Skip to content

Commit c31a250

Browse files
committed
feat: 모바일에서 보여져야하는 펫 리스트 조회/수정 API를 추가한다
1 parent b69cb7a commit c31a250

File tree

11 files changed

+129
-58
lines changed

11 files changed

+129
-58
lines changed

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ class InternalPersonaController(
3838
)
3939

4040
return PersonaResponse(
41-
persona.id,
42-
persona.type,
43-
persona.level,
44-
persona.visible,
45-
persona.dropRate,
41+
id = persona.id,
42+
type = persona.type,
43+
level = persona.level,
44+
visible = persona.visible,
45+
appVisible = persona.appVisible,
46+
dropRate = persona.dropRate,
4647
)
4748
}
4849

@@ -62,11 +63,12 @@ class InternalPersonaController(
6263
)
6364

6465
PersonaResponse(
65-
persona.id,
66-
persona.type,
67-
persona.level,
68-
persona.visible,
69-
persona.dropRate,
66+
id = persona.id,
67+
type = persona.type,
68+
level = persona.level,
69+
visible = persona.visible,
70+
appVisible = persona.appVisible,
71+
dropRate = persona.dropRate,
7072
)
7173
}
7274
}
@@ -80,11 +82,12 @@ class InternalPersonaController(
8082
val persona = userFacade.deletePersona(token, personaId)
8183

8284
return PersonaResponse(
83-
persona.id,
84-
persona.type,
85-
persona.level,
86-
persona.visible,
87-
persona.dropRate,
85+
id = persona.id,
86+
type = persona.type,
87+
level = persona.level,
88+
visible = persona.visible,
89+
appVisible = persona.appVisible,
90+
dropRate = persona.dropRate,
8891
)
8992
}
9093

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

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.gitanimals.render.controller
22

3-
import org.gitanimals.core.PersonaType
43
import org.gitanimals.core.AuthorizationException
5-
import org.gitanimals.render.app.UserFacade
6-
import org.gitanimals.render.app.request.MergePersonaRequest
74
import org.gitanimals.core.ErrorResponse
5+
import org.gitanimals.core.PersonaType
86
import org.gitanimals.core.auth.RequiredUserEntryPoints
97
import org.gitanimals.core.auth.UserEntryPoint
8+
import org.gitanimals.render.app.UserFacade
9+
import org.gitanimals.render.app.request.MergePersonaRequest
1010
import org.gitanimals.render.controller.response.PersonaEnumResponse
1111
import org.gitanimals.render.controller.response.PersonaResponse
1212
import org.gitanimals.render.controller.response.UserResponse
@@ -36,11 +36,12 @@ class PersonaController(
3636
val persona = userFacade.getPersona(token, personaId)
3737

3838
return PersonaResponse(
39-
persona.id,
40-
persona.type,
41-
persona.level,
42-
persona.visible,
43-
persona.dropRate
39+
id = persona.id,
40+
type = persona.type,
41+
level = persona.level,
42+
visible = persona.visible,
43+
appVisible = persona.appVisible,
44+
dropRate = persona.dropRate,
4445
)
4546
}
4647

@@ -54,11 +55,12 @@ class PersonaController(
5455
val changedPersona = userFacade.changePersona(token, personaChangeRequest)
5556

5657
return PersonaResponse(
57-
changedPersona.id,
58-
changedPersona.type,
59-
changedPersona.level,
60-
changedPersona.visible,
61-
changedPersona.dropRate,
58+
id = changedPersona.id,
59+
type = changedPersona.type,
60+
level = changedPersona.level,
61+
visible = changedPersona.visible,
62+
appVisible = changedPersona.appVisible,
63+
dropRate = changedPersona.dropRate,
6264
)
6365
}
6466

src/main/kotlin/org/gitanimals/render/controller/response/PersonaResponse.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ data class PersonaResponse(
88
val type: PersonaType,
99
val level: String,
1010
val visible: Boolean,
11+
val appVisible: Boolean,
1112
val dropRate: String,
1213
) {
1314

@@ -18,6 +19,7 @@ data class PersonaResponse(
1819
type = personaResponse.type,
1920
level = personaResponse.level,
2021
visible = personaResponse.visible,
22+
appVisible = personaResponse.appVisible,
2123
dropRate = personaResponse.dropRate,
2224
)
2325
}

