diff --git a/api/src/main/java/org/yapp/domain/user/application/UserService.java b/api/src/main/java/org/yapp/domain/user/application/UserService.java index c0db4884..be705975 100644 --- a/api/src/main/java/org/yapp/domain/user/application/UserService.java +++ b/api/src/main/java/org/yapp/domain/user/application/UserService.java @@ -7,13 +7,15 @@ import org.yapp.core.domain.profile.Profile; import org.yapp.core.domain.user.RoleStatus; import org.yapp.core.domain.user.User; +import org.yapp.core.domain.user.UserDeleteReason; import org.yapp.core.domain.user.UserRejectHistory; import org.yapp.core.exception.ApplicationException; import org.yapp.core.exception.error.code.UserErrorCode; import org.yapp.domain.auth.presentation.dto.response.OauthLoginResponse; +import org.yapp.domain.user.dao.UserDeleteReasonRepository; import org.yapp.domain.user.dao.UserRejectHistoryRepository; import org.yapp.domain.user.dao.UserRepository; -import org.yapp.domain.user.presentation.response.UserRejectHistoryResponse; +import org.yapp.domain.user.presentation.dto.response.UserRejectHistoryResponse; @Service @RequiredArgsConstructor @@ -21,6 +23,7 @@ public class UserService { private final UserRepository userRepository; private final UserRejectHistoryRepository userRejectHistoryRepository; + private final UserDeleteReasonRepository userDeleteReasonRepository; private final JwtUtil jwtUtil; /** @@ -92,7 +95,8 @@ public UserRejectHistoryResponse getUserRejectHistoryLatest(Long userId) { } @Transactional - public void deleteUser(Long userId) { + public void deleteUser(Long userId, String reason) { + userDeleteReasonRepository.save(new UserDeleteReason(userId, reason)); userRepository.deleteById(userId); } } diff --git a/api/src/main/java/org/yapp/domain/user/dao/UserDeleteReasonRepository.java b/api/src/main/java/org/yapp/domain/user/dao/UserDeleteReasonRepository.java new file mode 100644 index 00000000..bf8c54ea --- /dev/null +++ b/api/src/main/java/org/yapp/domain/user/dao/UserDeleteReasonRepository.java @@ -0,0 +1,8 @@ +package org.yapp.domain.user.dao; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.yapp.core.domain.user.UserDeleteReason; + +public interface UserDeleteReasonRepository extends JpaRepository { + +} diff --git a/api/src/main/java/org/yapp/domain/user/presentation/UserController.java b/api/src/main/java/org/yapp/domain/user/presentation/UserController.java index e3c3b90d..147adfc8 100644 --- a/api/src/main/java/org/yapp/domain/user/presentation/UserController.java +++ b/api/src/main/java/org/yapp/domain/user/presentation/UserController.java @@ -1,6 +1,7 @@ package org.yapp.domain.user.presentation; import io.swagger.v3.oas.annotations.Operation; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -8,10 +9,12 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.yapp.domain.user.application.UserService; -import org.yapp.domain.user.presentation.response.UserRejectHistoryResponse; +import org.yapp.domain.user.presentation.dto.request.UserDeleteRequest; +import org.yapp.domain.user.presentation.dto.response.UserRejectHistoryResponse; import org.yapp.format.CommonResponse; @RestController @@ -34,10 +37,12 @@ public ResponseEntity> getUserRejectHi } @DeleteMapping - @PreAuthorize(value = "hasRole('USER')") + @PreAuthorize(value = "hasAnyAuthority('REGISTER','USER')") @Operation(summary = "회원 탈퇴", description = "회원 탈퇴합니다.", tags = {"사용자"}) - public ResponseEntity> deleteUser(@AuthenticationPrincipal Long userId) { - userService.deleteUser(userId); + public ResponseEntity> deleteUser( + @RequestBody @Valid UserDeleteRequest request, + @AuthenticationPrincipal Long userId) { + userService.deleteUser(userId, request.getReason()); return ResponseEntity.ok(CommonResponse.createSuccessWithNoContent()); } } diff --git a/api/src/main/java/org/yapp/domain/user/presentation/dto/request/UserDeleteRequest.java b/api/src/main/java/org/yapp/domain/user/presentation/dto/request/UserDeleteRequest.java new file mode 100644 index 00000000..21bcb193 --- /dev/null +++ b/api/src/main/java/org/yapp/domain/user/presentation/dto/request/UserDeleteRequest.java @@ -0,0 +1,13 @@ +package org.yapp.domain.user.presentation.dto.request; + +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Getter +public class UserDeleteRequest { + + @Size(max = 100, message = "탈퇴 이유는 100자 이하여야합니다.") + private String reason; +} diff --git a/api/src/main/java/org/yapp/domain/user/presentation/response/UserRejectHistoryResponse.java b/api/src/main/java/org/yapp/domain/user/presentation/dto/response/UserRejectHistoryResponse.java similarity index 78% rename from api/src/main/java/org/yapp/domain/user/presentation/response/UserRejectHistoryResponse.java rename to api/src/main/java/org/yapp/domain/user/presentation/dto/response/UserRejectHistoryResponse.java index 145e7ccb..637faa14 100644 --- a/api/src/main/java/org/yapp/domain/user/presentation/response/UserRejectHistoryResponse.java +++ b/api/src/main/java/org/yapp/domain/user/presentation/dto/response/UserRejectHistoryResponse.java @@ -1,4 +1,4 @@ -package org.yapp.domain.user.presentation.response; +package org.yapp.domain.user.presentation.dto.response; import org.yapp.core.domain.profile.ProfileStatus; diff --git a/core/domain/src/main/java/org/yapp/core/domain/user/UserDeleteReason.java b/core/domain/src/main/java/org/yapp/core/domain/user/UserDeleteReason.java new file mode 100644 index 00000000..c5b95a66 --- /dev/null +++ b/core/domain/src/main/java/org/yapp/core/domain/user/UserDeleteReason.java @@ -0,0 +1,24 @@ +package org.yapp.core.domain.user; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "user_delete_reason") +public class UserDeleteReason { + + @Id + @Column(name = "user_id") + private Long id; + + @Column(name = "reason") + private String reason; +}