132 lines
5.6 KiB
Markdown
132 lines
5.6 KiB
Markdown
|
|
# 📐 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.
|