Files
efir-api-server/migrations/001_init_schema.up.sql

77 lines
3.0 KiB
MySQL
Raw Normal View History

-- Таблица пользователей
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);