From a9c68f9971aca1590c9e709334ba78590f750986 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 8 Apr 2025 15:32:45 +0900 Subject: [PATCH] =?UTF-8?q?=EC=86=8C=EC=85=9C=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8,=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20-=20?= =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=B2=B4=ED=81=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95=20-=20=EC=9D=B4=EB=AF=B8=20?= =?UTF-8?q?=EA=B0=80=EC=9E=85=EB=90=9C=20=EA=B3=84=EC=A0=95=EC=9D=B8=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=95=88=EB=82=B4=20=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EC=9E=90=EC=84=B8=ED=9E=88=20=EC=95=88=EB=82=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/member/MemberRepository.kt | 9 --- .../sodalive/member/MemberService.kt | 74 +++++++++++++++++-- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt index 4d7ead6..c7826ba 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt @@ -62,7 +62,6 @@ interface MemberQueryRepository { fun getMemberProfile(memberId: Long, myMemberId: Long): GetMemberProfileResponse - fun existsByEmail(email: String): Boolean fun existsByNickname(nickname: String): Boolean fun findNicknamesWithPrefix(prefix: String): List } @@ -486,14 +485,6 @@ class MemberQueryRepositoryImpl( .fetchFirst() } - override fun existsByEmail(email: String): Boolean { - return queryFactory - .selectOne() - .from(member) - .where(member.email.eq(email)) - .fetchFirst() != null - } - override fun existsByNickname(nickname: String): Boolean { return queryFactory .selectOne() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 93cf16e..a1162d1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -286,11 +286,22 @@ class MemberService( isAdmin: Boolean = false, isCreator: Boolean = false ): LoginResponse { - val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.") + val member = repository.findByEmail(email = email) ?: throw SodaException("없는 계정입니다.") + if (!member.isActive) { throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.") } + if (member.provider != MemberProvider.EMAIL) { + val provider = when (member.provider) { + MemberProvider.APPLE -> "애플" + MemberProvider.GOOGLE -> "구글" + else -> "카카오" + } + + throw SodaException("해당 이메일은 $provider 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.") + } + if (isCreator && member.role != MemberRole.CREATOR) { throw SodaException("로그인 정보를 확인해주세요.") } @@ -380,8 +391,23 @@ class MemberService( fun duplicateCheckEmail(email: String): ApiResponse { validateEmail(email) - if (repository.existsByEmail(email)) { - throw SodaException("이미 사용중인 이메일 입니다.", "email") + val findMember = repository.findByEmail(email) + + if (findMember != null) { + if (findMember.provider == MemberProvider.EMAIL) { + throw SodaException("이미 사용중인 이메일 입니다.", "email") + } else { + val provider = when (findMember.provider) { + MemberProvider.APPLE -> "애플" + MemberProvider.GOOGLE -> "구글" + else -> "카카오" + } + + throw SodaException( + "해당 이메일은 $provider 계정으로 이미 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.", + "email" + ) + } } return ApiResponse.ok(message = "사용 가능한 이메일 입니다.") @@ -741,7 +767,14 @@ class MemberService( @Transactional fun findOrRegister(googleUserInfo: GoogleUserInfo, container: String, marketingPid: String?): Member { - repository.findByGoogleId(googleUserInfo.sub)?.let { return it } + val findMember = repository.findByGoogleId(googleUserInfo.sub) + if (findMember != null) { + if (findMember.isActive) { + return findMember + } else { + throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.") + } + } val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID) ?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.") @@ -749,10 +782,13 @@ class MemberService( val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID) ?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.") + val email = googleUserInfo.email + checkEmail(email) + val nickname = nicknameGenerateService.generateUniqueNickname() val member = Member( googleId = googleUserInfo.sub, - email = googleUserInfo.email, + email = email, password = "", nickname = nickname, profileImage = "profile/default-profile.png", @@ -774,7 +810,14 @@ class MemberService( @Transactional fun findOrRegister(kakaoUserInfo: KakaoUserInfo, container: String, marketingPid: String?): Member { - repository.findByKakaoId(kakaoUserInfo.id)?.let { return it } + val findMember = repository.findByKakaoId(kakaoUserInfo.id) + if (findMember != null) { + if (findMember.isActive) { + return findMember + } else { + throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.") + } + } val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID) ?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.") @@ -782,10 +825,13 @@ class MemberService( val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID) ?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.") + val email = kakaoUserInfo.email + checkEmail(email) + val nickname = nicknameGenerateService.generateUniqueNickname() val member = Member( kakaoId = kakaoUserInfo.id, - email = kakaoUserInfo.email, + email = email, password = "", nickname = nickname, profileImage = "profile/default-profile.png", @@ -804,4 +850,18 @@ class MemberService( return member } + + private fun checkEmail(email: String) { + val member = repository.findByEmail(email) + + if (member != null) { + val provider = when (member.provider) { + MemberProvider.APPLE -> "애플" + MemberProvider.GOOGLE -> "구글" + else -> "카카오" + } + + throw SodaException("해당 이메일은 $provider 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.") + } + } }