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