Initial commit: Эфир мессенджер
This commit is contained in:
77
migrations/001_init_schema.up.sql
Normal file
77
migrations/001_init_schema.up.sql
Normal file
@@ -0,0 +1,77 @@
|
||||
-- Таблица пользователей
|
||||
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);
|
||||
Reference in New Issue
Block a user