mirror of
https://github.com/zvx-echo6/central.git
synced 2026-05-21 18:14:44 +02:00
feat(config): add migration framework and config schema
Add simple SQL migration runner tracking applied migrations in schema_migrations table. First migration creates: - config schema - config.adapters table (name, enabled, cadence_s, settings JSONB) - config.api_keys table (alias, encrypted_value BYTEA) - NOTIFY triggers for real-time config change detection - Seeds NWS adapter row from current TOML config Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
fab452aa02
commit
a9b7dcab62
2 changed files with 189 additions and 0 deletions
64
sql/migrations/001_create_config_schema.sql
Normal file
64
sql/migrations/001_create_config_schema.sql
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
-- Migration: 001_create_config_schema
|
||||
-- Creates the config schema with adapters and api_keys tables.
|
||||
-- Also seeds the NWS adapter row from current TOML config.
|
||||
|
||||
-- Create config schema
|
||||
CREATE SCHEMA config;
|
||||
|
||||
-- Adapters configuration table
|
||||
CREATE TABLE config.adapters (
|
||||
name TEXT PRIMARY KEY,
|
||||
enabled BOOLEAN NOT NULL DEFAULT true,
|
||||
cadence_s INTEGER NOT NULL,
|
||||
settings JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
paused_at TIMESTAMPTZ,
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- API keys table (encrypted values)
|
||||
CREATE TABLE config.api_keys (
|
||||
alias TEXT PRIMARY KEY,
|
||||
encrypted_value BYTEA NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
rotated_at TIMESTAMPTZ,
|
||||
last_used_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Notify function for config changes
|
||||
CREATE OR REPLACE FUNCTION config.notify_config_change()
|
||||
RETURNS trigger AS $$
|
||||
DECLARE
|
||||
key_value TEXT;
|
||||
BEGIN
|
||||
-- Handle different table structures
|
||||
IF TG_TABLE_NAME = 'adapters' THEN
|
||||
key_value := COALESCE(NEW.name, OLD.name, '');
|
||||
ELSIF TG_TABLE_NAME = 'api_keys' THEN
|
||||
key_value := COALESCE(NEW.alias, OLD.alias, '');
|
||||
ELSE
|
||||
key_value := '';
|
||||
END IF;
|
||||
|
||||
PERFORM pg_notify('config_changed', TG_TABLE_NAME || ':' || key_value);
|
||||
RETURN COALESCE(NEW, OLD);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Trigger for adapters table
|
||||
CREATE TRIGGER adapters_notify
|
||||
AFTER INSERT OR UPDATE OR DELETE ON config.adapters
|
||||
FOR EACH ROW EXECUTE FUNCTION config.notify_config_change();
|
||||
|
||||
-- Trigger for api_keys table
|
||||
CREATE TRIGGER api_keys_notify
|
||||
AFTER INSERT OR UPDATE OR DELETE ON config.api_keys
|
||||
FOR EACH ROW EXECUTE FUNCTION config.notify_config_change();
|
||||
|
||||
-- Seed NWS adapter from current TOML config values
|
||||
INSERT INTO config.adapters (name, enabled, cadence_s, settings)
|
||||
VALUES (
|
||||
'nws',
|
||||
true,
|
||||
60,
|
||||
'{"states": ["ID", "OR", "WA", "MT", "WY", "UT", "NV"], "contact_email": "mj@k7zvx.com"}'::jsonb
|
||||
);
|
||||
Loading…
Add table
Add a link
Reference in a new issue