BEGIN; CREATE TABLE IF NOT EXISTS control_revisions ( revision BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, kind VARCHAR(64) NOT NULL, created_at TIMESTAMPTZ NOT NULL, CHECK (kind IN ('config', 'upstream', 'routing')) ); CREATE TABLE IF NOT EXISTS config_revisions ( revision BIGINT PRIMARY KEY, config_version VARCHAR(128) NOT NULL UNIQUE, checksum CHAR(64) NOT NULL, source VARCHAR(512) NOT NULL, created_at TIMESTAMPTZ NOT NULL, FOREIGN KEY (revision) REFERENCES control_revisions(revision), CHECK (checksum ~ '^[0-9A-Fa-f]{64}$') ); CREATE TABLE IF NOT EXISTS upstream_admin_state ( name VARCHAR(128) PRIMARY KEY, enabled BOOLEAN NOT NULL, revision BIGINT NOT NULL, updated_at TIMESTAMPTZ NOT NULL, FOREIGN KEY (revision) REFERENCES control_revisions(revision) ); CREATE TABLE IF NOT EXISTS routing_admin_state ( name VARCHAR(128) PRIMARY KEY, enabled BOOLEAN NOT NULL, upstreams TEXT[] NOT NULL, current_upstream VARCHAR(128) NOT NULL, revision BIGINT NOT NULL, updated_at TIMESTAMPTZ NOT NULL, FOREIGN KEY (revision) REFERENCES control_revisions(revision), CHECK (cardinality(upstreams) > 0), CHECK (current_upstream = ANY(upstreams)) ); CREATE TABLE IF NOT EXISTS admin_audit_log ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, request_id VARCHAR(128) NOT NULL, actor_id VARCHAR(256) NOT NULL, source_ip INET, action VARCHAR(64) NOT NULL, resource_type VARCHAR(64) NOT NULL, resource_name VARCHAR(128) NOT NULL, changed BOOLEAN NOT NULL, revision BIGINT NOT NULL, reason VARCHAR(512) NOT NULL DEFAULT '', occurred_at TIMESTAMPTZ NOT NULL, FOREIGN KEY (revision) REFERENCES control_revisions(revision), CHECK (action IN ('commit_config', 'set_upstream_enabled', 'switch_routing')) ); CREATE TABLE IF NOT EXISTS admin_outbox ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, revision BIGINT NOT NULL, event_type VARCHAR(128) NOT NULL, aggregate_type VARCHAR(64) NOT NULL, aggregate_id VARCHAR(128) NOT NULL, payload JSONB NOT NULL, occurred_at TIMESTAMPTZ NOT NULL, claim_owner VARCHAR(128), claim_until TIMESTAMPTZ, published_at TIMESTAMPTZ, FOREIGN KEY (revision) REFERENCES control_revisions(revision), CHECK (jsonb_typeof(payload) = 'object'), CHECK ((claim_owner IS NULL) = (claim_until IS NULL)) ); CREATE INDEX IF NOT EXISTS admin_audit_log_revision_idx ON admin_audit_log (revision, id); CREATE INDEX IF NOT EXISTS admin_outbox_pending_idx ON admin_outbox (id) WHERE published_at IS NULL; CREATE INDEX IF NOT EXISTS admin_outbox_claim_idx ON admin_outbox (claim_until, id) WHERE published_at IS NULL; COMMIT;