krona-staff/migrations/0001_infrastructure.up.sql

64 lines
2.8 KiB
SQL

CREATE TABLE IF NOT EXISTS staff_outbox (
id VARCHAR(26) PRIMARY KEY CHECK (id ~ '^[0-9A-HJKMNP-TV-Z]{26}$'),
tenant_id VARCHAR(26) NOT NULL CHECK (tenant_id ~ '^[0-9A-HJKMNP-TV-Z]{26}$'),
event_type TEXT NOT NULL,
event_version INTEGER NOT NULL CHECK (event_version > 0),
payload JSONB NOT NULL,
correlation_id VARCHAR(26) NOT NULL,
causation_id VARCHAR(26),
occurred_at TIMESTAMPTZ NOT NULL,
published_at TIMESTAMPTZ,
attempts INTEGER NOT NULL DEFAULT 0,
last_error TEXT
);
CREATE INDEX staff_outbox_pending_idx ON staff_outbox (tenant_id, occurred_at) WHERE published_at IS NULL;
CREATE TABLE IF NOT EXISTS staff_inbox (
event_id VARCHAR(26) NOT NULL,
tenant_id VARCHAR(26) NOT NULL,
event_type TEXT NOT NULL,
event_version INTEGER NOT NULL,
correlation_id VARCHAR(26) NOT NULL,
causation_id VARCHAR(26),
received_at TIMESTAMPTZ NOT NULL DEFAULT now(),
processed_at TIMESTAMPTZ,
PRIMARY KEY (tenant_id, event_id)
);
CREATE TABLE IF NOT EXISTS staff_idempotency_keys (
tenant_id VARCHAR(26) NOT NULL,
key TEXT NOT NULL,
request_hash TEXT NOT NULL,
response_status INTEGER,
response_body JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
expires_at TIMESTAMPTZ NOT NULL,
PRIMARY KEY (tenant_id, key)
);
CREATE TABLE IF NOT EXISTS staff_audit_log (
id VARCHAR(26) PRIMARY KEY,
tenant_id VARCHAR(26) NOT NULL,
actor_id VARCHAR(26) NOT NULL,
action TEXT NOT NULL,
entity_type TEXT NOT NULL,
entity_id VARCHAR(26),
old_values JSONB,
new_values JSONB,
correlation_id VARCHAR(26) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX staff_audit_tenant_time_idx ON staff_audit_log (tenant_id, created_at DESC);
ALTER TABLE staff_outbox ENABLE ROW LEVEL SECURITY;
ALTER TABLE staff_outbox FORCE ROW LEVEL SECURITY;
CREATE POLICY staff_outbox_tenant_isolation ON staff_outbox USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true));
ALTER TABLE staff_inbox ENABLE ROW LEVEL SECURITY;
ALTER TABLE staff_inbox FORCE ROW LEVEL SECURITY;
CREATE POLICY staff_inbox_tenant_isolation ON staff_inbox USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true));
ALTER TABLE staff_idempotency_keys ENABLE ROW LEVEL SECURITY;
ALTER TABLE staff_idempotency_keys FORCE ROW LEVEL SECURITY;
CREATE POLICY staff_idempotency_tenant_isolation ON staff_idempotency_keys USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true));
ALTER TABLE staff_audit_log ENABLE ROW LEVEL SECURITY;
ALTER TABLE staff_audit_log FORCE ROW LEVEL SECURITY;
CREATE POLICY staff_audit_tenant_isolation ON staff_audit_log USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true));