-- Чаты и сообщения CREATE TABLE IF NOT EXISTS chats ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_a UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, user_b UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMPTZ DEFAULT NOW(), last_msg_at TIMESTAMPTZ DEFAULT NOW(), UNIQUE (user_a, user_b), CHECK (user_a < user_b) ); CREATE INDEX IF NOT EXISTS idx_chats_user_a ON chats(user_a, last_msg_at DESC); CREATE INDEX IF NOT EXISTS idx_chats_user_b ON chats(user_b, last_msg_at DESC); CREATE TABLE IF NOT EXISTS messages ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), chat_id UUID NOT NULL REFERENCES chats(id) ON DELETE CASCADE, sender_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, body TEXT, photo_url TEXT, read BOOLEAN NOT NULL DEFAULT FALSE, edited BOOLEAN NOT NULL DEFAULT FALSE, deleted BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_messages_chat ON messages(chat_id, created_at); -- Блокировки CREATE TABLE IF NOT EXISTS blocks ( blocker_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, blocked_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (blocker_id, blocked_id) ); -- Жалобы CREATE TABLE IF NOT EXISTS reports ( id BIGSERIAL PRIMARY KEY, reporter_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, target_type TEXT NOT NULL CHECK (target_type IN ('user','message','chat')), target_id TEXT NOT NULL, reason TEXT, metadata JSONB, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_reports_target ON reports(target_type, target_id);