You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/migrations/20260426034_create_realtime...

38 lines
1.2 KiB
SQL

CREATE TABLE IF NOT EXISTS realtime_outbox (
id TEXT PRIMARY KEY,
aggregate_type TEXT NOT NULL,
aggregate_id TEXT NOT NULL,
event_type TEXT NOT NULL,
event_version BIGINT NOT NULL DEFAULT 1,
aggregate_version BIGINT,
payload JSONB NOT NULL,
status SMALLINT NOT NULL,
attempts INTEGER NOT NULL DEFAULT 0,
next_retry_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
locked_by TEXT,
locked_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
dispatched_at TIMESTAMPTZ,
last_error TEXT,
CHECK (jsonb_typeof(payload) = 'object')
);
CREATE INDEX IF NOT EXISTS idx_realtime_outbox_pending
ON realtime_outbox (next_retry_at, created_at, id)
WHERE status = 1;
CREATE INDEX IF NOT EXISTS idx_realtime_outbox_aggregate
ON realtime_outbox (aggregate_type, aggregate_id, created_at);
CREATE INDEX IF NOT EXISTS idx_realtime_outbox_sent_dispatched
ON realtime_outbox (dispatched_at)
WHERE status = 3 AND dispatched_at IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_realtime_outbox_dead_created
ON realtime_outbox (created_at)
WHERE status = 4;
CREATE INDEX IF NOT EXISTS idx_realtime_outbox_processing_locked
ON realtime_outbox (locked_at)
WHERE status = 2 AND locked_at IS NOT NULL;