src/main/kotlin/org/gitanimals/render/controller/response/UserResponse.kt

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ data class UserResponse(
1717
user.contributionCount().toString(),
1818
user.personas.map {
1919
PersonaResponse(
20-
it.id.toString(),
21-
it.type,
22-
it.level().toString(),
23-
it.visible,
24-
it.type.getDropRate()
20+
id = it.id.toString(),
21+
type = it.type,
22+
level = it.level().toString(),
23+
visible = it.visible,
24+
appVisible = it.appVisible,
25+
dropRate = it.type.getDropRate(),
2526
)
2627
}.toList()
2728
)
@@ -36,11 +37,12 @@ data class UserResponse(
3637
it.id in personaId
3738
}.map {
3839
PersonaResponse(
39-
it.id.toString(),
40-
it.type,
41-
it.level().toString(),
42-
it.visible,
43-
it.type.getDropRate()
40+
id = it.id.toString(),
41+
type = it.type,
42+
level = it.level().toString(),
43+
visible = it.visible,
44+
appVisible = it.appVisible,
45+
dropRate = it.type.getDropRate(),
4446
)
4547
}.toList()
4648
)
@@ -55,11 +57,12 @@ data class UserResponse(
5557
.maxBy { it.level() }
5658
.let {
5759
PersonaResponse(
58-
it.id.toString(),
59-
it.type,
60-
it.level().toString(),
61-
it.visible,
62-
it.type.getDropRate()
60+
id = it.id.toString(),
61+
type = it.type,
62+
level = it.level().toString(),
63+
visible = it.visible,
64+
appVisible = it.appVisible,
65+
dropRate = it.type.getDropRate(),
6366
)
6467
}
6568
)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class Persona(
2424
@Column(name = "visible", nullable = false)
2525
var visible: Boolean,
2626

27+
@Column(name = "app_visible", nullable = false, columnDefinition = "bit(1) DEFAULT 0")
28+
var appVisible: Boolean = false,
29+
2730
@JsonIgnore
2831
@JoinColumn(name = "user_id")
2932
@ManyToOne(fetch = FetchType.LAZY, optional = false)

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.gitanimals.core.*
66
import org.gitanimals.render.domain.event.PersonaDeleted
77
import org.gitanimals.render.domain.event.UserContributionUpdated
88
import org.gitanimals.render.domain.extension.RenderFieldTypeExtension.isRenderField
9+
import org.gitanimals.render.domain.request.VisibleChangeType
910
import org.gitanimals.render.domain.response.PersonaResponse
1011
import org.gitanimals.render.domain.value.Contribution
1112
import org.gitanimals.render.domain.value.Level
@@ -97,7 +98,13 @@ class User(
9798
}
9899

99100
fun addPersona(id: Long, personaType: PersonaType, level: Int): PersonaResponse {
100-
val persona = Persona(id, personaType, Level(level.toLong()), personas.size < 30, this)
101+
val persona = Persona(
102+
id = id,
103+
type = personaType,
104+
level = Level(level.toLong()),
105+
visible = personas.size < 30,
106+
user = this,
107+
)
101108

102109
this.personas.add(persona)
103110

@@ -148,11 +155,23 @@ class User(
148155
)
149156
}
150157

151-
fun changePersonaVisible(personaId: Long, visible: Boolean): Persona {
158+
fun changePersonaVisible(
159+
personaId: Long,
160+
visible: Boolean,
161+
visibleChangeType: VisibleChangeType
162+
): Persona {
152163
val persona = personas.find { it.id == personaId }
153164
?: throw IllegalArgumentException("Cannot find persona by id \"$personaId\"")
154165

155-
persona.visible = visible
166+
when (visibleChangeType) {
167+
VisibleChangeType.APP -> run {
168+
persona.appVisible = visible
169+
}
170+
171+
VisibleChangeType.DEFAULT -> run {
172+
persona.visible = visible
173+
}
174+
}
156175

157176
val visiblePersonas = personas.filter { it.visible }
158177

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,13 @@ class UserService(
9494

9595
@Retryable(retryFor = [ObjectOptimisticLockingFailureException::class], maxAttempts = 10)
9696
@Transactional
97-
fun changePersona(name: String, personChangeRequest: PersonaChangeRequest): PersonaResponse {
97+
fun changePersona(name: String, personaChangeRequest: PersonaChangeRequest): PersonaResponse {
9898
val user = getUserByName(name)
9999

100100
val changedPersona = user.changePersonaVisible(
101-
personChangeRequest.personaId.toLong(),
102-
personChangeRequest.visible
101+
personaChangeRequest.personaId.toLong(),
102+
personaChangeRequest.visible,
103+
personaChangeRequest.type,
103104
)
104105

105106
return PersonaResponse.from(changedPersona)

src/main/kotlin/org/gitanimals/render/domain/request/PersonaChangeRequest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,11 @@ package org.gitanimals.render.domain.request
33
data class PersonaChangeRequest(
44
val personaId: String,
55
val visible: Boolean,
6+
val type: VisibleChangeType = VisibleChangeType.DEFAULT
67
)
8+
9+
enum class VisibleChangeType {
10+
DEFAULT,
11+
APP,
12+
;
13+
}

src/main/kotlin/org/gitanimals/render/domain/response/PersonaResponse.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@ data class PersonaResponse(
88
val type: PersonaType,
99
val level: String,
1010
val visible: Boolean,
11+
val appVisible: Boolean,
1112
val dropRate: String,
1213
) {
1314
companion object {
1415
fun from(persona: Persona): PersonaResponse {
1516
return PersonaResponse(
16-
persona.id.toString(),
17-
persona.type,
18-
persona.level.value.toString(),
19-
persona.visible,
20-
persona.type.getDropRate()
17+
id = persona.id.toString(),
18+
type = persona.type,
19+
level = persona.level.value.toString(),
20+
visible = persona.visible,
21+
appVisible = persona.appVisible,
22+
dropRate = persona.type.getDropRate(),
2123
)
2224
}
2325
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@ fun persona(
3434
type = type,
3535
level = Level(0),
3636
visible = false,
37+
appVisible = false,
3738
user = user,
3839
)

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import io.kotest.core.annotation.DisplayName
77
import io.kotest.core.spec.style.DescribeSpec
88
import io.kotest.matchers.equals.shouldBeEqual
99
import io.kotest.matchers.nulls.shouldNotBeNull
10-
import org.gitanimals.core.DomainEventPublisher
11-
import org.gitanimals.core.PersonaType
12-
import org.gitanimals.core.instant
13-
import org.gitanimals.core.toZonedDateTime
10+
import io.kotest.matchers.shouldBe
11+
import org.gitanimals.core.*
12+
import org.gitanimals.core.filter.MDCFilter.Companion.TRACE_ID
1413
import org.gitanimals.render.domain.event.PersonaDeleted
14+
import org.gitanimals.render.domain.request.VisibleChangeType
1515
import org.gitanimals.render.domain.value.Contribution
1616
import org.gitanimals.render.supports.DomainEventHolder
17+
import org.slf4j.MDC
1718
import org.springframework.test.context.ContextConfiguration
1819
import java.time.Instant
1920
import java.time.temporal.ChronoUnit
@@ -35,6 +36,7 @@ internal class UserTest(
3536
) : DescribeSpec({
3637

3738
beforeEach {
39+
MDC.put(TRACE_ID, IdGenerator.generate().toString())
3840
domainEventHolder.deleteAll()
3941
}
4042

@@ -167,6 +169,32 @@ internal class UserTest(
167169
}
168170
}
169171
}
172+
173+
describe("changePersonaVisible 메소드는") {
174+
context("visibleChangeType이 APP일때,") {
175+
val user = user().apply {
176+
this.personas.add(persona(id = 1, user = this))
177+
}
178+
179+
it("personaId에 해당하는 persona의 appVisible을 visible로 변경한다") {
180+
user.changePersonaVisible(1, true, VisibleChangeType.APP)
181+
182+
user.personas.first().appVisible shouldBe true
183+
}
184+
}
185+
186+
context("visibleChangeType이 DEFAULT일때,") {
187+
val user = user().apply {
188+
this.personas.add(persona(id = 1, user = this))
189+
}
190+
191+
it("personaId에 해당하는 persona의 visible을 visible로 변경한다") {
192+
user.changePersonaVisible(1, true, VisibleChangeType.DEFAULT)
193+
194+
user.personas.first().visible shouldBe true
195+
}
196+
}
197+
}
170198
}) {
171199
private companion object {
172200
private const val ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

0 commit comments

Comments
 (0)