From fd9cacae082827e641cc40f6eb184e17f739c2db Mon Sep 17 00:00:00 2001 From: aram-su Date: Thu, 17 Oct 2024 19:51:17 +0900 Subject: [PATCH 1/2] =?UTF-8?q?NB-241=20:=20feat=20-=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=ED=83=88=ED=87=B4=20=ED=9B=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=8B=9C=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. UserRepository - Boolean existsByEmailAndIsDeletedTrue(String email) 메소드 추가 - soft delete된 계정 확인 2. UserService - void checkIfUserIsDeleted(String email) 메소드 추가 - 삭제된 계정 확인 및 DeletedUserSignupAttemptException 발생 3. 소셜 로그인 서비스 수정 - AppleOAuthLoginService, GoogleOAuthLoginService - 회원가입 및 로그인 시 삭제된 유저 검증 로직 추가 4. DeletedUserSignupAttemptException 추가 - 삭제된 계정 로그인 시도 시 발생하는 커스텀 예외 --- .../com/soyeon/nubim/domain/user/UserRepository.java | 3 +++ .../java/com/soyeon/nubim/domain/user/UserService.java | 7 +++++++ .../exception/DeletedUserSignupAttemptException.java | 10 ++++++++++ .../nubim/security/oauth/AppleOAuthLoginService.java | 1 + .../nubim/security/oauth/GoogleOAuthLoginService.java | 1 + 5 files changed, 22 insertions(+) create mode 100644 src/main/java/com/soyeon/nubim/domain/user/exception/DeletedUserSignupAttemptException.java diff --git a/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java b/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java index 8893963..38d2f3c 100644 --- a/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java +++ b/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java @@ -24,6 +24,9 @@ public interface UserRepository extends JpaRepository { Boolean existsByNickname(String nickname); + @Query(value = "SELECT CASE WHEN COUNT(*) > 0 THEN true ELSE false END FROM users WHERE email = :email", nativeQuery = true) + Boolean existsByEmailAndIsDeletedTrue(String email); + Page findByNicknameStartsWith(Pageable pageable, String query); @Modifying diff --git a/src/main/java/com/soyeon/nubim/domain/user/UserService.java b/src/main/java/com/soyeon/nubim/domain/user/UserService.java index afdd8d4..d6abb48 100644 --- a/src/main/java/com/soyeon/nubim/domain/user/UserService.java +++ b/src/main/java/com/soyeon/nubim/domain/user/UserService.java @@ -20,6 +20,7 @@ import com.soyeon.nubim.domain.user.dto.ProfileUpdateRequest; import com.soyeon.nubim.domain.user.dto.ProfileUpdateResponse; import com.soyeon.nubim.domain.user.dto.UserProfileResponseDto; +import com.soyeon.nubim.domain.user.exception.DeletedUserSignupAttemptException; import com.soyeon.nubim.domain.user.exception.InvalidNicknameFormatException; import com.soyeon.nubim.domain.user.exception.MultipleProfileUpdateException; import com.soyeon.nubim.domain.user.exception.NicknameAlreadyExistsException; @@ -151,6 +152,12 @@ public ProfileUpdateResponse updateProfile(ProfileUpdateRequest updateRequest) { throw new MultipleProfileUpdateException(); } + public void checkIfUserIsDeleted(String email) { + if (userRepository.existsByEmailAndIsDeletedTrue(email)) { + throw new DeletedUserSignupAttemptException(email); + } + } + private void validateProfileImageContentType(String contentType) { if (contentType == null || !contentType.equals("image/png")) { throw new UnsupportedProfileImageTypeException(contentType); diff --git a/src/main/java/com/soyeon/nubim/domain/user/exception/DeletedUserSignupAttemptException.java b/src/main/java/com/soyeon/nubim/domain/user/exception/DeletedUserSignupAttemptException.java new file mode 100644 index 0000000..d8d786f --- /dev/null +++ b/src/main/java/com/soyeon/nubim/domain/user/exception/DeletedUserSignupAttemptException.java @@ -0,0 +1,10 @@ +package com.soyeon.nubim.domain.user.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + +public class DeletedUserSignupAttemptException extends ResponseStatusException { + public DeletedUserSignupAttemptException(String email) { + super(HttpStatus.FORBIDDEN, "deleted account : " + email); + } +} \ No newline at end of file diff --git a/src/main/java/com/soyeon/nubim/security/oauth/AppleOAuthLoginService.java b/src/main/java/com/soyeon/nubim/security/oauth/AppleOAuthLoginService.java index 94a9ffc..7bf0878 100644 --- a/src/main/java/com/soyeon/nubim/security/oauth/AppleOAuthLoginService.java +++ b/src/main/java/com/soyeon/nubim/security/oauth/AppleOAuthLoginService.java @@ -79,6 +79,7 @@ private User upsertUserFromAppleUserInfo(User user) { existingUser.updateNameFromOAuthProfile(user.getUsername()); return userService.saveUser(existingUser); } catch (UserNotFoundException e) { + userService.checkIfUserIsDeleted(user.getEmail()); return userService.saveUser(user); } } diff --git a/src/main/java/com/soyeon/nubim/security/oauth/GoogleOAuthLoginService.java b/src/main/java/com/soyeon/nubim/security/oauth/GoogleOAuthLoginService.java index 948795e..0310bc7 100644 --- a/src/main/java/com/soyeon/nubim/security/oauth/GoogleOAuthLoginService.java +++ b/src/main/java/com/soyeon/nubim/security/oauth/GoogleOAuthLoginService.java @@ -66,6 +66,7 @@ private User upsertUserFromGoogleUserInfo(GoogleUserInfo userInfo) { oAuthLoginCommons.validateUserProvider(user, Provider.GOOGLE); user = user.updateNameFromOAuthProfile(userInfo.getName()); } catch (UserNotFoundException e) { + userService.checkIfUserIsDeleted(userInfo.getEmail()); user = userInfo.toUserEntity(); } return userService.saveUser(user); From bbe5332c9a6b58842c7871bc0adceb2ce03819d6 Mon Sep 17 00:00:00 2001 From: aram-su Date: Fri, 18 Oct 2024 11:21:29 +0900 Subject: [PATCH 2/2] =?UTF-8?q?NB-241=20:=20refactor=20-=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=9C=A0=EC=A0=80=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. UserRepository - existsByEmailAndIsDeletedTrue(String email) 메소드 쿼리 수정 - case문에서 exists로 수정하여 더 효율적인 쿼리로 수정함 --- src/main/java/com/soyeon/nubim/domain/user/UserRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java b/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java index 38d2f3c..5c63a76 100644 --- a/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java +++ b/src/main/java/com/soyeon/nubim/domain/user/UserRepository.java @@ -24,7 +24,7 @@ public interface UserRepository extends JpaRepository { Boolean existsByNickname(String nickname); - @Query(value = "SELECT CASE WHEN COUNT(*) > 0 THEN true ELSE false END FROM users WHERE email = :email", nativeQuery = true) + @Query(value = "SELECT EXISTS(SELECT 1 FROM users WHERE email = :email AND is_deleted = true)", nativeQuery = true) Boolean existsByEmailAndIsDeletedTrue(String email); Page findByNicknameStartsWith(Pageable pageable, String query);