From 54431b0ed7864d3d78e6df28cda8b49bf24e2810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A7=80=EB=B9=88?= <80810278+yoonjibin@users.noreply.github.com> Date: Tue, 23 May 2023 15:05:00 +0900 Subject: [PATCH 1/5] =?UTF-8?q?:sparkles:=20Exists=20by=20email=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/AuthenticationQueryPersistenceAdapter.kt | 4 ++++ .../output/persistence/repository/AuthenticationRepository.kt | 1 + .../auth/application/port/output/QueryAuthenticationPort.kt | 1 + 3 files changed, 6 insertions(+) diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt index 5eea03d..d2b56e7 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt @@ -15,4 +15,8 @@ class AuthenticationQueryPersistenceAdapter( return authenticationEntity.toDomain(authenticationEntity) } + override fun existsByEmail(email: String): Boolean { + return authenticationRepository.existsByEmail(email) + } + } \ No newline at end of file diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt index 3d3d36a..3fdcc4d 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt @@ -5,4 +5,5 @@ import org.springframework.data.repository.CrudRepository interface AuthenticationRepository : CrudRepository { fun findByEmailOrNull(email: String): AuthenticationEntity + fun existsByEmail(email: String): Boolean } \ No newline at end of file diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/QueryAuthenticationPort.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/QueryAuthenticationPort.kt index c5cfb23..0181c80 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/QueryAuthenticationPort.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/QueryAuthenticationPort.kt @@ -4,4 +4,5 @@ import com.gsm.notdo.domain.auth.domain.Authentication interface QueryAuthenticationPort { fun findByEmailOrNull(email: String): Authentication + fun existsByEmail(email: String): Boolean } \ No newline at end of file From cf7d9e8894f2a5c1a821e4dc0a61e0e4268b00d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A7=80=EB=B9=88?= <80810278+yoonjibin@users.noreply.github.com> Date: Tue, 23 May 2023 15:12:44 +0900 Subject: [PATCH 2/5] =?UTF-8?q?:sparkles:=20Authentication=20not=20Found?= =?UTF-8?q?=20Exception=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/port/output/PasswordEncodePort.kt | 2 +- .../auth/application/service/SignUpService.kt | 2 +- .../exception/AuthenticationNotFoundException.kt | 6 ++++++ .../exception/error/AuthenticationErrorCode.kt | 14 ++++++++++++++ .../security/adapter/PasswordEncodeAdapter.kt | 2 +- 5 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/AuthenticationNotFoundException.kt create mode 100644 src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/error/AuthenticationErrorCode.kt diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/PasswordEncodePort.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/PasswordEncodePort.kt index 15a3225..445653e 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/PasswordEncodePort.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/application/port/output/PasswordEncodePort.kt @@ -1,4 +1,4 @@ -package com.gsm.notdo.domain.auth.port.output +package com.gsm.notdo.domain.auth.application.port.output interface PasswordEncodePort { fun encode(password: String): String diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt index 0d7604a..1c4eab0 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt @@ -5,7 +5,7 @@ import com.gsm.notdo.domain.auth.domain.RefreshToken import com.gsm.notdo.domain.auth.application.port.input.SignUpUseCase import com.gsm.notdo.domain.auth.application.port.input.dto.SignUpDto import com.gsm.notdo.domain.auth.application.port.output.JwtPort -import com.gsm.notdo.domain.auth.port.output.PasswordEncodePort +import com.gsm.notdo.domain.auth.application.port.output.PasswordEncodePort import com.gsm.notdo.domain.auth.port.output.dto.TokenDto import com.gsm.notdo.domain.user.domain.User import com.gsm.notdo.domain.user.domain.exception.UserAlreadyExistException diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/AuthenticationNotFoundException.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/AuthenticationNotFoundException.kt new file mode 100644 index 0000000..e0aae50 --- /dev/null +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/AuthenticationNotFoundException.kt @@ -0,0 +1,6 @@ +package com.gsm.notdo.domain.auth.domain.exception + +import com.gsm.notdo.domain.auth.domain.exception.error.AuthenticationErrorCode +import com.gsm.notdo.global.error.BasicException + +class AuthenticationNotFoundException : BasicException(AuthenticationErrorCode.AUTHENTICATION_NOT_FOUND) \ No newline at end of file diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/error/AuthenticationErrorCode.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/error/AuthenticationErrorCode.kt new file mode 100644 index 0000000..4f628be --- /dev/null +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/domain/exception/error/AuthenticationErrorCode.kt @@ -0,0 +1,14 @@ +package com.gsm.notdo.domain.auth.domain.exception.error + +import com.gsm.notdo.global.error.ErrorProperty + +enum class AuthenticationErrorCode( + private val message: String, + private val status: Int +) : ErrorProperty { + AUTHENTICATION_NOT_FOUND("authentication not found", 404); + + override fun status(): Int = status + + override fun message(): String = message +} \ No newline at end of file diff --git a/src/main/kotlin/com/gsm/notdo/global/security/adapter/PasswordEncodeAdapter.kt b/src/main/kotlin/com/gsm/notdo/global/security/adapter/PasswordEncodeAdapter.kt index 49d10c1..460a535 100644 --- a/src/main/kotlin/com/gsm/notdo/global/security/adapter/PasswordEncodeAdapter.kt +++ b/src/main/kotlin/com/gsm/notdo/global/security/adapter/PasswordEncodeAdapter.kt @@ -1,6 +1,6 @@ package com.gsm.notdo.global.security.adapter -import com.gsm.notdo.domain.auth.port.output.PasswordEncodePort +import com.gsm.notdo.domain.auth.application.port.output.PasswordEncodePort import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.stereotype.Component From 7af679d968c40802a0d4d949f8255cf25f49bc52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A7=80=EB=B9=88?= <80810278+yoonjibin@users.noreply.github.com> Date: Tue, 23 May 2023 16:06:57 +0900 Subject: [PATCH 3/5] =?UTF-8?q?:sparkles:=20User=20not=20verify=20exceptio?= =?UTF-8?q?n=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationQueryPersistenceAdapter.kt | 3 ++- .../persistence/repository/AuthenticationRepository.kt | 2 +- .../domain/auth/application/service/SignUpService.kt | 10 ++++++++++ .../user/domain/exception/UserNotVerifyException.kt | 6 ++++++ .../user/domain/exception/error/UserErrorCode.kt | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/UserNotVerifyException.kt diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt index d2b56e7..77a6615 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/AuthenticationQueryPersistenceAdapter.kt @@ -4,6 +4,7 @@ import com.gsm.notdo.domain.auth.apdater.output.persistence.mapper.toDomain import com.gsm.notdo.domain.auth.apdater.output.persistence.repository.AuthenticationRepository import com.gsm.notdo.domain.auth.application.port.output.QueryAuthenticationPort import com.gsm.notdo.domain.auth.domain.Authentication +import com.gsm.notdo.domain.auth.domain.exception.AuthenticationNotFoundException import org.springframework.stereotype.Component @Component @@ -11,7 +12,7 @@ class AuthenticationQueryPersistenceAdapter( private val authenticationRepository: AuthenticationRepository ) : QueryAuthenticationPort { override fun findByEmailOrNull(email: String): Authentication { - val authenticationEntity = authenticationRepository.findByEmailOrNull(email) + val authenticationEntity = authenticationRepository.findByEmailOrNull(email) ?: throw AuthenticationNotFoundException() return authenticationEntity.toDomain(authenticationEntity) } diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt index 3fdcc4d..3e3c749 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/apdater/output/persistence/repository/AuthenticationRepository.kt @@ -4,6 +4,6 @@ import com.gsm.notdo.domain.auth.apdater.output.persistence.entity.Authenticatio import org.springframework.data.repository.CrudRepository interface AuthenticationRepository : CrudRepository { - fun findByEmailOrNull(email: String): AuthenticationEntity + fun findByEmailOrNull(email: String): AuthenticationEntity? fun existsByEmail(email: String): Boolean } \ No newline at end of file diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt index 1c4eab0..3a2d56a 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt @@ -6,6 +6,8 @@ import com.gsm.notdo.domain.auth.application.port.input.SignUpUseCase import com.gsm.notdo.domain.auth.application.port.input.dto.SignUpDto import com.gsm.notdo.domain.auth.application.port.output.JwtPort import com.gsm.notdo.domain.auth.application.port.output.PasswordEncodePort +import com.gsm.notdo.domain.auth.application.port.output.QueryAuthenticationPort +import com.gsm.notdo.domain.auth.domain.exception.AuthenticationNotFoundException import com.gsm.notdo.domain.auth.port.output.dto.TokenDto import com.gsm.notdo.domain.user.domain.User import com.gsm.notdo.domain.user.domain.exception.UserAlreadyExistException @@ -22,16 +24,24 @@ class SignUpService( private val commandUserPort: CommandUserPort, private val passwordEncoderPort: PasswordEncodePort, private val commandRefreshTokenPort: CommandRefreshTokenPort, + private val queryAuthenticationPort: QueryAuthenticationPort, private val jwtPort: JwtPort ) : SignUpUseCase { override fun execute(dto: SignUpDto): TokenDto { val user = createUser(dto) val token = jwtPort.receiveToken(user.id) + validateAuthentication(dto.email) createRefreshToken(user, token) return token } + private fun validateAuthentication(email: String) { + val authentication = queryAuthenticationPort.findByEmailOrNull(email) + if(!authentication.isVerified) { + throw + } + } private fun createUser(dto: SignUpDto): User { val isExistUser = queryUserPort.existUserByEmail(dto.email) diff --git a/src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/UserNotVerifyException.kt b/src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/UserNotVerifyException.kt new file mode 100644 index 0000000..9e0e920 --- /dev/null +++ b/src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/UserNotVerifyException.kt @@ -0,0 +1,6 @@ +package com.gsm.notdo.domain.user.domain.exception + +import com.gsm.notdo.domain.user.domain.exception.error.UserErrorCode +import com.gsm.notdo.global.error.BasicException + +class UserNotVerifyException : BasicException(UserErrorCode.USER_NOT_VERIFIED) \ No newline at end of file diff --git a/src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/error/UserErrorCode.kt b/src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/error/UserErrorCode.kt index e593cef..44ab90f 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/error/UserErrorCode.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/user/domain/exception/error/UserErrorCode.kt @@ -7,6 +7,7 @@ enum class UserErrorCode( private val status: Int ) : ErrorProperty { USER_ALREADY_EXIST("user already exist", 400), + USER_NOT_VERIFIED("user not verify", 403), USER_NOT_FOUND("user not found", 404); override fun status(): Int = status From d6a82598f15ba91f5b909e4613ea547ff86b908f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A7=80=EB=B9=88?= <80810278+yoonjibin@users.noreply.github.com> Date: Tue, 23 May 2023 18:53:30 +0900 Subject: [PATCH 4/5] =?UTF-8?q?:bug:=20Import=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notdo/domain/auth/application/service/SignUpService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt index 3a2d56a..2eea861 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt @@ -7,12 +7,12 @@ import com.gsm.notdo.domain.auth.application.port.input.dto.SignUpDto import com.gsm.notdo.domain.auth.application.port.output.JwtPort import com.gsm.notdo.domain.auth.application.port.output.PasswordEncodePort import com.gsm.notdo.domain.auth.application.port.output.QueryAuthenticationPort -import com.gsm.notdo.domain.auth.domain.exception.AuthenticationNotFoundException import com.gsm.notdo.domain.auth.port.output.dto.TokenDto import com.gsm.notdo.domain.user.domain.User import com.gsm.notdo.domain.user.domain.exception.UserAlreadyExistException import com.gsm.notdo.domain.user.application.port.output.CommandUserPort import com.gsm.notdo.domain.user.application.port.output.QueryUserPort +import com.gsm.notdo.domain.user.domain.exception.UserNotVerifyException import org.springframework.stereotype.Service import java.time.LocalDate import java.util.* @@ -39,7 +39,7 @@ class SignUpService( private fun validateAuthentication(email: String) { val authentication = queryAuthenticationPort.findByEmailOrNull(email) if(!authentication.isVerified) { - throw + throw UserNotVerifyException() } } private fun createUser(dto: SignUpDto): User { From 58e4459493dcb8eb743a93d38cc0c8f6594ba120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A7=80=EB=B9=88?= <80810278+yoonjibin@users.noreply.github.com> Date: Tue, 23 May 2023 19:44:15 +0900 Subject: [PATCH 5/5] =?UTF-8?q?:recycle:=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/service/SignUpService.kt | 30 +++++++++---------- .../output/UserCommandPersistenceAdapter.kt | 2 +- .../port/output/CommandUserPort.kt | 2 +- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt index 2eea861..83994d7 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/auth/application/service/SignUpService.kt @@ -12,13 +12,13 @@ import com.gsm.notdo.domain.user.domain.User import com.gsm.notdo.domain.user.domain.exception.UserAlreadyExistException import com.gsm.notdo.domain.user.application.port.output.CommandUserPort import com.gsm.notdo.domain.user.application.port.output.QueryUserPort +import com.gsm.notdo.domain.user.domain.exception.UserNotFoundException import com.gsm.notdo.domain.user.domain.exception.UserNotVerifyException import org.springframework.stereotype.Service import java.time.LocalDate import java.util.* @Service - class SignUpService( private val queryUserPort: QueryUserPort, private val commandUserPort: CommandUserPort, @@ -42,21 +42,19 @@ class SignUpService( throw UserNotVerifyException() } } - private fun createUser(dto: SignUpDto): User { - val isExistUser = queryUserPort.existUserByEmail(dto.email) - - if(isExistUser) { - throw UserAlreadyExistException() - } - val user = User( - id = UUID.randomUUID(), - email = dto.email, - password = passwordEncoderPort.encode(dto.password), - nickname = dto.nickname, - createdAt = LocalDate.now() - ) - return commandUserPort.create(user) - } + private fun createUser(dto: SignUpDto): User = + queryUserPort.existUserByEmail(dto.email) + .takeUnless { it } + ?.let { + User( + id = UUID.randomUUID(), + email = dto.email, + password = passwordEncoderPort.encode(dto.password), + nickname = dto.nickname, + createdAt = LocalDate.now() + ) + .also { commandUserPort.save(it) } + } ?: throw UserNotFoundException() private fun createRefreshToken(user: User, token: TokenDto) { val refreshToken = RefreshToken( diff --git a/src/main/kotlin/com/gsm/notdo/domain/user/adapter/output/UserCommandPersistenceAdapter.kt b/src/main/kotlin/com/gsm/notdo/domain/user/adapter/output/UserCommandPersistenceAdapter.kt index 436cf08..b1ddd95 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/user/adapter/output/UserCommandPersistenceAdapter.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/user/adapter/output/UserCommandPersistenceAdapter.kt @@ -11,7 +11,7 @@ import org.springframework.stereotype.Component class UserCommandPersistenceAdapter( private val userRepository: UserRepository ) : CommandUserPort { - override fun create(domain: User): User { + override fun save(domain: User): User { val userEntity = domain.toEntity(domain) val saveEntity = userRepository.save(userEntity) return saveEntity.toDomain(saveEntity) diff --git a/src/main/kotlin/com/gsm/notdo/domain/user/application/port/output/CommandUserPort.kt b/src/main/kotlin/com/gsm/notdo/domain/user/application/port/output/CommandUserPort.kt index 05ddcf8..5b9d3e0 100644 --- a/src/main/kotlin/com/gsm/notdo/domain/user/application/port/output/CommandUserPort.kt +++ b/src/main/kotlin/com/gsm/notdo/domain/user/application/port/output/CommandUserPort.kt @@ -4,5 +4,5 @@ import com.gsm.notdo.domain.user.domain.User interface CommandUserPort { - fun create(domain: User) : User + fun save(domain: User) : User } \ No newline at end of file