116 lines
No EOL
4.7 KiB
PL/PgSQL
116 lines
No EOL
4.7 KiB
PL/PgSQL
-- Migration: Structure de base de données simplifiée pour chat server
|
|
-- Création: 2025-07-26
|
|
-- Version: 1.0.0 Production Ready
|
|
|
|
-- Extensions requises
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
|
|
|
-- ================================================================
|
|
-- TABLE UTILISATEURS
|
|
-- ================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
display_name VARCHAR(100),
|
|
avatar_url TEXT,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
last_seen TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- ================================================================
|
|
-- TABLE CONVERSATIONS
|
|
-- ================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
conversation_type VARCHAR(50) NOT NULL DEFAULT 'direct',
|
|
is_private BOOLEAN NOT NULL DEFAULT false,
|
|
created_by UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- ================================================================
|
|
-- TABLE MEMBRES DES CONVERSATIONS
|
|
-- ================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS conversation_members (
|
|
conversation_id UUID REFERENCES conversations(id) ON DELETE CASCADE,
|
|
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
role VARCHAR(50) NOT NULL DEFAULT 'user',
|
|
joined_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
PRIMARY KEY (conversation_id, user_id)
|
|
);
|
|
|
|
-- ================================================================
|
|
-- TABLE MESSAGES
|
|
-- ================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
conversation_id UUID REFERENCES conversations(id) ON DELETE CASCADE,
|
|
sender_id UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
content TEXT NOT NULL,
|
|
message_type VARCHAR(50) NOT NULL DEFAULT 'text',
|
|
parent_message_id UUID REFERENCES messages(id) ON DELETE CASCADE,
|
|
is_pinned BOOLEAN NOT NULL DEFAULT false,
|
|
is_deleted BOOLEAN NOT NULL DEFAULT false,
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
status VARCHAR(50) NOT NULL DEFAULT 'sent'
|
|
);
|
|
|
|
-- ================================================================
|
|
-- INDEX POUR PERFORMANCE
|
|
-- ================================================================
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_messages_conversation_id ON messages(conversation_id);
|
|
CREATE INDEX IF NOT EXISTS idx_messages_sender_id ON messages(sender_id);
|
|
CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_conversation_members_conversation_id ON conversation_members(conversation_id);
|
|
CREATE INDEX IF NOT EXISTS idx_conversation_members_user_id ON conversation_members(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
|
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
|
|
|
-- ================================================================
|
|
-- TRIGGERS POUR MISE À JOUR AUTOMATIQUE
|
|
-- ================================================================
|
|
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_conversations_updated_at BEFORE UPDATE ON conversations
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_messages_updated_at BEFORE UPDATE ON messages
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
-- ================================================================
|
|
-- DONNÉES DE TEST
|
|
-- ================================================================
|
|
|
|
-- Insérer un utilisateur de test
|
|
INSERT INTO users (username, email, display_name)
|
|
VALUES ('test_user', 'test@veza.com', 'Test User')
|
|
ON CONFLICT (username) DO NOTHING;
|
|
|
|
-- Insérer une conversation de test
|
|
INSERT INTO conversations (name, description, conversation_type, created_by)
|
|
SELECT 'Test Room', 'Room de test pour Veza', 'group', id
|
|
FROM users WHERE username = 'test_user'
|
|
ON CONFLICT DO NOTHING; |