veza/docs/UUID_DB_MIGRATION_PLAN.md

132 lines
5.6 KiB
Markdown
Raw Permalink Normal View History

# 📐 UUID_DB_MIGRATION_PLAN.md
**Date:** 04/12/2025
**Statut:** PLAN VALIDÉ (En attente d'exécution)
**Objectif:** Unification totale des IDs (UUID) et séparation des responsabilités (Schemas).
---
## 1. Schéma Cible & Stratégie de Séparation
Pour résoudre définitivement les conflits de nommage et de propriété, nous allons adopter une architecture **Multi-Schéma PostgreSQL**.
### 1.1 Architecture des Schémas
1. **Schema `public` (Master: Backend Go)**
* Contient les données "Cœur" : `users`, `auth`, `tracks`, `playlists`.
* Le service Go `veza-backend-api` possède les droits DDL (Migrations) sur ce schéma.
* Tous les IDs (PK et FK) sont des **UUID**.
2. **Schema `chat` (Master: Chat Rust)**
* Contient les données spécifiques au chat : `conversations`, `messages`, `members`.
* Le service Rust `veza-chat-server` possède les droits DDL sur ce schéma uniquement.
* Fait référence à `public.users(id)` via FK.
* Isole la table `messages` du chat de la table `messages` legacy du backend.
### 1.2 Matrice des Types d'Identifiants
| Entité | Table | Schema | PK Type | Géré par |
| :--- | :--- | :--- | :--- | :--- |
| User | `users` | `public` | **UUID** | Go |
| Track | `tracks` | `public` | **UUID** | Go |
| Playlist | `playlists` | `public` | **UUID** | Go |
| Conversation | `conversations` | `chat` | **UUID** | Rust |
| Message | `messages` | `chat` | **UUID** | Rust |
| Message (Legacy) | `messages` | `public` | **UUID** | Go |
---
## 2. Migrations : Le Plan de Bataille
Les migrations seront exécutées séquentiellement.
### Phase A : Consolidation du Backend (Go)
*Ces migrations doivent être créées dans `veza-backend-api/migrations/`*
1. **`070_finish_secondary_tables_uuid.sql`**
* **But :** Finaliser le travail laissé par `migrations/001_migrate_ids_to_uuid_up.sql`.
* **Action :** Pour toutes les tables secondaires (`contests`, `equipment`, etc.) qui ont une colonne `new_id` :
* Supprimer l'ancienne PK `id` (INT).
* Renommer `new_id` -> `id`.
* Mettre `id` en PRIMARY KEY.
2. **`071_migrate_tracks_playlists_pk_to_uuid.sql`**
* **But :** S'assurer que `tracks` et `playlists` ont bien leur **PK** en UUID (pas seulement la FK `user_id`).
* **Action :** Même pattern : ajout colonne tmp UUID, migration data, switch PK.
3. **`072_create_chat_schema.sql`**
* **Action :** `CREATE SCHEMA IF NOT EXISTS chat;`
* **Action :** Donner les droits nécessaires au user DB du chat server.
### Phase B : Refonte du Chat Server (Rust)
*Ces migrations remplacent le dossier `veza-chat-server/migrations/` actuel.*
1. **`001_init_chat_schema.sql`** (Remplacement total)
* **Action :** Créer les tables `conversations`, `messages`, `conversation_members` DANS le schéma `chat`.
* **Reference :** `REFERENCES public.users(id)`.
* **Nettoyage :** NE PAS créer de table `users`.
---
## 3. Modifications du Code (Implementation Detail)
### 3.1 Backend API (Go)
* **Models GORM :**
* Vérifier que tous les structs (`User`, `Track`, `Playlist`) utilisent le type `uuid.UUID` pour le champ `ID` et ont le tag `` `gorm:"type:uuid;default:uuid_generate_v4()"` `` (ou v5 pour users legacy).
* Supprimer définitivement les champs `ID uint` ou `int64`.
* **Handlers :**
* Nettoyer tout code convertissant `string` -> `int` pour les IDs. Utiliser `uuid.Parse()`.
### 3.2 Chat Server (Rust)
* **Configuration SQLx :**
* Forcer le search_path : `ALTER DATABASE ... SET search_path TO chat, public;`.
* **Structs :**
* Le struct `User` (utilisé pour l'auth ou l'info user) doit être un "Read Model" mappé sur `public.users`.
* Supprimer toute logique d'écriture dans `users` depuis Rust.
* **Queries :**
* Remplacer `SELECT ... FROM users` par `SELECT ... FROM public.users`.
* Remplacer `SELECT ... FROM messages` par `SELECT ... FROM chat.messages`.
---
## 4. Désarmement des Migrations du Chat
Actuellement, `veza-chat-server` contient des migrations conflictuelles.
**Plan d'action :**
1. **Supprimer** le contenu actuel de `veza-chat-server/migrations/`.
2. **Créer** une nouvelle migration `0001_init_chat.sql` qui contient uniquement la DDL du schéma `chat` (conversations, messages).
3. **Retirer** toute instruction `CREATE TABLE users`.
4. **Ajuster** `sqlx-data.json` (le fichier de cache query verification) en le régénérant contre la nouvelle DB cible.
---
## 5. Nettoyage des Scripts & Hacks
Les scripts "béquilles" doivent disparaître pour garantir que le code est sain sans patch externe.
1. **Supprimer :**
* `scripts/fix-remaining-uuid-errors.sh` (Le code doit compiler nativement).
* `scripts/migrate-handlers-to-uuid.sh`.
* `scripts/migrate-models-to-uuid.sh`.
* `migrations/` (le dossier root) : Son contenu utile est déplacé dans la migration `070` du backend.
2. **Créer :**
* `scripts/db-reset-clean.sh` :
1. Drop DB.
2. Create DB.
3. Run Backend Migrations (Go).
4. Run Chat Migrations (Rust).
5. Seed minimal data.
---
## 6. Vérification de Compatibilité
* **Backend -> DB :** Le Backend Go migre tout en UUID. Il n'attendra plus de SERIAL.
* **Chat -> DB :** Le Chat utilise son propre schéma. Il lit `public.users` (qui est UUID) via des FKs UUID. Compatibilité 100%.
* **Collision Messages :** Résolue par `public.messages` (legacy) vs `chat.messages`.
## ⏳ Prochaine Étape
Exécuter ce plan nécessite d'abord de **générer les fichiers de migration SQL** décrits en Phase A et B, puis d'appliquer les changements de code.