diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/exception/UserException.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/exception/UserException.kt new file mode 100644 index 00000000..05cf705d --- /dev/null +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/exception/UserException.kt @@ -0,0 +1,16 @@ +package com.bamyanggang.domainmodule.domain.user.exception + +import com.bamyanggang.commonmodule.exception.CustomException + +sealed class UserException( + errorCode: Int, + message: String, +) : CustomException(CODE_PREFIX, errorCode, message) { + + class DuplicatedUser(message: String = "이미 존재하는 유저입니다.") : + UserException(errorCode = 1, message = message) + + companion object { + const val CODE_PREFIX = "USER" + } +} diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/repository/UserRepository.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/repository/UserRepository.kt index 27a74dc5..09e19b80 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/repository/UserRepository.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/repository/UserRepository.kt @@ -11,4 +11,6 @@ interface UserRepository { fun findById(userId: UUID): User -} \ No newline at end of file + fun existsBySocialId(socialId: String): Boolean + +} diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt index aca24335..cbd33b14 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt @@ -2,6 +2,7 @@ package com.bamyanggang.domainmodule.domain.user.service import com.bamyanggang.domainmodule.domain.user.aggregate.User import com.bamyanggang.domainmodule.domain.user.enums.SocialLoginProvider +import com.bamyanggang.domainmodule.domain.user.exception.UserException import com.bamyanggang.domainmodule.domain.user.repository.UserRepository class UserAppender( @@ -18,6 +19,7 @@ class UserAppender( goal: String?, dream: String? ): User { + if(userRepository.existsBySocialId(socialId)) {throw UserException.DuplicatedUser()} return User.create( socialId = socialId, profileImgUrl = profileImgUrl, diff --git a/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppenderTest.kt b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppenderTest.kt new file mode 100644 index 00000000..8593224c --- /dev/null +++ b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppenderTest.kt @@ -0,0 +1,53 @@ +package com.bamyanggang.domainmodule.domain.user.service + +import com.bamyanggang.domainmodule.domain.user.enums.SocialLoginProvider +import com.bamyanggang.domainmodule.domain.user.exception.UserException +import com.bamyanggang.domainmodule.domain.user.repository.UserRepository +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify + +class UserAppenderTest : BehaviorSpec({ + val mockUserRepository = mockk(relaxed = true) + val userAppender = UserAppender(mockUserRepository) + val socialId = "socialId" + val profileImgUrl = "profileImgUrl" + val provider = SocialLoginProvider.KAKAO + val email = "email" + val nickName = "nickName" + val jobSearchStatus = "jobSearchStatus" + val desiredJob = "desiredJob" + val goal = "goal" + val dream = "dream" + + Given("a social id, profile image url, provider, email, nickname, job search status, desired job, goal, and dream") { + every { mockUserRepository.existsBySocialId(socialId) } returns false + + When("appendUser is called") { + userAppender.appendUser(socialId, profileImgUrl, provider, email, nickName, jobSearchStatus, desiredJob, goal, dream) + + Then("a new user should be created and saved") { + verify { mockUserRepository.existsBySocialId(socialId) } + verify { mockUserRepository.save(any()) } + } + } + } + + Given("a social id that already exists") { + every { mockUserRepository.existsBySocialId(socialId) } returns true + + When("appendUser is called") { + val exception = shouldThrow { + userAppender.appendUser(socialId, profileImgUrl, provider, email, nickName, jobSearchStatus, desiredJob, goal, dream) + } + + Then("a DuplicatedUser exception should be thrown") { + verify { mockUserRepository.existsBySocialId(socialId) } + assert(exception.message == "이미 존재하는 유저입니다.") + } + } + } + +}) diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/UserRepositoryImpl.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/UserRepositoryImpl.java index 497b7812..04d62d13 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/UserRepositoryImpl.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/UserRepositoryImpl.java @@ -32,9 +32,15 @@ public User findBySocialId(String socialId) { } @Override - public User findById(@NotNull UUID userId) { + public User findById(UUID userId) { return userJpaRepository.findByUserId(userId) .map(userMapper::toDomainEntity) .orElseThrow(() -> new PersistenceException.NotFound()); } -} \ No newline at end of file + + @Override + public boolean existsBySocialId(String socialId) { + return userJpaRepository.existsBySocialId(socialId); + } + +} diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/jpa/repository/UserJpaRepository.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/jpa/repository/UserJpaRepository.java index 0b909d46..071badee 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/jpa/repository/UserJpaRepository.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/user/jpa/repository/UserJpaRepository.java @@ -10,4 +10,6 @@ public interface UserJpaRepository extends JpaRepository { Optional findByUserId(UUID id); + boolean existsBySocialId(String socialId); + }