using ScadaLink.Commons.Types.Notifications; namespace ScadaLink.Commons.Messages.Notification; /// /// Outbox UI -> Central: paginated, filtered query over the notification outbox. /// All filter fields are optional; restricts results to stuck notifications. /// public record NotificationOutboxQueryRequest( string CorrelationId, string? StatusFilter, string? TypeFilter, string? SourceSiteFilter, string? ListNameFilter, bool StuckOnly, string? SubjectKeyword, DateTimeOffset? From, DateTimeOffset? To, int PageNumber, int PageSize, string? SourceNodeFilter = null); /// /// A single notification row summarised for outbox UI display. /// public record NotificationSummary( string NotificationId, string Type, string ListName, string Subject, string Status, int RetryCount, string? LastError, string SourceSiteId, string? SourceInstanceId, DateTimeOffset CreatedAt, DateTimeOffset? DeliveredAt, bool IsStuck, string? SourceNode = null); /// /// Central -> Outbox UI: paginated response for a . /// public record NotificationOutboxQueryResponse( string CorrelationId, bool Success, string? ErrorMessage, IReadOnlyList Notifications, int TotalCount); /// /// Outbox UI -> Central: request to immediately retry delivery of a notification. /// public record RetryNotificationRequest( string CorrelationId, string NotificationId); /// /// Central -> Outbox UI: result of a . /// public record RetryNotificationResponse( string CorrelationId, bool Success, string? ErrorMessage); /// /// Outbox UI -> Central: request to discard (cancel) a pending or stuck notification. /// public record DiscardNotificationRequest( string CorrelationId, string NotificationId); /// /// Central -> Outbox UI: result of a . /// public record DiscardNotificationResponse( string CorrelationId, bool Success, string? ErrorMessage); /// /// Outbox UI -> Central: request for the full detail of a single notification /// (including Body and resolved recipients), for the report detail modal. /// public record NotificationDetailRequest( string CorrelationId, string NotificationId); /// /// Central -> Outbox UI: full detail for one notification. On a repository fault or /// missing row, Success is false / Detail is null and ErrorMessage carries the cause. /// public record NotificationDetailResponse( string CorrelationId, bool Success, string? ErrorMessage, NotificationDetail? Detail); /// /// Full notification detail for the report detail modal — everything in the grid's /// NotificationSummary plus Body, ResolvedTargets (recipients), TypeData, SourceScript, /// and the additional lifecycle timestamps. /// public record NotificationDetail( string NotificationId, string Type, string ListName, string Subject, string Body, string Status, int RetryCount, string? LastError, string? ResolvedTargets, string? TypeData, string SourceSiteId, string? SourceInstanceId, string? SourceScript, DateTimeOffset SiteEnqueuedAt, DateTimeOffset CreatedAt, DateTimeOffset? LastAttemptAt, DateTimeOffset? NextAttemptAt, DateTimeOffset? DeliveredAt, string? SourceNode = null); /// /// Outbox UI -> Central: request for the notification outbox KPI summary. /// public record NotificationKpiRequest( string CorrelationId); /// /// Central -> Outbox UI: KPI summary for the notification outbox dashboard. /// On a repository fault is false, /// carries the cause, and the KPI fields are zeroed/null. /// public record NotificationKpiResponse( string CorrelationId, bool Success, string? ErrorMessage, int QueueDepth, int StuckCount, int ParkedCount, int DeliveredLastInterval, TimeSpan? OldestPendingAge); /// /// Outbox UI -> Central: request for the per-source-site notification outbox KPI breakdown. /// public record PerSiteNotificationKpiRequest( string CorrelationId); /// /// Central -> Outbox UI: per-site KPI breakdown for the Notification KPIs page. /// On a repository fault is false, /// carries the cause, and is empty. /// public record PerSiteNotificationKpiResponse( string CorrelationId, bool Success, string? ErrorMessage, IReadOnlyList Sites);