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

91 lines
3.1 KiB
SQL

-- 0017_dialog_folders: archive folder, custom dialog filters, and durable folder updates.
ALTER TABLE dialogs
ADD COLUMN IF NOT EXISTS folder_id INT NOT NULL DEFAULT 0;
ALTER TABLE dialogs
DROP CONSTRAINT IF EXISTS dialogs_folder_id_check;
ALTER TABLE dialogs
ADD CONSTRAINT dialogs_folder_id_check CHECK (folder_id >= 0);
CREATE INDEX IF NOT EXISTS dialogs_user_folder_top_message_idx
ON dialogs (user_id, folder_id, pinned DESC, top_message_date DESC, top_message_id DESC, peer_id DESC);
CREATE TABLE IF NOT EXISTS dialog_filters (
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
filter_id INT NOT NULL,
is_chatlist BOOLEAN NOT NULL DEFAULT false,
filter JSONB NOT NULL,
order_value INT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (user_id, filter_id),
CONSTRAINT dialog_filters_id_check CHECK (filter_id >= 2),
CONSTRAINT dialog_filters_filter_object_check CHECK (jsonb_typeof(filter) = 'object')
) PARTITION BY HASH (user_id);
CREATE INDEX IF NOT EXISTS dialog_filters_user_order_idx
ON dialog_filters (user_id, order_value, filter_id);
CREATE TABLE IF NOT EXISTS dialog_filter_settings (
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
tags_enabled BOOLEAN NOT NULL DEFAULT false,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (user_id)
) PARTITION BY HASH (user_id);
DO $$
DECLARE
i int;
BEGIN
FOR i IN 0..63 LOOP
EXECUTE format(
'CREATE TABLE IF NOT EXISTS dialog_filters_p%s PARTITION OF dialog_filters FOR VALUES WITH (MODULUS 64, REMAINDER %s)',
lpad(i::text, 2, '0'),
i
);
EXECUTE format(
'CREATE TABLE IF NOT EXISTS dialog_filter_settings_p%s PARTITION OF dialog_filter_settings FOR VALUES WITH (MODULUS 64, REMAINDER %s)',
lpad(i::text, 2, '0'),
i
);
END LOOP;
END $$;
ALTER TABLE user_update_events
ADD COLUMN IF NOT EXISTS dialog_filter JSONB NOT NULL DEFAULT '{}'::jsonb;
ALTER TABLE user_update_events
ADD COLUMN IF NOT EXISTS filter_order JSONB NOT NULL DEFAULT '[]'::jsonb;
ALTER TABLE user_update_events
ADD COLUMN IF NOT EXISTS folder_peers JSONB NOT NULL DEFAULT '[]'::jsonb;
ALTER TABLE user_update_events
ADD COLUMN IF NOT EXISTS filter_id INT NOT NULL DEFAULT 0;
ALTER TABLE user_update_events
ADD COLUMN IF NOT EXISTS tags_enabled BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE user_update_events
DROP CONSTRAINT IF EXISTS user_update_events_type_check;
ALTER TABLE user_update_events
ADD CONSTRAINT user_update_events_type_check CHECK (
event_type IN (
'new_message',
'read_history_inbox',
'contacts_reset',
'dialog_pinned',
'pinned_dialogs',
'dialog_unread_mark',
'peer_settings',
'delete_messages',
'dialog_filter',
'dialog_filter_order',
'dialog_filters',
'folder_peers',
'noop'
)
);