95 lines
3.5 KiB
SQL
95 lines
3.5 KiB
SQL
-- RJLResaka MySQL schema
|
|
-- Compatible with MySQL Workbench / MariaDB
|
|
-- Create the database then import this file.
|
|
|
|
CREATE DATABASE IF NOT EXISTS rjlresaka
|
|
CHARACTER SET utf8mb4
|
|
COLLATE utf8mb4_unicode_ci;
|
|
|
|
USE rjlresaka;
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
full_name VARCHAR(120) NOT NULL,
|
|
username VARCHAR(60) NOT NULL UNIQUE,
|
|
email VARCHAR(120) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
avatar_color VARCHAR(20) NOT NULL DEFAULT '#0ea5e9',
|
|
bio VARCHAR(255) NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS password_reset_tokens (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
user_id INT NOT NULL,
|
|
token VARCHAR(120) NOT NULL UNIQUE,
|
|
expires_at DATETIME NOT NULL,
|
|
used TINYINT(1) NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_password_reset_user
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS conversation_participants (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
conversation_id INT NOT NULL,
|
|
user_id INT NOT NULL,
|
|
joined_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_conv_part_conversation
|
|
FOREIGN KEY (conversation_id) REFERENCES conversations(id)
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT fk_conv_part_user
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT uq_conv_part UNIQUE (conversation_id, user_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
conversation_id INT NOT NULL,
|
|
sender_id INT NOT NULL,
|
|
body TEXT NULL,
|
|
attachment_name VARCHAR(255) NULL,
|
|
attachment_path VARCHAR(255) NULL,
|
|
attachment_type VARCHAR(120) NULL,
|
|
attachment_size BIGINT NULL,
|
|
is_edited TINYINT(1) NOT NULL DEFAULT 0,
|
|
is_deleted TINYINT(1) NOT NULL DEFAULT 0,
|
|
seen_at DATETIME NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_message_conversation
|
|
FOREIGN KEY (conversation_id) REFERENCES conversations(id)
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT fk_message_sender
|
|
FOREIGN KEY (sender_id) REFERENCES users(id)
|
|
ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS message_reactions (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
message_id INT NOT NULL,
|
|
user_id INT NOT NULL,
|
|
emoji VARCHAR(20) NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_reaction_message
|
|
FOREIGN KEY (message_id) REFERENCES messages(id)
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT fk_reaction_user
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT uq_message_reaction UNIQUE (message_id, user_id, emoji)
|
|
);
|
|
|
|
INSERT INTO users (full_name, username, email, password_hash, avatar_color, bio)
|
|
SELECT 'Demo User', 'demo', 'demo@rjlresaka.app', '$2a$10$u6N8G6s8wWC4b7A9iI5L8e2ZfQFlA95zT4zWS3TzFmpXQxwCLWv0W', '#2563eb', 'Compte de démonstration'
|
|
WHERE NOT EXISTS (SELECT 1 FROM users WHERE email = 'demo@rjlresaka.app');
|