Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 33 additions & 25 deletions MessagingService.BusinessLogic/Services/MessagingDomainService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,29 +117,30 @@
Result result = await ApplyEmailUpdates(async (EmailAggregate emailAggregate) =>
{
// Check if this message has been sent before
if (emailAggregate.GetMessageStatus() != EmailMessageAggregate.MessageStatus.NotSet)
{
if (emailAggregate.GetMessageStatus() != EmailMessageAggregate.MessageStatus.NotSet) {
return Result.Success();
}

// send message to provider (record event)
emailAggregate.SendRequestToProvider(command.FromAddress, command.ToAddresses, command.Subject, command.Body, command.IsHtml, attachments);
Result stateResult = emailAggregate.SendRequestToProvider(command.FromAddress, command.ToAddresses, command.Subject, command.Body, command.IsHtml, attachments);
if (stateResult.IsFailed)
return stateResult;

// Make call to Email provider here
EmailServiceProxyResponse emailResponse = await this.EmailServiceProxy.SendEmail(command.MessageId, command.FromAddress,
command.ToAddresses,command.Subject, command.Body, command.IsHtml, attachments, cancellationToken);

if (emailResponse.ApiCallSuccessful)
{
if (emailResponse.ApiCallSuccessful) {
// response message from provider (record event)
emailAggregate.ReceiveResponseFromProvider(emailResponse.RequestIdentifier,
emailResponse.EmailIdentifier);
stateResult = emailAggregate.ReceiveResponseFromProvider(emailResponse.RequestIdentifier, emailResponse.EmailIdentifier);
}
else
{
emailAggregate.ReceiveBadResponseFromProvider(emailResponse.Error, emailResponse.ErrorCode);
else {
stateResult = emailAggregate.ReceiveBadResponseFromProvider(emailResponse.Error, emailResponse.ErrorCode);
}

if (stateResult.IsFailed)
return stateResult;

return Result.Success();
}, command.MessageId, cancellationToken, false);

Expand Down Expand Up @@ -187,8 +188,10 @@

Result result = await ApplyEmailUpdates(async (EmailAggregate emailAggregate) => {
// re-send message to provider (record event)
emailAggregate.ResendRequestToProvider();

Result stateResult = emailAggregate.ResendRequestToProvider();
if (stateResult.IsFailed)
return stateResult;

// Make call to Email provider here
EmailServiceProxyResponse emailResponse =
await this.EmailServiceProxy.SendEmail(messageId, emailAggregate.FromAddress,
Expand All @@ -198,16 +201,15 @@
emailAggregate.IsHtml, null,
cancellationToken);

if (emailResponse.ApiCallSuccessful)
{
if (emailResponse.ApiCallSuccessful) {
// response message from provider (record event)
emailAggregate.ReceiveResponseFromProvider(emailResponse.RequestIdentifier,
emailResponse.EmailIdentifier);
stateResult = emailAggregate.ReceiveResponseFromProvider(emailResponse.RequestIdentifier, emailResponse.EmailIdentifier);
}
else
{
emailAggregate.ReceiveBadResponseFromProvider(emailResponse.Error, emailResponse.ErrorCode);
else {
stateResult = emailAggregate.ReceiveBadResponseFromProvider(emailResponse.Error, emailResponse.ErrorCode);
}
if (stateResult.IsFailed)
return stateResult;

return Result.Success();
}, messageId, cancellationToken);
Expand All @@ -233,30 +235,36 @@

public async Task<Result> UpdateMessageStatus(EmailCommands.UpdateMessageStatusCommand command,
CancellationToken cancellationToken) {
Result result = await ApplyEmailUpdates(async (EmailAggregate emailAggregate) => {

Check warning on line 238 in MessagingService.BusinessLogic/Services/MessagingDomainService.cs

View workflow job for this annotation

GitHub Actions / Build and Test Pull Requests

This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.

Check warning on line 238 in MessagingService.BusinessLogic/Services/MessagingDomainService.cs

View workflow job for this annotation

GitHub Actions / Build and Test Pull Requests

This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.

Result stateResult;

switch (command.Status) {
case EmailServices.MessageStatus.Bounced:
emailAggregate.MarkMessageAsBounced(command.Description, command.Timestamp);
stateResult = emailAggregate.MarkMessageAsBounced(command.Description, command.Timestamp);
break;
case EmailServices.MessageStatus.Delivered:
emailAggregate.MarkMessageAsDelivered(command.Description, command.Timestamp);
stateResult = emailAggregate.MarkMessageAsDelivered(command.Description, command.Timestamp);
break;
case EmailServices.MessageStatus.Failed:
case EmailServices.MessageStatus.Unknown:
emailAggregate.MarkMessageAsFailed(command.Description, command.Timestamp);
stateResult = emailAggregate.MarkMessageAsFailed(command.Description, command.Timestamp);
break;
case EmailServices.MessageStatus.Rejected:
emailAggregate.MarkMessageAsRejected(command.Description, command.Timestamp);
stateResult = emailAggregate.MarkMessageAsRejected(command.Description, command.Timestamp);
break;
case EmailServices.MessageStatus.Spam:
emailAggregate.MarkMessageAsSpam(command.Description, command.Timestamp);
stateResult = emailAggregate.MarkMessageAsSpam(command.Description, command.Timestamp);
break;
default:
// Unknown status - treat as failed
emailAggregate.MarkMessageAsFailed(command.Description, command.Timestamp);
stateResult = emailAggregate.MarkMessageAsFailed(command.Description, command.Timestamp);
break;
}

if (stateResult.IsFailed)
return stateResult;

return Result.Success();
}, command.MessageId, cancellationToken);
return result;
Expand All @@ -264,7 +272,7 @@

public async Task<Result> UpdateMessageStatus(SMSCommands.UpdateMessageStatusCommand command,
CancellationToken cancellationToken) {
Result result = await ApplySMSUpdates(async (SMSAggregate smsAggregate) => {

Check warning on line 275 in MessagingService.BusinessLogic/Services/MessagingDomainService.cs

View workflow job for this annotation

GitHub Actions / Build and Test Pull Requests

This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.

switch (command.Status) {
case SMSServices.MessageStatus.Delivered:
Expand Down
45 changes: 34 additions & 11 deletions MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Linq;
using SimpleResults;
using Xunit;

namespace MessagingService.EmailAggregate.Tests
Expand Down Expand Up @@ -120,7 +121,9 @@ public void EmailAggregate_MarkMessageAsDelivered_IncorrectState_ErrorThrown(Mes

}

Should.Throw<InvalidOperationException>(() => emailAggregate.MarkMessageAsDelivered(TestData.ProviderStatusDescription, TestData.DeliveredDateTime));
Result result = emailAggregate.MarkMessageAsDelivered(TestData.ProviderStatusDescription, TestData.DeliveredDateTime);
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand Down Expand Up @@ -171,7 +174,9 @@ public void EmailAggregate_MarkMessageAsRejected_IncorrectState_ErrorThrown(Mess
break;
}

Should.Throw<InvalidOperationException>(() => emailAggregate.MarkMessageAsRejected(TestData.ProviderStatusDescription, TestData.RejectedDateTime));
Result result = emailAggregate.MarkMessageAsRejected(TestData.ProviderStatusDescription, TestData.RejectedDateTime);
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand Down Expand Up @@ -222,7 +227,9 @@ public void EmailAggregate_MarkMessageAsFailed_IncorrectState_ErrorThrown(Messag
break;
}

Should.Throw<InvalidOperationException>(() => emailAggregate.MarkMessageAsFailed(TestData.ProviderStatusDescription, TestData.FailedDateTime));
Result result = emailAggregate.MarkMessageAsFailed(TestData.ProviderStatusDescription, TestData.FailedDateTime);
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand Down Expand Up @@ -273,7 +280,9 @@ public void EmailAggregate_MarkMessageAsBounced_IncorrectState_ErrorThrown(Messa
break;
}

Should.Throw<InvalidOperationException>(() => emailAggregate.MarkMessageAsBounced(TestData.ProviderStatusDescription, TestData.BouncedDateTime));
Result result = emailAggregate.MarkMessageAsBounced(TestData.ProviderStatusDescription, TestData.BouncedDateTime);
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand Down Expand Up @@ -324,7 +333,9 @@ public void EmailAggregate_MarkMessageAsSpam_IncorrectState_ErrorThrown(MessageS
break;
}

Should.Throw<InvalidOperationException>(() => emailAggregate.MarkMessageAsSpam(TestData.ProviderStatusDescription, TestData.SpamDateTime));
Result result = emailAggregate.MarkMessageAsSpam(TestData.ProviderStatusDescription, TestData.SpamDateTime);
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}


Expand Down Expand Up @@ -358,15 +369,19 @@ public void EmailAggregate_ResendRequestToProvider_IsDelivered_MessageIsResent()
public void EmailAggregate_ResendRequestToProvider_NotSet_ErrorThrown() {
EmailAggregate emailAggregate = EmailAggregate.Create(TestData.MessageId);

Should.Throw<InvalidOperationException>(() => emailAggregate.ResendRequestToProvider());
Result result = emailAggregate.ResendRequestToProvider();
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
public void EmailAggregate_ResendRequestToProvider_InProgress_ErrorThrown() {
EmailAggregate emailAggregate = EmailAggregate.Create(TestData.MessageId);

emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue, TestData.EmailAttachmentModels);
Should.Throw<InvalidOperationException>(() => emailAggregate.ResendRequestToProvider());
Result result = emailAggregate.ResendRequestToProvider();
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand All @@ -376,7 +391,9 @@ public void EmailAggregate_ResendRequestToProvider_Rejected_ErrorThrown() {
emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue, TestData.EmailAttachmentModels);
emailAggregate.ReceiveResponseFromProvider(TestData.ProviderRequestReference, TestData.ProviderEmailReference);
emailAggregate.MarkMessageAsRejected(TestData.ProviderStatusDescription, TestData.RejectedDateTime);
Should.Throw<InvalidOperationException>(() => emailAggregate.ResendRequestToProvider());
Result result = emailAggregate.ResendRequestToProvider();
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand All @@ -386,7 +403,9 @@ public void EmailAggregate_ResendRequestToProvider_Failed_ErrorThrown() {
emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue, TestData.EmailAttachmentModels);
emailAggregate.ReceiveResponseFromProvider(TestData.ProviderRequestReference, TestData.ProviderEmailReference);
emailAggregate.MarkMessageAsFailed(TestData.ProviderStatusDescription, TestData.FailedDateTime);
Should.Throw<InvalidOperationException>(() => emailAggregate.ResendRequestToProvider());
Result result = emailAggregate.ResendRequestToProvider();
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand All @@ -396,7 +415,9 @@ public void EmailAggregate_ResendRequestToProvider_Spam_ErrorThrown() {
emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue, TestData.EmailAttachmentModels);
emailAggregate.ReceiveResponseFromProvider(TestData.ProviderRequestReference, TestData.ProviderEmailReference);
emailAggregate.MarkMessageAsSpam(TestData.ProviderStatusDescription, TestData.SpamDateTime);
Should.Throw<InvalidOperationException>(() => emailAggregate.ResendRequestToProvider());
Result result = emailAggregate.ResendRequestToProvider();
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand All @@ -406,7 +427,9 @@ public void EmailAggregate_ResendRequestToProvider_Bounced_ErrorThrown() {
emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue, TestData.EmailAttachmentModels);
emailAggregate.ReceiveResponseFromProvider(TestData.ProviderRequestReference, TestData.ProviderEmailReference);
emailAggregate.MarkMessageAsBounced(TestData.ProviderStatusDescription, TestData.BouncedDateTime);
Should.Throw<InvalidOperationException>(() => emailAggregate.ResendRequestToProvider());
Result result = emailAggregate.ResendRequestToProvider();
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
}

[Fact]
Expand Down
Loading
Loading