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