diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/email/EmailConfig.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/email/EmailConfig.kt new file mode 100644 index 00000000..ea325a07 --- /dev/null +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/config/email/EmailConfig.kt @@ -0,0 +1,33 @@ +package pt.up.fe.ni.website.backend.config.email + +import com.samskivert.mustache.Mustache +import org.commonmark.ext.front.matter.YamlFrontMatterExtension +import org.commonmark.parser.Parser +import org.commonmark.renderer.html.HtmlRenderer +import org.commonmark.renderer.text.TextContentRenderer +import org.springframework.boot.autoconfigure.mustache.MustacheResourceTemplateLoader +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class EmailConfig( + private val emailConfigProperties: EmailConfigProperties +) { + @Bean + fun mustacheCompiler() = Mustache.compiler().withLoader( + MustacheResourceTemplateLoader(emailConfigProperties.templatePrefix, emailConfigProperties.templateSuffix) + ) + + @Bean + fun commonmarkParser() = Parser.builder().extensions( + listOf( + YamlFrontMatterExtension.create() + ) + ).build() + + @Bean + fun commonmarkHtmlRenderer() = HtmlRenderer.builder().build() + + @Bean + fun commonmarkTextRenderer() = TextContentRenderer.builder().build() +} diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/email/BaseEmailBuilder.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/email/BaseEmailBuilder.kt index 7762bdea..3487fb1e 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/email/BaseEmailBuilder.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/email/BaseEmailBuilder.kt @@ -3,10 +3,13 @@ package pt.up.fe.ni.website.backend.email import jakarta.validation.Valid import jakarta.validation.constraints.Email import org.springframework.mail.javamail.MimeMessageHelper +import pt.up.fe.ni.website.backend.config.ApplicationContextUtils import pt.up.fe.ni.website.backend.config.email.EmailConfigProperties import pt.up.fe.ni.website.backend.model.Account abstract class BaseEmailBuilder : EmailBuilder { + protected val emailConfigProperties = ApplicationContextUtils.getBean(EmailConfigProperties::class.java) + private var from: String? = null private var fromPersonal: String? = null private var to: MutableSet = mutableSetOf() @@ -42,7 +45,7 @@ abstract class BaseEmailBuilder : EmailBuilder { bcc.addAll(users.map { it.email }) } - override fun build(helper: MimeMessageHelper, emailConfigProperties: EmailConfigProperties) { + override fun build(helper: MimeMessageHelper) { helper.setFrom(from ?: emailConfigProperties.from, fromPersonal ?: emailConfigProperties.fromPersonal) to.forEach(helper::setTo) diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/email/EmailBuilder.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/email/EmailBuilder.kt index 69a259d8..30a80db5 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/email/EmailBuilder.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/email/EmailBuilder.kt @@ -1,8 +1,7 @@ package pt.up.fe.ni.website.backend.email import org.springframework.mail.javamail.MimeMessageHelper -import pt.up.fe.ni.website.backend.config.email.EmailConfigProperties interface EmailBuilder { - fun build(helper: MimeMessageHelper, emailConfigProperties: EmailConfigProperties) + fun build(helper: MimeMessageHelper) } diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/email/SimpleEmailBuilder.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/email/SimpleEmailBuilder.kt index 9a978b41..ec625b00 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/email/SimpleEmailBuilder.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/email/SimpleEmailBuilder.kt @@ -6,7 +6,6 @@ import jakarta.activation.URLDataSource import java.io.File import java.net.URL import org.springframework.mail.javamail.MimeMessageHelper -import pt.up.fe.ni.website.backend.config.email.EmailConfigProperties class SimpleEmailBuilder : BaseEmailBuilder() { private var text: String? = null @@ -51,20 +50,16 @@ class SimpleEmailBuilder : BaseEmailBuilder() { inlines.add(EmailFile(name, URLDataSource(URL(path)))) } - override fun build(helper: MimeMessageHelper, emailConfigProperties: EmailConfigProperties) { - super.build(helper, emailConfigProperties) + override fun build(helper: MimeMessageHelper) { + super.build(helper) - if (text != null && html != null) { - helper.setText(text!!, html!!) - } else if (text != null) { - helper.setText(text!!) - } else if (html != null) { - helper.setText(html!!, true) + when { + text != null && html != null -> helper.setText(text!!, html!!) + html != null -> helper.setText(html!!, true) + text != null -> helper.setText(text!!) } - if (subject != null) { - helper.setSubject(subject!!) - } + subject?.let { helper.setSubject(it) } attachments.forEach { helper.addAttachment(it.name, it.content) } inlines.forEach { helper.addInline(it.name, it.content) } diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/email/TemplateEmailBuilder.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/email/TemplateEmailBuilder.kt index 54e3ef19..c7a9cc09 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/email/TemplateEmailBuilder.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/email/TemplateEmailBuilder.kt @@ -1,30 +1,23 @@ package pt.up.fe.ni.website.backend.email import com.samskivert.mustache.Mustache -import org.commonmark.ext.front.matter.YamlFrontMatterExtension import org.commonmark.ext.front.matter.YamlFrontMatterVisitor import org.commonmark.parser.Parser import org.commonmark.renderer.html.HtmlRenderer import org.commonmark.renderer.text.TextContentRenderer -import org.springframework.boot.autoconfigure.mustache.MustacheResourceTemplateLoader import org.springframework.core.io.Resource import org.springframework.core.io.UrlResource import org.springframework.mail.javamail.MimeMessageHelper import org.springframework.util.ResourceUtils -import pt.up.fe.ni.website.backend.config.email.EmailConfigProperties +import pt.up.fe.ni.website.backend.config.ApplicationContextUtils abstract class TemplateEmailBuilder( private val template: String ) : BaseEmailBuilder() { - private companion object { - val commonmarkParser: Parser = Parser.builder().extensions( - listOf( - YamlFrontMatterExtension.create() - ) - ).build() - val commonmarkHtmlRenderer: HtmlRenderer = HtmlRenderer.builder().build() - val commonmarkTextRenderer: TextContentRenderer = TextContentRenderer.builder().build() - } + private val commonmarkParser = ApplicationContextUtils.getBean(Parser::class.java) + private val commonmarkHtmlRenderer = ApplicationContextUtils.getBean(HtmlRenderer::class.java) + private val commonmarkTextRenderer = ApplicationContextUtils.getBean(TextContentRenderer::class.java) + private val mustache = ApplicationContextUtils.getBean(Mustache.Compiler::class.java) private var data: T? = null @@ -32,12 +25,10 @@ abstract class TemplateEmailBuilder( this.data = data } - override fun build(helper: MimeMessageHelper, emailConfigProperties: EmailConfigProperties) { - super.build(helper, emailConfigProperties) + override fun build(helper: MimeMessageHelper) { + super.build(helper) - val mustache = Mustache.compiler().withLoader( - MustacheResourceTemplateLoader(emailConfigProperties.templatePrefix, emailConfigProperties.templateSuffix) - ) + if (data == null) return val markdown = mustache.loadTemplate(template).execute(data) @@ -49,12 +40,7 @@ abstract class TemplateEmailBuilder( doc.accept(yamlVisitor) val subject = yamlVisitor.data["subject"]?.firstOrNull() - if (subject != null) { - helper.setSubject(subject) - } - - yamlVisitor.data.getOrDefault("attachments", emptyList()).forEach { addFile(helper::addAttachment, it) } - yamlVisitor.data.getOrDefault("inline", emptyList()).forEach { addFile(helper::addInline, it) } + subject?.let { helper.setSubject(it) } val styles = yamlVisitor.data.getOrDefault("styles", mutableListOf()).apply { if (yamlVisitor.data["no_default_style"].isNullOrEmpty()) { @@ -74,22 +60,19 @@ abstract class TemplateEmailBuilder( ) helper.setText(text, html) + + yamlVisitor.data.getOrDefault("attachments", emptyList()).forEach { addFile(helper::addAttachment, it) } + yamlVisitor.data.getOrDefault("inline", emptyList()).forEach { addFile(helper::addInline, it) } } - private fun addFile(fn: (String, Resource) -> Any, file: String): Pair? { - var split = file.split("\\s*::\\s*".toRegex(), 2) + private fun addFile(fn: (String, Resource) -> Any, file: String) { + val split = file.split("\\s*::\\s*".toRegex(), 2) - if (split.isEmpty()) { - return null - } else if (split.size == 1) { - split = listOf(split[0], split[0]) - } + if (split.isEmpty()) return val name = split[0] - val path = split[1] + val path = split.getOrElse(1) { split[0] } fn(name, UrlResource(path)) - - return Pair(name, path) } } diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/service/EmailService.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/service/EmailService.kt index 79ac8db2..61335751 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/service/EmailService.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/service/EmailService.kt @@ -3,19 +3,17 @@ package pt.up.fe.ni.website.backend.service import org.springframework.mail.javamail.JavaMailSender import org.springframework.mail.javamail.MimeMessageHelper import org.springframework.stereotype.Service -import pt.up.fe.ni.website.backend.config.email.EmailConfigProperties import pt.up.fe.ni.website.backend.email.EmailBuilder @Service class EmailService( - private val mailSender: JavaMailSender, - val emailConfigProperties: EmailConfigProperties + private val mailSender: JavaMailSender ) { fun send(email: EmailBuilder) { val message = mailSender.createMimeMessage() val helper = MimeMessageHelper(message, true) - email.build(helper, emailConfigProperties) + email.build(helper) mailSender.send(message) }