using DigitalData.MessagingService.Application.Common.Interfaces; using DigitalData.MessagingService.Application.EmailAccount.Queries; using DigitalData.MessagingService.Abstraction; using DigitalData.MessagingService.Domain.Exceptions; using MediatR; namespace DigitalData.MessagingService.Application.EmailReceiving.Queries; /// /// Query to fetch emails from an IMAP mailbox. /// public record FetchEmailsQuery : IRequest> { /// /// Identifies the email account to use. /// public required GetSenderQuery Account { get; init; } /// /// Mailbox folder to read from (default: "INBOX"). /// public string Folder { get; init; } = "INBOX"; /// /// When returns only unread messages. /// public bool UnseenOnly { get; init; } = false; /// /// Maximum number of messages to retrieve (most-recent first). 0 = unlimited. /// public int MaxCount { get; init; } = 50; } public class FetchEmailsQueryHandler( ISender Sender, IImapEmailService ImapService) : IRequestHandler> { public async Task> Handle(FetchEmailsQuery request, CancellationToken cancellationToken) { var account = await Sender.Send(request.Account, cancellationToken) ?? throw new NotFoundException( $"No email account found for the given criteria (Id: {request.Account.Id}, Username: {request.Account.Username})."); if (string.IsNullOrWhiteSpace(account.ImapServer)) throw new InvalidOperationException( $"IMAP is not configured for account '{account.Username}' (Id: {account.Id}). Set ImapServer in EmailAccounts configuration."); return await ImapService.FetchEmailsAsync( account, request.Folder, request.UnseenOnly, request.MaxCount, cancellationToken); } }