central/sql/migrations/011_events_add_adapter_column.sql
Ubuntu 8601a19f60 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>
2026-05-17 16:09:59 +00:00

46 lines
1.4 KiB
SQL

-- 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;