[api] 회원 탈퇴 관련 api 추가

This commit is contained in:
2026-05-20 09:00:06 +09:00
parent d5483b790d
commit b58a321482
8 changed files with 149 additions and 17 deletions
@@ -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();
}
}
@@ -120,4 +120,25 @@ public class UserController {
return ApiResponse.entity(result, ApiResponseCode.CODE_2005, "개인정보 수정");
}
@Operation(
summary = "사용자 탈퇴 상태 변경",
description = "로그인한 사용자의 탈퇴 요청 또는 탈퇴 요청 철회를 처리합니다. P: 탈퇴대기, N: 탈퇴요청 철회"
)
@PatchMapping("/withdraw")
public ResponseEntity<ApiResponse<UserWithdrawStatusUpdateVo>> 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, "탈퇴 상태 변경");
}
}
@@ -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;
}
@@ -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;
}
}
@@ -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);
}
@@ -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;
}
}
@@ -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;
}
+16 -10
View File
@@ -35,6 +35,22 @@
WHERE ATUT.user_token_idx = #{userTokenIdx}
AND ATU.del_yn = 1
</update>
<update id="updateWithdrawStatus">
/*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'
</update>
<select id="selectDuplicateUserCount" resultType="int">
/*UserMapper.selectDuplicateUserCount*/
@@ -43,16 +59,6 @@
where id = #{id}
</select>
<select id="selectUserByUserIdx" resultType="com.alist.api.modules.user.vo.UserVo">
/*UserMapper.selectUserByUserIdx*/
SELECT ATU.user_idx
, ATU.password
FROM ALISTLMS.test_user ATU
INNER JOIN ALISTLMS.test_user_token ATUT ON ATUT.user_idx = ATU.user_idx
WHERE ATUT.user_token_idx = #{userTokenIdx}
AND ATU.del_yn = 1
</select>
<select id="selectUserByUserTokenIdx" resultType="com.alist.api.modules.user.vo.UserVo">
/*UserMapper.selectUserByUserTokenIdx*/
SELECT ATU.user_idx