towerops/priv/repo/migrations/20260325215632_deduplicate_discovery_checks.exs
2026-03-26 10:23:26 -05:00

40 lines
1.1 KiB
Elixir

defmodule Towerops.Repo.Migrations.DeduplicateDiscoveryChecks do
use Ecto.Migration
def up do
# Delete duplicate auto-discovered checks, keeping the oldest one per
# (device_id, check_type, source_id) combination.
execute("""
DELETE FROM checks
WHERE id IN (
SELECT id FROM (
SELECT id,
ROW_NUMBER() OVER (
PARTITION BY device_id, check_type, source_id
ORDER BY inserted_at ASC
) AS rn
FROM checks
WHERE source_type = 'auto_discovery'
AND source_id IS NOT NULL
) ranked
WHERE rn > 1
)
""")
# Prevent future duplicates for auto-discovered checks.
create(
unique_index(:checks, [:device_id, :check_type, :source_id],
where: "source_type = 'auto_discovery' AND source_id IS NOT NULL",
name: :checks_device_type_source_unique_index
)
)
end
def down do
drop_if_exists(
index(:checks, [:device_id, :check_type, :source_id],
name: :checks_device_type_source_unique_index
)
)
end
end