Skip to content

Commit

Permalink
Merge pull request #27 from TeamMiso/feat/email-setting
Browse files Browse the repository at this point in the history
๐Ÿ”€ :: Email ์„ธํŒ…
  • Loading branch information
uuuuuuuk authored Mar 12, 2024
2 parents 9f476ce + f6b8d10 commit aa274d0
Show file tree
Hide file tree
Showing 9 changed files with 173 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package andreas311.miso.domain.email.adapter.output.persistence

import andreas311.miso.domain.email.adapter.output.persistence.mapper.EmailMapper
import andreas311.miso.domain.email.adapter.output.persistence.repository.EmailRepository
import andreas311.miso.domain.email.application.port.output.CommandEmailPort
import andreas311.miso.domain.email.domain.Email

class CommandEmailPersistenceAdapter(
private val emailRepository: EmailRepository,
private val emailMapper: EmailMapper
): CommandEmailPort {
override fun saveEmail(email: Email): Email {
val email = emailRepository.save(emailMapper.toEntity(email))
return emailMapper.toDomain(email)!!
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package andreas311.miso.domain.email.adapter.output.persistence.entity

import andreas311.miso.common.entitiy.BaseIdxEntity
import javax.persistence.*

@Entity
@Table(name = "email")
class EmailEntity(
@Column(name = "email_id", nullable = false)
val id: Long,

@Column(name = "email", nullable = false)
val email: String,

@Column(name = "random_key", nullable = false)
var randomKey: String,

@Column(name = "authentication", nullable = false)
var authentication: Boolean
): BaseIdxEntity(id)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package andreas311.miso.domain.email.adapter.output.persistence.mapper

import andreas311.miso.domain.email.adapter.output.persistence.entity.EmailEntity
import andreas311.miso.domain.email.domain.Email
import org.springframework.stereotype.Component

@Component
class EmailMapper {
fun toEntity(domain: Email): EmailEntity =
EmailEntity(
id = domain.id,
email = domain.email,
randomKey = domain.randomKey,
authentication = domain.authentication
)

fun toDomain(entity: EmailEntity): Email? =
entity?.let {
Email(
id = entity.id,
email = entity.email,
randomKey = entity.randomKey,
authentication = entity.authentication
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package andreas311.miso.domain.email.adapter.output.persistence.repository

import andreas311.miso.domain.email.adapter.output.persistence.entity.EmailEntity
import org.springframework.data.repository.CrudRepository

interface EmailRepository: CrudRepository<EmailEntity, Long>
Original file line number Diff line number Diff line change
@@ -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 EmailSendFailedException: MisoException(ErrorCode.EMAIL_SEND_FAIL)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package andreas311.miso.domain.email.application.port.output

import andreas311.miso.domain.email.domain.Email

interface CommandEmailPort {
fun saveEmail(email: Email): Email
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package andreas311.miso.domain.email.application.port.output

interface EmailSendPort {
fun sendEmailAuthKey(email: String)
}
12 changes: 12 additions & 0 deletions src/main/kotlin/andreas311/miso/domain/email/domain/Email.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package andreas311.miso.domain.email.domain

data class Email(
val id: Long,
val email: String,
var randomKey: String,
var authentication: Boolean
) {
fun updateAuthentication(authentication: Boolean) {
this.authentication = authentication
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package andreas311.miso.thirdparty.email

import andreas311.miso.domain.email.application.exception.EmailSendFailedException
import andreas311.miso.domain.email.application.port.output.CommandEmailPort
import andreas311.miso.domain.email.application.port.output.EmailSendPort
import andreas311.miso.domain.email.domain.Email
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.mail.javamail.MimeMessageHelper
import java.util.*
import javax.mail.MessagingException

class EmailSendAdapter(
private val javaMailSender: JavaMailSender,
private val commandEmailPort: CommandEmailPort
): EmailSendPort {
override fun sendEmailAuthKey(email: String) {
val randomKey = createRandomKey()
sendAuthEmail(email, randomKey)
}

private fun sendAuthEmail(email: String, randomKey: String) {
val subject = "MISO ์ธ์ฆ๋ฒˆํ˜ธ๊ฐ€ ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค!"
val content = buildEmailContent(randomKey)

try {
sendEmail(email, subject, content)
} catch (e: MessagingException) {
throw EmailSendFailedException()
}
saveEmailToRepository(email, randomKey)
}

private fun buildEmailContent(randomKey: String): String {
return """
<div style='margin:100px;'>
<h1> ์•ˆ๋…•ํ•˜์„ธ์š” MISO ์ž…๋‹ˆ๋‹ค! </h1>
<br>
<h2><p>์•„๋ž˜ ์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ์ธ์ฆ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. ์ด์šฉํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!<p></h2>
<br>
<div align='center' style='border:1px solid black; font-family:verdana';>
<h3 style='color:blue;'>์ธ์ฆ๋ฒˆํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค!</h3>
<div style='font-size:130%'>
์ธ์ฆ๋ฒˆํ˜ธ : <strong>$randomKey</strong><div><br/>
</div>
""".trimIndent()
}

private fun saveEmailToRepository(email: String, randomKey: String) {
commandEmailPort.saveEmail(
Email(
id = 0L,
email = email,
randomKey = randomKey,
authentication = false
)
)
}

private fun sendEmail(email: String, subject: String, content: String) {
val mimeMessage = javaMailSender.createMimeMessage()
val helper = MimeMessageHelper(mimeMessage, true, "utf-8")
helper.setTo(email)
helper.setSubject(subject)
helper.setText(content, true)
javaMailSender.send(mimeMessage)
}

private fun createRandomKey(): String {
val random = Random()

val randomKey = random.nextInt(8888) + 1111

return randomKey.toString()
}
}

0 comments on commit aa274d0

Please sign in to comment.