Skip to content

Commit 329f56d

Browse files
authored
release: 0.7.5 (#135)
2 parents 01b2cd2 + a57efae commit 329f56d

File tree

6 files changed

+59
-0
lines changed

6 files changed

+59
-0
lines changed

src/main/kotlin/org/gitanimals/render/app/UserFacade.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.gitanimals.render.app
22

3+
import org.gitanimals.render.app.request.MergePersonaRequest
34
import org.gitanimals.render.domain.UserService
45
import org.gitanimals.render.domain.request.PersonaChangeRequest
56
import org.gitanimals.render.domain.response.PersonaResponse
@@ -40,4 +41,14 @@ class UserFacade(
4041

4142
return userService.getPersona(user.username, personaId)
4243
}
44+
45+
fun mergePersona(token: String, request: MergePersonaRequest) {
46+
val user = identityApi.getUserByToken(token)
47+
48+
return userService.mergePersona(
49+
user.id.toLong(),
50+
request.increasePersonaId,
51+
request.deletePersonaId,
52+
)
53+
}
4354
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.gitanimals.render.app.request
2+
3+
data class MergePersonaRequest(
4+
val increasePersonaId: Long,
5+
val deletePersonaId: Long,
6+
)

src/main/kotlin/org/gitanimals/render/controller/PersonaController.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.gitanimals.render.controller
22

33
import org.gitanimals.render.app.AuthorizationException
44
import org.gitanimals.render.app.UserFacade
5+
import org.gitanimals.render.app.request.MergePersonaRequest
56
import org.gitanimals.render.controller.request.AddMultiplyPersonaRequest
67
import org.gitanimals.render.controller.request.AddPersonaRequest
78
import org.gitanimals.render.controller.response.ErrorResponse
@@ -72,6 +73,13 @@ class PersonaController(
7273
)
7374
}
7475

76+
@PutMapping("/personas/merges")
77+
@ResponseStatus(HttpStatus.OK)
78+
fun mergePersona(
79+
@RequestHeader(HttpHeaders.AUTHORIZATION) token: String,
80+
@RequestBody meregPersonaRequest: MergePersonaRequest,
81+
) = userFacade.mergePersona(token, meregPersonaRequest)
82+
7583
@ExceptionHandler(IllegalArgumentException::class)
7684
@ResponseStatus(HttpStatus.BAD_REQUEST)
7785
fun handleIllegalArgumentException(exception: IllegalArgumentException): ErrorResponse =

src/main/kotlin/org/gitanimals/render/domain/User.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,15 @@ class User(
205205
.append("</svg>")
206206
.toString()
207207

208+
fun mergePersona(increasePersonaId: Long, deletePersonaId: Long) {
209+
val increasePersona = personas.first { it.id == increasePersonaId }
210+
val deletePersona = personas.first { it.id == deletePersonaId }
211+
212+
increasePersona.level.value += deletePersona.level.value
213+
214+
personas.remove(deletePersona)
215+
}
216+
208217
companion object {
209218
private const val MAX_PERSONA_COUNT = 30L
210219
private const val MAX_INIT_PERSONA_COUNT = 10L

src/main/kotlin/org/gitanimals/render/domain/UserService.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,15 @@ class UserService(
104104
return user.deletePersona(personaId)
105105
}
106106

107+
@Transactional
108+
@Retryable(retryFor = [ObjectOptimisticLockingFailureException::class], maxAttempts = 100)
109+
fun mergePersona(id: Long, increasePersonaId: Long, deletePersonaId: Long) {
110+
val user = userRepository.findByIdOrNull(id)
111+
?: throw IllegalArgumentException("Cannot find user by id \"$id\"")
112+
113+
user.mergePersona(increasePersonaId, deletePersonaId)
114+
}
115+
107116
fun getPersona(name: String, personaId: Long): PersonaResponse {
108117
return getUserByName(name).personas
109118
.find { it.id == personaId }

src/test/kotlin/org/gitanimals/render/domain/UserTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ internal class UserTest : DescribeSpec({
103103
}
104104
}
105105
}
106+
107+
describe("mergePersona 메소드는") {
108+
context("increasePersonaId와 deletePersonaId를 받아서,") {
109+
val user = User.newUser("devxb", mapOf())
110+
user.updateContribution(30)
111+
user.giveNewPersona()
112+
113+
val increasePersonaId = user.personas.minByOrNull { it.level.value }!!.id
114+
val deletePersonaId = user.personas.maxByOrNull { it.level.value }!!.id
115+
it("increasePersonaId에 deletePersonasId의 level을 추가하고, deletePersona를 삭제한다") {
116+
user.mergePersona(increasePersonaId, deletePersonaId)
117+
118+
user.personas.size shouldBeEqual 1
119+
}
120+
}
121+
}
106122
}) {
107123
private companion object {
108124
private const val ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

0 commit comments

Comments
 (0)