Skip to content

Commit 74b8ad1

Browse files
authored
release: 2.5.0 (#439)
2 parents 4efb486 + 6f90f2d commit 74b8ad1

File tree

5 files changed

+58
-0
lines changed

5 files changed

+58
-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
@@ -2,6 +2,7 @@ package org.gitanimals.render.app
22

33
import org.gitanimals.render.app.request.MergePersonaRequest
44
import org.gitanimals.core.FieldType
5+
import org.gitanimals.render.app.request.MergePersonaV2Request
56
import org.gitanimals.render.domain.UserService
67
import org.gitanimals.render.domain.request.PersonaChangeRequest
78
import org.gitanimals.render.domain.response.PersonaResponse
@@ -53,6 +54,16 @@ class UserFacade(
5354
)
5455
}
5556

57+
fun mergePersonaV2(token: String, request: MergePersonaV2Request): PersonaResponse {
58+
val user = identityApi.getUserByToken(token)
59+
60+
return userService.mergePersonaV2(
61+
user.username,
62+
request.increasePersonaId.toLong(),
63+
request.deletePersonaId.map { it.toLong() },
64+
)
65+
}
66+
5667
fun addField(token: String, fieldType: FieldType) {
5768
val user = identityApi.getUserByToken(token)
5869

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 MergePersonaV2Request(
4+
val increasePersonaId: String,
5+
val deletePersonaId: List<String>,
6+
)

โ€Žsrc/main/kotlin/org/gitanimals/render/controller/PersonaController.ktโ€Ž

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.gitanimals.core.auth.RequiredUserEntryPoints
77
import org.gitanimals.core.auth.UserEntryPoint
88
import org.gitanimals.render.app.UserFacade
99
import org.gitanimals.render.app.request.MergePersonaRequest
10+
import org.gitanimals.render.app.request.MergePersonaV2Request
1011
import org.gitanimals.render.controller.response.PersonaEnumResponse
1112
import org.gitanimals.render.controller.response.PersonaResponse
1213
import org.gitanimals.render.controller.response.UserResponse
@@ -70,6 +71,14 @@ class PersonaController(
7071
@RequestBody meregPersonaRequest: MergePersonaRequest,
7172
) = userFacade.mergePersona(token, meregPersonaRequest)
7273

74+
@PutMapping(path = ["/personas/merges"], headers = ["Api-Version=2"])
75+
@ResponseStatus(HttpStatus.OK)
76+
@RequiredUserEntryPoints([UserEntryPoint.GITHUB])
77+
fun mergePersonaV2(
78+
@RequestHeader(HttpHeaders.AUTHORIZATION) token: String,
79+
@RequestBody mergePersonaRequest: MergePersonaV2Request,
80+
) = userFacade.mergePersonaV2(token, mergePersonaRequest)
81+
7382
@ExceptionHandler(IllegalArgumentException::class)
7483
@ResponseStatus(HttpStatus.BAD_REQUEST)
7584
fun handleIllegalArgumentException(exception: IllegalArgumentException): ErrorResponse =

โ€Žsrc/main/kotlin/org/gitanimals/render/domain/User.ktโ€Ž

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,25 @@ class User(
126126
return increasePersona
127127
}
128128

129+
fun mergePersonaV2(increasePersonaId: Long, deletePersonaIds: List<Long>): Persona {
130+
require(deletePersonaIds.contains(increasePersonaId).not()) {
131+
"increasePersonaId \"$increasePersonaId\", deletePersonaId \"$deletePersonaIds\" must be different"
132+
}
133+
134+
val increasePersona = personas.first { it.id == increasePersonaId }
135+
val deletePersonas = personas.filter { it.id in deletePersonaIds }
136+
137+
val increaseLevel = deletePersonas.sumOf { deletePersona ->
138+
max(deletePersona.level() / 2, 1)
139+
}
140+
141+
increasePersona.level.value += increaseLevel
142+
143+
deletePersonas.forEach { deletePersona(it.id) }
144+
145+
return increasePersona
146+
}
147+
129148
fun deletePersona(personaId: Long): PersonaResponse {
130149
val persona = this.personas.find { it.id == personaId }
131150
?: throw IllegalArgumentException("Cannot find persona by id \"$personaId\"")

โ€Žsrc/main/kotlin/org/gitanimals/render/domain/UserService.ktโ€Ž

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,19 @@ class UserService(
151151
return PersonaResponse.from(user.mergePersona(increasePersonaId, deletePersonaId))
152152
}
153153

154+
@Transactional
155+
@Retryable(retryFor = [ObjectOptimisticLockingFailureException::class], maxAttempts = 10)
156+
fun mergePersonaV2(
157+
name: String,
158+
increasePersonaId: Long,
159+
deletePersonaIds: List<Long>,
160+
): PersonaResponse {
161+
val user = userRepository.findByName(name)
162+
?: throw IllegalArgumentException("Cannot find user by name \"$name\"")
163+
164+
return PersonaResponse.from(user.mergePersonaV2(increasePersonaId, deletePersonaIds))
165+
}
166+
154167
@Transactional
155168
@Retryable(retryFor = [ObjectOptimisticLockingFailureException::class], maxAttempts = 10)
156169
fun addField(name: String, fieldType: FieldType) {

0 commit comments

Comments
ย (0)