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;
}
}