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 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.") + } + } }