diff --git a/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs b/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs index f1f5f36..ad27997 100644 --- a/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs +++ b/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs @@ -11,15 +11,11 @@ public interface IImapEmailService /// Fetches emails from the specified mailbox folder. /// /// Account whose IMAP settings will be used. - /// Mailbox folder name (e.g. "INBOX"). Defaults to INBOX. - /// When returns only unread messages. - /// Maximum number of messages to retrieve (most-recent first). 0 = unlimited. + /// Filter to apply when fetching emails. /// Cancellation token. Task> FetchEmailsAsync( EmailAccountDto account, - string folder = "INBOX", - bool unseenOnly = false, - int maxCount = 50, + FetchEmailsQuery.SearchFilter filter, CancellationToken cancellationToken = default); /// diff --git a/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs b/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs index 8461fc6..7d8796e 100644 --- a/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs +++ b/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs @@ -19,9 +19,9 @@ public record FetchEmailsQuery : IRequest> /// /// Mail query used to filter and limit the emails retrieved. /// - public MailQuery Mail { get; init; } = new(); + public SearchFilter Mail { get; init; } = new(); - public record MailQuery + public record SearchFilter { /// /// Mailbox folder to read from (default: "INBOX"). @@ -56,9 +56,7 @@ public class FetchEmailsQueryHandler( return await ImapService.FetchEmailsAsync( account, - request.Mail.Folder, - request.Mail.UnseenOnly, - request.Mail.MaxCount, + request.Mail, cancellationToken); } } diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs index d97b32b..f55f51a 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs @@ -25,28 +25,26 @@ public class LimilabsImapEmailService( // Public API public async Task> FetchEmailsAsync( EmailAccountDto account, - string folder = "INBOX", - bool unseenOnly = false, - int maxCount = 50, + FetchEmailsQuery.SearchFilter filter, CancellationToken cancellationToken = default) { using var imap = new Imap(); try { await ConnectAndAuthenticateAsync(imap, account); - await SelectFolderAsync(imap, folder); + await SelectFolderAsync(imap, filter.Folder); // Get UIDs to fetch - List uids = unseenOnly + List uids = filter.UnseenOnly ? [.. await imap.SearchAsync(Flag.Unseen, cancellationToken)] : [.. await imap.GetAllAsync(cancellationToken)]; // Most-recent first; honour maxCount uids.Reverse(); - if (maxCount > 0 && uids.Count > maxCount) - uids = [.. uids.Take(maxCount)]; + if (filter.MaxCount > 0 && uids.Count() > filter.MaxCount) + uids = [.. uids.Take(filter.MaxCount)]; - var results = new List(uids.Count); + var results = new List(uids.Count()); foreach (var uid in uids) { @@ -62,7 +60,7 @@ public class LimilabsImapEmailService( } catch (Exception ex) { - logger.LogWarning(ex, "Failed to fetch IMAP message UID={Uid} from folder {Folder}. Skipping.", uid, folder); + logger.LogWarning(ex, "Failed to fetch IMAP message UID={Uid} from folder {Folder}. Skipping.", uid, filter.Folder); } }