feat(schema): add adapter column to events, drop source

Replaces module-path-based source column (e.g. "central/adapters/nws")
with stable adapter identifier (e.g. "nws") that foreign-keys to
config.adapters.name.

Migration 011:
- ADD COLUMN adapter TEXT
- Backfill via REPLACE(source, 'central/adapters/', '')
- SET NOT NULL + FK RESTRICT
- CREATE INDEX (adapter, received DESC) for dashboard queries
- DROP COLUMN source

Code changes:
- Event model: source field renamed to adapter
- All adapters: use adapter="name" instead of source="central/adapters/name"
- Archive: write adapter column instead of source

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ubuntu 2026-05-17 16:07:35 +00:00
commit 8601a19f60
10 changed files with 150 additions and 18 deletions

View file

@ -0,0 +1,46 @@
-- Migration 011: Add adapter column to events, drop source column
-- Replaces module-path-based source with stable adapter identifier
-- Add adapter column (idempotent)
ALTER TABLE public.events ADD COLUMN IF NOT EXISTS adapter TEXT;
-- Backfill from existing source values
UPDATE public.events
SET adapter = REPLACE(source, 'central/adapters/', '')
WHERE adapter IS NULL AND source IS NOT NULL;
-- Make NOT NULL after backfill (idempotent check)
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'events'
AND column_name = 'adapter'
AND is_nullable = 'YES'
) THEN
ALTER TABLE public.events ALTER COLUMN adapter SET NOT NULL;
END IF;
END $$;
-- Add FK constraint (idempotent check)
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.table_constraints
WHERE constraint_name = 'events_adapter_fkey'
AND table_name = 'events'
) THEN
ALTER TABLE public.events
ADD CONSTRAINT events_adapter_fkey
FOREIGN KEY (adapter) REFERENCES config.adapters(name)
ON DELETE RESTRICT;
END IF;
END $$;
-- Add index for dashboard queries (idempotent)
CREATE INDEX IF NOT EXISTS events_adapter_received_idx
ON public.events (adapter, received DESC);
-- Drop deprecated source column (idempotent)
ALTER TABLE public.events DROP COLUMN IF EXISTS source;

View file

@ -1,9 +1,12 @@
-- Central Data Hub schema
-- PostgreSQL 16 + TimescaleDB + PostGIS
-- NOTE: Migrations in sql/migrations/ are the source of truth.
-- This file is for reference and initial setup only.
CREATE TABLE IF NOT EXISTS events (
id TEXT NOT NULL, -- CloudEvent id
source TEXT NOT NULL, -- adapter identity
adapter TEXT NOT NULL -- adapter identity (FK to config.adapters.name)
REFERENCES config.adapters(name) ON DELETE RESTRICT,
category TEXT NOT NULL, -- "wx.alert.<type>"
time TIMESTAMPTZ NOT NULL, -- event-time UTC
expires TIMESTAMPTZ,
@ -21,6 +24,9 @@ SELECT create_hypertable('events', 'time', if_not_exists => TRUE);
CREATE INDEX IF NOT EXISTS events_category_time_idx
ON events (category, time DESC);
CREATE INDEX IF NOT EXISTS events_adapter_received_idx
ON events (adapter, received DESC);
CREATE INDEX IF NOT EXISTS events_geom_gist
ON events USING GIST (geom);