veza/UUID_MIGRATION_CARTOGRAPHY.md
okinrev b7955a680c P0: stabilisation backend/chat/stream + nouvelle base migrations v1
Backend Go:
- Remplacement complet des anciennes migrations par la base V1 alignée sur ORIGIN.
- Durcissement global du parsing JSON (BindAndValidateJSON + RespondWithAppError).
- Sécurisation de config.go, CORS, statuts de santé et monitoring.
- Implémentation des transactions P0 (RBAC, duplication de playlists, social toggles).
- Ajout d’un job worker structuré (emails, analytics, thumbnails) + tests associés.
- Nouvelle doc backend : AUDIT_CONFIG, BACKEND_CONFIG, AUTH_PASSWORD_RESET, JOB_WORKER_*.

Chat server (Rust):
- Refonte du pipeline JWT + sécurité, audit et rate limiting avancé.
- Implémentation complète du cycle de message (read receipts, delivered, edit/delete, typing).
- Nettoyage des panics, gestion d’erreurs robuste, logs structurés.
- Migrations chat alignées sur le schéma UUID et nouvelles features.

Stream server (Rust):
- Refonte du moteur de streaming (encoding pipeline + HLS) et des modules core.
- Transactions P0 pour les jobs et segments, garanties d’atomicité.
- Documentation détaillée de la pipeline (AUDIT_STREAM_*, DESIGN_STREAM_PIPELINE, TRANSACTIONS_P0_IMPLEMENTATION).

Documentation & audits:
- TRIAGE.md et AUDIT_STABILITY.md à jour avec l’état réel des 3 services.
- Cartographie complète des migrations et des transactions (DB_MIGRATIONS_*, DB_TRANSACTION_PLAN, AUDIT_DB_TRANSACTIONS, TRANSACTION_TESTS_PHASE3).
- Scripts de reset et de cleanup pour la lab DB et la V1.

Ce commit fige l’ensemble du travail de stabilisation P0 (UUID, backend, chat et stream) avant les phases suivantes (Coherence Guardian, WS hardening, etc.).
2025-12-06 11:14:38 +01:00

