using AutoMapper; using DigitalData.MessagingService.Application.EmailAccount.Queries; using DigitalData.MessagingService.Domain.Exceptions; using DigitalData.MessagingService.Abstraction; using MediatR; namespace DigitalData.MessagingService.Application.EmailSending.Commands; /// /// Command to send an email (enqueue to RabbitMQ) /// public record SendEmailCommand : IRequest { public required GetSenderQuery Sender { get; init; } /// /// Recipient email addresses /// public required IEnumerable Recipients { get; init; } /// /// Email subject /// public required string Subject { get; init; } /// /// Email body (HTML or plain text) /// public required string Body { get; init; } /// /// Is HTML email (default: true) /// public bool IsHtml { get; init; } = true; } /// /// Handler for SendEmailCommand /// Resolves the sender account via MediatR, maps to OutgoingEmailEvent and enqueues to RabbitMQ /// public class SendEmailCommandHandler( ISender Sender, IOutgoingEmailPublisher Publisher, IMapper Mapper) : IRequestHandler { public async Task Handle(SendEmailCommand request, CancellationToken cancellationToken) { var senderAccount = await Sender.Send(request.Sender, cancellationToken) ?? throw new NotFoundException( $"No email account found for the given sender criteria (Id: {request.Sender.Id}, Username: {request.Sender.Username})."); var outgoingEmailEvent = Mapper.Map(request) with { Sender = senderAccount }; // Enqueue to RabbitMQ await Publisher.EnqueueAsync(outgoingEmailEvent, cancellationToken); return outgoingEmailEvent; } }