Skip to content
This repository was archived by the owner on Jul 7, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ interface DeleteUserUsecase {

data class Command(
val userId: String,
val reason: String = ""
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class UserCommandService(
userManagementPort
.getUserNotNull(DomainId(command.userId))
.apply {
this.delete()
this.delete(command.reason)
userManagementPort.save(this)
}.also {
userAuthManagementPort.getNotNull(it.id).apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ interface UserApi {
)
fun deleteUser(
@AccessUser userId: String,
@RequestBody(required = false) request: UnregisterUserRequest?,
)

@Operation(summary = "내 정보 조회")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,11 @@ class UserController(
)
}

override fun deleteUser(userId: String) {
override fun deleteUser(userId: String, request: UnregisterUserRequest?) {
deleteUserUsecase.delete(
DeleteUserUsecase.Command(
userId = userId,
reason = request?.reason.orEmpty(),
),
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.asap.bootstrap.web.user.dto

data class UnregisterUserRequest(
val reason: String? = null
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@ import com.asap.application.user.port.out.UserManagementPort
import com.asap.bootstrap.IntegrationSupporter
import com.asap.bootstrap.web.user.dto.LogoutRequest
import com.asap.bootstrap.web.user.dto.RegisterUserRequest
import com.asap.bootstrap.web.user.dto.UnregisterUserRequest
import com.asap.bootstrap.web.user.dto.UpdateBirthdayRequest
import com.asap.domain.common.DomainId
import io.kotest.matchers.comparables.shouldBeGreaterThan
import io.kotest.matchers.shouldBe
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.http.MediaType
Expand Down Expand Up @@ -189,23 +192,51 @@ class UserApiIntegrationTest(
}
}

@Test
fun deleteUser() {
// given
val userId = userMockManager.settingUser()
userMockManager.settingUserAuth(userId = userId)
val accessToken = jwtMockManager.generateAccessToken(userId)
@Nested
@DisplayName("deleteUser")
inner class DeleteUser{
@Test
fun deleteUser() {
// given
val userId = userMockManager.settingUser()
userMockManager.settingUserAuth(userId = userId)
val accessToken = jwtMockManager.generateAccessToken(userId)

// when
val response =
mockMvc.delete("/api/v1/users") {
contentType = MediaType.APPLICATION_JSON
header("Authorization", "Bearer $accessToken")
// when
val response =
mockMvc.delete("/api/v1/users") {
contentType = MediaType.APPLICATION_JSON
header("Authorization", "Bearer $accessToken")
}

// then
response.andExpect {
status { isOk() }
}
}

// then
response.andExpect {
status { isOk() }
@Test
fun deleteUser_with_reason(){
// given
val userId = userMockManager.settingUser()
userMockManager.settingUserAuth(userId = userId)
val accessToken = jwtMockManager.generateAccessToken(userId)
val request = UnregisterUserRequest("reason")

// when
val response =
mockMvc.delete("/api/v1/users") {
contentType = MediaType.APPLICATION_JSON
content = objectMapper.writeValueAsString(request)
header("Authorization", "Bearer $accessToken")
}

// then
response.andExpect {
status { isOk() }
}
val user = userManagementPort.findById(DomainId(userId))
user!!.unregisterReason shouldBe request.reason
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class User(
var onboardingAt: LocalDateTime?,
createdAt: LocalDateTime,
updatedAt: LocalDateTime,
var unregisterReason: String? = null,
) : Aggregate<User>(id, createdAt, updatedAt) {
companion object {
fun create(
Expand All @@ -34,9 +35,10 @@ class User(
}
}

fun delete() {
fun delete(reason: String) {
this.profileImage = "UNKNOWN"
this.birthday = null
this.unregisterReason = reason

registerEvent(UserEvent.UserDeletedEvent(this))
updateTime()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ object UserMapper {
onboardingAt = user.onboardingAt,
createdAt = user.createdAt,
updatedAt = user.updatedAt,
unregisterReason = user.unregisterReason,
)

fun toUser(userEntity: UserEntity): User =
Expand All @@ -46,6 +47,7 @@ object UserMapper {
onboardingAt = userEntity.onboardingAt,
createdAt = userEntity.createdAt,
updatedAt = userEntity.updatedAt,
unregisterReason = userEntity.unregisterReason,
)

fun toUserAuthEntity(userAuth: UserAuth): UserAuthEntity =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class UserEntity(
onboardingAt: LocalDateTime?,
createdAt: LocalDateTime,
updatedAt: LocalDateTime,
unregisterReason: String? = null,
) : AggregateRoot<UserEntity>(id, createdAt, updatedAt) {
@Column(nullable = false)
val username: String = username
Expand All @@ -35,4 +36,9 @@ class UserEntity(
val birthday: LocalDate? = birthday

val onboardingAt: LocalDateTime? = onboardingAt

@Column(
columnDefinition = "varchar(1000)",
)
val unregisterReason: String? = unregisterReason
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
alter table user add column unregister_reason varchar(1000);