namespace InboxIntel.Application.DTOs; /// /// Advanced search request. accepts Gmail-like syntax /// (e.g. "from:github.com is:unread has:attachment newsletter") which the /// query parser decomposes into structured filters; remaining free text runs /// through PostgreSQL full-text search. /// public record SearchRequestDto( string? Query, string? Sender, string? Domain, DateOnly? From, DateOnly? To, bool? IsUnread, bool? HasAttachments, bool FuzzyMatch = false, int Page = 1, int PageSize = 50, // Folder / label filters bool? IsInInbox = null, bool? IsStarred = null, bool? IsTrashed = null, string? GmailLabel = null, // e.g. "SENT", "DRAFT", "SPAM" string? Category = null, // EmailCategory name, e.g. "Finance" long? MinSizeBytes = null, // Keyset cursor for the date-ordered browse path (RECOMMENDATIONS #8): pass the last // row's SentAtUtc+Id to fetch the next window without OFFSET (O(pageSize), not O(page)). // When set, TotalCount is not recomputed (-1). Additive; offset paging still works. DateTimeOffset? AfterSentAtUtc = null, Guid? AfterId = null);