diff --git a/src/main/kotlin/andreas311/miso/common/entitiy/BaseIdxEntity.kt b/src/main/kotlin/andreas311/miso/common/entitiy/BaseIdxEntity.kt deleted file mode 100644 index 81253e17..00000000 --- a/src/main/kotlin/andreas311/miso/common/entitiy/BaseIdxEntity.kt +++ /dev/null @@ -1,13 +0,0 @@ -package andreas311.miso.common.entitiy - -import javax.persistence.GeneratedValue -import javax.persistence.GenerationType -import javax.persistence.Id -import javax.persistence.MappedSuperclass - -@MappedSuperclass -abstract class BaseIdxEntity( - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - val idx: Long -) \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/auth/application/service/SignUpService.kt b/src/main/kotlin/andreas311/miso/domain/auth/application/service/SignUpService.kt index 82ddd154..c6dd81f5 100644 --- a/src/main/kotlin/andreas311/miso/domain/auth/application/service/SignUpService.kt +++ b/src/main/kotlin/andreas311/miso/domain/auth/application/service/SignUpService.kt @@ -24,7 +24,6 @@ class SignUpService( private val passwordEncodePort: PasswordEncodePort ) : SignUpUseCase { override fun execute(signUpDto: SignUpDto) { - passwordEncodePort.isPasswordMatch(signUpDto.password, signUpDto.passwordCheck) if (!queryUserPort.existsByEmail(signUpDto.email)) { diff --git a/src/main/kotlin/andreas311/miso/domain/email/adapter/input/EmailAdapter.kt b/src/main/kotlin/andreas311/miso/domain/email/adapter/input/EmailAdapter.kt new file mode 100644 index 00000000..f12ce76b --- /dev/null +++ b/src/main/kotlin/andreas311/miso/domain/email/adapter/input/EmailAdapter.kt @@ -0,0 +1,22 @@ +package andreas311.miso.domain.email.adapter.input + +import andreas311.miso.common.annotation.RequestController +import andreas311.miso.domain.email.adapter.input.data.request.RandomKeyRequest +import andreas311.miso.domain.email.adapter.input.mapper.EmailDataMapper +import andreas311.miso.domain.email.application.port.input.RandomKeyConfirmUseCase +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import javax.validation.Valid + +@RequestController("/email") +class EmailAdapter( + private val emailDataMapper: EmailDataMapper, + private val randomKeyConfirmUseCase: RandomKeyConfirmUseCase +) { + @PostMapping + fun emailCheck(@RequestBody @Valid randomKeyRequest: RandomKeyRequest): ResponseEntity = + randomKeyConfirmUseCase.execute(emailDataMapper toDto randomKeyRequest) + .let { ResponseEntity.status(HttpStatus.OK).build() } +} \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/adapter/input/data/request/RandomKeyRequest.kt b/src/main/kotlin/andreas311/miso/domain/email/adapter/input/data/request/RandomKeyRequest.kt new file mode 100644 index 00000000..6ac21a99 --- /dev/null +++ b/src/main/kotlin/andreas311/miso/domain/email/adapter/input/data/request/RandomKeyRequest.kt @@ -0,0 +1,8 @@ +package andreas311.miso.domain.email.adapter.input.data.request + +import javax.validation.constraints.NotNull + +data class RandomKeyRequest( + @field:NotNull + val randomKey: String +) diff --git a/src/main/kotlin/andreas311/miso/domain/email/adapter/input/mapper/EmailDataMapper.kt b/src/main/kotlin/andreas311/miso/domain/email/adapter/input/mapper/EmailDataMapper.kt new file mode 100644 index 00000000..3fc9ce60 --- /dev/null +++ b/src/main/kotlin/andreas311/miso/domain/email/adapter/input/mapper/EmailDataMapper.kt @@ -0,0 +1,13 @@ +package andreas311.miso.domain.email.adapter.input.mapper + +import andreas311.miso.domain.email.adapter.input.data.request.RandomKeyRequest +import andreas311.miso.domain.email.application.port.input.dto.RandomKeyDto +import org.springframework.stereotype.Component + +@Component +class EmailDataMapper { + infix fun toDto(randomKeyRequest: RandomKeyRequest): RandomKeyDto = + RandomKeyDto( + randomKey = randomKeyRequest.randomKey + ) +} \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/QueryEmailPersistenceAdapter.kt b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/QueryEmailPersistenceAdapter.kt index 8e29cf7e..12b1fadf 100644 --- a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/QueryEmailPersistenceAdapter.kt +++ b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/QueryEmailPersistenceAdapter.kt @@ -18,4 +18,9 @@ class QueryEmailPersistenceAdapter( override fun existsByEmail(email: String): Boolean = emailRepository.existsByEmail(email) + + override fun findByRandomKeyOrNull(randomKey: String): Email? { + val emailEntity = emailRepository.findByRandomKey(randomKey) + return emailMapper.toDomain(emailEntity) + } } \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/entity/EmailEntity.kt b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/entity/EmailEntity.kt index 63dbbb28..56d3e3c3 100644 --- a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/entity/EmailEntity.kt +++ b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/entity/EmailEntity.kt @@ -1,11 +1,12 @@ package andreas311.miso.domain.email.adapter.output.persistence.entity -import andreas311.miso.common.entitiy.BaseIdxEntity import javax.persistence.* @Entity @Table(name = "email") class EmailEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "email_id", nullable = false) val id: Long, @@ -17,4 +18,4 @@ class EmailEntity( @Column(name = "authentication", nullable = false) var authentication: Boolean -): BaseIdxEntity(id) \ No newline at end of file +) \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/mapper/EmailMapper.kt b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/mapper/EmailMapper.kt index b3552fb2..5181bc85 100644 --- a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/mapper/EmailMapper.kt +++ b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/mapper/EmailMapper.kt @@ -14,7 +14,7 @@ class EmailMapper { authentication = domain.authentication ) - fun toDomain(entity: EmailEntity): Email? = + fun toDomain(entity: EmailEntity?): Email? = entity?.let { Email( id = entity.id, diff --git a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/repository/EmailRepository.kt b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/repository/EmailRepository.kt index 50fbd16b..4b8c6050 100644 --- a/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/repository/EmailRepository.kt +++ b/src/main/kotlin/andreas311/miso/domain/email/adapter/output/persistence/repository/EmailRepository.kt @@ -6,4 +6,5 @@ import org.springframework.data.repository.CrudRepository interface EmailRepository: CrudRepository { fun findByEmail(email: String): EmailEntity fun existsByEmail(email: String): Boolean + fun findByRandomKey(randomKey: String): EmailEntity? } \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/application/exception/EmailKeyInvalidException.kt b/src/main/kotlin/andreas311/miso/domain/email/application/exception/EmailKeyInvalidException.kt new file mode 100644 index 00000000..013863a2 --- /dev/null +++ b/src/main/kotlin/andreas311/miso/domain/email/application/exception/EmailKeyInvalidException.kt @@ -0,0 +1,6 @@ +package andreas311.miso.domain.email.application.exception + +import andreas311.miso.global.error.ErrorCode +import andreas311.miso.global.error.exception.MisoException + +class EmailKeyInvalidException : MisoException(ErrorCode.EMAIL_KEY_IS_INVALID) \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/application/port/input/RandomKeyConfirmUseCase.kt b/src/main/kotlin/andreas311/miso/domain/email/application/port/input/RandomKeyConfirmUseCase.kt new file mode 100644 index 00000000..b6059fc0 --- /dev/null +++ b/src/main/kotlin/andreas311/miso/domain/email/application/port/input/RandomKeyConfirmUseCase.kt @@ -0,0 +1,7 @@ +package andreas311.miso.domain.email.application.port.input + +import andreas311.miso.domain.email.application.port.input.dto.RandomKeyDto + +interface RandomKeyConfirmUseCase { + fun execute(randomKeyDto: RandomKeyDto) +} \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/application/port/input/dto/RandomKeyDto.kt b/src/main/kotlin/andreas311/miso/domain/email/application/port/input/dto/RandomKeyDto.kt new file mode 100644 index 00000000..7a711d49 --- /dev/null +++ b/src/main/kotlin/andreas311/miso/domain/email/application/port/input/dto/RandomKeyDto.kt @@ -0,0 +1,5 @@ +package andreas311.miso.domain.email.application.port.input.dto + +data class RandomKeyDto( + val randomKey: String +) diff --git a/src/main/kotlin/andreas311/miso/domain/email/application/port/output/QueryEmailPort.kt b/src/main/kotlin/andreas311/miso/domain/email/application/port/output/QueryEmailPort.kt index e6d488c6..595c0406 100644 --- a/src/main/kotlin/andreas311/miso/domain/email/application/port/output/QueryEmailPort.kt +++ b/src/main/kotlin/andreas311/miso/domain/email/application/port/output/QueryEmailPort.kt @@ -5,4 +5,5 @@ import andreas311.miso.domain.email.domain.Email interface QueryEmailPort { fun findByEmailOrNull(email: String): Email? fun existsByEmail(email: String): Boolean + fun findByRandomKeyOrNull(randomKey: String): Email? } \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/application/service/RandomKeyConfirmService.kt b/src/main/kotlin/andreas311/miso/domain/email/application/service/RandomKeyConfirmService.kt new file mode 100644 index 00000000..1b46885a --- /dev/null +++ b/src/main/kotlin/andreas311/miso/domain/email/application/service/RandomKeyConfirmService.kt @@ -0,0 +1,21 @@ +package andreas311.miso.domain.email.application.service + +import andreas311.miso.common.annotation.RollbackService +import andreas311.miso.domain.email.application.exception.EmailKeyInvalidException +import andreas311.miso.domain.email.application.port.input.RandomKeyConfirmUseCase +import andreas311.miso.domain.email.application.port.input.dto.RandomKeyDto +import andreas311.miso.domain.email.application.port.output.CommandEmailPort +import andreas311.miso.domain.email.application.port.output.QueryEmailPort + +@RollbackService +class RandomKeyConfirmService( + private val commandEmailPort: CommandEmailPort, + private val queryEmailPort: QueryEmailPort +): RandomKeyConfirmUseCase { + override fun execute(randomKeyDto: RandomKeyDto) { + val email = queryEmailPort.findByRandomKeyOrNull(randomKeyDto.randomKey) + ?: throw EmailKeyInvalidException() + + commandEmailPort.saveEmail(email.updateAuthentication(true)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/andreas311/miso/domain/email/domain/Email.kt b/src/main/kotlin/andreas311/miso/domain/email/domain/Email.kt index 98b8d312..c3314c6f 100644 --- a/src/main/kotlin/andreas311/miso/domain/email/domain/Email.kt +++ b/src/main/kotlin/andreas311/miso/domain/email/domain/Email.kt @@ -6,7 +6,8 @@ data class Email( var randomKey: String, var authentication: Boolean ) { - fun updateAuthentication(authentication: Boolean) { + fun updateAuthentication(authentication: Boolean): Email { this.authentication = authentication + return this } }