diff --git a/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj b/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj
index 6848542..73d33dc 100644
--- a/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj
+++ b/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj
@@ -2,7 +2,7 @@
net8.0
- None
+ Full
false
diff --git a/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs b/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs
index eb5a999..7187ec3 100644
--- a/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs
+++ b/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs
@@ -57,6 +57,41 @@ public async Task MessagingDomainService_SendEmailMessage_MessageSent()
result.Data.ShouldBe(TestData.MessageId);
}
+ [Fact]
+ public async Task MessagingDomainService_SendEmailMessage_SecondSend_MessageNotSent()
+ {
+ Mock> emailAggregateRepository = new Mock>();
+ emailAggregateRepository.Setup(a => a.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.GetSentEmailAggregate());
+ emailAggregateRepository.Setup(a => a.SaveChanges(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success);
+ Mock> smsAggregateRepository = new Mock>();
+ Mock emailServiceProxy = new Mock();
+ emailServiceProxy
+ .Setup(e => e.SendEmail(It.IsAny(),
+ It.IsAny(),
+ It.IsAny>(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny>(),
+ It.IsAny())).ReturnsAsync(TestData.SuccessfulEmailServiceProxyResponse);
+ Mock smsServiceProxy = new Mock();
+
+ MessagingDomainService messagingDomainService =
+ new MessagingDomainService(emailAggregateRepository.Object, smsAggregateRepository.Object, emailServiceProxy.Object, smsServiceProxy.Object);
+
+ var result = await messagingDomainService.SendEmailMessage(TestData.ConnectionIdentifier,
+ TestData.MessageId,
+ TestData.FromAddress,
+ TestData.ToAddresses,
+ TestData.Subject,
+ TestData.Body,
+ TestData.IsHtmlTrue,
+ TestData.EmailAttachmentModels,
+ CancellationToken.None);
+ result.IsSuccess.ShouldBeTrue();
+ result.Data.ShouldBe(TestData.MessageId);
+ }
+
[Fact] public async Task MessagingDomainService_SendEmailMessage_SaveFailed_MessageSent()
{
Mock> emailAggregateRepository = new Mock>();
@@ -260,6 +295,35 @@ public async Task MessagingDomainService_SendSMSMessage_MessageSent()
}
+ [Fact]
+ public async Task MessagingDomainService_SendSMSMessage_SecondTime_MessageNotSent()
+ {
+ Mock> emailAggregateRepository = new Mock>();
+ Mock> smsAggregateRepository = new Mock>();
+ smsAggregateRepository.Setup(a => a.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.GetSentSMSAggregate());
+ smsAggregateRepository.Setup(a => a.SaveChanges(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success());
+ Mock emailServiceProxy = new Mock();
+ Mock smsServiceProxy = new Mock();
+ smsServiceProxy
+ .Setup(e => e.SendSMS(It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny())).ReturnsAsync(TestData.SuccessfulSMSServiceProxyResponse);
+ MessagingDomainService messagingDomainService =
+ new MessagingDomainService(emailAggregateRepository.Object, smsAggregateRepository.Object, emailServiceProxy.Object, smsServiceProxy.Object);
+
+ var result = await messagingDomainService.SendSMSMessage(TestData.ConnectionIdentifier,
+ TestData.MessageId,
+ TestData.Sender,
+ TestData.Destination,
+ TestData.Message,
+ CancellationToken.None);
+ result.IsSuccess.ShouldBeTrue();
+ result.Data.ShouldBe(TestData.MessageId);
+
+ }
+
[Fact]
public async Task MessagingDomainService_SendSMSMessage_SaveFailed_MessageSent()
{
diff --git a/MessagingService.BusinessLogic/Services/MessagingDomainService.cs b/MessagingService.BusinessLogic/Services/MessagingDomainService.cs
index 2b56b8c..14b851f 100644
--- a/MessagingService.BusinessLogic/Services/MessagingDomainService.cs
+++ b/MessagingService.BusinessLogic/Services/MessagingDomainService.cs
@@ -120,8 +120,13 @@ public async Task> SendEmailMessage(Guid connectionIdentifier,
List attachments,
CancellationToken cancellationToken) {
Result result = await ApplyEmailUpdates(async (EmailAggregate emailAggregate) => {
+ // Check if this message has been sent before
+ if (emailAggregate.GetMessageStatus() != EmailMessageAggregate.MessageStatus.NotSet) {
+ return Result.Success();
+ }
+
// send message to provider (record event)
- emailAggregate.SendRequestToProvider(fromAddress, toAddresses, subject, body, isHtml, attachments);
+ emailAggregate.SendRequestToProvider(fromAddress, toAddresses, subject, body, isHtml, attachments);
// Make call to Email provider here
EmailServiceProxyResponse emailResponse = await this.EmailServiceProxy.SendEmail(messageId, fromAddress,
@@ -152,6 +157,12 @@ public async Task> SendSMSMessage(Guid connectionIdentifier,
CancellationToken cancellationToken)
{
Result result = await ApplySMSUpdates(async (SMSAggregate smsAggregate) => {
+ // Check if this message has been sent before
+ if (smsAggregate.GetMessageStatus() != SMSMessageAggregate.MessageStatus.NotSet)
+ {
+ return Result.Success();
+ }
+
// send message to provider (record event)
smsAggregate.SendRequestToProvider(sender, destination, message);
diff --git a/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs b/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs
index dcfb34a..9e9cfd6 100644
--- a/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs
+++ b/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs
@@ -44,21 +44,6 @@ public void EmailAggregate_SendRequestToProvider_RequestSent() {
}
}
- [Fact]
- public void EmailAggregate_SendRequestToProvider_RequestAlreadySent_NoErrorThrown() {
- EmailAggregate emailAggregate = EmailAggregate.Create(TestData.MessageId);
-
- emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue, TestData.EmailAttachmentModels);
-
- Should.NotThrow(() => {
- emailAggregate.SendRequestToProvider(TestData.FromAddress,
- TestData.ToAddresses,
- TestData.Subject,
- TestData.Body,
- TestData.IsHtmlTrue, TestData.EmailAttachmentModels);
- });
- }
-
[Fact]
public void EmailAggregate_ReceiveResponseFromProvider_ResponseReceived() {
EmailAggregate emailAggregate = EmailAggregate.Create(TestData.MessageId);
diff --git a/MessagingService.EmailMessageAggregate/EmailAggregate.cs b/MessagingService.EmailMessageAggregate/EmailAggregate.cs
index 2abf450..74eba7f 100644
--- a/MessagingService.EmailMessageAggregate/EmailAggregate.cs
+++ b/MessagingService.EmailMessageAggregate/EmailAggregate.cs
@@ -79,6 +79,11 @@ public static void ReceiveBadResponseFromProvider(this EmailAggregate aggregate,
aggregate.ApplyAndAppend(badResponseReceivedFromProviderEvent);
}
+ public static MessageStatus GetMessageStatus(this EmailAggregate aggregate)
+ {
+ return aggregate.DeliveryStatusList[aggregate.ResendCount];
+ }
+
public static void SendRequestToProvider(this EmailAggregate aggregate, String fromAddress,
List toAddresses,
String subject,
@@ -86,10 +91,6 @@ public static void SendRequestToProvider(this EmailAggregate aggregate, String f
Boolean isHtml,
List attachments)
{
- if (aggregate.DeliveryStatusList[aggregate.ResendCount] != MessageStatus.NotSet) {
- return;
- }
-
RequestSentToEmailProviderEvent requestSentToProviderEvent = new RequestSentToEmailProviderEvent(aggregate.AggregateId, fromAddress, toAddresses, subject, body, isHtml);
aggregate.ApplyAndAppend(requestSentToProviderEvent);
diff --git a/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs b/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs
index dbb4984..af5b6c0 100644
--- a/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs
+++ b/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs
@@ -34,19 +34,6 @@ public void SMSAggregate_SendRequestToProvider_RequestSent()
smsAggregate.GetDeliveryStatus().ShouldBe(MessageStatus.InProgress);
}
- [Fact]
- public void SMSAggregate_SendRequestToProvider_RequestAlreadySent_NoErrorThrown()
- {
- SMSAggregate smsAggregate = SMSAggregate.Create(TestData.MessageId);
-
- smsAggregate.SendRequestToProvider(TestData.Sender, TestData.Destination, TestData.Message);
-
- Should.NotThrow(() =>
- {
- smsAggregate.SendRequestToProvider(TestData.Sender, TestData.Destination, TestData.Message);
- });
- }
-
[Fact]
public void SMSAggregate_ReceiveResponseFromProvider_ResponseReceived()
{
diff --git a/MessagingService.SMSMessageAggregate/SMSAggregate.cs b/MessagingService.SMSMessageAggregate/SMSAggregate.cs
index 4c580ab..f23c715 100644
--- a/MessagingService.SMSMessageAggregate/SMSAggregate.cs
+++ b/MessagingService.SMSMessageAggregate/SMSAggregate.cs
@@ -113,9 +113,7 @@ public static void SendRequestToProvider(this SMSAggregate aggregate,
String sender,
String destination,
String message){
- if (aggregate.DeliveryStatusList[aggregate.ResendCount] != MessageStatus.NotSet){
- return;
- }
+
RequestSentToSMSProviderEvent requestSentToProviderEvent = new RequestSentToSMSProviderEvent(aggregate.AggregateId, sender, destination, message);
@@ -146,6 +144,10 @@ private static void CheckMessageCanBeSetToUndeliverable(this SMSAggregate aggreg
}
}
+ public static MessageStatus GetMessageStatus(this SMSAggregate aggregate) {
+ return aggregate.DeliveryStatusList[aggregate.ResendCount];
+ }
+
#endregion
}