File tree Expand file tree Collapse file tree 6 files changed +59
-0
lines changed
main/kotlin/org/gitanimals/render
test/kotlin/org/gitanimals/render/domain Expand file tree Collapse file tree 6 files changed +59
-0
lines changed Original file line number Diff line number Diff line change 1
1
package org.gitanimals.render.app
2
2
3
+ import org.gitanimals.render.app.request.MergePersonaRequest
3
4
import org.gitanimals.render.domain.UserService
4
5
import org.gitanimals.render.domain.request.PersonaChangeRequest
5
6
import org.gitanimals.render.domain.response.PersonaResponse
@@ -40,4 +41,14 @@ class UserFacade(
40
41
41
42
return userService.getPersona(user.username, personaId)
42
43
}
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
+ }
43
54
}
Original file line number Diff line number Diff line change
1
+ package org.gitanimals.render.app.request
2
+
3
+ data class MergePersonaRequest (
4
+ val increasePersonaId : Long ,
5
+ val deletePersonaId : Long ,
6
+ )
Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ package org.gitanimals.render.controller
2
2
3
3
import org.gitanimals.render.app.AuthorizationException
4
4
import org.gitanimals.render.app.UserFacade
5
+ import org.gitanimals.render.app.request.MergePersonaRequest
5
6
import org.gitanimals.render.controller.request.AddMultiplyPersonaRequest
6
7
import org.gitanimals.render.controller.request.AddPersonaRequest
7
8
import org.gitanimals.render.controller.response.ErrorResponse
@@ -72,6 +73,13 @@ class PersonaController(
72
73
)
73
74
}
74
75
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
+
75
83
@ExceptionHandler(IllegalArgumentException ::class )
76
84
@ResponseStatus(HttpStatus .BAD_REQUEST )
77
85
fun handleIllegalArgumentException (exception : IllegalArgumentException ): ErrorResponse =
Original file line number Diff line number Diff line change @@ -205,6 +205,15 @@ class User(
205
205
.append(" </svg>" )
206
206
.toString()
207
207
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
+
208
217
companion object {
209
218
private const val MAX_PERSONA_COUNT = 30L
210
219
private const val MAX_INIT_PERSONA_COUNT = 10L
Original file line number Diff line number Diff line change @@ -104,6 +104,15 @@ class UserService(
104
104
return user.deletePersona(personaId)
105
105
}
106
106
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
+
107
116
fun getPersona (name : String , personaId : Long ): PersonaResponse {
108
117
return getUserByName(name).personas
109
118
.find { it.id == personaId }
Original file line number Diff line number Diff line change @@ -103,6 +103,22 @@ internal class UserTest : DescribeSpec({
103
103
}
104
104
}
105
105
}
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
+ }
106
122
}) {
107
123
private companion object {
108
124
private const val ALPHABET = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"
You can’t perform that action at this time.
0 commit comments