using Kbx.Shared.ExternalData.Generated; namespace Kbx.Shared.ExternalData; public static class KbxExternalDataFreshnessPolicy { public static KbxExternalDataState Evaluate(KbxExternalDataDatasetDefinition dataset, DateTimeOffset now, DateTimeOffset? freshUntil, DateTimeOffset? usableUntil) { if (freshUntil is null && dataset.FreshnessMode == "provider-defined") return KbxExternalDataState.Unavailable; if (freshUntil is not null && now <= freshUntil.Value) return KbxExternalDataState.Fresh; if (dataset.FreshnessMode == "strict") return KbxExternalDataState.Expired; if (usableUntil is not null && now <= usableUntil.Value) return KbxExternalDataState.Stale; return KbxExternalDataState.Expired; } public static (DateTimeOffset? FreshUntil, DateTimeOffset? UsableUntil) Window(KbxExternalDataDatasetDefinition dataset, DateTimeOffset receivedAt) { if (dataset.FreshForSeconds is null) return (null, null); var fresh = receivedAt.AddSeconds(dataset.FreshForSeconds.Value); var usable = dataset.FreshnessMode == "stale-while-revalidate" && dataset.MaxStaleSeconds is > 0 ? fresh.AddSeconds(dataset.MaxStaleSeconds.Value) : fresh; return (fresh, usable); } }