summaryrefslogtreecommitdiff
path: root/DomainDig/CloudSyncService.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-24 15:04:54 -0500
committerChristian Cleberg <[email protected]>2026-04-24 15:04:54 -0500
commit3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22 (patch)
tree17c710faf6191ac86ea5b6cab4df240cf2cefef9 /DomainDig/CloudSyncService.swift
parentd0b3b7a15b59266b4ae4262fdb0364245092c17c (diff)
downloaddomain-dig-3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22.tar.gz
domain-dig-3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22.tar.bz2
domain-dig-3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22.zip
DomainDig v3.8.0 — Smart Monitoring
* Stable domain intervals * Frequent changes decrease intervals * Duplicate states do not trigger alerts * Quiet hours suppress alerts * Quiet hours across midnight work correctly * Sensitivity levels alter behavior as expected
Diffstat (limited to 'DomainDig/CloudSyncService.swift')
-rw-r--r--DomainDig/CloudSyncService.swift22
1 files changed, 22 insertions, 0 deletions
diff --git a/DomainDig/CloudSyncService.swift b/DomainDig/CloudSyncService.swift
index 9947e08..1cf41d9 100644
--- a/DomainDig/CloudSyncService.swift
+++ b/DomainDig/CloudSyncService.swift
@@ -1453,6 +1453,8 @@ final class CloudSyncService {
certificateDaysRemaining: trackedDomain.certificateDaysRemaining,
lastMonitoredAt: trackedDomain.lastMonitoredAt,
lastAlertAt: trackedDomain.lastAlertAt,
+ monitoringState: trackedDomain.monitoringState,
+ pendingMonitoringAlerts: trackedDomain.pendingMonitoringAlerts,
collaboration: trackedDomain.collaboration
)
}
@@ -1476,6 +1478,8 @@ final class CloudSyncService {
certificateDaysRemaining: winner.certificateDaysRemaining ?? lhs.certificateDaysRemaining ?? rhs.certificateDaysRemaining,
lastMonitoredAt: [lhs.lastMonitoredAt, rhs.lastMonitoredAt].compactMap { $0 }.max(),
lastAlertAt: [lhs.lastAlertAt, rhs.lastAlertAt].compactMap { $0 }.max(),
+ monitoringState: preferredMonitoringState(lhs.monitoringState, rhs.monitoringState),
+ pendingMonitoringAlerts: deduplicatedPendingAlerts(lhs.pendingMonitoringAlerts + rhs.pendingMonitoringAlerts),
collaboration: preferredCollaboration(lhs.collaboration, rhs.collaboration)
)
}
@@ -1501,6 +1505,24 @@ final class CloudSyncService {
return lhs.updatedAt >= rhs.updatedAt ? lhs : rhs
}
+ private func preferredMonitoringState(_ lhs: MonitoringState, _ rhs: MonitoringState) -> MonitoringState {
+ let lhsDate = [lhs.lastCheck, lhs.lastAlertDate, lhs.lastChangeDate].compactMap { $0 }.max() ?? .distantPast
+ let rhsDate = [rhs.lastCheck, rhs.lastAlertDate, rhs.lastChangeDate].compactMap { $0 }.max() ?? .distantPast
+ return lhsDate >= rhsDate ? lhs : rhs
+ }
+
+ private func deduplicatedPendingAlerts(_ alerts: [MonitoringPendingAlert]) -> [MonitoringPendingAlert] {
+ var uniqueByHash: [String: MonitoringPendingAlert] = [:]
+ for alert in alerts {
+ if let existing = uniqueByHash[alert.changeHash] {
+ uniqueByHash[alert.changeHash] = existing.detectedAt >= alert.detectedAt ? existing : alert
+ } else {
+ uniqueByHash[alert.changeHash] = alert
+ }
+ }
+ return uniqueByHash.values.sorted { $0.detectedAt < $1.detectedAt }
+ }
+
private func preferredWorkflow(_ lhs: DomainWorkflow, _ rhs: DomainWorkflow) -> DomainWorkflow {
let lhsRank = collaborationRank(lhs.collaboration)
let rhsRank = collaborationRank(rhs.collaboration)