95 lines
3.1 KiB
SQL
95 lines
3.1 KiB
SQL
-- Initial schema for Discord-like app
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
username VARCHAR(50) NOT NULL UNIQUE,
|
|
email VARCHAR(100) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
avatar_url VARCHAR(255),
|
|
status VARCHAR(20) DEFAULT 'offline',
|
|
is_bot BOOLEAN DEFAULT FALSE,
|
|
bot_token VARCHAR(64) UNIQUE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS servers (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
owner_id INT NOT NULL,
|
|
icon_url VARCHAR(255),
|
|
invite_code VARCHAR(10) UNIQUE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (owner_id) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS channels (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
server_id INT NOT NULL,
|
|
name VARCHAR(100) NOT NULL,
|
|
type ENUM('text', 'voice') DEFAULT 'text',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (server_id) REFERENCES servers(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
channel_id INT NOT NULL,
|
|
user_id INT NOT NULL,
|
|
content TEXT NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS webhooks (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
token VARCHAR(64) NOT NULL UNIQUE,
|
|
channel_id INT NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS roles (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
server_id INT NOT NULL,
|
|
name VARCHAR(50) NOT NULL,
|
|
color VARCHAR(7) DEFAULT '#99aab5',
|
|
permissions INT DEFAULT 0,
|
|
position INT DEFAULT 0,
|
|
FOREIGN KEY (server_id) REFERENCES servers(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS user_roles (
|
|
user_id INT NOT NULL,
|
|
role_id INT NOT NULL,
|
|
PRIMARY KEY (user_id, role_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS server_members (
|
|
server_id INT NOT NULL,
|
|
user_id INT NOT NULL,
|
|
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (server_id, user_id),
|
|
FOREIGN KEY (server_id) REFERENCES servers(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- Seed initial data
|
|
INSERT IGNORE INTO users (id, username, email, password_hash, status) VALUES
|
|
(1, 'System', 'system@local', '$2y$10$xyz', 'online');
|
|
|
|
INSERT IGNORE INTO servers (id, name, owner_id, invite_code) VALUES
|
|
(1, 'General Community', 1, 'GEN-123'),
|
|
(2, 'Flatlogic Devs', 1, 'DEV-456');
|
|
|
|
INSERT IGNORE INTO server_members (server_id, user_id) VALUES (1, 1), (2, 1);
|
|
|
|
INSERT IGNORE INTO channels (id, server_id, name, type) VALUES
|
|
(1, 1, 'general', 'text'),
|
|
(2, 1, 'random', 'text'),
|
|
(3, 1, 'Voice General', 'voice'),
|
|
(4, 2, 'announcements', 'text'),
|
|
(5, 2, 'coding-help', 'text');
|