From daf66038c6b37cc1dfd11c5e9076e45d1157b521 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Wed, 4 Mar 2026 16:31:08 -0600 Subject: [PATCH] fix: auto-resolve Gaiia reconciliation insights when issues are fixed --- lib/towerops/workers/gaiia_insight_worker.ex | 35 ++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/lib/towerops/workers/gaiia_insight_worker.ex b/lib/towerops/workers/gaiia_insight_worker.ex index 78103173..5173bbd1 100644 --- a/lib/towerops/workers/gaiia_insight_worker.ex +++ b/lib/towerops/workers/gaiia_insight_worker.ex @@ -26,11 +26,46 @@ defmodule Towerops.Workers.GaiiaInsightWorker do defp process_reconciliation(organization_id) do result = Reconciliation.reconcile(organization_id) + # Auto-resolve insights when issues are fixed + maybe_dismiss_resolved_insights(organization_id, "untracked", result.untracked_devices) + maybe_dismiss_resolved_insights(organization_id, "ghost", result.ghost_devices) + maybe_dismiss_resolved_insights(organization_id, "mismatch", result.data_mismatches) + generate_untracked_insights(organization_id, result.untracked_devices) generate_ghost_insights(organization_id, result.ghost_devices) generate_mismatch_insights(organization_id, result.data_mismatches) end + defp maybe_dismiss_resolved_insights(organization_id, dedup_key, current_items) do + # If the issue is resolved (no items), dismiss any active insights + if Enum.empty?(current_items) do + import Ecto.Query + + alias Towerops.Preseem.Insight + alias Towerops.Repo + + now = DateTime.truncate(DateTime.utc_now(), :second) + + {count, _} = + Insight + |> where( + organization_id: ^organization_id, + type: "reconciliation_finding", + status: "active" + ) + |> where([i], fragment("?->>'dedup_key' = ?", i.metadata, ^dedup_key)) + |> Repo.update_all(set: [status: "dismissed", dismissed_at: now]) + + if count > 0 do + require Logger + + Logger.info( + "Auto-dismissed #{count} reconciliation_finding insight(s) for #{dedup_key} in org #{organization_id}" + ) + end + end + end + defp generate_untracked_insights(organization_id, untracked_devices) do count = length(untracked_devices)