diff --git a/src/presentation/DigitalData.MessagingService.Client/Email.cs b/src/presentation/DigitalData.MessagingService.Client/Email.cs new file mode 100644 index 0000000..48eeeeb --- /dev/null +++ b/src/presentation/DigitalData.MessagingService.Client/Email.cs @@ -0,0 +1,46 @@ +using DigitalData.MessagingService.Publisher.Abstraction; + +namespace DigitalData.MessagingService.Client; + +/// +/// Represents an outgoing email message to be sent through the messaging service. +/// +public record Email +{ + /// + /// Recipient email address + /// + public string Recipient { get; set; } = null!; + + /// + /// Email subject + /// + public string Subject { get; set; } = null!; + + /// + /// Email body (HTML or plain text) + /// + public string Body { get; set; } = null!; + + /// + /// Is HTML email (default: true) + /// + public bool IsHtml { get; set; } = true; + + /// + /// Converts this instance to an . + /// + /// A new representing this email. + internal OutgoingEmailEvent ToEvent() + { + return new OutgoingEmailEvent + { + Id = Guid.NewGuid(), + Recipient = Recipient, + Subject = Subject, + Body = Body, + IsHtml = IsHtml, + QueuedAt = DateTime.Now + }; + } +} \ No newline at end of file diff --git a/src/presentation/DigitalData.MessagingService.Client/EmailSender.cs b/src/presentation/DigitalData.MessagingService.Client/EmailSender.cs index 72ff28f..911f526 100644 --- a/src/presentation/DigitalData.MessagingService.Client/EmailSender.cs +++ b/src/presentation/DigitalData.MessagingService.Client/EmailSender.cs @@ -106,24 +106,25 @@ public static class EmailSender } /// - /// Enqueues the specified email event to the RabbitMQ messaging pipeline. + /// Enqueues the specified email to the RabbitMQ messaging pipeline. /// - /// The outgoing email event to enqueue. + /// The outgoing email data to enqueue. /// /// Thrown when has not been called prior to sending. /// /// - /// This method resolves from the internal + /// This method maps to , + /// then resolves from the internal /// service provider and calls EnqueueAsync in a fire-and-forget manner. /// Ensure that any unhandled exceptions from the async operation are handled /// at the publisher level. /// - public static void Send(OutgoingEmailEvent email) + public static void Send(Email email) { if(!IsConnected) throw new InvalidOperationException("Messaging service is not connected. Call ConnectRabbitMq first."); var publisher = LazyProvider.Value.GetRequiredService(); - publisher.EnqueueAsync(email); + publisher.EnqueueAsync(email.ToEvent()); } } \ No newline at end of file diff --git a/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderTests.cs b/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderTests.cs index 40ea01e..6ba7b36 100644 --- a/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderTests.cs +++ b/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderTests.cs @@ -75,14 +75,12 @@ public sealed class EmailSenderTests [Fact] public void Send_WithValidEmail_DoesNotThrow() { - var email = new OutgoingEmailEvent + var email = new Email { - Id = Guid.NewGuid(), Recipient = "hakanttek@gmail.com", Subject = "EmailSender.Send Integration Test", Body = "

Sent via EmailSender static client.

", IsHtml = true, - QueuedAt = DateTime.Now }; var exception = Record.Exception(() => EmailSender.Send(email)); @@ -93,14 +91,12 @@ public sealed class EmailSenderTests [Fact] public void Send_WithPlainTextBody_DoesNotThrow() { - var email = new OutgoingEmailEvent + var email = new Email { - Id = Guid.NewGuid(), Recipient = "hakanttek@gmail.com", Subject = "Plain Text Test", Body = "This is a plain text email.", - IsHtml = false, - QueuedAt = DateTime.Now + IsHtml = false }; var exception = Record.Exception(() => EmailSender.Send(email)); diff --git a/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderUrlOverloadTests.cs b/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderUrlOverloadTests.cs index a8ebee7..6541a1b 100644 --- a/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderUrlOverloadTests.cs +++ b/tests/DigitalData.MessagingService.Tests/Integration/EmailSenderUrlOverloadTests.cs @@ -55,14 +55,12 @@ public sealed class EmailSenderUrlOverloadTests [Fact] public void Send_AfterUrlOverloadConnection_DoesNotThrow() { - var email = new OutgoingEmailEvent + var email = new Email { - Id = Guid.NewGuid(), Recipient = "url-overload-test@example.com", Subject = "URL Overload Integration Test", Body = "

Sent after URL-based connection.

", - IsHtml = true, - QueuedAt = DateTime.Now + IsHtml = true }; // Connection was established via Action<> overload in the fixture;