Skip to content
This repository was archived by the owner on Jul 7, 2025. It is now read-only.

Commit cd1559e

Browse files
authored
Merge pull request #123 from ASAP-Lettering/ASAP-423
ASAP-423 사용자 회원 탈퇴 사유 저장 컬럼 추가
2 parents 547137c + 80ba69e commit cd1559e

File tree

10 files changed

+68
-17
lines changed

10 files changed

+68
-17
lines changed

Application-Module/src/main/kotlin/com/asap/application/user/port/in/DeleteUserUsecase.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ interface DeleteUserUsecase {
55

66
data class Command(
77
val userId: String,
8+
val reason: String = ""
89
)
910
}

Application-Module/src/main/kotlin/com/asap/application/user/service/UserCommandService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class UserCommandService(
6969
userManagementPort
7070
.getUserNotNull(DomainId(command.userId))
7171
.apply {
72-
this.delete()
72+
this.delete(command.reason)
7373
userManagementPort.save(this)
7474
}.also {
7575
userAuthManagementPort.getNotNull(it.id).apply {

Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/user/api/UserApi.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ interface UserApi {
6868
)
6969
fun deleteUser(
7070
@AccessUser userId: String,
71+
@RequestBody(required = false) request: UnregisterUserRequest?,
7172
)
7273

7374
@Operation(summary = "내 정보 조회")

Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/user/controller/UserController.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,11 @@ class UserController(
4040
)
4141
}
4242

43-
override fun deleteUser(userId: String) {
43+
override fun deleteUser(userId: String, request: UnregisterUserRequest?) {
4444
deleteUserUsecase.delete(
4545
DeleteUserUsecase.Command(
4646
userId = userId,
47+
reason = request?.reason.orEmpty(),
4748
),
4849
)
4950
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.asap.bootstrap.web.user.dto
2+
3+
data class UnregisterUserRequest(
4+
val reason: String? = null
5+
) {
6+
}

Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/user/UserApiIntegrationTest.kt

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ import com.asap.application.user.port.out.UserManagementPort
55
import com.asap.bootstrap.IntegrationSupporter
66
import com.asap.bootstrap.web.user.dto.LogoutRequest
77
import com.asap.bootstrap.web.user.dto.RegisterUserRequest
8+
import com.asap.bootstrap.web.user.dto.UnregisterUserRequest
89
import com.asap.bootstrap.web.user.dto.UpdateBirthdayRequest
910
import com.asap.domain.common.DomainId
1011
import io.kotest.matchers.comparables.shouldBeGreaterThan
12+
import io.kotest.matchers.shouldBe
13+
import org.junit.jupiter.api.DisplayName
1114
import org.junit.jupiter.api.Nested
1215
import org.junit.jupiter.api.Test
1316
import org.springframework.http.MediaType
@@ -189,23 +192,51 @@ class UserApiIntegrationTest(
189192
}
190193
}
191194

192-
@Test
193-
fun deleteUser() {
194-
// given
195-
val userId = userMockManager.settingUser()
196-
userMockManager.settingUserAuth(userId = userId)
197-
val accessToken = jwtMockManager.generateAccessToken(userId)
195+
@Nested
196+
@DisplayName("deleteUser")
197+
inner class DeleteUser{
198+
@Test
199+
fun deleteUser() {
200+
// given
201+
val userId = userMockManager.settingUser()
202+
userMockManager.settingUserAuth(userId = userId)
203+
val accessToken = jwtMockManager.generateAccessToken(userId)
198204

199-
// when
200-
val response =
201-
mockMvc.delete("/api/v1/users") {
202-
contentType = MediaType.APPLICATION_JSON
203-
header("Authorization", "Bearer $accessToken")
205+
// when
206+
val response =
207+
mockMvc.delete("/api/v1/users") {
208+
contentType = MediaType.APPLICATION_JSON
209+
header("Authorization", "Bearer $accessToken")
210+
}
211+
212+
// then
213+
response.andExpect {
214+
status { isOk() }
204215
}
216+
}
205217

206-
// then
207-
response.andExpect {
208-
status { isOk() }
218+
@Test
219+
fun deleteUser_with_reason(){
220+
// given
221+
val userId = userMockManager.settingUser()
222+
userMockManager.settingUserAuth(userId = userId)
223+
val accessToken = jwtMockManager.generateAccessToken(userId)
224+
val request = UnregisterUserRequest("reason")
225+
226+
// when
227+
val response =
228+
mockMvc.delete("/api/v1/users") {
229+
contentType = MediaType.APPLICATION_JSON
230+
content = objectMapper.writeValueAsString(request)
231+
header("Authorization", "Bearer $accessToken")
232+
}
233+
234+
// then
235+
response.andExpect {
236+
status { isOk() }
237+
}
238+
val user = userManagementPort.findById(DomainId(userId))
239+
user!!.unregisterReason shouldBe request.reason
209240
}
210241
}
211242

Domain-Module/src/main/kotlin/com/asap/domain/user/entity/User.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class User(
1717
var onboardingAt: LocalDateTime?,
1818
createdAt: LocalDateTime,
1919
updatedAt: LocalDateTime,
20+
var unregisterReason: String? = null,
2021
) : Aggregate<User>(id, createdAt, updatedAt) {
2122
companion object {
2223
fun create(
@@ -34,9 +35,10 @@ class User(
3435
}
3536
}
3637

37-
fun delete() {
38+
fun delete(reason: String) {
3839
this.profileImage = "UNKNOWN"
3940
this.birthday = null
41+
this.unregisterReason = reason
4042

4143
registerEvent(UserEvent.UserDeletedEvent(this))
4244
updateTime()

Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/UserMapper.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ object UserMapper {
2828
onboardingAt = user.onboardingAt,
2929
createdAt = user.createdAt,
3030
updatedAt = user.updatedAt,
31+
unregisterReason = user.unregisterReason,
3132
)
3233

3334
fun toUser(userEntity: UserEntity): User =
@@ -46,6 +47,7 @@ object UserMapper {
4647
onboardingAt = userEntity.onboardingAt,
4748
createdAt = userEntity.createdAt,
4849
updatedAt = userEntity.updatedAt,
50+
unregisterReason = userEntity.unregisterReason,
4951
)
5052

5153
fun toUserAuthEntity(userAuth: UserAuth): UserAuthEntity =

Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserEntity.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class UserEntity(
1717
onboardingAt: LocalDateTime?,
1818
createdAt: LocalDateTime,
1919
updatedAt: LocalDateTime,
20+
unregisterReason: String? = null,
2021
) : AggregateRoot<UserEntity>(id, createdAt, updatedAt) {
2122
@Column(nullable = false)
2223
val username: String = username
@@ -35,4 +36,9 @@ class UserEntity(
3536
val birthday: LocalDate? = birthday
3637

3738
val onboardingAt: LocalDateTime? = onboardingAt
39+
40+
@Column(
41+
columnDefinition = "varchar(1000)",
42+
)
43+
val unregisterReason: String? = unregisterReason
3844
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
alter table user add column unregister_reason varchar(1000);

0 commit comments

Comments
 (0)