using ZB.MOM.WW.Configuration; namespace ZB.MOM.WW.ScadaBridge.SiteCallAudit; /// /// Validates at startup. The durations feed /// stuck-call detection, KPI windowing, the central→site relay Ask timeout, and /// the two central-singleton scheduler cadences (reconciliation + purge); a /// zero/negative value makes an Akka scheduler spin or a KPI window collapse. /// Registered with ValidateOnStart() so a bad ScadaBridge:SiteCallAudit /// section fails fast at boot with a clear, key-naming message. Validates the /// BASE properties — the Resolved* computed properties clamp bad cadence /// values away and would hide the misconfiguration. /// public sealed class SiteCallAuditOptionsValidator : OptionsValidatorBase { /// protected override void Validate(ValidationBuilder builder, SiteCallAuditOptions options) { builder.RequireThat(options.StuckAgeThreshold > TimeSpan.Zero, $"ScadaBridge:SiteCallAudit:StuckAgeThreshold must be a positive duration " + $"(was {options.StuckAgeThreshold}); it is the age past which a cached call is flagged stuck."); builder.RequireThat(options.KpiInterval > TimeSpan.Zero, $"ScadaBridge:SiteCallAudit:KpiInterval must be a positive duration " + $"(was {options.KpiInterval}); it is the trailing window for the throughput KPIs."); builder.RequireThat(options.RelayTimeout > TimeSpan.Zero, $"ScadaBridge:SiteCallAudit:RelayTimeout must be a positive duration " + $"(was {options.RelayTimeout}); it is the Ask timeout for the central→site Retry/Discard relay."); builder.RequireThat(options.ReconciliationInterval > TimeSpan.Zero, $"ScadaBridge:SiteCallAudit:ReconciliationInterval must be a positive duration " + $"(was {options.ReconciliationInterval}); it is the period of the per-site reconciliation pull."); builder.RequireThat(options.ReconciliationBatchSize > 0, $"ScadaBridge:SiteCallAudit:ReconciliationBatchSize must be positive " + $"(was {options.ReconciliationBatchSize}); it is the max rows requested per PullSiteCalls RPC."); builder.RequireThat(options.PurgeInterval > TimeSpan.Zero, $"ScadaBridge:SiteCallAudit:PurgeInterval must be a positive duration " + $"(was {options.PurgeInterval}); it is the period of the daily terminal-row purge tick."); builder.RequireThat(options.RetentionDays > 0, $"ScadaBridge:SiteCallAudit:RetentionDays must be positive " + $"(was {options.RetentionDays}); it is the retention window for terminal SiteCalls rows."); } }