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