diff --git a/src/main/java/com/alist/api/config/OpenApiConfig.java b/src/main/java/com/alist/api/config/OpenApiConfig.java index 3a81e52..b5e8da7 100644 --- a/src/main/java/com/alist/api/config/OpenApiConfig.java +++ b/src/main/java/com/alist/api/config/OpenApiConfig.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springdoc.core.models.GroupedOpenApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -34,4 +35,25 @@ public class OpenApiConfig { ) ); } + + @Bean + public GroupedOpenApi frontApi() { + return GroupedOpenApi.builder() + .group("front") + .pathsToMatch("/**") + .pathsToExclude( + "/admin/**", + "/error", + "/actuator/**" + ) + .build(); + } + + @Bean + public GroupedOpenApi adminApi() { + return GroupedOpenApi.builder() + .group("admin") + .pathsToMatch("/admin/**") + .build(); + } } diff --git a/src/main/java/com/alist/api/modules/user/UserController.java b/src/main/java/com/alist/api/modules/user/UserController.java index 26b5e4f..1dbcd9a 100644 --- a/src/main/java/com/alist/api/modules/user/UserController.java +++ b/src/main/java/com/alist/api/modules/user/UserController.java @@ -120,4 +120,25 @@ public class UserController { return ApiResponse.entity(result, ApiResponseCode.CODE_2005, "개인정보 수정"); } + + @Operation( + summary = "사용자 탈퇴 상태 변경", + description = "로그인한 사용자의 탈퇴 요청 또는 탈퇴 요청 철회를 처리합니다. P: 탈퇴대기, N: 탈퇴요청 철회" + ) + @PatchMapping("/withdraw") + public ResponseEntity> updateWithdrawStatus( + @Valid @RequestBody UserWithdrawStatusUpdateForm userWithdrawStatusUpdateForm + ) { + UserWithdrawStatusUpdateVo result = userService.updateWithdrawStatus(userWithdrawStatusUpdateForm.toUserWithdrawStatusUpdateDto()); + + if (!result.isWithdrawStatusUpdated()) { + if (result.getResultCode() == 4003 || result.getResultCode() == 4001) { + return ApiResponse.entity(result, ApiResponseCode.CODE_4001); + } + + return ApiResponse.entity(result, ApiResponseCode.CODE_2003); + } + + return ApiResponse.entity(result, ApiResponseCode.CODE_2005, "탈퇴 상태 변경"); + } } \ No newline at end of file diff --git a/src/main/java/com/alist/api/modules/user/dto/UserWithdrawStatusUpdateDto.java b/src/main/java/com/alist/api/modules/user/dto/UserWithdrawStatusUpdateDto.java new file mode 100644 index 0000000..9acd217 --- /dev/null +++ b/src/main/java/com/alist/api/modules/user/dto/UserWithdrawStatusUpdateDto.java @@ -0,0 +1,11 @@ +package com.alist.api.modules.user.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserWithdrawStatusUpdateDto { + private Integer userTokenIdx; + private String withdrawStatus; +} diff --git a/src/main/java/com/alist/api/modules/user/form/UserWithdrawStatusUpdateForm.java b/src/main/java/com/alist/api/modules/user/form/UserWithdrawStatusUpdateForm.java new file mode 100644 index 0000000..c8e8b67 --- /dev/null +++ b/src/main/java/com/alist/api/modules/user/form/UserWithdrawStatusUpdateForm.java @@ -0,0 +1,28 @@ +package com.alist.api.modules.user.form; + +import com.alist.api.modules.user.dto.UserWithdrawStatusUpdateDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "사용자 탈퇴 상태 변경 요청 폼") +@Getter +@Setter +public class UserWithdrawStatusUpdateForm { + @Schema( + description = "탈퇴 상태. P: 탈퇴대기, N: 탈퇴요청 철회", + example = "P", + requiredMode = Schema.RequiredMode.REQUIRED + ) + @NotBlank(message = "탈퇴 상태는 필수입니다.") + @Pattern(regexp = "^[PN]$", message = "탈퇴 상태는 P 또는 N만 가능합니다.") + private String withdrawStatus; + + public UserWithdrawStatusUpdateDto toUserWithdrawStatusUpdateDto() { + UserWithdrawStatusUpdateDto userWithdrawStatusUpdateDto = new UserWithdrawStatusUpdateDto(); + userWithdrawStatusUpdateDto.setWithdrawStatus(withdrawStatus); + return userWithdrawStatusUpdateDto; + } +} diff --git a/src/main/java/com/alist/api/modules/user/mapper/UserMapper.java b/src/main/java/com/alist/api/modules/user/mapper/UserMapper.java index 77b42d5..45f4633 100644 --- a/src/main/java/com/alist/api/modules/user/mapper/UserMapper.java +++ b/src/main/java/com/alist/api/modules/user/mapper/UserMapper.java @@ -1,9 +1,6 @@ package com.alist.api.modules.user.mapper; -import com.alist.api.modules.user.dto.UserDto; -import com.alist.api.modules.user.dto.UserPasswordChangeDto; -import com.alist.api.modules.user.dto.UserProfileUpdateDto; -import com.alist.api.modules.user.dto.UserTokenDto; +import com.alist.api.modules.user.dto.*; import com.alist.api.modules.user.vo.UserVo; import org.apache.ibatis.annotations.Mapper; @@ -15,11 +12,11 @@ public interface UserMapper { int insertUserTokenSignup(UserTokenDto userTokenDto); - UserVo selectUserByUserIdx(Integer userIdx); - UserVo selectUserByUserTokenIdx(Integer userTokenIdx); int updateUserPassword(UserPasswordChangeDto userPasswordChangeDto); int updateUserProfile(UserProfileUpdateDto userProfileUpdateDto); + + int updateWithdrawStatus(UserWithdrawStatusUpdateDto userWithdrawStatusUpdateDto); } diff --git a/src/main/java/com/alist/api/modules/user/service/UserService.java b/src/main/java/com/alist/api/modules/user/service/UserService.java index 92eac85..af408d1 100644 --- a/src/main/java/com/alist/api/modules/user/service/UserService.java +++ b/src/main/java/com/alist/api/modules/user/service/UserService.java @@ -120,7 +120,7 @@ public class UserService { return result; } - UserVo userVo = userMapper.selectUserByUserIdx(userPasswordCheckDto.getUserTokenIdx()); + UserVo userVo = userMapper.selectUserByUserTokenIdx(userPasswordCheckDto.getUserTokenIdx()); if (userVo == null || userVo.getPassword() == null) { result.setPasswordMatched(false); @@ -227,4 +227,33 @@ public class UserService { return result; } + + @Transactional + public UserWithdrawStatusUpdateVo updateWithdrawStatus(UserWithdrawStatusUpdateDto userWithdrawStatusUpdateDto) { + UserWithdrawStatusUpdateVo result = new UserWithdrawStatusUpdateVo(); + + Integer userTokenIdx = SecurityUtil.getLoginUserTokenIdx(); + userWithdrawStatusUpdateDto.setUserTokenIdx(userTokenIdx); + + if (userTokenIdx == null || userWithdrawStatusUpdateDto.getWithdrawStatus() == null) { + result.setWithdrawStatusUpdated(false); + result.setResultCode(4003); + return result; + } + + String withdrawStatus = userWithdrawStatusUpdateDto.getWithdrawStatus(); + + if (!"P".equals(withdrawStatus) && !"N".equals(withdrawStatus)) { + result.setWithdrawStatusUpdated(false); + result.setResultCode(4001); + return result; + } + + int updateCount = userMapper.updateWithdrawStatus(userWithdrawStatusUpdateDto); + + result.setWithdrawStatusUpdated(updateCount > 0); + result.setResultCode(updateCount > 0 ? 2005 : 2003); + + return result; + } } diff --git a/src/main/java/com/alist/api/modules/user/vo/UserWithdrawStatusUpdateVo.java b/src/main/java/com/alist/api/modules/user/vo/UserWithdrawStatusUpdateVo.java new file mode 100644 index 0000000..633db4a --- /dev/null +++ b/src/main/java/com/alist/api/modules/user/vo/UserWithdrawStatusUpdateVo.java @@ -0,0 +1,18 @@ +package com.alist.api.modules.user.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "사용자 탈퇴 상태 변경 응답") +@Getter +@Setter +public class UserWithdrawStatusUpdateVo { + @Schema(description = "탈퇴 상태 변경 여부", example = "true") + private boolean withdrawStatusUpdated; + + @JsonIgnore + @Schema(hidden = true) + private Integer resultCode; +} diff --git a/src/main/resources/mapper/User/UserMapper.xml b/src/main/resources/mapper/User/UserMapper.xml index 8611ea2..92f2b7c 100644 --- a/src/main/resources/mapper/User/UserMapper.xml +++ b/src/main/resources/mapper/User/UserMapper.xml @@ -35,6 +35,22 @@ WHERE ATUT.user_token_idx = #{userTokenIdx} AND ATU.del_yn = 1 + + /*UserMapper.updateWithdrawStatus*/ + UPDATE ALISTLMS.test_user ATU + INNER JOIN ALISTLMS.test_user_token ATUT ON ATUT.user_idx = ATU.user_idx + SET ATU.withdraw_status = #{withdrawStatus} + , ATU.withdraw_at = + CASE + WHEN #{withdrawStatus} = 'P' THEN now() + WHEN #{withdrawStatus} = 'N' THEN NULL + ELSE ATU.withdraw_at + END + , ATU.update_at = now() + WHERE ATUT.user_token_idx = #{userTokenIdx} + AND ATU.del_yn = 1 + AND ATU.withdraw_status != 'Y' + - -