-- Таблица пользователей CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, login TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'user' CHECK(role IN ('user', 'global_admin')), last_seen DATETIME, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- Индекс для быстрого поиска по логину CREATE INDEX IF NOT EXISTS idx_users_login ON users(login); -- Таблица профилей CREATE TABLE IF NOT EXISTS profiles ( user_id INTEGER PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, display_name TEXT, bio TEXT, avatar_url TEXT ); -- Таблица чатов CREATE TABLE IF NOT EXISTS chats ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL CHECK(type IN ('private', 'group')), title TEXT, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- Индекс для фильтрации по типу чата CREATE INDEX IF NOT EXISTS idx_chats_type ON chats(type); -- Таблица участников чатов CREATE TABLE IF NOT EXISTS chat_members ( chat_id INTEGER NOT NULL REFERENCES chats(id) ON DELETE CASCADE, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, role TEXT NOT NULL DEFAULT 'member' CHECK(role IN ('member', 'admin')), joined_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (chat_id, user_id) ); -- Индекс для быстрого получения всех чатов пользователя CREATE INDEX IF NOT EXISTS idx_chat_members_user_id ON chat_members(user_id); -- Индекс для быстрого получения участников чата CREATE INDEX IF NOT EXISTS idx_chat_members_chat_id ON chat_members(chat_id); -- Таблица сообщений CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id INTEGER NOT NULL REFERENCES chats(id) ON DELETE CASCADE, sender_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, encrypted_body BLOB NOT NULL, attachment_id INTEGER, is_read BOOLEAN NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- Индекс для быстрой загрузки истории чата CREATE INDEX IF NOT EXISTS idx_messages_chat_id_created_at ON messages(chat_id, created_at DESC); -- Индекс для поиска сообщений по отправителю CREATE INDEX IF NOT EXISTS idx_messages_sender_id ON messages(sender_id); -- Таблица вложений CREATE TABLE IF NOT EXISTS attachments ( id INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER REFERENCES messages(id) ON DELETE SET NULL, file_name TEXT NOT NULL, file_size INTEGER NOT NULL, storage_path TEXT NOT NULL, mime_type TEXT NOT NULL, uploaded_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- Индекс для поиска вложений по сообщению CREATE INDEX IF NOT EXISTS idx_attachments_message_id ON attachments(message_id);