84 lines
2.7 KiB
PL/PgSQL
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;
|