proxy-pool/internal/adapters/postgresadmin/migrations/0001_admin_state.sql
2026-07-29 19:55:33 +08:00

84 lines
2.7 KiB
PL/PgSQL

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;