namespace StellaOps.Notify.WebService.Contracts; /// /// Retention policy configuration request/response. /// public sealed record RetentionPolicyDto { /// /// Retention period for delivery records in days. /// public int DeliveryRetentionDays { get; init; } = 90; /// /// Retention period for audit log entries in days. /// public int AuditRetentionDays { get; init; } = 365; /// /// Retention period for dead-letter entries in days. /// public int DeadLetterRetentionDays { get; init; } = 30; /// /// Retention period for storm tracking data in days. /// public int StormDataRetentionDays { get; init; } = 7; /// /// Retention period for inbox messages in days. /// public int InboxRetentionDays { get; init; } = 30; /// /// Retention period for event history in days. /// public int EventHistoryRetentionDays { get; init; } = 30; /// /// Whether automatic cleanup is enabled. /// public bool AutoCleanupEnabled { get; init; } = true; /// /// Cron expression for automatic cleanup schedule. /// public string CleanupSchedule { get; init; } = "0 2 * * *"; /// /// Maximum records to delete per cleanup run. /// public int MaxDeletesPerRun { get; init; } = 10000; /// /// Whether to keep resolved/acknowledged deliveries longer. /// public bool ExtendResolvedRetention { get; init; } = true; /// /// Extension multiplier for resolved items. /// public double ResolvedRetentionMultiplier { get; init; } = 2.0; } /// /// Request to update retention policy. /// public sealed record UpdateRetentionPolicyRequest { public required RetentionPolicyDto Policy { get; init; } } /// /// Response for retention policy operations. /// public sealed record RetentionPolicyResponse { public required string TenantId { get; init; } public required RetentionPolicyDto Policy { get; init; } } /// /// Response for retention cleanup execution. /// public sealed record RetentionCleanupResponse { public required string TenantId { get; init; } public required bool Success { get; init; } public string? Error { get; init; } public required DateTimeOffset ExecutedAt { get; init; } public required double DurationMs { get; init; } public required RetentionCleanupCountsDto Counts { get; init; } } /// /// Cleanup counts DTO. /// public sealed record RetentionCleanupCountsDto { public int Deliveries { get; init; } public int AuditEntries { get; init; } public int DeadLetterEntries { get; init; } public int StormData { get; init; } public int InboxMessages { get; init; } public int Events { get; init; } public int Total { get; init; } } /// /// Response for cleanup preview. /// public sealed record RetentionCleanupPreviewResponse { public required string TenantId { get; init; } public required DateTimeOffset PreviewedAt { get; init; } public required RetentionCleanupCountsDto EstimatedCounts { get; init; } public required RetentionPolicyDto PolicyApplied { get; init; } public required IReadOnlyDictionary CutoffDates { get; init; } } /// /// Response for last cleanup execution. /// public sealed record RetentionCleanupExecutionResponse { public required string ExecutionId { get; init; } public required string TenantId { get; init; } public required DateTimeOffset StartedAt { get; init; } public DateTimeOffset? CompletedAt { get; init; } public required string Status { get; init; } public RetentionCleanupCountsDto? Counts { get; init; } public string? Error { get; init; } } /// /// Response for cleanup all tenants. /// public sealed record RetentionCleanupAllResponse { public required IReadOnlyList Results { get; init; } public required int SuccessCount { get; init; } public required int FailureCount { get; init; } public required int TotalDeleted { get; init; } }