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,