owpengram-server/deploy/migrations/0047_dialog_drafts.up.sql
2026-06-04 01:37:39 +08:00

31 lines
1.2 KiB
SQL

-- 0047_dialog_drafts: persistent cloud drafts for private dialogs and channels.
CREATE TABLE IF NOT EXISTS dialog_drafts (
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
peer_type VARCHAR(16) NOT NULL,
peer_id BIGINT NOT NULL,
top_message_id INT NOT NULL DEFAULT 0,
date INT NOT NULL DEFAULT 0,
draft JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (user_id, peer_type, peer_id, top_message_id),
CONSTRAINT dialog_drafts_peer_type_check CHECK (peer_type IN ('user', 'channel')),
CONSTRAINT dialog_drafts_top_message_id_check CHECK (top_message_id >= 0)
) PARTITION BY HASH (user_id);
CREATE INDEX IF NOT EXISTS dialog_drafts_user_date_idx
ON dialog_drafts (user_id, date DESC, peer_type, peer_id, top_message_id);
DO $$
DECLARE
i int;
BEGIN
FOR i IN 0..63 LOOP
EXECUTE format(
'CREATE TABLE IF NOT EXISTS dialog_drafts_p%s PARTITION OF dialog_drafts FOR VALUES WITH (MODULUS 64, REMAINDER %s)',
lpad(i::text, 2, '0'),
i
);
END LOOP;
END $$;