diff --git a/src/main/java/net/dancier/kikeriki/application/domain/model/events/EmailSendingRequestedEvent.java b/src/main/java/net/dancier/kikeriki/adapter/in/kafka/EmailSendingRequestedCommandDto.java similarity index 70% rename from src/main/java/net/dancier/kikeriki/application/domain/model/events/EmailSendingRequestedEvent.java rename to src/main/java/net/dancier/kikeriki/adapter/in/kafka/EmailSendingRequestedCommandDto.java index b2e36f6..0797fa2 100644 --- a/src/main/java/net/dancier/kikeriki/application/domain/model/events/EmailSendingRequestedEvent.java +++ b/src/main/java/net/dancier/kikeriki/adapter/in/kafka/EmailSendingRequestedCommandDto.java @@ -1,12 +1,10 @@ -package net.dancier.kikeriki.application.domain.model.events; +package net.dancier.kikeriki.adapter.in.kafka; import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; import org.springframework.mail.SimpleMailMessage; @JsonInclude(JsonInclude.Include.NON_NULL) -public class EmailSendingRequestedEvent extends SimpleMailMessage { +public class EmailSendingRequestedCommandDto extends SimpleMailMessage { private String id; public void setId(String id) { this.id = id; diff --git a/src/main/java/net/dancier/kikeriki/adapter/in/kafka/ListenerAll.java b/src/main/java/net/dancier/kikeriki/adapter/in/kafka/ListenerAll.java index 5444e3a..39ccfb2 100644 --- a/src/main/java/net/dancier/kikeriki/adapter/in/kafka/ListenerAll.java +++ b/src/main/java/net/dancier/kikeriki/adapter/in/kafka/ListenerAll.java @@ -3,8 +3,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.cloudevents.CloudEvent; import lombok.RequiredArgsConstructor; -import net.dancier.kikeriki.application.domain.model.events.MessagePostedEvent; -import net.dancier.kikeriki.application.domain.model.events.MessageReadEvent; +import net.dancier.kikeriki.application.domain.model.messages.MessagePostedEvent; +import net.dancier.kikeriki.application.domain.model.messages.MessageReadEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationEventPublisher; @@ -12,7 +12,6 @@ import org.springframework.stereotype.Component; import java.io.IOException; -import java.time.LocalDateTime; @RequiredArgsConstructor @Component diff --git a/src/main/java/net/dancier/kikeriki/adapter/in/kafka/MailCommandListener.java b/src/main/java/net/dancier/kikeriki/adapter/in/kafka/MailCommandListener.java index 21dd026..2359909 100644 --- a/src/main/java/net/dancier/kikeriki/adapter/in/kafka/MailCommandListener.java +++ b/src/main/java/net/dancier/kikeriki/adapter/in/kafka/MailCommandListener.java @@ -1,16 +1,13 @@ package net.dancier.kikeriki.adapter.in.kafka; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.cloudevents.CloudEvent; import lombok.RequiredArgsConstructor; -import net.dancier.kikeriki.application.domain.model.events.EmailSendingRequestedEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationEventPublisher; import org.springframework.kafka.annotation.KafkaListener; -import org.springframework.mail.MailSender; import org.springframework.stereotype.Component; import java.io.IOException; @@ -29,12 +26,12 @@ public class MailCommandListener { void listener(CloudEvent cloudEvent) { log.info("Got Mail Command: " + cloudEvent); try { - EmailSendingRequestedEvent emailSendingRequestedEvent = objectMapper.readValue(cloudEvent.getData().toBytes(), EmailSendingRequestedEvent.class); - log.info("Got that request to send a mail: {}", emailSendingRequestedEvent); - emailSendingRequestedEvent.setId(cloudEvent.getId()); - applicationEventPublisher.publishEvent(emailSendingRequestedEvent); + EmailSendingRequestedCommandDto emailSendingRequestedCommand = objectMapper.readValue(cloudEvent.getData().toBytes(), EmailSendingRequestedCommandDto.class); + log.info("Got that request to send a mail: {}", emailSendingRequestedCommand); + emailSendingRequestedCommand.setId(cloudEvent.getId()); + applicationEventPublisher.publishEvent(emailSendingRequestedCommand); } catch (IOException ioe) { - log.info(ioe.toString()); + log.error(ioe.toString()); } } } diff --git a/src/main/java/net/dancier/kikeriki/adapter/out/mail/DancierSendMailAdapter.java b/src/main/java/net/dancier/kikeriki/adapter/out/mail/DancierSendMailAdapter.java index 913da81..a40def0 100644 --- a/src/main/java/net/dancier/kikeriki/adapter/out/mail/DancierSendMailAdapter.java +++ b/src/main/java/net/dancier/kikeriki/adapter/out/mail/DancierSendMailAdapter.java @@ -1,11 +1,10 @@ package net.dancier.kikeriki.adapter.out.mail; import lombok.RequiredArgsConstructor; -import net.dancier.kikeriki.application.domain.model.events.EmailSendingRequestedEvent; +import net.dancier.kikeriki.application.domain.model.messages.EmailSendingRequestedCommand; import net.dancier.kikeriki.application.port.DancierSendMailPort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -19,13 +18,13 @@ public class DancierSendMailAdapter implements DancierSendMailPort { public final MailOutboxJpaRepository mailOutboxJpaRepository; @Override - public void schedule(EmailSendingRequestedEvent emailSendingRequestedEvent) { - log.info("Storing message for later delivery: {}", emailSendingRequestedEvent); + public void schedule(EmailSendingRequestedCommand emailSendingRequestedCommand) { + log.info("Storing message for later delivery: {}", emailSendingRequestedCommand); MailOutboxJpaEntity mailOutboxJpaEntity = new MailOutboxJpaEntity(); - mailOutboxJpaEntity.setId(emailSendingRequestedEvent.getId()); + mailOutboxJpaEntity.setId(emailSendingRequestedCommand.getId()); mailOutboxJpaEntity.setStatus(MailOutboxJpaEntity.STATUS.NEW); mailOutboxJpaEntity.setCreatedAt(LocalDateTime.now()); - mailOutboxJpaEntity.setEmailSendingRequestedEvent(emailSendingRequestedEvent); + mailOutboxJpaEntity.setEmailSendingRequestedCommand(emailSendingRequestedCommand); mailOutboxJpaRepository.save(mailOutboxJpaEntity); } } diff --git a/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailOutboxJpaEntity.java b/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailOutboxJpaEntity.java index 62e1824..1ca9151 100644 --- a/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailOutboxJpaEntity.java +++ b/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailOutboxJpaEntity.java @@ -1,10 +1,9 @@ package net.dancier.kikeriki.adapter.out.mail; -import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.*; import lombok.Data; import lombok.NoArgsConstructor; -import net.dancier.kikeriki.application.domain.model.events.EmailSendingRequestedEvent; +import net.dancier.kikeriki.application.domain.model.messages.EmailSendingRequestedCommand; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; @@ -24,7 +23,7 @@ public class MailOutboxJpaEntity { @JdbcTypeCode(SqlTypes.JSON) @Column(name = "mail") - private EmailSendingRequestedEvent emailSendingRequestedEvent; + private EmailSendingRequestedCommand emailSendingRequestedCommand; private LocalDateTime createdAt; diff --git a/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailSenderJob.java b/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailSenderJob.java index 0d775c3..b6b6456 100644 --- a/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailSenderJob.java +++ b/src/main/java/net/dancier/kikeriki/adapter/out/mail/MailSenderJob.java @@ -37,7 +37,7 @@ private void sendMail(MailOutboxJpaEntity item) { log.info("Sending the mail via SMTP: {}", item); log.info("And sender: {}", javaMailSender); try { - javaMailSender.send(item.getEmailSendingRequestedEvent()); + javaMailSender.send(Util.commandToSimpleMailMessage(item.getEmailSendingRequestedCommand())); item.setStatus(DONE); } catch (MailAuthenticationException mailAuthenticationException) { item.setStatus(TEMPORARY_FAILED); diff --git a/src/main/java/net/dancier/kikeriki/adapter/out/mail/Util.java b/src/main/java/net/dancier/kikeriki/adapter/out/mail/Util.java new file mode 100644 index 0000000..0ebe0fa --- /dev/null +++ b/src/main/java/net/dancier/kikeriki/adapter/out/mail/Util.java @@ -0,0 +1,16 @@ +package net.dancier.kikeriki.adapter.out.mail; + +import net.dancier.kikeriki.application.domain.model.messages.EmailSendingRequestedCommand; +import org.springframework.mail.SimpleMailMessage; + +public class Util { + + public static SimpleMailMessage commandToSimpleMailMessage(EmailSendingRequestedCommand command) { + SimpleMailMessage result = new SimpleMailMessage(); + result.setTo(command.getTo()); + result.setFrom(command.getFrom()); + result.setSubject(command.getSubject()); + result.setText(command.getText()); + return result; + } +} diff --git a/src/main/java/net/dancier/kikeriki/application/domain/model/messages/EmailSendingRequestedCommand.java b/src/main/java/net/dancier/kikeriki/application/domain/model/messages/EmailSendingRequestedCommand.java new file mode 100644 index 0000000..9c44926 --- /dev/null +++ b/src/main/java/net/dancier/kikeriki/application/domain/model/messages/EmailSendingRequestedCommand.java @@ -0,0 +1,68 @@ +package net.dancier.kikeriki.application.domain.model.messages; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.mail.SimpleMailMessage; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +public class EmailSendingRequestedCommand { + private final String id; + private final String[] to; + private final String from; + private final String[] cc; + private final String[] bcc; + private final String subject; + private final String text; + + public static class EmailSendingRequestedCommandBuilder { + private String id; + private String[] to; + private String from; + private String[] cc; + private String[] bcc; + private String subject; + private String text; + + public EmailSendingRequestedCommandBuilder setId(String id) { + this.id = id; + return this; + } + + public EmailSendingRequestedCommandBuilder setTo(String[] to) { + this.to = to; + return this; + } + + public EmailSendingRequestedCommandBuilder setFrom(String from) { + this.from = from; + return this; + } + + public EmailSendingRequestedCommandBuilder setCc(String[] cc) { + this.cc = cc; + return this; + } + + public EmailSendingRequestedCommandBuilder setBcc(String[] bcc) { + this.bcc = bcc; + return this; + } + + public EmailSendingRequestedCommandBuilder setSubject(String subject) { + this.subject = subject; + return this; + } + + public EmailSendingRequestedCommandBuilder setText(String text) { + this.text = text; + return this; + } + public EmailSendingRequestedCommand build() { + return new EmailSendingRequestedCommand(id, to, from, cc, bcc, subject, text); + } + } +} diff --git a/src/main/java/net/dancier/kikeriki/application/domain/model/events/MessagePostedEvent.java b/src/main/java/net/dancier/kikeriki/application/domain/model/messages/MessagePostedEvent.java similarity index 80% rename from src/main/java/net/dancier/kikeriki/application/domain/model/events/MessagePostedEvent.java rename to src/main/java/net/dancier/kikeriki/application/domain/model/messages/MessagePostedEvent.java index ae567e0..8127cec 100644 --- a/src/main/java/net/dancier/kikeriki/application/domain/model/events/MessagePostedEvent.java +++ b/src/main/java/net/dancier/kikeriki/application/domain/model/messages/MessagePostedEvent.java @@ -1,4 +1,4 @@ -package net.dancier.kikeriki.application.domain.model.events; +package net.dancier.kikeriki.application.domain.model.messages; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -6,7 +6,6 @@ import java.time.LocalDateTime; import java.util.List; -import java.util.UUID; @Data public class MessagePostedEvent { diff --git a/src/main/java/net/dancier/kikeriki/application/domain/model/events/MessageReadEvent.java b/src/main/java/net/dancier/kikeriki/application/domain/model/messages/MessageReadEvent.java similarity index 61% rename from src/main/java/net/dancier/kikeriki/application/domain/model/events/MessageReadEvent.java rename to src/main/java/net/dancier/kikeriki/application/domain/model/messages/MessageReadEvent.java index 4c7bbf0..57352ef 100644 --- a/src/main/java/net/dancier/kikeriki/application/domain/model/events/MessageReadEvent.java +++ b/src/main/java/net/dancier/kikeriki/application/domain/model/messages/MessageReadEvent.java @@ -1,4 +1,4 @@ -package net.dancier.kikeriki.application.domain.model.events; +package net.dancier.kikeriki.application.domain.model.messages; import lombok.Data; diff --git a/src/main/java/net/dancier/kikeriki/application/port/DancierSendMailPort.java b/src/main/java/net/dancier/kikeriki/application/port/DancierSendMailPort.java index aa9d3bd..33fa9b6 100644 --- a/src/main/java/net/dancier/kikeriki/application/port/DancierSendMailPort.java +++ b/src/main/java/net/dancier/kikeriki/application/port/DancierSendMailPort.java @@ -1,9 +1,9 @@ package net.dancier.kikeriki.application.port; -import net.dancier.kikeriki.application.domain.model.events.EmailSendingRequestedEvent; +import net.dancier.kikeriki.application.domain.model.messages.EmailSendingRequestedCommand; public interface DancierSendMailPort { - void schedule(EmailSendingRequestedEvent emailSendingRequestedEvent); + void schedule(EmailSendingRequestedCommand emailSendingRequestedCommand); } diff --git a/src/main/java/net/dancier/kikeriki/application/service/ApplicationEventListeners.java b/src/main/java/net/dancier/kikeriki/application/service/ApplicationEventListeners.java index 6278a24..f3ed1d8 100644 --- a/src/main/java/net/dancier/kikeriki/application/service/ApplicationEventListeners.java +++ b/src/main/java/net/dancier/kikeriki/application/service/ApplicationEventListeners.java @@ -1,9 +1,9 @@ package net.dancier.kikeriki.application.service; import lombok.RequiredArgsConstructor; -import net.dancier.kikeriki.application.domain.model.events.EmailSendingRequestedEvent; -import net.dancier.kikeriki.application.domain.model.events.MessagePostedEvent; -import net.dancier.kikeriki.application.domain.model.events.MessageReadEvent; +import net.dancier.kikeriki.application.domain.model.messages.EmailSendingRequestedCommand; +import net.dancier.kikeriki.application.domain.model.messages.MessagePostedEvent; +import net.dancier.kikeriki.application.domain.model.messages.MessageReadEvent; import net.dancier.kikeriki.application.domain.model.state.State; import net.dancier.kikeriki.application.domain.model.state.UnreadChatMessage; import net.dancier.kikeriki.application.port.DancierSendMailPort; @@ -27,7 +27,7 @@ public class ApplicationEventListeners { @EventListener - public void handle(EmailSendingRequestedEvent event) { + public void handle(EmailSendingRequestedCommand event) { log.info("I go a request to directly send an email. I will schedule that.: {}", event); sendMailPort.schedule(event); } diff --git a/src/test/java/net/dancier/kikeriki/adapter/out/mail/SchedulingAndSendingMailWorks.java b/src/test/java/net/dancier/kikeriki/adapter/out/mail/SchedulingAndSendingMailWorks.java index 49e40cb..b9f60bd 100644 --- a/src/test/java/net/dancier/kikeriki/adapter/out/mail/SchedulingAndSendingMailWorks.java +++ b/src/test/java/net/dancier/kikeriki/adapter/out/mail/SchedulingAndSendingMailWorks.java @@ -1,7 +1,7 @@ package net.dancier.kikeriki.adapter.out.mail; import net.dancier.kikeriki.NeededInfrastructureBaseTestClass; -import net.dancier.kikeriki.application.domain.model.events.EmailSendingRequestedEvent; +import net.dancier.kikeriki.application.domain.model.messages.EmailSendingRequestedCommand; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; @@ -47,9 +47,9 @@ public void scheduleAndSendTest() { ); } - private EmailSendingRequestedEvent getDummy() { - EmailSendingRequestedEvent emailSendingRequestedEvent = new EmailSendingRequestedEvent(); - emailSendingRequestedEvent.setId(UUID.randomUUID().toString()); - return emailSendingRequestedEvent; + private EmailSendingRequestedCommand getDummy() { + return new EmailSendingRequestedCommand.EmailSendingRequestedCommandBuilder() + .setId(UUID.randomUUID().toString()) + .build(); } } \ No newline at end of file diff --git a/src/test/java/net/dancier/kikeriki/adapter/out/mail/UtilTest.java b/src/test/java/net/dancier/kikeriki/adapter/out/mail/UtilTest.java new file mode 100644 index 0000000..644b8b0 --- /dev/null +++ b/src/test/java/net/dancier/kikeriki/adapter/out/mail/UtilTest.java @@ -0,0 +1,32 @@ +package net.dancier.kikeriki.adapter.out.mail; + +import net.dancier.kikeriki.application.domain.model.messages.EmailSendingRequestedCommand; +import org.junit.jupiter.api.Test; +import org.springframework.mail.SimpleMailMessage; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +class UtilTest { + + @Test + public void testCommandToSimpleMailMessage() { + EmailSendingRequestedCommand command = new EmailSendingRequestedCommand.EmailSendingRequestedCommandBuilder() + .setId(UUID.randomUUID().toString()) + .setTo(new String[]{"bar"}) + .setFrom("foo") + .setSubject("why") + .setText("reson") + .build(); + + SimpleMailMessage result = Util.commandToSimpleMailMessage(command); + + assertThat(result).isNotNull(); + assertThat(result.getTo()).isNotEmpty(); + assertThat(result.getFrom()).isEqualTo("foo"); + assertThat(result.getSubject()).isEqualTo("why"); + assertThat(result.getText()).isEqualTo("reson"); + } + +} \ No newline at end of file