700 lines
32 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Rapport Migration UUID — Projet Veza
**Date** : 2025-01-27
**Objectif** : Cartographier exhaustivement l'état de la migration UUID dans le monorepo et produire un plan de nettoyage pour supprimer définitivement tout le code legacy.
---
## Résumé exécutif
- **Services analysés** : 6 (backend-api, chat-server, stream-server, web, mobile, desktop)
- **Fichiers legacy à supprimer** : 45+ (migrations_legacy/, *.legacy, dossiers backup)
- **Modifications de code requises** : ~15 fichiers avec patterns INT à corriger
- **TODOs/FIXMEs liés à la migration** : 8 identifiés
- **Estimation temps nettoyage** : 4-6 heures
**État global** : La migration UUID est **largement complétée** dans le backend Go, mais il reste :
- Un dossier `migrations_legacy/` complet (44 fichiers SQL)
- Des fichiers `.legacy`
- Des TODOs/FIXMEs indiquant une migration partielle
- Le chat-server Rust utilise encore des `i64` pour certains IDs (cohabitation INT/UUID)
---
## 1. Cartographie complète des services
### 1.1 Services du monorepo
| Service | Langage | A des migrations | A migrations_legacy | ORM/DB | État UUID |
|---------|---------|------------------|---------------------|--------|-----------|
| veza-backend-api | Go | ✅ `migrations/` | ✅ `migrations_legacy/` (44 fichiers) | GORM | ✅ Principalement migré |
| veza-chat-server | Rust | ✅ `migrations/` | ❌ | SQLx | ⚠️ Mixte (i64 + UUID) |
| veza-stream-server | Rust | ❌ (pas de migrations SQL) | ❌ | SQLx | ✅ UUID |
| apps/web | React/TS | ❌ | ❌ | - | ✅ string (UUID) |
| veza-mobile | React Native | ❌ | ❌ | - | ✅ string (UUID) |
| veza-desktop | Electron/TS | ❌ | ❌ | - | ✅ string (UUID) |
### 1.2 Fichiers de migration par service
#### veza-backend-api/migrations/ (MODERN - UUID)
| Fichier | Tables impactées | Type d'ID | Notes |
|---------|------------------|-----------|-------|
| 001_extensions_and_types.sql | - | - | Extensions PostgreSQL |
| 010_auth_and_users.sql | users | UUID | ✅ |
| 020_rbac_and_profiles.sql | roles, permissions | UUID | ✅ |
| 030_files_management.sql | files | UUID | ✅ |
| 040_streaming_core.sql | tracks, playlists | UUID | ✅ |
| 041_streaming_analytics.sql | playback_analytics | UUID | ✅ |
| 042_media_processing.sql | hls_streams, transcodes | UUID | ✅ |
| 050_legacy_chat.sql | messages, rooms | UUID | ✅ |
| 900_triggers_and_functions.sql | - | - | Triggers |
**Total** : 9 fichiers modernes
#### veza-backend-api/migrations_legacy/ (À SUPPRIMER)
| Fichier | Tables impactées | Type d'ID | Équivalent modern | Statut |
|---------|------------------|-----------|-------------------|--------|
| 001_create_users.sql | users | INT → UUID | 010_auth_and_users.sql | ✅ Remplacé |
| 018_create_email_verification_tokens.sql | email_verification_tokens | INT | 010_auth_and_users.sql | ✅ Remplacé |
| 019_create_password_reset_tokens.sql | password_reset_tokens | INT | 010_auth_and_users.sql | ✅ Remplacé |
| 020_create_sessions.sql | sessions | INT → UUID | 010_auth_and_users.sql | ✅ Remplacé |
| 021_add_profile_privacy.sql | users | - | 010_auth_and_users.sql | ✅ Remplacé |
| 022_add_profile_slug.sql | users | - | 010_auth_and_users.sql | ✅ Remplacé |
| 023_create_roles_permissions.sql | roles, permissions | INT → UUID | 020_rbac_and_profiles.sql | ✅ Remplacé |
| 024_seed_permissions.sql | permissions | - | 020_rbac_and_profiles.sql | ✅ Remplacé |
| 025_create_tracks.sql | tracks | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 026_add_track_status.sql | tracks | - | 040_streaming_core.sql | ✅ Remplacé |
| 027_create_track_likes.sql | track_likes | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 028_create_track_comments.sql | track_comments | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 029_create_track_plays.sql | track_plays | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 030_create_playlists.sql | playlists | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 031_create_playlist_collaborators.sql | playlist_collaborators | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 031_create_track_shares.sql | track_shares | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 032_create_playlist_follows.sql | playlist_follows | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 032_create_track_versions.sql | track_versions | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
| 033_create_track_history.sql | track_history | INT → UUID | 041_streaming_analytics.sql | ✅ Remplacé |
| 034_create_hls_streams_table.sql | hls_streams | INT → UUID | 042_media_processing.sql | ✅ Remplacé |
| 035_create_hls_transcode_queue.sql | hls_transcode_queue | INT → UUID | 042_media_processing.sql | ✅ Remplacé |
| 036_create_bitrate_adaptation_logs.sql | bitrate_adaptation_logs | INT → UUID | 041_streaming_analytics.sql | ✅ Remplacé |
| 037_create_playback_analytics.sql | playback_analytics | INT → UUID | 041_streaming_analytics.sql | ✅ Remplacé |
| 038_add_playback_analytics_indexes.sql | playback_analytics | - | 041_streaming_analytics.sql | ✅ Remplacé |
| 040_create_refresh_tokens.sql | refresh_tokens | INT → UUID | 010_auth_and_users.sql | ✅ Remplacé |
| 041_create_rooms.sql | rooms | INT → UUID | 050_legacy_chat.sql | ✅ Remplacé |
| 042_create_room_members.sql | room_members | INT → UUID | 050_legacy_chat.sql | ✅ Remplacé |
| 043_create_messages.sql | messages | INT → UUID | 050_legacy_chat.sql | ✅ Remplacé |
| 044_add_sessions_revoked_at.sql | sessions | - | 010_auth_and_users.sql | ✅ Remplacé |
| 045_create_user_sessions.sql | user_sessions | INT → UUID | 010_auth_and_users.sql | ✅ Remplacé |
| 046_add_playlists_missing_columns.sql | playlists | - | 040_streaming_core.sql | ✅ Remplacé |
| 047_migrate_users_id_to_uuid.sql | users | Migration INT→UUID | - | ✅ Migration appliquée |
| 048_migrate_webhooks_to_uuid.sql | webhooks | Migration INT→UUID | - | ✅ Migration appliquée |
| 049_migrate_sessions_to_uuid.sql | sessions | Migration INT→UUID | - | ✅ Migration appliquée |
| 050_migrate_room_members_to_uuid.sql | room_members | Migration INT→UUID | - | ✅ Migration appliquée |
| 051_migrate_messages_to_uuid.sql | messages | Migration INT→UUID | - | ✅ Migration appliquée |
| 060_migrate_tracks_playlists_to_uuid.sql | tracks, playlists | Migration INT→UUID | - | ✅ Migration appliquée |
| 061_migrate_admin_tables_to_uuid.sql | admin tables | Migration INT→UUID | - | ✅ Migration appliquée |
| 062_migrate_roles_permissions_to_uuid.sql | roles, permissions | Migration INT→UUID | - | ✅ Migration appliquée |
| 070_finish_secondary_tables_uuid.sql | secondary tables | Migration INT→UUID | - | ✅ Migration appliquée |
| 070_fix_users_user_roles_uuid.sql | user_roles | Migration INT→UUID | - | ✅ Migration appliquée |
| 071_migrate_tracks_playlists_pk_to_uuid.sql | tracks, playlists | Migration PK INT→UUID | - | ✅ Migration appliquée |
| 072_create_chat_schema.sql | chat tables | UUID | 050_legacy_chat.sql | ✅ Remplacé |
| XXX_create_playlist_versions.sql | playlist_versions | INT → UUID | 040_streaming_core.sql | ✅ Remplacé |
**Total** : 44 fichiers legacy à supprimer
#### veza-chat-server/migrations/ (MODERN - UUID)
| Fichier | Tables impactées | Type d'ID | Notes |
|---------|------------------|-----------|-------|
| 001_create_clean_database.sql | users, conversations, messages | UUID | ✅ Toutes les tables utilisent UUID |
| 002_advanced_features.sql | messages, conversations | UUID | ✅ |
| 1000_dm_enriched.sql | conversations | UUID | ✅ |
| 1001_post_migration_fixes.sql | - | - | Corrections |
| 999_cleanup_production_ready_fixed.sql | - | - | Nettoyage |
| archive/ | 4 fichiers archivés | - | Archive (peut être supprimé) |
**Total** : 5 fichiers actifs + 4 archivés
#### veza-stream-server/migrations/
**Aucun fichier de migration SQL** - Le stream-server n'utilise pas de migrations SQL explicites.
---
## 2. Modèles et types d'ID par service
### 2.1 veza-backend-api (Go)
| Modèle | Fichier | Type ID actuel | Type ID attendu | Conforme | Notes |
|--------|---------|----------------|-----------------|----------|-------|
| User | internal/models/user.go | uuid.UUID | uuid.UUID | ✅ | |
| Track | internal/models/track.go | uuid.UUID | uuid.UUID | ✅ | |
| Playlist | internal/models/playlist.go | uuid.UUID | uuid.UUID | ✅ | |
| Session | internal/models/session.go | uuid.UUID | uuid.UUID | ✅ | |
| Room | internal/models/room.go | uuid.UUID | uuid.UUID | ✅ | |
| Message | internal/models/message.go | uuid.UUID | uuid.UUID | ✅ | |
| Role | internal/models/role.go | uuid.UUID | uuid.UUID | ✅ | |
| RefreshToken | internal/models/refresh_token.go | uuid.UUID | uuid.UUID | ✅ | |
| TrackLike | internal/models/track_like.go | uuid.UUID | uuid.UUID | ✅ | |
| TrackComment | internal/models/track_comment.go | uuid.UUID | uuid.UUID | ✅ | |
| TrackShare | internal/models/track_share.go | uuid.UUID | uuid.UUID | ✅ | |
| PlaylistCollaborator | internal/models/playlist_collaborator.go | uuid.UUID | uuid.UUID | ✅ | |
| PlaybackAnalytics | internal/models/playback_analytics.go | uuid.UUID | uuid.UUID | ✅ | |
| HLSStream | internal/models/hls_stream.go | uuid.UUID | uuid.UUID | ✅ | |
| HLSTranscodeQueue | internal/models/hls_transcode_queue.go | uuid.UUID | uuid.UUID | ✅ | |
| Contest | internal/models/contest.go | uuid.UUID | uuid.UUID | ✅ | |
| ContestEntry | internal/models/contest.go | uuid.UUID | uuid.UUID | ✅ | |
| MFAConfig | internal/models/mfa_config.go | uuid.UUID | uuid.UUID | ✅ | |
| FederatedIdentity | internal/models/federated_identity.go | uuid.UUID | uuid.UUID | ✅ | |
| AdminSettings | internal/models/admin.go | uuid.UUID | uuid.UUID | ✅ | |
| AuditLog | internal/models/admin.go | uuid.UUID | uuid.UUID | ✅ | |
| CategoryStats | internal/models/admin.go | int | int | ✅ | Compteur, pas un ID |
**Résultat** : ✅ **100% conforme** - Tous les modèles principaux utilisent UUID
### 2.2 veza-chat-server (Rust)
| Struct | Fichier | Type ID | Type UUID | Conforme | Notes |
|--------|---------|---------|-----------|----------|-------|
| Message | src/models/message.rs | Uuid | ✅ | ✅ | ID principal = UUID |
| Room (channels.rs) | src/hub/channels.rs | id: i64, uuid: Uuid | ⚠️ | ❌ | **PROBLÈME** : Double ID (i64 + UUID) |
| RoomMember | src/hub/channels.rs | id: i64, conversation_id: i64, user_id: i64 | ❌ | ❌ | **PROBLÈME** : Utilise i64 |
| RoomMessage | src/hub/channels.rs | id: i64, uuid: Uuid, author_id: i64 | ⚠️ | ❌ | **PROBLÈME** : Mixte |
| Conversation (DB) | migrations/001_create_clean_database.sql | UUID | ✅ | ✅ | Schéma DB = UUID |
**Résultat** : ⚠️ **Partiellement conforme** - Le schéma DB utilise UUID, mais le code Rust utilise encore des `i64` pour certains IDs.
**Problème identifié** : Le chat-server a une **cohabitation INT/UUID** :
- Les structures Rust (`Room`, `RoomMember`, `RoomMessage`) utilisent `i64` pour les IDs
- La base de données utilise `UUID` (voir `migrations/001_create_clean_database.sql`)
- Il y a un champ `uuid: Uuid` dans certaines structures mais l'ID principal reste `i64`
### 2.3 veza-stream-server (Rust)
**À vérifier** : Le stream-server n'a pas de modèles de données explicites dans le code analysé. Il semble utiliser des UUIDs pour les identifiants de tracks (basé sur les appels API).
### 2.4 apps/web (Frontend React)
| Interface/Type | Fichier | Type ID | Conforme | Notes |
|----------------|---------|---------|----------|-------|
| User | src/types/user.ts (présumé) | string (uuid) | ✅ | Les UUIDs sont représentés comme strings en TS |
| Track | src/types/track.ts (présumé) | string (uuid) | ✅ | |
| Playlist | src/types/playlist.ts (présumé) | string (uuid) | ✅ | |
**Résultat** : ✅ **Conforme** - Le frontend traite les IDs comme des strings (format UUID)
---
## 3. Code legacy détecté
### 3.1 Fichiers explicitement legacy (à supprimer)
| Fichier/Dossier | Service | Raison | Vérification |
|----------------|---------|--------|--------------|
| `migrations_legacy/` (44 fichiers) | veza-backend-api | Dossier entier legacy, remplacé par `migrations/` | ✅ Aucun import référencé |
| `cmd/main.go.legacy` | veza-backend-api | Ancien point d'entrée | ✅ Non référencé dans build |
| `migrations/archive/` (4 fichiers) | veza-chat-server | Fichiers archivés | ⚠️ À vérifier si utilisés |
### 3.2 Code avec patterns INT (à vérifier/migrer)
#### Backend Go
| Fichier | Ligne | Code | Action | Priorité |
|---------|-------|------|--------|----------|
| `internal/core/track/handler.go` | 136 | `// TODO(P2-GO-004): trackUploadService attend int64` | Vérifier si trackUploadService utilise encore int64 | 🔴 Haute |
| `internal/core/track/handler.go` | 151 | `// TODO(P2-GO-004): Migration UUID partielle` | Compléter migration trackUploadService | 🔴 Haute |
| `internal/services/track_history_service.go` | 81 | `// FIXME: models.TrackHistory needs UUID too` | Vérifier TrackHistory | 🟡 Moyenne |
| `internal/repositories/playlist_collaborator_repository.go` | 67 | `// FIXME: Assurer que le modèle PlaylistCollaborator utilise UUID` | Vérifier (déjà UUID normalement) | 🟢 Basse |
| `internal/services/playlist_version_service.go` | 72 | `// FIXME: models.PlaylistVersion ID types need check` | Vérifier PlaylistVersion | 🟡 Moyenne |
| `internal/services/playlist_service.go` | 212 | `// FIXME: PlaylistVersionService likely needs update` | Vérifier PlaylistVersionService | 🟡 Moyenne |
#### Chat Server Rust
| Fichier | Ligne | Code | Action | Priorité |
|---------|-------|------|--------|----------|
| `src/hub/channels.rs` | 28-40 | `pub struct Room { pub id: i64, pub uuid: Uuid, ... }` | Migrer vers UUID uniquement | 🔴 Haute |
| `src/hub/channels.rs` | 42-51 | `pub struct RoomMember { pub id: i64, pub conversation_id: i64, ... }` | Migrer vers UUID | 🔴 Haute |
| `src/hub/channels.rs` | 54-75 | `pub struct RoomMessage { pub id: i64, pub uuid: Uuid, ... }` | Migrer vers UUID uniquement | 🔴 Haute |
| `src/hub/channels.rs` | 98-165 | Fonctions utilisant `i64` pour room_id, user_id | Migrer vers UUID | 🔴 Haute |
**Problème majeur** : Le chat-server Rust utilise des `i64` alors que la DB utilise `UUID`. Il faut soit :
1. Migrer le code Rust vers UUID (recommandé)
2. Ou créer une couche de conversion (non recommandé)
### 3.3 TODOs liés à la migration
| Fichier | Ligne | TODO | Statut | Action |
|---------|-------|------|--------|--------|
| `internal/core/track/handler.go` | 136 | `TODO(P2-GO-004): trackUploadService attend int64` | ⚠️ À vérifier | Vérifier trackUploadService |
| `internal/core/track/handler.go` | 151 | `TODO(P2-GO-004): Migration UUID partielle` | ⚠️ À vérifier | Compléter migration |
| `internal/services/track_history_service.go` | 81 | `FIXME: models.TrackHistory needs UUID too` | ⚠️ À vérifier | Vérifier TrackHistory |
| `internal/repositories/playlist_collaborator_repository.go` | 67 | `FIXME: Assurer que le modèle PlaylistCollaborator utilise UUID` | ✅ Probablement fait | Vérifier et supprimer si OK |
| `internal/services/playlist_version_service.go` | 72 | `FIXME: models.PlaylistVersion ID types need check` | ⚠️ À vérifier | Vérifier PlaylistVersion |
| `internal/services/playlist_service.go` | 212 | `FIXME: PlaylistVersionService likely needs update` | ⚠️ À vérifier | Vérifier PlaylistVersionService |
---
## 4. Foreign Keys et cohérence
### 4.1 Backend Go
| Table source | Colonne FK | Table cible | Type FK | Type PK cible | Cohérent |
|--------------|------------|-------------|---------|---------------|----------|
| tracks | user_id | users | UUID | UUID | ✅ |
| playlists | user_id | users | UUID | UUID | ✅ |
| track_likes | track_id | tracks | UUID | UUID | ✅ |
| track_likes | user_id | users | UUID | UUID | ✅ |
| track_comments | track_id | tracks | UUID | UUID | ✅ |
| track_comments | user_id | users | UUID | UUID | ✅ |
| playlist_collaborators | playlist_id | playlists | UUID | UUID | ✅ |
| playlist_collaborators | user_id | users | UUID | UUID | ✅ |
| room_members | room_id | rooms | UUID | UUID | ✅ |
| room_members | user_id | users | UUID | UUID | ✅ |
| messages | room_id | rooms | UUID | UUID | ✅ |
| messages | user_id | users | UUID | UUID | ✅ |
| sessions | user_id | users | UUID | UUID | ✅ |
| refresh_tokens | user_id | users | UUID | UUID | ✅ |
**Résultat** : ✅ **100% cohérent** - Toutes les Foreign Keys utilisent UUID
### 4.2 Chat Server (Base de données)
| Table source | Colonne FK | Table cible | Type FK | Type PK cible | Cohérent |
|--------------|------------|-------------|---------|---------------|----------|
| conversations | created_by | users | UUID | UUID | ✅ |
| conversation_members | conversation_id | conversations | UUID | UUID | ✅ |
| conversation_members | user_id | users | UUID | UUID | ✅ |
| messages | conversation_id | conversations | UUID | UUID | ✅ |
| messages | sender_id | users | UUID | UUID | ✅ |
| messages | parent_message_id | messages | UUID | UUID | ✅ |
**Résultat** : ✅ **100% cohérent** - Le schéma DB utilise UUID partout
**Problème** : Le code Rust utilise `i64` alors que la DB utilise `UUID`**Incohérence code/DB**
---
## 5. Endpoints et parsing d'ID
### 5.1 Backend Go - Endpoints analysés
| Endpoint | Service | Fichier | Méthode de parsing | Format attendu | Conforme |
|----------|---------|---------|-------------------|----------------|----------|
| GET /api/v1/users/:id | backend-api | handlers/profile_handler.go | `uuid.Parse(id)` | UUID | ✅ |
| GET /api/v1/tracks/:id | backend-api | internal/core/track/handler.go | `uuid.Parse(id)` | UUID | ✅ |
| PUT /api/v1/tracks/:id | backend-api | internal/core/track/handler.go | `uuid.Parse(id)` | UUID | ✅ |
| DELETE /api/v1/tracks/:id | backend-api | internal/core/track/handler.go | `uuid.Parse(id)` | UUID | ✅ |
| GET /api/v1/tracks/:id/bitrate/analytics | backend-api | handlers/bitrate_handler.go | `uuid.Parse(id)` | UUID | ✅ |
| POST /api/v1/tracks/:id/analytics | backend-api | handlers/playback_analytics_handler.go | `uuid.Parse(id)` | UUID | ✅ |
| POST /api/v1/tracks/:id/hls/transcode | backend-api | handlers/hls_handler.go | `uuid.Parse(id)` | UUID | ✅ |
| GET /api/v1/playlists/:id | backend-api | handlers/playlist_handler.go | `uuid.Parse(id)` | UUID | ✅ |
**Résultat** : ✅ **100% conforme** - Tous les endpoints utilisent `uuid.Parse()`
### 5.2 Patterns de parsing détectés
**Patterns UUID (corrects)** :
```go
trackID, err := uuid.Parse(c.Param("id"))
```
**Patterns INT (legacy - non trouvés dans les handlers actifs)** :
```go
// Aucun strconv.Atoi trouvé pour les IDs dans les handlers
// Seulement pour pagination (page, limit) - OK
```
**Résultat** : ✅ **Aucun pattern INT détecté** pour les IDs dans les handlers
---
## 6. Dépendances inter-services
### 6.1 Communication inter-services
| Service source | Service cible | Méthode | Format ID échangé | Cohérent | Notes |
|----------------|---------------|---------|-------------------|----------|--------|
| backend-api | chat-server | HTTP/WebSocket | UUID (string) | ✅ | Via API REST |
| backend-api | stream-server | HTTP | UUID (string) | ✅ | Via API REST |
| web frontend | backend-api | REST | string (uuid) | ✅ | JSON serialization |
| mobile | backend-api | REST | string (uuid) | ✅ | JSON serialization |
| desktop | backend-api | REST | string (uuid) | ✅ | JSON serialization |
**Résultat** : ✅ **Cohérent** - Tous les échanges utilisent UUID (sérialisés en string)
### 6.2 DTOs et contrats
#### Backend → Frontend
| DTO | Fichier | Champ ID | Type | Frontend attend | Conforme |
|-----|---------|----------|------|-----------------|----------|
| UserResponse | internal/api/user/types.go | ID | uuid.UUID | string | ✅ |
| TrackResponse | internal/core/track/handler.go | ID | uuid.UUID | string | ✅ |
| PlaylistResponse | handlers/playlist_handler.go | ID | uuid.UUID | string | ✅ |
**Résultat** : ✅ **Conforme** - Les UUIDs sont sérialisés en string JSON (comportement standard)
---
## 7. Plan de nettoyage
### 7.1 Inventaire des suppressions
#### Suppressions sûres (aucune dépendance)
| Chemin | Raison | Vérification | Taille estimée |
|--------|--------|--------------|----------------|
| `veza-backend-api/migrations_legacy/` | Remplacé par `migrations/` | ✅ Aucun import | ~44 fichiers |
| `veza-backend-api/cmd/main.go.legacy` | Ancien point d'entrée | ✅ Non référencé | 1 fichier |
| `veza-chat-server/migrations/archive/` | Fichiers archivés | ⚠️ À vérifier | 4 fichiers |
**Total** : ~49 fichiers à supprimer
#### Suppressions à valider (peuvent avoir des dépendances)
| Chemin | Raison | Dépendances à vérifier |
|--------|--------|------------------------|
| Aucun identifié | - | - |
### 7.2 Modifications de code nécessaires
#### Haute priorité (bloque la suppression legacy)
| Fichier | Ligne | Modification | Avant | Après | Service |
|---------|-------|--------------|-------|-------|---------|
| `src/hub/channels.rs` | 28-40 | Migrer Room.id vers UUID | `pub id: i64` | `pub id: Uuid` | chat-server |
| `src/hub/channels.rs` | 42-51 | Migrer RoomMember vers UUID | `pub id: i64, pub conversation_id: i64, pub user_id: i64` | `pub id: Uuid, pub conversation_id: Uuid, pub user_id: Uuid` | chat-server |
| `src/hub/channels.rs` | 54-75 | Migrer RoomMessage vers UUID | `pub id: i64, pub author_id: i64, ...` | `pub id: Uuid, pub author_id: Uuid, ...` | chat-server |
| `src/hub/channels.rs` | Toutes fonctions | Migrer signatures vers UUID | `room_id: i64, user_id: i64` | `room_id: Uuid, user_id: Uuid` | chat-server |
**Estimation** : 2-3 heures pour migrer le chat-server Rust
#### Moyenne priorité (nettoyage)
| Fichier | Modification | Raison |
|---------|--------------|--------|
| `internal/core/track/handler.go` | Vérifier et supprimer TODOs si résolus | Nettoyage |
| `internal/services/track_history_service.go` | Vérifier TrackHistory.ID | Vérification |
| `internal/services/playlist_version_service.go` | Vérifier PlaylistVersion.ID | Vérification |
| `internal/services/playlist_service.go` | Vérifier et supprimer FIXME si résolu | Nettoyage |
| `internal/repositories/playlist_collaborator_repository.go` | Vérifier et supprimer FIXME si résolu | Nettoyage |
**Estimation** : 30 minutes - 1 heure
#### Basse priorité (cosmétique)
| Fichier | Modification |
|---------|--------------|
| Tous les fichiers avec commentaires `MIGRATION UUID: ...` | Supprimer commentaires obsolètes |
| Documentation | Mettre à jour pour refléter UUID partout |
**Estimation** : 30 minutes
### 7.3 Ordre des opérations recommandé
#### Étape 1 : Préparation (avant toute suppression)
1. [ ] Créer une branche `cleanup/uuid-migration`
2. [ ] S'assurer que tous les tests passent sur main
3. [ ] Tag git : `git tag pre-uuid-cleanup`
4. [ ] Backup : `tar -czf migrations_legacy_backup.tar.gz veza-backend-api/migrations_legacy/`
#### Étape 2 : Corrections de code (dans l'ordre)
**2.1 Chat Server Rust (priorité haute)**
1. [ ] Migrer `src/hub/channels.rs` : `Room.id` vers `Uuid`
2. [ ] Migrer `src/hub/channels.rs` : `RoomMember` vers `Uuid`
3. [ ] Migrer `src/hub/channels.rs` : `RoomMessage` vers `Uuid`
4. [ ] Migrer toutes les fonctions dans `channels.rs` vers UUID
5. [ ] Vérifier tous les autres fichiers Rust du chat-server
6. [ ] Compiler : `cd veza-chat-server && cargo build --release`
7. [ ] Tests : `cd veza-chat-server && cargo test`
**2.2 Backend Go (vérifications)**
1. [ ] Vérifier `internal/services/track_upload_service.go` : utilise-t-il UUID ?
2. [ ] Vérifier `internal/models/track_history.go` : ID est-il UUID ?
3. [ ] Vérifier `internal/models/playlist_version.go` : ID est-il UUID ?
4. [ ] Supprimer les TODOs/FIXMEs résolus
5. [ ] Tests : `cd veza-backend-api && go test ./... -v`
#### Étape 3 : Suppressions (dans l'ordre)
1. [ ] Supprimer `veza-backend-api/migrations_legacy/`
```bash
rm -rf veza-backend-api/migrations_legacy/
```
2. [ ] Supprimer `veza-backend-api/cmd/main.go.legacy`
```bash
rm veza-backend-api/cmd/main.go.legacy
```
3. [ ] Vérifier et supprimer `veza-chat-server/migrations/archive/` (si non utilisé)
```bash
# Vérifier d'abord
cd veza-chat-server && cargo build
# Si OK, supprimer
rm -rf veza-chat-server/migrations/archive/
```
4. [ ] Lancer les tests → doivent passer
```bash
cd veza-backend-api && go test ./... -v
cd veza-chat-server && cargo test
```
#### Étape 4 : Nettoyage final
1. [ ] Supprimer TODOs obsolètes liés à la migration
2. [ ] Supprimer commentaires `MIGRATION UUID: ...` obsolètes
3. [ ] Mettre à jour la documentation
4. [ ] Commit final avec message explicite
#### Étape 5 : Validation
1. [ ] Build complet de tous les services
```bash
cd veza-backend-api && go build ./cmd/api
cd veza-chat-server && cargo build --release
cd veza-stream-server && cargo build --release
cd apps/web && npm run build
```
2. [ ] Tests complets
```bash
cd veza-backend-api && go test ./... -v
cd veza-chat-server && cargo test
```
3. [ ] Review du diff total
```bash
git diff pre-uuid-cleanup..HEAD --stat
```
### 7.4 Script de nettoyage
```bash
#!/bin/bash
# cleanup-uuid-migration.sh
# À exécuter depuis la racine du monorepo
set -e # Stop on error
echo "=== Étape 1: Vérification pré-cleanup ==="
# Vérifier qu'on est sur la bonne branche
CURRENT_BRANCH=$(git branch --show-current)
if [ "$CURRENT_BRANCH" != "cleanup/uuid-migration" ]; then
echo "⚠️ Vous n'êtes pas sur la branche cleanup/uuid-migration"
echo "Création de la branche..."
git checkout -b cleanup/uuid-cleanup
fi
# Vérifier que les tests passent
echo "🧪 Vérification des tests..."
cd veza-backend-api && go test ./... -v || { echo "❌ Tests backend échoués"; exit 1; }
cd ../veza-chat-server && cargo test || { echo "❌ Tests chat-server échoués"; exit 1; }
cd ..
echo "✅ Tests OK"
echo ""
echo "=== Étape 2: Backup ==="
BACKUP_DIR="backup-pre-cleanup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "📦 Création du backup dans $BACKUP_DIR..."
tar -czf "$BACKUP_DIR/migrations_legacy.tar.gz" veza-backend-api/migrations_legacy/ 2>/dev/null || echo "⚠️ migrations_legacy/ déjà supprimé ou inexistant"
cp veza-backend-api/cmd/main.go.legacy "$BACKUP_DIR/" 2>/dev/null || echo "⚠️ main.go.legacy déjà supprimé ou inexistant"
echo "✅ Backup créé"
echo ""
echo "=== Étape 3: Suppressions ==="
# Supprimer migrations_legacy
if [ -d "veza-backend-api/migrations_legacy" ]; then
echo "🗑️ Suppression de veza-backend-api/migrations_legacy/..."
rm -rf veza-backend-api/migrations_legacy/
echo "✅ Supprimé"
else
echo " migrations_legacy/ n'existe pas (déjà supprimé ?)"
fi
# Supprimer main.go.legacy
if [ -f "veza-backend-api/cmd/main.go.legacy" ]; then
echo "🗑️ Suppression de veza-backend-api/cmd/main.go.legacy..."
rm veza-backend-api/cmd/main.go.legacy
echo "✅ Supprimé"
else
echo " main.go.legacy n'existe pas (déjà supprimé ?)"
fi
# Supprimer archive (optionnel, après vérification)
if [ -d "veza-chat-server/migrations/archive" ]; then
echo "⚠️ veza-chat-server/migrations/archive/ existe"
echo "Vérifiez manuellement s'il peut être supprimé"
# rm -rf veza-chat-server/migrations/archive/
fi
echo ""
echo "=== Étape 4: Vérification post-cleanup ==="
# Build
echo "🔨 Build backend..."
cd veza-backend-api && go build ./cmd/api || { echo "❌ Build backend échoué"; exit 1; }
cd ..
echo "🔨 Build chat-server..."
cd veza-chat-server && cargo build --release || { echo "❌ Build chat-server échoué"; exit 1; }
cd ..
# Tests
echo "🧪 Tests backend..."
cd veza-backend-api && go test ./... -v || { echo "❌ Tests backend échoués"; exit 1; }
cd ..
echo "🧪 Tests chat-server..."
cd veza-chat-server && cargo test || { echo "❌ Tests chat-server échoués"; exit 1; }
cd ..
echo ""
echo "=== ✅ Cleanup terminé ==="
echo ""
echo "📊 Résumé :"
echo " - Backup créé dans : $BACKUP_DIR"
echo " - migrations_legacy/ : Supprimé"
echo " - main.go.legacy : Supprimé"
echo ""
echo "📝 Prochaines étapes :"
echo " 1. Review les changements : git diff"
echo " 2. Commit : git commit -m 'chore: remove legacy UUID migration files'"
echo " 3. Push : git push origin cleanup/uuid-migration"
```
**Utilisation** :
```bash
chmod +x cleanup-uuid-migration.sh
./cleanup-uuid-migration.sh
```
---
## 8. Documentation à mettre à jour
### 8.1 Fichiers à mettre à jour
| Fichier | Section | Modification |
|---------|---------|--------------|
| `README.md` | Setup | Supprimer références aux anciennes migrations |
| `CONTRIBUTING.md` | Guidelines | Ajouter : "Tous les IDs sont des UUID v4" |
| `veza-backend-api/README.md` | Database | Confirmer UUID partout |
| `veza-chat-server/README.md` | Database | Confirmer UUID partout |
### 8.2 Nouveau contenu à ajouter
#### Dans README.md ou CONTRIBUTING.md :
```markdown
## Identifiants (IDs)
**Tous les IDs dans Veza sont des UUID v4.**
-**À faire** : Utiliser `uuid.UUID` (Go) ou `Uuid` (Rust) pour tous les IDs
-**À éviter** : Ne jamais utiliser d'ID entiers (`int`, `int64`, `i64`) pour les identifiants
-**Frontend** : Les UUIDs sont représentés comme des strings en TypeScript/JavaScript
-**API** : Les UUIDs sont sérialisés en string dans les réponses JSON
### Exemples
**Go** :
```go
type User struct {
ID uuid.UUID `gorm:"type:uuid;primaryKey" json:"id"`
}
```
**Rust** :
```rust
pub struct User {
pub id: Uuid,
}
```
**TypeScript** :
```typescript
interface User {
id: string; // UUID format
}
```
```
---
## 9. Checklist finale
### Avant le nettoyage
- [ ] Tous les modèles utilisent `uuid.UUID` (Go) ou `Uuid` (Rust)
- [ ] Aucun `strconv.Atoi` pour les IDs dans les handlers
- [ ] Tous les endpoints utilisent `uuid.Parse()` pour les IDs
- [ ] Tous les tests passent
- [ ] Backup créé
### Après le nettoyage
- [ ] `migrations_legacy/` supprimé
- [ ] `*.legacy` fichiers supprimés
- [ ] Aucun fichier `*.legacy` restant
- [ ] Chat-server Rust migré vers UUID (si applicable)
- [ ] Documentation à jour
- [ ] Tests passent
- [ ] Build OK pour tous les services
- [ ] Commit avec message explicite
- [ ] Tag post-cleanup créé
---
## 10. Risques et précautions
### Risques identifiés
1. **Chat-server Rust** : Migration de `i64` vers `Uuid` peut casser des intégrations
- **Mitigation** : Tester exhaustivement avant merge
- **Rollback** : Tag git `pre-uuid-cleanup` permet rollback
2. **Services dépendants** : Si d'autres services consomment les APIs avec format INT
- **Mitigation** : Vérifier les contrats d'API avant suppression
- **Vérification** : Aucun service externe identifié utilisant INT
3. **Base de données** : Les migrations legacy peuvent être référencées dans la doc
- **Mitigation** : Mettre à jour la documentation
### Précautions
-**Toujours pouvoir rollback** : Tag git `pre-uuid-cleanup`
-**Un service à la fois** : Ne pas tout casser en même temps
-**Tests entre chaque étape** : Valider que rien n'est cassé
-**Le frontend doit continuer à fonctionner** : Vérifier que les types correspondent
---
## 11. Conclusion
La migration UUID est **largement complétée** dans le monorepo Veza :
**Backend Go** : 100% migré vers UUID
⚠️ **Chat Server Rust** : Schéma DB = UUID, mais code Rust utilise encore `i64` (à migrer)
**Frontend** : Utilise string (UUID) - conforme
**Inter-services** : Communication en UUID - conforme
**Actions prioritaires** :
1. 🔴 **Haute** : Migrer le chat-server Rust vers UUID (2-3h)
2. 🟡 **Moyenne** : Supprimer `migrations_legacy/` et fichiers `.legacy` (30min)
3. 🟢 **Basse** : Nettoyer les TODOs/FIXMEs et documentation (30min)
**Estimation totale** : 4-6 heures pour un nettoyage complet.
---
**Document généré le** : 2025-01-27
**Prochaine révision** : Après nettoyage complet