From 71ce1c136b3b466848122bab8986a2d32a01f8d0 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Thu, 8 Oct 2020 07:18:32 +0100 Subject: [PATCH] Message Id validation added to prevent duplicates --- .../SendEmailRequest.cs | 2 ++ .../EmailAggregateTests.cs | 19 +++++++++++++++++++ .../EmailAggregate.cs | 7 ++++++- .../MessageStatus.cs | 2 ++ .../Controllers/EmailController.cs | 2 +- 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/MessagingService.DataTransferObjects/SendEmailRequest.cs b/MessagingService.DataTransferObjects/SendEmailRequest.cs index 2114e48..c91a731 100644 --- a/MessagingService.DataTransferObjects/SendEmailRequest.cs +++ b/MessagingService.DataTransferObjects/SendEmailRequest.cs @@ -8,6 +8,8 @@ public class SendEmailRequest { #region Properties + + public Guid? MessageId { get; set; } /// /// Gets or sets the body. diff --git a/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs b/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs index a7daf6f..ea6821e 100644 --- a/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs +++ b/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs @@ -28,9 +28,27 @@ public void EmailAggregate_SendRequestToProvider_RequestSent() emailAggregate.Subject.ShouldBe(TestData.Subject); emailAggregate.Body.ShouldBe(TestData.Body); emailAggregate.IsHtml.ShouldBe(TestData.IsHtmlTrue); + emailAggregate.MessageStatus.ShouldBe(MessageStatus.InProgress); // TODO: Get Recipients } + [Fact] + public void EmailAggregate_SendRequestToProvider_RequestAlreadySent_ErrorThrown() + { + EmailAggregate emailAggregate = EmailAggregate.Create(TestData.MessageId); + + emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue); + + Should.Throw(() => + { + emailAggregate.SendRequestToProvider(TestData.FromAddress, + TestData.ToAddresses, + TestData.Subject, + TestData.Body, + TestData.IsHtmlTrue); + }); + } + [Fact] public void EmailAggregate_ReceiveResponseFromProvider_ResponseReceived() { @@ -41,6 +59,7 @@ public void EmailAggregate_ReceiveResponseFromProvider_ResponseReceived() emailAggregate.ProviderRequestReference.ShouldBe(TestData.ProviderRequestReference); emailAggregate.ProviderEmailReference.ShouldBe(TestData.ProviderEmailReference); + emailAggregate.MessageStatus.ShouldBe(MessageStatus.Sent); } [Fact] diff --git a/MessagingService.EmailMessageAggregate/EmailAggregate.cs b/MessagingService.EmailMessageAggregate/EmailAggregate.cs index 6944c7f..d521440 100644 --- a/MessagingService.EmailMessageAggregate/EmailAggregate.cs +++ b/MessagingService.EmailMessageAggregate/EmailAggregate.cs @@ -233,6 +233,11 @@ public void SendRequestToProvider(String fromAddress, String body, Boolean isHtml) { + if (this.MessageStatus != MessageStatus.NotSet) + { + throw new InvalidOperationException("Cannot send a message to provider that has already been sent"); + } + RequestSentToProviderEvent requestSentToProviderEvent = RequestSentToProviderEvent.Create(this.AggregateId, fromAddress, toAddresses, subject, body, isHtml); this.ApplyAndPend(requestSentToProviderEvent); @@ -327,7 +332,7 @@ private void PlayEvent(RequestSentToProviderEvent domainEvent) this.Subject = domainEvent.Subject; this.IsHtml = domainEvent.IsHtml; this.FromAddress = domainEvent.FromAddress; - this.MessageStatus = MessageStatus.NotSet; + this.MessageStatus = MessageStatus.InProgress; foreach (String domainEventToAddress in domainEvent.ToAddresses) { diff --git a/MessagingService.EmailMessageAggregate/MessageStatus.cs b/MessagingService.EmailMessageAggregate/MessageStatus.cs index ef7a328..92612e4 100644 --- a/MessagingService.EmailMessageAggregate/MessageStatus.cs +++ b/MessagingService.EmailMessageAggregate/MessageStatus.cs @@ -10,6 +10,8 @@ public enum MessageStatus /// NotSet = 0, + InProgress, + /// /// The sent /// diff --git a/MessagingService/Controllers/EmailController.cs b/MessagingService/Controllers/EmailController.cs index c5fc1d5..6332b7a 100644 --- a/MessagingService/Controllers/EmailController.cs +++ b/MessagingService/Controllers/EmailController.cs @@ -65,7 +65,7 @@ public async Task PostEmail([FromBody] SendEmailRequestDTO sendEm return this.Forbid(); } - Guid messageId = Guid.NewGuid(); + Guid messageId = sendEmailRequest.MessageId.HasValue ? sendEmailRequest.MessageId.Value : Guid.NewGuid(); // Create the command SendEmailRequest request = SendEmailRequest.Create(sendEmailRequest.ConnectionIdentifier,