Sindbad~EG File Manager
-- Chat System Database Schema
-- User online status tracking
CREATE TABLE IF NOT EXISTS `user_online_status` (
`user_id` INT PRIMARY KEY,
`is_online` TINYINT(1) DEFAULT 0,
`last_seen` DATETIME DEFAULT CURRENT_TIMESTAMP,
`socket_id` VARCHAR(100) NULL,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Chat groups
CREATE TABLE IF NOT EXISTS `chat_groups` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`description` TEXT NULL,
`icon` VARCHAR(50) DEFAULT 'fa-users',
`created_by` INT NOT NULL,
`is_active` TINYINT(1) DEFAULT 1,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Group members
CREATE TABLE IF NOT EXISTS `chat_group_members` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`group_id` INT NOT NULL,
`user_id` INT NOT NULL,
`role` ENUM('admin', 'member') DEFAULT 'member',
`joined_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`is_banned` TINYINT(1) DEFAULT 0,
`banned_by` INT NULL,
`banned_at` DATETIME NULL,
`ban_reason` VARCHAR(255) NULL,
UNIQUE KEY `unique_group_member` (`group_id`, `user_id`),
FOREIGN KEY (`group_id`) REFERENCES `chat_groups`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`banned_by`) REFERENCES `users`(`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Direct messages between users
CREATE TABLE IF NOT EXISTS `chat_direct_messages` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`sender_id` INT NOT NULL,
`receiver_id` INT NOT NULL,
`message` TEXT NOT NULL,
`is_read` TINYINT(1) DEFAULT 0,
`read_at` DATETIME NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`sender_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`receiver_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
INDEX `idx_sender_receiver` (`sender_id`, `receiver_id`),
INDEX `idx_receiver_unread` (`receiver_id`, `is_read`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Group messages
CREATE TABLE IF NOT EXISTS `chat_group_messages` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`group_id` INT NOT NULL,
`sender_id` INT NOT NULL,
`message` TEXT NOT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`group_id`) REFERENCES `chat_groups`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`sender_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
INDEX `idx_group_messages` (`group_id`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Message read status for group messages
CREATE TABLE IF NOT EXISTS `chat_group_message_reads` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`message_id` INT NOT NULL,
`user_id` INT NOT NULL,
`read_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `unique_message_read` (`message_id`, `user_id`),
FOREIGN KEY (`message_id`) REFERENCES `chat_group_messages`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- User bans (global chat bans by admin)
CREATE TABLE IF NOT EXISTS `chat_user_bans` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL,
`banned_by` INT NOT NULL,
`reason` VARCHAR(255) NULL,
`banned_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`expires_at` DATETIME NULL,
`is_active` TINYINT(1) DEFAULT 1,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`banned_by`) REFERENCES `users`(`id`) ON DELETE CASCADE,
INDEX `idx_active_bans` (`user_id`, `is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Create default General group
INSERT INTO `chat_groups` (`name`, `description`, `icon`, `created_by`)
SELECT 'General', 'General discussion for all users', 'fa-comments', id
FROM `users` WHERE `user_level` = 'superuser' LIMIT 1;
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists