veza/docs/UUID_DB_CARTOGRAPHY.md

100 lines
5.4 KiB
Markdown
Raw Permalink Normal View History

# 🗺️ UUID_DB_CARTOGRAPHY.md
**Date:** 04/12/2025
**Statut:** 🔴 ALERTE CRITIQUE (Schisme de Données)
**Contexte:** Analyse post-mortem de la migration INT vers UUID et du conflit de propriété des données entre Backend (Go) et Chat (Rust).
---
## 1. État des Lieux : La Guerre des Schémas
Il existe **trois** sources de vérité concurrentes pour la définition de la base de données, créant un état incohérent.
| Entité | Source de Vérité | Type ID Utilisateur | Méthode de Génération | Colonnes Clés |
| :--- | :--- | :--- | :--- | :--- |
| **Backend API (Go)** | `veza-backend-api/migrations/` | **UUID** (Migré) | `uuid_generate_v5` (Déterministe depuis INT) | `username`, `email`, `password_hash` |
| **Chat Server (Rust)** | `veza-chat-server/migrations/` | **UUID** (Natif) | `gen_random_uuid()` (v4 Aléatoire) | `display_name`, `last_seen`, `avatar_url` |
| **Root Scripts** | `migrations/` | **UUID** (Mixte) | `uuid_generate_v4` (v4 Aléatoire) | N/A (Tables secondaires) |
### 🚨 Le Conflit "Users"
La table `users` est définie différemment par les deux services majeurs.
* **Backend (Go)** migre les anciens IDs : `123` -> `UUID-v5-du-123`.
* **Chat (Rust)** crée de nouveaux users : `UUID-v4-Random`.
**Conséquence :** Si le Backend et le Chat partagent la même DB (ce qui est le cas en prod), le Chat Server va échouer car il attend des colonnes (`display_name`) qui n'existent pas dans la version Backend (`first_name`/`last_name`), ou vice-versa.
---
## 2. Cartographie des Tables & IDs
### Tables Principales (Gérées par `veza-backend-api`)
Ces tables ont subi la migration `047` (Destructive).
| Table | Type ID PK | Type FK User | État Migration | Observation |
| :--- | :--- | :--- | :--- | :--- |
| `users` | **UUID** | N/A | ✅ Terminée | PK renommée de `id_uuid` à `id`. |
| `tracks` | SERIAL | **UUID** | ✅ Terminée | FK `user_id` est UUID. PK reste SERIAL ? (À vérifier) |
| `playlists` | SERIAL | **UUID** | ✅ Terminée | FK `user_id` est UUID. |
| `messages` (Legacy) | SERIAL | **UUID** | ✅ Terminée | Table messages du backend (pas celle du Chat Server). |
### Tables "Chat" (Gérées par `veza-chat-server`)
Ces tables sont définies dans `001_create_clean_database.sql` (Rust).
| Table | Type ID PK | Type FK User | État | Conflit ? |
| :--- | :--- | :--- | :--- | :--- |
| `conversations` | **UUID** | **UUID** | Natif | OK |
| `messages` (New) | **UUID** | **UUID** | Natif | ⚠️ Conflit de nom avec `messages` du Backend |
| `conversation_members`| Composite | **UUID** | Natif | OK |
### Tables Secondaires (Gérées par `migrations/` root)
Tables touchées par `001_migrate_ids_to_uuid_up.sql`.
| Table | Type ID PK | État | Observation |
| :--- | :--- | :--- | :--- |
| `contests` | **UUID** (new_id) | ⚠️ Partiel | Colonne `new_id` ajoutée mais PK pas encore switchée ? |
| `equipment` | **UUID** (new_id) | ⚠️ Partiel | Idem. |
| `user_profiles` | **UUID** (new_id) | ⚠️ Partiel | Doublon potentiel avec `users` ? |
---
## 3. Analyse des Migrations Exécutées
### Migration Critique : `veza-backend-api/.../047_migrate_users_id_to_uuid.sql`
C'est la migration de référence. Elle est **destructrice** (DROP COLUMN id).
* **Points Forts :** Utilise `uuid_generate_v5(namespace, old_id)`. Cela garantit que l'ID `42` devient toujours le même UUID. C'est excellent pour la consistance.
* **Points Faibles :** Elle suppose qu'elle est la seule à toucher à la DB.
### Migration "Root" : `migrations/001_migrate_ids_to_uuid_up.sql`
Semble être une tentative de rattrapage pour les tables oubliées par la migration 047.
* **Problème :** Elle ajoute `new_id` mais ne semble pas (dans l'extrait lu) faire le `DROP` et `RENAME` final. Elle laisse la DB dans un état intermédiaire (`id` INT + `new_id` UUID).
### Scripts Shell de "Fix"
* `scripts/fix-remaining-uuid-errors.sh` : Un script "Find & Replace" brutal (`sed`) sur le code Go.
* Preuve que le code Go n'a pas été refactoré proprement mais "patché" pour accepter les UUIDs (remplacement de `0` par `uuid.Nil`).
---
## 4. Source of Truth (Proposition de Résolution)
Pour résoudre le schisme, nous devons établir une hiérarchie stricte.
### 👑 Maître du Schéma Global : `veza-backend-api`
Le Backend Go contient l'historique et la complexité métier (Auth, Roles, Profils). Il **DOIT** posséder la table `users`.
### 🚫 Interdit au Chat Server
Le `veza-chat-server` **NE DOIT PAS** :
1. Créer la table `users`.
2. Gérer ses propres migrations pour `users`.
3. Avoir une table `messages` qui porte le même nom que celle du Backend (si elles sont dans le même schema).
### ✅ Actions Requises (pour la phase de correction)
1. **Aligner le schéma User :** Le Chat Server (Rust) doit adapter son modèle `struct User` pour correspondre aux colonnes réelles du Backend (`first_name` vs `display_name`).
2. **Renommage Tables :** La table `messages` du Chat Server doit être renommée `chat_messages` pour éviter la collision avec les messages legacy du Backend.
3. **Nettoyage Root :** Finir ou reverter la migration `migrations/001_migrate_ids_to_uuid_up.sql` (état `new_id` hybride dangereux).
---
## 5. Conclusion
Le chaos des IDs est en réalité un **Chaos de Gouvernance**.
Deux équipes (ou deux esprits) ont travaillé en parallèle : l'une migrant l'existant (Go), l'autre construisant le futur (Rust), sans se synchroniser sur la couche de données partagée.