diff --git a/boot/api/src/main/java/com/clip/api/docs/user/UserAccountDocs.java b/boot/api/src/main/java/com/clip/api/docs/user/UserAccountDocs.java index f83cc9e4..5ba3c601 100644 --- a/boot/api/src/main/java/com/clip/api/docs/user/UserAccountDocs.java +++ b/boot/api/src/main/java/com/clip/api/docs/user/UserAccountDocs.java @@ -124,6 +124,26 @@ void updateName(@RequestBody UpdateNameDto updateNameDto, void updateNickname(@RequestBody UpdateNicknameDto updateNicknameDto, @AuthenticationPrincipal UserDetails userDetails); + @Operation( + summary = "사용 가능한 닉네임 확인 API", + description = """ + 해당 닉네임이 사용 가능한지 확인합니다. + 다른 유저가 사용중인 닉네임일 경우 HTTP 400 Bad Request를 반환합니다. + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사용 가능한 닉네임" + ), + @ApiResponse( + responseCode = "400", + description = "사용 불가능한 닉네임" + ) + }) + @PostMapping("/nickname/available") + void checkNicknameAvailable(@RequestBody UpdateNicknameDto updateNicknameDto); + @Operation( summary = "유저 상세 정보 업데이트 API", description = """ diff --git a/boot/api/src/main/java/com/clip/api/user/controller/UserAccountController.java b/boot/api/src/main/java/com/clip/api/user/controller/UserAccountController.java index be66e713..099412dd 100644 --- a/boot/api/src/main/java/com/clip/api/user/controller/UserAccountController.java +++ b/boot/api/src/main/java/com/clip/api/user/controller/UserAccountController.java @@ -42,6 +42,11 @@ public void updateNickname(UpdateNicknameDto updateNicknameDto, userAccountService.updateNickname(Long.parseLong(userDetails.getUsername()), updateNicknameDto.getNickname()); } + @Override + public void checkNicknameAvailable(UpdateNicknameDto updateNicknameDto) { + userAccountService.checkNicknameAvailable(updateNicknameDto.getNickname()); + } + @Override public void updateUserDetailInfo(UpdateUserDetailInfoDto updateUserDetailInfoDto, UserDetails userDetails) { userAccountService.updateUserDetailInfo(Long.parseLong(userDetails.getUsername()), updateUserDetailInfoDto); diff --git a/boot/api/src/main/java/com/clip/api/user/service/UserAccountService.java b/boot/api/src/main/java/com/clip/api/user/service/UserAccountService.java index a0ef60df..90246da0 100644 --- a/boot/api/src/main/java/com/clip/api/user/service/UserAccountService.java +++ b/boot/api/src/main/java/com/clip/api/user/service/UserAccountService.java @@ -2,7 +2,6 @@ import com.clip.api.user.controller.dto.LoginDto; import com.clip.api.user.controller.dto.SignupDto; -import com.clip.api.user.controller.dto.UpdateNicknameDto; import com.clip.api.user.controller.dto.UpdateUserDetailInfoDto; import com.clip.api.user.controller.dto.UserInfoDto; import com.clip.api.user.exception.NotFoundUserException; @@ -11,6 +10,7 @@ import com.clip.auth.service.TokenService; import com.clip.global.config.jwt.TokenProvider; import com.clip.user.entity.User; +import com.clip.user.exception.NicknameAlreadyExistsException; import com.clip.user.service.TermsAcceptanceService; import com.clip.user.service.UserService; import lombok.RequiredArgsConstructor; @@ -92,4 +92,10 @@ public UserInfoDto getUserInfo(String phoneNumber) { .platform(user.getPlatform()) .build(); } + + public void checkNicknameAvailable(String nickname) { + if (userService.isExistNickname(nickname)) { + throw new NicknameAlreadyExistsException(); + } + } } diff --git a/boot/api/src/test/java/boot/api/com/clip/api/user/service/UserAccountServiceTest.java b/boot/api/src/test/java/boot/api/com/clip/api/user/service/UserAccountServiceTest.java index 1caae906..2814d334 100644 --- a/boot/api/src/test/java/boot/api/com/clip/api/user/service/UserAccountServiceTest.java +++ b/boot/api/src/test/java/boot/api/com/clip/api/user/service/UserAccountServiceTest.java @@ -322,4 +322,16 @@ void updateUserDetailInfo() { gender ); } + + @DisplayName("사용중인 닉네임이면 NicknameAlreadyExistsException이 발생한다.") + @Test + void checkNicknameAvailable() { + //given + String nickname = "닉네임"; + userService.save(User.builder().nickname(nickname).build()); + + //when & then + assertThatThrownBy(() -> userAccountService.checkNicknameAvailable(nickname)) + .isInstanceOf(NicknameAlreadyExistsException.class); + } } diff --git a/boot/api/src/test/java/data/coredata/com/clip/user/entity/repository/UserRepositoryTest.java b/boot/api/src/test/java/data/coredata/com/clip/user/entity/repository/UserRepositoryTest.java index 2beab4b9..57e0b154 100644 --- a/boot/api/src/test/java/data/coredata/com/clip/user/entity/repository/UserRepositoryTest.java +++ b/boot/api/src/test/java/data/coredata/com/clip/user/entity/repository/UserRepositoryTest.java @@ -164,4 +164,18 @@ void findUser() { //then assertThat(foundUser).isEqualTo(user); } + + @DisplayName("nickname이 존재하는지 확인한다.") + @Test + void existsByNickname() { + //given + String nickname = "닉네임"; + userRepository.save(User.builder().nickname(nickname).build()); + + //when + boolean exists = userRepository.existsByNickname(nickname); + + //then + assertThat(exists).isTrue(); + } } diff --git a/data/core-data/src/main/java/com/clip/user/repository/UserRepository.java b/data/core-data/src/main/java/com/clip/user/repository/UserRepository.java index c3a950ed..243b3906 100644 --- a/data/core-data/src/main/java/com/clip/user/repository/UserRepository.java +++ b/data/core-data/src/main/java/com/clip/user/repository/UserRepository.java @@ -59,4 +59,6 @@ void updateUserDetailInfo( @Query("select u from User u where u.phoneNumber = :phoneNumber") Optional findUser(@Param("phoneNumber") String phoneNumber); + + boolean existsByNickname(String nickname); } diff --git a/data/core-data/src/main/java/com/clip/user/service/UserService.java b/data/core-data/src/main/java/com/clip/user/service/UserService.java index 0bbfcacf..9517a7b7 100644 --- a/data/core-data/src/main/java/com/clip/user/service/UserService.java +++ b/data/core-data/src/main/java/com/clip/user/service/UserService.java @@ -57,4 +57,8 @@ public User findUser(String phoneNumber) { return userRepository.findUser(phoneNumber) .orElseThrow(UserNotFoundException::new); } + + public boolean isExistNickname(String nickname) { + return userRepository.existsByNickname(nickname); + } }