-- 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');