diff --git a/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailQueue.cs b/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailQueue.cs index ffc8fa0..7805e9d 100644 --- a/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailQueue.cs +++ b/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailQueue.cs @@ -1,4 +1,5 @@ -using DigitalData.EmailProfiler.Domain.Entities; +using DigitalData.EmailProfiler.Application.Common.Events; +using DigitalData.EmailProfiler.Application.EmailSending.Commands; namespace DigitalData.EmailProfiler.Application.Common.Interfaces; @@ -7,14 +8,14 @@ namespace DigitalData.EmailProfiler.Application.Common.Interfaces; /// public interface IEmailQueue { - Task EnqueueAsync(EmailOutbox email, CancellationToken cancellationToken = default); - Task DequeueAsync(CancellationToken cancellationToken = default); + Task EnqueueAsync(OutgoingEmailEvent outgoingEmailEvent, CancellationToken cancellationToken = default); + Task DequeueAsync(CancellationToken cancellationToken = default); Task GetQueueDepthAsync(CancellationToken cancellationToken = default); /// - /// Start event-driven consumer that calls callback when message received + /// Start event-driven consumer that calls callback when mail received /// - /// Callback to process received message + /// Callback to process received mail /// Cancellation token - Task StartConsumerAsync(Func onMessageReceived, CancellationToken cancellationToken = default); + Task StartConsumerAsync(Func onMailReceived, CancellationToken cancellationToken = default); } diff --git a/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailService.cs b/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailService.cs index 31f9452..6e38d48 100644 --- a/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailService.cs +++ b/src/DigitalData.EmailProfiler.Application/Common/Interfaces/IEmailService.cs @@ -1,5 +1,3 @@ -using DigitalData.EmailProfiler.Application.Common.Dtos; - namespace DigitalData.EmailProfiler.Application.Common.Interfaces; /// diff --git a/src/DigitalData.EmailProfiler.Application/DigitalData.EmailProfiler.Application.csproj b/src/DigitalData.EmailProfiler.Application/DigitalData.EmailProfiler.Application.csproj index d7886fb..8bc5a1a 100644 --- a/src/DigitalData.EmailProfiler.Application/DigitalData.EmailProfiler.Application.csproj +++ b/src/DigitalData.EmailProfiler.Application/DigitalData.EmailProfiler.Application.csproj @@ -18,4 +18,8 @@ + + + + diff --git a/src/DigitalData.EmailProfiler.Application/EmailSending/Commands/SendEmailCommand.cs b/src/DigitalData.EmailProfiler.Application/EmailSending/Commands/SendEmailCommand.cs index 543c432..b4ce0bf 100644 --- a/src/DigitalData.EmailProfiler.Application/EmailSending/Commands/SendEmailCommand.cs +++ b/src/DigitalData.EmailProfiler.Application/EmailSending/Commands/SendEmailCommand.cs @@ -1,6 +1,6 @@ using AutoMapper; +using DigitalData.EmailProfiler.Application.Common.Events; using DigitalData.EmailProfiler.Application.Common.Interfaces; -using DigitalData.EmailProfiler.Domain.Entities; using MediatR; namespace DigitalData.EmailProfiler.Application.EmailSending.Commands; @@ -8,13 +8,8 @@ namespace DigitalData.EmailProfiler.Application.EmailSending.Commands; /// /// Command to send an email (enqueue to RabbitMQ) /// -public record SendEmailCommand : IRequest +public record SendEmailCommand : IRequest { - /// - /// Email account ID to use for sending - /// - public required int EmailAccountId { get; init; } - /// /// Recipient email address /// @@ -34,37 +29,20 @@ public record SendEmailCommand : IRequest /// Is HTML email (default: true) /// public bool IsHtml { get; init; } = true; - - /// - /// Optional reference string (e.g., ticket number, order ID) - /// - public string? ReferenceId { get; init; } - - /// - /// Optional comment - /// - public string? Comment { get; init; } } /// /// Handler for SendEmailCommand /// Creates EmailOutbox entity via AutoMapper and enqueues to RabbitMQ /// -public class SendEmailCommandHandler(IEmailQueue EmailQueue, IMapper Mapper) : IRequestHandler +public class SendEmailCommandHandler(IEmailQueue EmailQueue, IMapper Mapper) : IRequestHandler { - public async Task Handle(SendEmailCommand request, CancellationToken cancellationToken) + public async Task Handle(SendEmailCommand request, CancellationToken cancellationToken) { - // Map command to EmailOutbox entity using AutoMapper - var emailOutbox = Mapper.Map(request); - - // Set audit fields - emailOutbox.AddedWhen = DateTime.Now; - emailOutbox.Sent = false; - emailOutbox.RetryCount = 0; + var outgoingEmailEvent = Mapper.Map(request); // Enqueue to RabbitMQ - await EmailQueue.EnqueueAsync(emailOutbox, cancellationToken); - - return emailOutbox.Id; + await EmailQueue.EnqueueAsync(outgoingEmailEvent, cancellationToken); + return outgoingEmailEvent; } } diff --git a/src/DigitalData.EmailProfiler.Application/EmailSending/Validators/SendEmailCommandValidator.cs b/src/DigitalData.EmailProfiler.Application/EmailSending/Validators/SendEmailCommandValidator.cs index 7388ef2..b93cf00 100644 --- a/src/DigitalData.EmailProfiler.Application/EmailSending/Validators/SendEmailCommandValidator.cs +++ b/src/DigitalData.EmailProfiler.Application/EmailSending/Validators/SendEmailCommandValidator.cs @@ -10,10 +10,6 @@ public class SendEmailCommandValidator : AbstractValidator { public SendEmailCommandValidator() { - RuleFor(x => x.EmailAccountId) - .GreaterThan(0) - .WithMessage("EmailAccountId must be greater than 0"); - RuleFor(x => x.Recipient) .NotEmpty() .WithMessage("Recipient is required") @@ -31,15 +27,5 @@ public class SendEmailCommandValidator : AbstractValidator RuleFor(x => x.Body) .NotEmpty() .WithMessage("Body is required"); - - RuleFor(x => x.ReferenceId) - .MaximumLength(200) - .When(x => !string.IsNullOrEmpty(x.ReferenceId)) - .WithMessage("ReferenceId must not exceed 200 characters"); - - RuleFor(x => x.Comment) - .MaximumLength(500) - .When(x => !string.IsNullOrEmpty(x.Comment)) - .WithMessage("Comment must not exceed 500 characters"); } }