namespace Distribution.Features.Notifications; public interface INotificationRepository { // ── Inbox ──────────────────────────────────────────────────────────── Task AddAsync(Models.Notification notification); /// Stops tracking a notification (and its recipients) whose save failed. void Discard(Models.Notification notification); Task GetInboxCountAsync(Guid userId, bool unreadOnly); Task> GetInboxAsync(Guid userId, bool unreadOnly, int page, int pageSize); Task GetUnreadCountAsync(Guid userId); Task GetRecipientAsync(Guid userId, Guid recipientId); Task> GetUnreadRecipientsAsync(Guid userId); void RemoveRecipient(Models.NotificationRecipient recipient); // ── Recipient resolution ───────────────────────────────────────────── Task> FilterActiveUserIdsAsync(IEnumerable userIds); Task> GetUserIdsByPermissionAsync(string permissionCode); Task> GetUserIdsByScopeAsync(ScopeKind kind, Guid id); Task GetReportsToUserIdAsync(Guid userId); Task GetRouteOwnerUserIdAsync(ScopeKind kind, Guid id); // ── Retention ──────────────────────────────────────────────────────── Task> GetExpiredReadRecipientsAsync(DateTime cutoff, int take); Task> GetOrphanNotificationsAsync(int take); void RemoveRecipients(IEnumerable recipients); void RemoveNotifications(IEnumerable notifications); }