diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt index 5d3fe966..4f04be7f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt @@ -6,6 +6,7 @@ import kr.co.vividnext.sodalive.fcm.PushTokenService import kr.co.vividnext.sodalive.i18n.LangContext import kr.co.vividnext.sodalive.i18n.SodaMessageSource import kr.co.vividnext.sodalive.jwt.TokenProvider +import kr.co.vividnext.sodalive.member.MemberKind import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.login.LoginRequest @@ -70,6 +71,10 @@ class CreatorAdminMemberService( throw SodaException(messageKey = "creator.admin.member.inactive_account") } + if (member.memberKind == MemberKind.AI_CHARACTER) { + throw SodaException(messageKey = "common.error.bad_credentials") + } + if (member.role != MemberRole.CREATOR && member.role != MemberRole.AGENT) { throw SodaException(messageKey = "common.error.bad_credentials") } 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 9f65dae9..a6e790ff 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -339,6 +339,10 @@ class MemberService( throw SodaException(messageKey = "member.validation.inactive_account") } + if (member.memberKind == MemberKind.AI_CHARACTER) { + throw SodaException(messageKey = "common.error.bad_credentials") + } + if (member.provider != MemberProvider.EMAIL) { val provider = resolveProviderLabel(member.provider) throw SodaException(message = formatMessage("member.validation.email_registered_with_provider", provider)) diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberServiceTest.kt new file mode 100644 index 00000000..40e1240c --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberServiceTest.kt @@ -0,0 +1,49 @@ +package kr.co.vividnext.sodalive.creator.admin.member + +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberKind +import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.member.MemberRole +import kr.co.vividnext.sodalive.member.login.LoginRequest +import kr.co.vividnext.sodalive.support.EmbeddedRedisInitializer +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertThrows +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ContextConfiguration +import org.springframework.transaction.annotation.Transactional +import javax.persistence.EntityManager + +@SpringBootTest +@Transactional +@ContextConfiguration(initializers = [EmbeddedRedisInitializer::class]) +class CreatorAdminMemberServiceTest @Autowired constructor( + private val service: CreatorAdminMemberService, + private val memberRepository: MemberRepository, + private val entityManager: EntityManager +) { + @Test + @DisplayName("AI 캐릭터용 Member는 크리에이터 관리자 로그인할 수 없다") + fun shouldRejectAiCharacterMemberCreatorAdminLogin() { + val member = memberRepository.save( + Member( + email = "ai-character-creator-admin@test.com", + password = "", + nickname = "AI 캐릭터 관리자", + role = MemberRole.CREATOR, + memberKind = MemberKind.AI_CHARACTER + ) + ) + entityManager.flush() + entityManager.clear() + + val exception = assertThrows(SodaException::class.java) { + service.login(LoginRequest(email = member.email!!, password = "password")) + } + + assertEquals("common.error.bad_credentials", exception.messageKey) + } +} diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/member/MemberServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/member/MemberServiceTest.kt new file mode 100644 index 00000000..e121cc68 --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/member/MemberServiceTest.kt @@ -0,0 +1,45 @@ +package kr.co.vividnext.sodalive.member + +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.login.LoginRequest +import kr.co.vividnext.sodalive.support.EmbeddedRedisInitializer +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertThrows +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ContextConfiguration +import org.springframework.transaction.annotation.Transactional +import javax.persistence.EntityManager + +@SpringBootTest +@Transactional +@ContextConfiguration(initializers = [EmbeddedRedisInitializer::class]) +class MemberServiceTest @Autowired constructor( + private val service: MemberService, + private val memberRepository: MemberRepository, + private val entityManager: EntityManager +) { + @Test + @DisplayName("AI 캐릭터용 Member는 일반 로그인할 수 없다") + fun shouldRejectAiCharacterMemberLoginBeforeAuthentication() { + val member = memberRepository.save( + Member( + email = "ai-character-login@test.com", + password = "", + nickname = "AI 캐릭터 로그인", + role = MemberRole.CREATOR, + memberKind = MemberKind.AI_CHARACTER + ) + ) + entityManager.flush() + entityManager.clear() + + val exception = assertThrows(SodaException::class.java) { + service.login(LoginRequest(email = member.email!!, password = "password")) + } + + assertEquals("common.error.bad_credentials", exception.messageKey) + } +}