Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

πŸ”€ :: 35 - νšŒμ›κ°€μž…λ‘œμ§ μˆ˜μ • #36

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@ 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
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)
}

override fun existsByEmail(email: String): Boolean {
return authenticationRepository.existsByEmail(email)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ import com.gsm.notdo.domain.auth.apdater.output.persistence.entity.Authenticatio
import org.springframework.data.repository.CrudRepository

interface AuthenticationRepository : CrudRepository<AuthenticationEntity, String> {
fun findByEmailOrNull(email: String): AuthenticationEntity
fun findByEmailOrNull(email: String): AuthenticationEntity?
fun existsByEmail(email: String): Boolean
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ import com.gsm.notdo.domain.auth.domain.Authentication

interface QueryAuthenticationPort {
fun findByEmailOrNull(email: String): Authentication
fun existsByEmail(email: String): Boolean
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,48 +5,56 @@ 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.application.port.output.QueryAuthenticationPort
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.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,
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 createUser(dto: SignUpDto): User {
val isExistUser = queryUserPort.existUserByEmail(dto.email)

if(isExistUser) {
throw UserAlreadyExistException()
private fun validateAuthentication(email: String) {
val authentication = queryAuthenticationPort.findByEmailOrNull(email)
if(!authentication.isVerified) {
throw UserNotVerifyException()
}
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(
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ import com.gsm.notdo.domain.user.domain.User


interface CommandUserPort {
fun create(domain: User) : User
fun save(domain: User) : User
}
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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

Expand Down