veza/veza-chat-server/migrations/001_create_clean_database.sql
2025-12-03 20:33:26 +01:00

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;