mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
Signed-off-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co> Co-authored-by: npub12gtutshhh76rx0jx697f32f9tffd4hhp3hx58fp4x6u4uemkm7sqf8f757 <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@sprout-oss.stage.blox.sqprod.co>
53 lines
2.8 KiB
SQL
53 lines
2.8 KiB
SQL
-- NIP-PL effective lease state and durable wake outbox. Every key is led by
|
|
-- community_id: client-provided origin is confirmation only, never routing.
|
|
CREATE TABLE push_leases (
|
|
community_id UUID NOT NULL REFERENCES communities(id),
|
|
author BYTEA NOT NULL CHECK (length(author) = 32),
|
|
installation_id TEXT NOT NULL CHECK (octet_length(installation_id) BETWEEN 1 AND 64),
|
|
source_event_id BYTEA NOT NULL CHECK (length(source_event_id) = 32),
|
|
source_created_at BIGINT NOT NULL,
|
|
generation BIGINT NOT NULL CHECK (generation > 0),
|
|
active BOOLEAN NOT NULL,
|
|
app_profile TEXT,
|
|
endpoint_hash BYTEA CHECK (endpoint_hash IS NULL OR length(endpoint_hash) = 32),
|
|
endpoint_grant TEXT,
|
|
max_class TEXT CHECK (max_class IS NULL OR max_class IN ('silent','default','time_sensitive','urgent')),
|
|
subscriptions JSONB,
|
|
expires_at BIGINT NOT NULL,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (community_id, author, installation_id),
|
|
UNIQUE (community_id, source_event_id),
|
|
CHECK ((active AND app_profile IS NOT NULL AND endpoint_hash IS NOT NULL AND endpoint_grant IS NOT NULL AND max_class IS NOT NULL AND subscriptions IS NOT NULL)
|
|
OR (NOT active AND app_profile IS NULL AND endpoint_hash IS NULL AND endpoint_grant IS NULL AND max_class IS NULL AND subscriptions IS NULL))
|
|
);
|
|
CREATE UNIQUE INDEX push_leases_endpoint_unique
|
|
ON push_leases (community_id, author, app_profile, endpoint_hash)
|
|
WHERE active;
|
|
CREATE INDEX push_leases_expiry ON push_leases (community_id, expires_at) WHERE active;
|
|
|
|
CREATE TABLE push_wake_outbox (
|
|
community_id UUID NOT NULL REFERENCES communities(id),
|
|
id UUID NOT NULL DEFAULT gen_random_uuid(),
|
|
author BYTEA NOT NULL CHECK (length(author) = 32),
|
|
installation_id TEXT NOT NULL,
|
|
lease_generation BIGINT NOT NULL CHECK (lease_generation > 0),
|
|
endpoint_hash BYTEA NOT NULL CHECK (length(endpoint_hash) = 32),
|
|
event_id BYTEA NOT NULL CHECK (length(event_id) = 32),
|
|
class TEXT NOT NULL CHECK (class IN ('silent','default','time_sensitive','urgent')),
|
|
expires_at BIGINT NOT NULL,
|
|
state TEXT NOT NULL DEFAULT 'pending' CHECK (state IN ('pending','sending','delivered','failed')),
|
|
attempts INTEGER NOT NULL DEFAULT 0 CHECK (attempts >= 0),
|
|
next_attempt_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
lease_until TIMESTAMPTZ,
|
|
claim_id UUID,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (community_id, id),
|
|
FOREIGN KEY (community_id, author, installation_id)
|
|
REFERENCES push_leases (community_id, author, installation_id),
|
|
UNIQUE (community_id, endpoint_hash, event_id)
|
|
);
|
|
CREATE INDEX push_wake_outbox_due
|
|
ON push_wake_outbox (community_id, next_attempt_at) WHERE state = 'pending';
|
|
CREATE INDEX push_wake_outbox_recovery
|
|
ON push_wake_outbox (community_id, lease_until) WHERE state = 'sending';
|