-- ===================================================================== -- ТЕХПОДДЕРЖКА: роль Support + тикеты через Telegram-бота -- ===================================================================== -- Единственный канал связи с поддержкой — бот (см. src/bot.rs). Кнопка -- "Поддержка" переводит юзера в разовый режим ожидания сообщения -- (awaiting_support_message), сбрасывается сразу после получения текста — -- случайное сообщение мимо кнопки тикет не создаёт. ALTER TABLE users DROP CONSTRAINT IF EXISTS users_role_check; ALTER TABLE users ADD CONSTRAINT users_role_check CHECK (role IN ('user', 'owner', 'moderator', 'partner', 'support', 'admin')); ALTER TABLE users ADD COLUMN IF NOT EXISTS awaiting_support_message BOOLEAN NOT NULL DEFAULT FALSE; CREATE TABLE IF NOT EXISTS support_tickets ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, status VARCHAR(20) NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'closed')), -- Информационно: кто последним ответил. Не enforced-назначение — любой -- staff/support видит и отвечает на любой тикет. assigned_to UUID REFERENCES users(id), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_support_tickets_status ON support_tickets(status, updated_at DESC); -- Быстро найти "есть ли уже открытый тикет у юзера" — частичный индекс, -- т.к. это единственный поиск по user_id, который реально нужен в горячем пути. CREATE INDEX IF NOT EXISTS idx_support_tickets_user_open ON support_tickets(user_id) WHERE status = 'open'; CREATE TABLE IF NOT EXISTS support_messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), ticket_id UUID NOT NULL REFERENCES support_tickets(id) ON DELETE CASCADE, sender_role VARCHAR(10) NOT NULL CHECK (sender_role IN ('user', 'staff')), sender_user_id UUID REFERENCES users(id), body TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_support_messages_ticket ON support_messages(ticket_id, created_at);