diff --git a/src/main/java/com/sumte/apiPayload/code/error/CommonErrorCode.java b/src/main/java/com/sumte/apiPayload/code/error/CommonErrorCode.java index d9eb8c9..83fa4a9 100644 --- a/src/main/java/com/sumte/apiPayload/code/error/CommonErrorCode.java +++ b/src/main/java/com/sumte/apiPayload/code/error/CommonErrorCode.java @@ -18,22 +18,25 @@ public enum CommonErrorCode implements ErrorCode { USER_NOT_FOUND(HttpStatus.NOT_FOUND, "COMMON404", "사용자를 찾을 수 없습니다"), METHOD_NOT_ALLOWED(HttpStatus.METHOD_NOT_ALLOWED, "COMMON405", "허용되지 않는 HTTP Method입니다."), - // GUESTHOUSE4XX - DUPLICATE_DATA(HttpStatus.BAD_REQUEST, "GUESTHOUSE401", "중복된 게스트하우스 입니다."), - NOT_EXIST(HttpStatus.BAD_REQUEST, "GUESTHOUSE402", "존재하지 않는 게스트하우스 입니다."), - OPTIONSERVICE_NOT_EXIST(HttpStatus.BAD_REQUEST, "GUESTHOUSE403", "존재하지 않는 부가 서비스 입니다."), - TARGETAUDIENCE_NOT_EXIST(HttpStatus.BAD_REQUEST, "GUESTHOUSE404", "존재하지 않는 이용대상 입니다."), + // GUESTHOUSE4XX + DUPLICATE_DATA(HttpStatus.BAD_REQUEST, "GUESTHOUSE401", "중복된 게스트하우스 입니다."), + NOT_EXIST(HttpStatus.BAD_REQUEST, "GUESTHOUSE402", "존재하지 않는 게스트하우스 입니다."), + OPTIONSERVICE_NOT_EXIST(HttpStatus.BAD_REQUEST, "GUESTHOUSE403", "존재하지 않는 부가 서비스 입니다."), + TARGETAUDIENCE_NOT_EXIST(HttpStatus.BAD_REQUEST, "GUESTHOUSE404", "존재하지 않는 이용대상 입니다."), - // ROOM4XX - ALREADY_EXIST(HttpStatus.BAD_REQUEST, "ROOM401", "이미 같은 방이 존재합니다."), - NOT_EXIST_ROOM(HttpStatus.BAD_REQUEST, "ROOM402", "존재하지 않는 방입니다."), + // ROOM4XX + ALREADY_EXIST(HttpStatus.BAD_REQUEST, "ROOM401", "이미 같은 방이 존재합니다."), + NOT_EXIST_ROOM(HttpStatus.BAD_REQUEST, "ROOM402", "존재하지 않는 방입니다."), // COMMON 5XX INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "COMMON500", "서버 내부 오류입니다."), - // page 처리 관련 - PAGE_UNDER_ONE(HttpStatus.BAD_REQUEST,"PAGE_4001","페이지는 1이상으로 입력해야 합니다."), - PAGE_SIZE_UNDER_ONE(HttpStatus.BAD_REQUEST,"PAGE_4002","페이지 사이즈는 1이상으로 입력해야 합니다."); + // page 처리 관련 + PAGE_UNDER_ONE(HttpStatus.BAD_REQUEST, "PAGE_4001", "페이지는 1이상으로 입력해야 합니다."), + PAGE_SIZE_UNDER_ONE(HttpStatus.BAD_REQUEST, "PAGE_4002", "페이지 사이즈는 1이상으로 입력해야 합니다."), + + //닉네임 중복 + DUPLICATE_NICKNAME(HttpStatus.CONFLICT, "USER401", "이미 사용 중인 닉네임입니다."); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/sumte/apiPayload/code/error/SecurityErrorCode.java b/src/main/java/com/sumte/apiPayload/code/error/SecurityErrorCode.java index b9b542c..9ef78fa 100644 --- a/src/main/java/com/sumte/apiPayload/code/error/SecurityErrorCode.java +++ b/src/main/java/com/sumte/apiPayload/code/error/SecurityErrorCode.java @@ -10,6 +10,7 @@ public enum SecurityErrorCode implements ErrorCode { IDENTIFIER_DUPLICATED(HttpStatus.BAD_REQUEST, "SECURITY400", "이미 존재하는 아이디입니다."), NICKNAME_DUPLICATED(HttpStatus.BAD_REQUEST, "SECURITY400", "이미 존재하는 닉네임입니다."), + EMAIL_DUPLICATED(HttpStatus.BAD_REQUEST, "SECURITY400", "이미 존재하는 이메일입니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/sumte/security/controller/SignUpController.java b/src/main/java/com/sumte/security/controller/SignUpController.java index 4481be8..45a6258 100644 --- a/src/main/java/com/sumte/security/controller/SignUpController.java +++ b/src/main/java/com/sumte/security/controller/SignUpController.java @@ -46,4 +46,12 @@ public ResponseEntity> checkDuplicateNickname(@RequestParam( signUpService.checkDuplicatedNickname(nickname); return ResponseEntity.ok(ApiResponse.success("사용 가능한 닉네임입니다.")); } + + @Operation(summary = "이메일 중복 확인 API", description = "이메일 중복 확인 API입니다.") + @GetMapping("/duplicate/email") + public ResponseEntity> checkDuplicateEmail(@RequestParam("email") String email) { + signUpService.checkDuplicatedEmail(email); + return ResponseEntity.ok(ApiResponse.success("사용 가능한 이메일입니다.")); + } + } diff --git a/src/main/java/com/sumte/security/service/SignUpService.java b/src/main/java/com/sumte/security/service/SignUpService.java index afa55e3..67ed6e2 100644 --- a/src/main/java/com/sumte/security/service/SignUpService.java +++ b/src/main/java/com/sumte/security/service/SignUpService.java @@ -39,4 +39,10 @@ public void checkDuplicatedNickname(String nickname) { throw new SumteException(SecurityErrorCode.NICKNAME_DUPLICATED); } } + + public void checkDuplicatedEmail(String email) { + if (userRepository.findByEmail(email).isPresent()) { + throw new SumteException(SecurityErrorCode.EMAIL_DUPLICATED); + } + } } diff --git a/src/main/java/com/sumte/user/controller/UserController.java b/src/main/java/com/sumte/user/controller/UserController.java index e51818c..6651e3f 100644 --- a/src/main/java/com/sumte/user/controller/UserController.java +++ b/src/main/java/com/sumte/user/controller/UserController.java @@ -3,16 +3,20 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.sumte.apiPayload.ApiResponse; import com.sumte.security.authorization.UserId; +import com.sumte.user.dto.UserNicknameUpdateRequest; import com.sumte.user.dto.response.UserInfoResponse; import com.sumte.user.service.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -42,4 +46,15 @@ public ResponseEntity> deactivateUser( userService.deactivateUser(userId); return ResponseEntity.ok(ApiResponse.successWithNoData()); } + + //닉네임 중복확인 + @PatchMapping("/nickname") + @Operation(summary = "닉네임 수정 API", description = "사용자의 닉네임을 수정합니다.") + public ResponseEntity updateNickname( + @RequestBody @Valid UserNicknameUpdateRequest request, + @UserId Long userId + ) { + userService.updateNickname(userId, request.nickname()); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/sumte/user/dto/UserNicknameUpdateRequest.java b/src/main/java/com/sumte/user/dto/UserNicknameUpdateRequest.java new file mode 100644 index 0000000..23a06d0 --- /dev/null +++ b/src/main/java/com/sumte/user/dto/UserNicknameUpdateRequest.java @@ -0,0 +1,9 @@ +package com.sumte.user.dto; + +import jakarta.validation.constraints.NotBlank; + +public record UserNicknameUpdateRequest( + @NotBlank(message = "닉네임은 필수입니다.") + String nickname +) { +} \ No newline at end of file diff --git a/src/main/java/com/sumte/user/entity/User.java b/src/main/java/com/sumte/user/entity/User.java index fc15a76..e4e693e 100644 --- a/src/main/java/com/sumte/user/entity/User.java +++ b/src/main/java/com/sumte/user/entity/User.java @@ -64,4 +64,8 @@ public User(String loginId, String password, String name, String nickname, Strin this.email = email; this.status = status; } + + public void updateNickname(String nickname) { + this.nickname = nickname; + } } diff --git a/src/main/java/com/sumte/user/repository/UserRepository.java b/src/main/java/com/sumte/user/repository/UserRepository.java index 024a7bc..a5e6b6e 100644 --- a/src/main/java/com/sumte/user/repository/UserRepository.java +++ b/src/main/java/com/sumte/user/repository/UserRepository.java @@ -9,7 +9,9 @@ @Repository public interface UserRepository extends JpaRepository { - Optional findByLoginId(String loginId); + Optional findByLoginId(String loginId); - Optional findByNickname(String nickName); + Optional findByNickname(String nickName); + + Optional findByEmail(String email); } diff --git a/src/main/java/com/sumte/user/service/UserService.java b/src/main/java/com/sumte/user/service/UserService.java index 76915ce..6ed45e3 100644 --- a/src/main/java/com/sumte/user/service/UserService.java +++ b/src/main/java/com/sumte/user/service/UserService.java @@ -35,4 +35,19 @@ public void deactivateUser(Long userId) { user.deactivate(); } + + // 닉네임 수정 + @Transactional + public void updateNickname(Long userId, String nickname) { + // 중복검사를 위함 + userRepository.findByNickname(nickname).ifPresent(user -> { + throw new SumteException(CommonErrorCode.DUPLICATE_NICKNAME); + }); + + // 사용자 조회해서 닉네임 변경하기 + User user = userRepository.findById(userId) + .orElseThrow(() -> new SumteException(CommonErrorCode.USER_NOT_FOUND)); + + user.updateNickname(nickname); + } }