File tree Expand file tree Collapse file tree 5 files changed +58
-0
lines changed
src/main/kotlin/org/gitanimals/render Expand file tree Collapse file tree 5 files changed +58
-0
lines changed Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ package org.gitanimals.render.app
22
33import org.gitanimals.render.app.request.MergePersonaRequest
44import org.gitanimals.core.FieldType
5+ import org.gitanimals.render.app.request.MergePersonaV2Request
56import org.gitanimals.render.domain.UserService
67import org.gitanimals.render.domain.request.PersonaChangeRequest
78import 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
Original file line number Diff line number Diff line change 1+ package org.gitanimals.render.app.request
2+
3+ data class MergePersonaV2Request (
4+ val increasePersonaId : String ,
5+ val deletePersonaId : List <String >,
6+ )
Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ import org.gitanimals.core.auth.RequiredUserEntryPoints
77import org.gitanimals.core.auth.UserEntryPoint
88import org.gitanimals.render.app.UserFacade
99import org.gitanimals.render.app.request.MergePersonaRequest
10+ import org.gitanimals.render.app.request.MergePersonaV2Request
1011import org.gitanimals.render.controller.response.PersonaEnumResponse
1112import org.gitanimals.render.controller.response.PersonaResponse
1213import 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 =
Original file line number Diff line number Diff 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 \" " )
Original file line number Diff line number Diff 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 ) {
You canโt perform that action at this time.
0 commit comments