# AUDIT EXHAUSTIF - MODULE VEZA BACKEND API **Date**: 2025-01-27 **Auditeur**: Auto (Cursor AI) **Module**: `veza-backend-api` (Backend Go - API REST) **Version**: 1.2.0 **Go Version**: 1.23.8 --- # EXECUTIVE SUMMARY ## État Général - ✅ **Build**: Compile sans erreurs - ⚠️ **Tests**: 229 fichiers de tests, certains échecs liés à testcontainers (PostgreSQL) - ✅ **Sécurité**: JWT validation stricte, CORS configuré, ClamAV intégré - ⚠️ **Robustesse**: Timeouts partiels, retries présents, circuit breakers manquants - ⚠️ **Performance**: Risques N+1 queries, cache limité, pas de métriques DB pool - ✅ **Observabilité**: Logging structuré (zap), Prometheus metrics, Sentry intégré ## Métriques Clés - **Fichiers Go**: 671 - **Fichiers Tests**: 229 (34% ratio) - **TODOs/FIXMEs**: 25+ identifiés - **Points d'entrée**: 2 (`cmd/api/main.go`, `cmd/modern-server/main.go`) ## Risques Critiques (Top 5) 1. **P0-SECURITY**: CORS strict mode en production si `CORS_ALLOWED_ORIGINS` vide (rejette tout) 2. **P0-SECURITY**: Secrets dans logs si `LOG_LEVEL=DEBUG` en production 3. **P1-ROBUSTNESS**: Tests d'intégration échouent (testcontainers PostgreSQL) 4. **P1-ROBUSTNESS**: Pas de rollback automatique migrations si échec 5. **P1-PERFORMANCE**: Risque N+1 queries dans certains handlers --- # PHASE A — CARTOGRAPHIE ## A.1 But du Module **Rôle**: API REST backend pour la plateforme Veza (audio collaborative) **Fonctionnalités principales**: - Authentification (JWT, sessions, 2FA, OAuth) - Gestion utilisateurs et profils (RBAC) - Upload et gestion de tracks audio (ClamAV scanning) - Playlists et collaboration - Chat rooms et messages - Marketplace (produits, commandes) - Webhooks et jobs asynchrones - Audit logging ## A.2 Entrées / Sorties ### APIs Exposées **HTTP REST** (Gin Framework): - Base path: `/api/v1` - Port: 8080 (configurable via `APP_PORT`) - Format: JSON (Content-Type: `application/json`) **Routes principales**: ``` GET /api/v1/health - Health check global GET /api/v1/healthz - Liveness probe GET /api/v1/readyz - Readiness probe GET /api/v1/status - Status détaillé GET /api/v1/metrics - Prometheus metrics POST /api/v1/auth/register - Inscription POST /api/v1/auth/login - Connexion (rate limited) POST /api/v1/auth/refresh - Refresh token POST /api/v1/auth/logout - Déconnexion POST /api/v1/auth/verify-email - Vérification email POST /api/v1/auth/password/reset-request - Reset password GET /api/v1/users/:id - Profil utilisateur PUT /api/v1/users/:id - Mise à jour profil GET /api/v1/tracks - Liste tracks POST /api/v1/tracks - Upload track (creator role) GET /api/v1/tracks/:id - Détails track PUT /api/v1/tracks/:id - Mise à jour track DELETE /api/v1/tracks/:id - Suppression track GET /api/v1/playlists - Liste playlists POST /api/v1/playlists - Créer playlist GET /api/v1/playlists/:id - Détails playlist GET /api/v1/marketplace/products - Liste produits POST /api/v1/marketplace/products - Créer produit (creator role) GET /api/v1/admin/* - Routes admin (admin role) ``` **WebSocket**: Délégué au Chat Server Rust (port 8081) **gRPC**: Configuré mais non utilisé actuellement **GraphQL**: Configuré mais non utilisé actuellement ### Formats de Données **Request/Response JSON**: ```json { "id": "uuid-v4", "email": "user@example.com", "username": "username", "created_at": "2025-01-27T10:00:00Z" } ``` **JWT Token** (Bearer): ``` Authorization: Bearer ``` **Claims JWT**: - `sub`: UUID utilisateur - `iss`: "veza-api" (vérifié) - `aud`: "veza-app" (vérifié) - `exp`: Expiration timestamp - `iat`: Issued at timestamp - `token_version`: Version pour révocation ## A.3 Dépendances Internes **Structure**: ``` internal/ ├── api/ # Routes et handlers HTTP ├── config/ # Configuration (env, secrets, validation) ├── core/ # Services core (auth, track, marketplace) ├── database/ # Gestion DB (migrations, pool, retry) ├── handlers/ # Handlers HTTP (auth, tracks, playlists, etc.) ├── middleware/ # Middlewares (auth, CORS, rate limit, timeout, etc.) ├── models/ # Modèles GORM ├── repositories/ # Repositories (data access) ├── services/ # Services métier ├── workers/ # Workers asynchrones (jobs, webhooks, etc.) ├── errors/ # Gestion erreurs standardisée ├── logging/ # Logging structuré (zap) ├── metrics/ # Prometheus metrics └── validators/ # Validateurs (email, password, etc.) ``` **Packages partagés**: - `internal/errors`: Codes d'erreur standardisés (1000-9999) - `internal/common`: Types et validation communs - `internal/response`: Format réponse standardisé ## A.4 Dépendances Externes ### Base de Données - **PostgreSQL**: Base principale (via `lib/pq` + GORM) - **Migrations**: SQL files dans `migrations/` (exécutées au démarrage) - **Pool**: MaxOpenConns=25, MaxIdleConns=10, MaxLifetime=5min ### Cache & Sessions - **Redis**: Cache et sessions (optionnel via `REDIS_ENABLE`) - **Client**: `redis/go-redis/v9` ### Message Queue - **RabbitMQ**: Event bus pour jobs asynchrones (optionnel via `RABBITMQ_ENABLE`) - **Client**: `rabbitmq/amqp091-go` ### Services Externes - **Chat Server**: `http://localhost:8081` (WebSocket, Rust) - **Stream Server**: `http://localhost:8082` (WebRTC streaming, Rust) - **ClamAV**: Virus scanning (localhost:3310, optionnel) ### Monitoring & Observabilité - **Sentry**: Error tracking (optionnel via `SENTRY_DSN`) - **Prometheus**: Metrics exposées sur `/api/v1/metrics` ### Email - **SMTP**: Envoi emails (verification, password reset, etc.) ## A.5 Exécution ### Commandes Build/Run **Build**: ```bash make build # Compile binaire make build-linux # Compile pour Linux make docker-build # Build image Docker ``` **Run**: ```bash make run # Build + run make dev # Run en mode dev (go run) make run-lab # Run en mode lab (sans Redis/RabbitMQ) ``` **Tests**: ```bash make test # Tests unitaires make test-coverage # Tests avec couverture make test-race # Tests avec détection race conditions make test-integration # Tests d'intégration ``` **Qualité**: ```bash make lint # golangci-lint make vet # go vet make security # gosec + govulncheck ``` ### Configuration **Variables d'environnement requises**: ```bash DATABASE_URL=postgresql://user:pass@host:5432/dbname JWT_SECRET= ``` **Variables optionnelles**: ```bash APP_ENV=production # development, test, production APP_PORT=8080 REDIS_URL=redis://localhost:6379 REDIS_ENABLE=true RABBITMQ_URL=amqp://guest:guest@localhost:5672/ RABBITMQ_ENABLE=true CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com SENTRY_DSN=https://... LOG_LEVEL=INFO # DEBUG, INFO, WARN, ERROR HANDLER_TIMEOUT=30s ``` **Fichiers de config**: - `.env` (chargé automatiquement) - `.env.{APP_ENV}` (chargé selon environnement) ### Docker **Build**: ```bash docker build -t veza-backend-api . ``` **Run**: ```bash docker run -p 8080:8080 \ -e DATABASE_URL=... \ -e JWT_SECRET=... \ veza-backend-api ``` **Production Dockerfile**: `Dockerfile.production` (multi-stage, non-root user, healthcheck) ## A.6 Points d'Intégration ### Contrats d'API **Frontend React**: - Base URL: `/api/v1` - Auth: JWT Bearer token - CORS: Configuré via `CORS_ALLOWED_ORIGINS` **Chat Server Rust**: - Endpoint: `POST /api/v1/chat/token` (génère JWT pour Chat Server) - Format: JWT avec claims `sub`, `iss`, `aud` **Stream Server Rust**: - Callback: `POST /api/v1/internal/tracks/:id/stream-ready` (callback après transcoding) - Format: JSON avec `track_id`, `status`, `hls_url` ### Auth **JWT Validation**: - Algorithme: HS256 (strict, `none`/`RS256` rejetés) - Claims vérifiés: `iss`, `aud`, `exp`, `token_version` - Session DB: Vérifiée via `SessionService.ValidateSession()` **RBAC**: - Rôles: `user`, `admin`, `creator`, `premium`, `artist`, `producer`, `label` - Permissions: Tables `permissions`, `role_permissions`, `user_roles` - Middleware: `RequireAuth()`, `RequireAdmin()`, `RequireContentCreatorRole()` ### Schéma DB **Conventions**: - IDs: UUID v4 (migration depuis int64 complétée) - Timestamps: `created_at`, `updated_at` (timestamptz) - Soft delete: `deleted_at` (timestamptz nullable) - Foreign keys: ON DELETE CASCADE/RESTRICT explicite - Indexes: Sur toutes foreign keys **Tables principales**: - `users` (id UUID, email, username, password_hash, token_version, ...) - `sessions` (id UUID, user_id UUID, token_hash, expires_at, ...) - `tracks` (id UUID, user_id UUID, title, file_path, status, ...) - `playlists` (id UUID, user_id UUID, title, ...) - `permissions`, `role_permissions`, `user_roles` (RBAC) --- # PHASE B — SANTÉ TECHNIQUE ## B.1 Build & Compilation **État**: ✅ **PASS** **Compilation**: ```bash go build ./... # ✅ Compile sans erreurs ``` **Points d'entrée**: - `cmd/api/main.go`: Point d'entrée principal (Sentry, RabbitMQ, Job Worker) - `cmd/modern-server/main.go`: Point d'entrée alternatif (moins de fonctionnalités) **Problèmes**: - ⚠️ **P2-STRUCTURE**: 2 points d'entrée créent confusion - Fichier: `cmd/api/main.go`, `cmd/modern-server/main.go` - Impact: Développeurs peuvent utiliser le mauvais point d'entrée - Fix: Documenter ou supprimer `cmd/modern-server/main.go` **Dockerfile**: - ✅ Multi-stage build (optimisé) - ✅ Non-root user (sécurité) - ✅ Healthcheck configuré - ⚠️ **P2-DOCKER**: `Dockerfile.production` référence `./main.go` (ligne 30) mais devrait être `./cmd/api/main.go` - Fichier: `Dockerfile.production:30` - Impact: Build échoue si utilisé - Fix: Corriger chemin vers `./cmd/api/main.go` ## B.2 Tests **État**: ⚠️ **PARTIAL** (tests unitaires OK, tests d'intégration échouent) **Métriques**: - Fichiers tests: 229 - Ratio: 34% (229/671) - Tests unitaires: ✅ Passent (sauf dépendances externes) - Tests d'intégration: ❌ Échouent (testcontainers PostgreSQL) **Problèmes identifiés**: #### MOD-P1-011: Tests d'Intégration Échouent (testcontainers) - **Titre**: Tests d'intégration échouent avec erreur "container exited with code 3" - **Impact**: Tests d'intégration non fiables, CI/CD peut échouer - **Preuve**: `tests/transactions/social_transaction_test.go:23` - erreur testcontainers - **Cause**: Testcontainers PostgreSQL ne démarre pas correctement - **Fix Minimal**: 1. Vérifier configuration testcontainers 2. Ajouter retry/backoff pour démarrage container 3. Ou utiliser DB de test locale si testcontainers instable - **Plan Validation**: - Test: `go test ./tests/transactions -v` → doit passer - Commande: Vérifier logs testcontainers pour cause échec - **Effet de Bord**: Tests peuvent être plus lents - **Effort**: M (4h) **Couverture**: - ⚠️ Pas de métrique de couverture automatique - ⚠️ **P2-TEST**: Couverture non mesurée systématiquement - Fix: Ajouter `make test-coverage` dans CI/CD **Tests manquants**: - ⚠️ **P2-TEST**: Pas de tests E2E complets - ⚠️ **P2-TEST**: Tests de charge manquants (k6 script présent mais non exécuté) ## B.3 Gestion des Erreurs **État**: ✅ **BON** (structure standardisée) **Implémentation**: - ✅ Package `internal/errors`: Codes d'erreur standardisés (1000-9999) - ✅ `AppError` struct: Code, Message, Details, Context - ✅ Middleware `ErrorHandler`: Mapping code → HTTP status - ✅ Wrapping: `errors.Wrap()` pour chaînage erreurs **Codes d'erreur**: ```go // Auth (1000-1999) ErrCodeInvalidCredentials = 1000 ErrCodeTokenExpired = 1001 ErrCodeTokenInvalid = 1002 ErrCodeForbidden = 1003 ErrCodeUnauthorized = 1004 // Validation (2000-2999) ErrCodeValidation = 2000 ErrCodeRequiredField = 2001 // Resource (3000-3999) ErrCodeNotFound = 3000 ErrCodeAlreadyExists = 3001 // Business Logic (4000-4999) ErrCodeOperationNotAllowed = 4000 ErrCodeQuotaExceeded = 4005 // Rate Limiting (5000-5099) ErrCodeRateLimitExceeded = 5000 // Internal (9000-9999) ErrCodeInternal = 9000 ErrCodeDatabase = 9001 ``` **Problèmes**: - ⚠️ **P2-ERROR**: Certains handlers retournent encore `gin.H{"error": "..."}` au lieu de `AppError` - Fichiers: À auditer tous handlers - Impact: Incohérence format erreur - Fix: Refactoriser tous handlers pour utiliser `AppError` ## B.4 Conventions & Structure **État**: ✅ **BON** (structure claire) **Naming**: - ✅ Packages: snake_case (`internal/api/user`) - ✅ Fichiers: snake_case (`handler.go`, `service.go`) - ✅ Types: PascalCase (`AuthService`, `UserHandler`) - ✅ Variables: camelCase (`userID`, `authService`) **Structure**: - ✅ Séparation claire: handlers → services → repositories - ✅ Middlewares centralisés - ✅ Config centralisée **Problèmes**: - ⚠️ **P2-STRUCTURE**: 25+ TODOs/FIXMEs dans code - Fichiers: `internal/core/track/handler.go:282`, `internal/services/track_history_service.go:74`, etc. - Impact: Dette technique, code incomplet - Fix: Auditer tous TODOs, prioriser, résoudre ou créer tickets --- # PHASE C — SÉCURITÉ ## C.1 Secrets & Configuration **État**: ✅ **BON** (secrets masqués, validation stricte) **Implémentation**: - ✅ `SecretsProvider`: Masque secrets dans logs (`internal/config/secrets.go`) - ✅ `getEnvRequired()`: Variables requises retournent erreur (pas panic) - ✅ Validation environnement: `ValidateForEnvironment()` (stricte en production) - ✅ CORS: Wildcard `*` interdit en production **Problèmes**: #### MOD-P0-001: CORS Strict Mode en Production - **Titre**: Si `CORS_ALLOWED_ORIGINS` vide en production, TOUTES les requêtes CORS sont rejetées - **Impact**: Service inaccessible depuis frontend si config manquante - **Preuve**: `internal/api/router.go:72-74` - Warning loggé mais service démarre - **Cause**: CORS middleware appliqué avec liste vide (strict mode) - **Fix Minimal**: 1. Fail-fast au démarrage si `CORS_ALLOWED_ORIGINS` vide en production 2. Ou documenter que strict mode est intentionnel - **Plan Validation**: - Test: Démarrer avec `APP_ENV=production CORS_ALLOWED_ORIGINS=""` → doit échouer ou documenter - Commande: Vérifier logs au démarrage - **Effet de Bord**: Service ne démarre pas si config manquante (acceptable pour sécurité) - **Effort**: S (1h) #### MOD-P0-002: Secrets dans Logs si DEBUG - **Titre**: `LOG_LEVEL=DEBUG` en production peut exposer secrets dans logs - **Impact**: Fuite de données sensibles (JWT secrets, DB passwords) - **Preuve**: `internal/config/config.go:651` - Validation interdit DEBUG en prod, mais si contourné - **Cause**: Logs DEBUG peuvent contenir config complète - **Fix Minimal**: 1. Validation déjà présente (interdit DEBUG en prod) 2. Ajouter redaction automatique secrets dans logs DEBUG - **Plan Validation**: - Test: Démarrer avec `LOG_LEVEL=DEBUG`, vérifier logs → secrets masqués - Commande: `grep -i "jwt_secret\|password" logs/*.log` → doit être vide - **Effet de Bord**: Debugging plus difficile (acceptable) - **Effort**: S (2h) ## C.2 Authentification & Autorisation **État**: ✅ **EXCELLENT** (JWT validation stricte, RBAC fonctionnel) **JWT Validation**: - ✅ Algorithme: HS256 (strict, `none`/`RS256` rejetés) - ✅ Signature: Validée avec secret - ✅ Expiration: `exp` claim vérifié - ✅ Issuer: `iss` vérifié (doit être `JWT_ISSUER` ou "veza-api") - ✅ Audience: `aud` vérifié (doit être `JWT_AUDIENCE` ou "veza-app") - ✅ Token Version: Vérifié contre DB (`user.token_version`) - ✅ Session DB: `SessionService.ValidateSession()` appelé **RBAC**: - ✅ `RequireAdmin()`: Utilise `PermissionService.HasRole(..., "admin")` - ✅ `RequirePermission()`: Utilise `PermissionService.HasPermission()` - ✅ `RequireContentCreatorRole()`: Vérifie creator/premium/admin/artist/producer/label - ✅ Tables DB: `permissions`, `role_permissions`, `user_roles` existent **Routes Protégées**: - ✅ `/api/v1/admin/*`: Protégé par `RequireAdmin()` - ✅ `/api/v1/tracks` (POST): Protégé par `RequireContentCreatorRole()` - ✅ `/api/v1/marketplace/products` (POST): Protégé par `RequireContentCreatorRole()` **Problèmes**: - ✅ **RÉSOLU**: Validation `aud`/`iss` JWT stricte (via `jwt.WithIssuer()`, `jwt.WithAudience()`) - ✅ **RÉSOLU**: Token version vérifiée dans `authenticate()` ## C.3 Injection & File Upload **État**: ✅ **BON** (ClamAV intégré, validation stricte) **File Upload**: - ✅ ClamAV scanning: Intégré (`internal/services/upload_validator.go`) - ✅ Validation type MIME: Magic number + extension - ✅ Validation taille: Limites par type (audio, image, video) - ✅ Fail-secure: Rejette upload si ClamAV requis mais indisponible - ✅ Quarantine: Fichiers infectés mis en quarantaine **SQL Injection**: - ✅ GORM: Utilisé partout (paramétrisé) - ✅ Raw SQL: Utilisé avec `$1, $2, ...` (paramétrisé) - ⚠️ **P1-SECURITY**: Quelques requêtes raw SQL à auditer - Fichiers: `internal/services/email_verification_service.go:73`, `internal/services/session_service.go:82` - Impact: Risque SQL injection si mal formaté - Fix: Vérifier toutes requêtes raw SQL utilisent paramètres **Command Injection**: - ✅ Pas d'exécution commande shell identifiée - ✅ ClamAV: Communication via socket (pas commande shell) **Path Traversal**: - ✅ Uploads: Chemins sanitizés (`filepath.Join`, `filepath.Base`) - ⚠️ **P2-SECURITY**: Audit nécessaire pour tous accès fichiers ## C.4 CORS, Cookies, Headers **État**: ✅ **BON** (CORS configuré, pas de cookies) **CORS**: - ✅ Middleware: `middleware.CORS()` appliqué - ✅ Origins: Configuré via `CORS_ALLOWED_ORIGINS` - ✅ Production: Wildcard `*` interdit - ⚠️ **P0-SECURITY**: Si `CORS_ALLOWED_ORIGINS` vide, strict mode (rejette tout) - voir MOD-P0-001 **Cookies**: - ✅ Pas de cookies utilisés (JWT dans header Authorization) **Headers Sécurité**: - ⚠️ **P2-SECURITY**: Headers sécurité manquants (HSTS, CSP, X-Frame-Options, etc.) - Fix: Ajouter middleware sécurité avec headers recommandés ## C.5 Dépendances Vulnérables **État**: ✅ **BON** (scan automatique dans CI/CD) **Scan Automatique**: - ✅ GitHub Actions: `govulncheck` dans workflow (`vulnerability-scan.yml`) - ✅ Makefile: `make security` avec `gosec` + `govulncheck` - ✅ Docker: Trivy scan dans CI/CD **Problèmes**: - ⚠️ **P2-SECURITY**: Scan non exécuté localement par défaut - Fix: Ajouter `make security` dans `make ci` --- # PHASE D — ROBUSTESSE & OBSERVABILITÉ ## D.1 Logging **État**: ✅ **EXCELLENT** (structured logging, corrélation) **Implémentation**: - ✅ Zap: Structured logging (`go.uber.org/zap`) - ✅ Request ID: Généré et propagé (`middleware.RequestID()`) - ✅ Trace ID: W3C Trace Context compatible (`middleware.Tracing()`) - ✅ Context: `request_id`, `user_id`, `trace_id`, `span_id` dans logs - ✅ Niveaux: DEBUG, INFO, WARN, ERROR (configurable via `LOG_LEVEL`) **Problèmes**: - ⚠️ **P1-OBSERVABILITY**: Stack traces dans logs peuvent exposer info sensible - Fichier: `internal/middleware/error_handler.go:145` - `zap.ByteString("stack_trace", debug.Stack())` - Impact: Chemins fichiers, code dans logs prod - Fix: Logger stack traces seulement si `LOG_LEVEL=DEBUG` ou `APP_ENV=development` - Effort: S (1h) ## D.2 Metrics **État**: ✅ **BON** (Prometheus intégré) **Implémentation**: - ✅ Prometheus: Metrics exposées sur `/api/v1/metrics` - ✅ Middleware: `middleware.Metrics()` enregistre requêtes HTTP - ✅ Error Metrics: `ErrorMetrics` enregistre erreurs par code - ✅ System Metrics: CPU, mémoire, goroutines (`/api/v1/system/metrics`) **Problèmes**: - ⚠️ **P2-OBSERVABILITY**: Métriques DB pool manquantes (connections, wait time) - Fix: Exposer métriques `database/sql` stats - Effort: M (2h) ## D.3 Healthchecks **État**: ✅ **BON** (healthchecks complets) **Endpoints**: - ✅ `/api/v1/health`: Health check global - ✅ `/api/v1/healthz`: Liveness probe (Kubernetes) - ✅ `/api/v1/readyz`: Readiness probe (DB, Redis, RabbitMQ) - ✅ `/api/v1/status`: Status détaillé (version, git commit, build time) **Problèmes**: - ⚠️ **P1-ROBUSTNESS**: `/readyz` peut échouer si Redis/RabbitMQ down (même en dev) - Fichier: `internal/handlers/health.go:143-159` - Impact: Service marqué "not ready" même si DB OK - Fix: Déjà partiel (tolérance en non-prod), mais peut être amélioré - Effort: S (1h) ## D.4 Timeouts & Retries **État**: ⚠️ **PARTIAL** (timeouts partiels, retries présents) **Timeouts**: - ✅ HTTP server: `ReadTimeout: 30s`, `WriteTimeout: 30s` - ✅ Global handler: `HANDLER_TIMEOUT=30s` (middleware `Timeout()`) - ✅ DB: Timeout 5s dans health checks - ✅ Redis: Timeout 5s dans health checks - ⚠️ **P1-ROBUSTNESS**: Pas de timeout context dans tous les handlers - Impact: Handlers peuvent bloquer indéfiniment - Fix: Ajouter `context.WithTimeout()` dans tous handlers - Effort: M (4h) **Retries**: - ✅ DB: Retry avec `DBMaxRetries` (défaut: 5) et `DBRetryInterval` (défaut: 5s) - ✅ RabbitMQ: Retry avec `RabbitMQMaxRetries` (défaut: 3) et `RabbitMQRetryInterval` (défaut: 2s) - ⚠️ **P2-ROBUSTNESS**: Pas de retry sur requêtes HTTP externes (Chat Server, Stream Server) - Fix: Ajouter retry avec backoff exponentiel - Effort: M (3h) **Circuit Breakers**: - ⚠️ **P2-ROBUSTNESS**: Pas de circuit breakers implémentés - Impact: Service peut être surchargé si dépendances lentes - Fix: Intégrer `sony/gobreaker` ou similaire - Effort: M (4h) ## D.5 Gestion de Charge **DB Pool**: - ✅ Configuré: `MaxOpenConns: 25`, `MaxIdleConns: 10` - ✅ `ConnMaxLifetime: 5min`, `ConnMaxIdleTime: 1min` - ⚠️ **P2-PERFORMANCE**: Pool stats pas exposés dans métriques - Fix: Exposer métriques pool - Effort: S (1h) **WebSocket**: - ⚠️ **P2-ROBUSTNESS**: Pas de limite connexions WebSocket (géré par Chat Server Rust) **Streaming**: - ⚠️ **P2-ROBUSTNESS**: Pas de backpressure sur uploads (géré par rate limiting uploads) ## D.6 Migrations & Compatibilité **Migrations**: - ✅ Migrations SQL (`migrations/*.sql`) - ✅ Table tracking: `schema_migrations` - ✅ Exécution au démarrage: `Database.Initialize()` - ⚠️ **P1-ROBUSTNESS**: Pas de rollback automatique si migration échoue - Fichier: `internal/database/database.go:219` - Migration exécutée sans rollback si erreur - Impact: DB peut être dans état incohérent - Fix: Exécuter migrations dans transaction, rollback si erreur - Effort: M (4h) **UUID Migration**: - ✅ Migration depuis int64 vers UUID complétée - ✅ Fichiers backup présents (`.backup-pre-uuid-migration/`) - à nettoyer **Compatibilité**: - ⚠️ **P2-ROBUSTNESS**: Pas de versioning API (toutes routes `/api/v1/*`) - Impact: Breaking changes difficiles - Fix: Prévoir versioning pour futures versions --- # PHASE E — PERFORMANCE & SCALABILITÉ ## E.1 Hotspots **Allocations**: - ⚠️ **P2-PERFORMANCE**: Copies de slices/strings dans certains handlers (audit nécessaire) - ⚠️ **P2-PERFORMANCE**: JSON marshalling peut être optimisé (streaming pour grandes réponses) **N+1 Queries**: - ⚠️ **P1-PERFORMANCE**: Risque N+1 dans `ListTracks()` si relations chargées - Fichier: `internal/core/track/service.go` - À auditer - Impact: Performance dégradée, charge DB excessive - Fix: Ajouter `Preload("User")` ou joins SQL - Effort: M (6h) **Locks**: - ⚠️ **P2-PERFORMANCE**: Pas de locks identifiés (audit nécessaire pour concurrence) ## E.2 Streaming **Buffering**: - ✅ Chunked Upload: Implémenté (`TrackChunkService`) - ✅ Redis Cache: Utilisé pour chunks (si Redis enabled) **ffmpeg Pipeline**: - ⚠️ **P2-PERFORMANCE**: Pas d'implémentation ffmpeg dans backend (délégué à Stream Server) **IO**: - ⚠️ **P2-PERFORMANCE**: File I/O synchrone (peut bloquer goroutines) - Fix: File I/O asynchrone (goroutines pour uploads) - Effort: M (4h) ## E.3 Go-Specific Issues **Goroutine Leaks**: - ✅ **RÉSOLU**: Timeout middleware fixé (MOD-P1-007) - Fichier: `internal/middleware/timeout.go:24-27` - Context cancellation + cleanup **Context Propagation**: - ✅ Context: Propagé dans handlers → services → repositories - ⚠️ **P2-PERFORMANCE**: Pas toujours utilisé pour timeouts DB **DB Pool Misuse**: - ✅ Pool Configuré: MaxOpenConns, MaxIdleConns configurés - ⚠️ **P2-PERFORMANCE**: Pas de métriques pool pour monitoring --- # PHASE F — LISTE EXHAUSTIVE DES PROBLÈMES PRIORISÉS ## Définition des Priorités - **P0**: Faille sécurité exploitable / perte de données / crash prod / corruption / auth bypass / build cassé - **P1**: Bugs fréquents / dette bloquante / erreurs de contrat inter-modules / manque de tests critiques - **P2**: Qualité, maintenabilité, perf non critique, DX - **P3**: Cosmétique, refactors non urgents ## P0 — CRITIQUE (Sécurité / Crash / Corruption) ### MOD-P0-001: CORS Strict Mode en Production - **ID**: `MOD-P0-001` - **Titre**: CORS strict mode si `CORS_ALLOWED_ORIGINS` vide en production - **Impact**: Service inaccessible depuis frontend si config manquante - **Preuve**: `internal/api/router.go:72-74` - Warning loggé mais service démarre - **Cause**: CORS middleware appliqué avec liste vide (strict mode) - **Fix Minimal**: Fail-fast au démarrage si `CORS_ALLOWED_ORIGINS` vide en production - **Plan Validation**: Démarrer avec `APP_ENV=production CORS_ALLOWED_ORIGINS=""` → doit échouer - **Effet de Bord**: Service ne démarre pas si config manquante (acceptable) - **Effort**: S (1h) ### MOD-P0-002: Secrets dans Logs si DEBUG - **ID**: `MOD-P0-002` - **Titre**: `LOG_LEVEL=DEBUG` en production peut exposer secrets - **Impact**: Fuite de données sensibles - **Preuve**: `internal/config/config.go:651` - Validation interdit DEBUG en prod, mais si contourné - **Cause**: Logs DEBUG peuvent contenir config complète - **Fix Minimal**: Ajouter redaction automatique secrets dans logs DEBUG - **Plan Validation**: Démarrer avec `LOG_LEVEL=DEBUG`, vérifier logs → secrets masqués - **Effet de Bord**: Debugging plus difficile (acceptable) - **Effort**: S (2h) ### MOD-P0-003: Dockerfile Production Chemin Incorrect - **ID**: `MOD-P0-003` - **Titre**: `Dockerfile.production` référence `./main.go` au lieu de `./cmd/api/main.go` - **Impact**: Build échoue si utilisé - **Preuve**: `Dockerfile.production:30` - `./main.go` n'existe pas - **Cause**: Chemin incorrect - **Fix Minimal**: Corriger chemin vers `./cmd/api/main.go` - **Plan Validation**: `docker build -f Dockerfile.production .` → doit build - **Effet de Bord**: Aucun - **Effort**: S (5min) ## P1 — MAJEUR (Bugs / Dette / Tests) ### MOD-P1-001: Tests d'Intégration Échouent - **ID**: `MOD-P1-001` - **Titre**: Tests d'intégration échouent avec testcontainers PostgreSQL - **Impact**: Tests d'intégration non fiables - **Preuve**: `tests/transactions/social_transaction_test.go:23` - erreur testcontainers - **Cause**: Testcontainers PostgreSQL ne démarre pas correctement - **Fix Minimal**: Vérifier configuration testcontainers, ajouter retry/backoff - **Plan Validation**: `go test ./tests/transactions -v` → doit passer - **Effet de Bord**: Tests peuvent être plus lents - **Effort**: M (4h) ### MOD-P1-002: Pas de Rollback Automatique Migrations - **ID**: `MOD-P1-002` - **Titre**: Pas de rollback automatique si migration échoue - **Impact**: DB peut être dans état incohérent - **Preuve**: `internal/database/database.go:219` - Migration exécutée sans rollback - **Cause**: Migrations SQL exécutées directement sans transaction - **Fix Minimal**: Exécuter migrations dans transaction, rollback si erreur - **Plan Validation**: Créer migration invalide, démarrer → doit rollback - **Effet de Bord**: Aucun (sécurité) - **Effort**: M (4h) ### MOD-P1-003: Risque N+1 Queries - **ID**: `MOD-P1-003` - **Titre**: Risque N+1 queries dans certains handlers - **Impact**: Performance dégradée, charge DB excessive - **Preuve**: Audit nécessaire, exemples probables: `/api/v1/tracks` charge user pour chaque track - **Cause**: Pas de `Preload()` GORM ou joins dans certains handlers - **Fix Minimal**: Auditer handlers, ajouter `Preload("User")` ou joins SQL - **Plan Validation**: Requête `/api/v1/tracks` avec 100 tracks → doit faire < 5 queries DB - **Effet de Bord**: Aucun (optimisation) - **Effort**: M (6h) ### MOD-P1-004: Pas de Timeout Context dans Tous Handlers - **ID**: `MOD-P1-004` - **Titre**: Pas de timeout context dans tous les handlers - **Impact**: Handlers peuvent bloquer indéfiniment - **Preuve**: Audit nécessaire, certains handlers peuvent ne pas avoir timeout - **Cause**: Pas de timeout context systématique - **Fix Minimal**: Ajouter `context.WithTimeout()` dans tous handlers (30s) - **Plan Validation**: Handler avec DB lente → doit timeout après 30s - **Effet de Bord**: Requêtes lentes seront annulées (comportement attendu) - **Effort**: M (4h) ### MOD-P1-005: Stack Traces dans Logs Prod - **ID**: `MOD-P1-005` - **Titre**: Stack traces dans logs peuvent exposer info sensible - **Impact**: Info sensible dans logs prod - **Preuve**: `internal/middleware/error_handler.go:145` - `zap.ByteString("stack_trace", debug.Stack())` - **Cause**: Stack traces toujours loggés même en prod - **Fix Minimal**: Logger stack traces seulement si `LOG_LEVEL=DEBUG` ou `APP_ENV=development` - **Plan Validation**: Démarrer en prod, déclencher erreur → logs ne doivent pas contenir stack trace - **Effet de Bord**: Debugging plus difficile en prod (utiliser Sentry) - **Effort**: S (1h) ### MOD-P1-006: /readyz Échoue si Redis/RabbitMQ Down - **ID**: `MOD-P1-006` - **Titre**: `/readyz` peut échouer si Redis/RabbitMQ down (même en dev) - **Impact**: Service marqué "not ready" même si DB OK - **Preuve**: `internal/handlers/health.go:143-159` - **Cause**: Health check strict pour tous services - **Fix Minimal**: Tolérance en non-prod, ou marquer service comme "degraded" au lieu de "not ready" - **Plan Validation**: Démarrer sans Redis, `/readyz` → doit retourner 200 ou 503 avec status "degraded" - **Effet de Bord**: Service peut être marqué "degraded" au lieu de "ready" - **Effort**: S (1h) ## P2 — MOYEN (Qualité / Maintenabilité / Perf Non Critique) ### MOD-P2-001: 25+ TODOs/FIXMEs dans Code - **ID**: `MOD-P2-001` - **Titre**: 25+ occurrences de TODO/FIXME/HACK/XXX dans code - **Impact**: Dette technique, code incomplet - **Preuve**: `grep -r "TODO|FIXME|HACK|XXX" --include="*.go"` → 25+ - **Cause**: Code en développement, TODOs non résolus - **Fix Minimal**: Auditer tous TODOs, prioriser, résoudre ou créer tickets - **Plan Validation**: Liste TODOs documentée, tickets créés - **Effet de Bord**: Aucun - **Effort**: M (4h) ### MOD-P2-002: 2 Points d'Entrée Créent Confusion - **ID**: `MOD-P2-002` - **Titre**: 2 points d'entrée (`cmd/api/main.go`, `cmd/modern-server/main.go`) - **Impact**: Développeurs peuvent utiliser le mauvais point d'entrée - **Preuve**: `cmd/api/main.go`, `cmd/modern-server/main.go` - **Cause**: Migration/refactoring partiel - **Fix Minimal**: Documenter ou supprimer `cmd/modern-server/main.go` - **Plan Validation**: Vérifier que seul `cmd/api/main.go` est utilisé - **Effet de Bord**: Aucun - **Effort**: S (1h) ### MOD-P2-003: Gestion Erreurs Incohérente - **ID**: `MOD-P2-003` - **Titre**: Certains handlers retournent `gin.H{"error": "..."}` au lieu de `AppError` - **Impact**: Incohérence format erreur - **Preuve**: Audit nécessaire, certains handlers - **Cause**: Migration partielle vers `AppError` - **Fix Minimal**: Refactoriser tous handlers pour utiliser `AppError` - **Plan Validation**: Tous handlers retournent `AppError` - **Effet de Bord**: Aucun - **Effort**: M (6h) ### MOD-P2-004: Métriques DB Pool Manquantes - **ID**: `MOD-P2-004` - **Titre**: Métriques DB pool pas exposées (connections, wait time) - **Impact**: Monitoring limité - **Preuve**: Pas de métriques pool dans `/api/v1/metrics` - **Cause**: Métriques non implémentées - **Fix Minimal**: Exposer métriques `database/sql` stats - **Plan Validation**: `/api/v1/metrics` contient métriques pool - **Effet de Bord**: Aucun - **Effort**: S (1h) ### MOD-P2-005: Headers Sécurité Manquants - **ID**: `MOD-P2-005` - **Titre**: Headers sécurité manquants (HSTS, CSP, X-Frame-Options, etc.) - **Impact**: Sécurité renforcée manquante - **Preuve**: Pas de middleware sécurité avec headers - **Cause**: Headers non implémentés - **Fix Minimal**: Ajouter middleware sécurité avec headers recommandés - **Plan Validation**: Headers présents dans réponses HTTP - **Effet de Bord**: Aucun - **Effort**: S (2h) ### MOD-P2-006: Pas de Retry sur Requêtes HTTP Externes - **ID**: `MOD-P2-006` - **Titre**: Pas de retry sur requêtes HTTP externes (Chat Server, Stream Server) - **Impact**: Échecs temporaires non récupérés - **Preuve**: Pas de retry dans `internal/services/stream_service.go` - **Cause**: Retry non implémenté - **Fix Minimal**: Ajouter retry avec backoff exponentiel - **Plan Validation**: Requête avec service down → doit retry 3 fois - **Effet de Bord**: Latence augmentée en cas d'échec - **Effort**: M (3h) ### MOD-P2-007: Pas de Circuit Breakers - **ID**: `MOD-P2-007` - **Titre**: Pas de circuit breakers implémentés - **Impact**: Service peut être surchargé si dépendances lentes - **Preuve**: Pas de circuit breakers dans code - **Cause**: Circuit breakers non implémentés - **Fix Minimal**: Intégrer `sony/gobreaker` ou similaire - **Plan Validation**: Service lent → circuit breaker s'ouvre après seuil - **Effet de Bord**: Service peut rejeter requêtes si dépendance down - **Effort**: M (4h) ### MOD-P2-008: File I/O Synchrone - **ID**: `MOD-P2-008` - **Titre**: File I/O synchrone (peut bloquer goroutines) - **Impact**: Performance dégradée sur uploads - **Preuve**: File I/O dans handlers sans goroutines - **Cause**: I/O synchrone - **Fix Minimal**: File I/O asynchrone (goroutines pour uploads) - **Plan Validation**: Uploads ne bloquent pas autres requêtes - **Effet de Bord**: Aucun - **Effort**: M (4h) ### MOD-P2-009: Pas de Versioning API - **ID**: `MOD-P2-009` - **Titre**: Pas de versioning API (toutes routes `/api/v1/*`) - **Impact**: Breaking changes difficiles - **Preuve**: Toutes routes dans `/api/v1` - **Cause**: Versioning non prévu - **Fix Minimal**: Prévoir versioning pour futures versions - **Plan Validation**: Documentation versioning - **Effet de Bord**: Aucun (planification) - **Effort**: S (2h) ### MOD-P2-010: Couverture Tests Non Mesurée - **ID**: `MOD-P2-010` - **Titre**: Couverture tests non mesurée systématiquement - **Impact**: Qualité tests inconnue - **Preuve**: Pas de métrique couverture dans CI/CD - **Cause**: Couverture non intégrée - **Fix Minimal**: Ajouter `make test-coverage` dans CI/CD - **Plan Validation**: CI/CD affiche couverture - **Effet de Bord**: Aucun - **Effort**: S (1h) ## P3 — MINEUR (Cosmétique / Refactors Non Urgents) ### MOD-P3-001: Fichiers Backup UUID Migration - **ID**: `MOD-P3-001` - **Titre**: Fichiers backup UUID migration présents (`.backup-pre-uuid-migration/`) - **Impact**: Confusion, code mort - **Preuve**: `internal/models/.backup-pre-uuid-migration/`, `internal/services/.backup-pre-uuid-migration/` - **Cause**: Backup non supprimé après migration - **Fix Minimal**: Supprimer fichiers backup si migration complétée - **Plan Validation**: Fichiers backup supprimés - **Effet de Bord**: Aucun - **Effort**: S (5min) ### MOD-P3-002: Code Mort (simple_main.go) - **ID**: `MOD-P3-002` - **Titre**: `cmd/simple_main.go` présent mais non utilisé - **Impact**: Confusion - **Preuve**: `cmd/simple_main.go` existe - **Cause**: Code de test/demo non supprimé - **Fix Minimal**: Supprimer si non utilisé - **Plan Validation**: Fichier supprimé - **Effet de Bord**: Aucun - **Effort**: S (5min) --- # PHASE G — PLAN D'EXÉCUTION ## Checklist P0 (Ordre Strict) 1. ✅ **MOD-P0-003**: Corriger `Dockerfile.production` chemin (5min) 2. ⚠️ **MOD-P0-001**: CORS strict mode - Fail-fast ou documenter (1h) 3. ⚠️ **MOD-P0-002**: Redaction secrets dans logs DEBUG (2h) **Total P0**: ~3h ## Checklist P1 (Par Lots Cohérents) ### Lot 1: Tests & Robustesse (8h) 1. **MOD-P1-001**: Fix tests d'intégration testcontainers (4h) 2. **MOD-P1-002**: Rollback automatique migrations (4h) ### Lot 2: Performance & Timeouts (10h) 3. **MOD-P1-003**: Fix N+1 queries (6h) 4. **MOD-P1-004**: Timeout context dans tous handlers (4h) ### Lot 3: Observabilité (2h) 5. **MOD-P1-005**: Stack traces conditionnels (1h) 6. **MOD-P1-006**: /readyz tolérance Redis/RabbitMQ (1h) **Total P1**: ~20h ## Quick Wins (≤ 1h chacun) 1. **MOD-P0-003**: Dockerfile production chemin (5min) 2. **MOD-P1-005**: Stack traces conditionnels (1h) 3. **MOD-P1-006**: /readyz tolérance (1h) 4. **MOD-P2-004**: Métriques DB pool (1h) 5. **MOD-P2-010**: Couverture tests CI/CD (1h) 6. **MOD-P3-001**: Supprimer fichiers backup UUID (5min) 7. **MOD-P3-002**: Supprimer simple_main.go (5min) **Total Quick Wins**: ~5h ## Tests à Ajouter en Priorité 1. **Tests E2E**: Scénarios complets (auth → upload → playlist) 2. **Tests de Charge**: k6 scripts (présents mais non exécutés) 3. **Tests Race Conditions**: `go test -race ./...` dans CI/CD 4. **Tests Sécurité**: Injection SQL, XSS, path traversal ## PR Plan (Découpe en PRs Petites) ### PR 1: Fix P0 Critiques (3h) - MOD-P0-003: Dockerfile production - MOD-P0-001: CORS strict mode - MOD-P0-002: Redaction secrets **Titre**: `fix(security): P0 security fixes (CORS, secrets, Dockerfile)` ### PR 2: Fix Tests Intégration (4h) - MOD-P1-001: Tests d'intégration testcontainers **Titre**: `fix(tests): Fix testcontainers PostgreSQL integration tests` ### PR 3: Robustesse Migrations (4h) - MOD-P1-002: Rollback automatique migrations **Titre**: `feat(db): Add automatic rollback for failed migrations` ### PR 4: Performance N+1 Queries (6h) - MOD-P1-003: Fix N+1 queries **Titre**: `perf(db): Fix N+1 queries in track and playlist handlers` ### PR 5: Timeouts & Observabilité (6h) - MOD-P1-004: Timeout context handlers - MOD-P1-005: Stack traces conditionnels - MOD-P1-006: /readyz tolérance **Titre**: `feat(robustness): Add timeouts and improve observability` ### PR 6: Quick Wins (5h) - MOD-P2-004: Métriques DB pool - MOD-P2-010: Couverture tests CI/CD - MOD-P3-001: Supprimer fichiers backup - MOD-P3-002: Supprimer simple_main.go **Titre**: `chore: Quick wins (metrics, coverage, cleanup)` ### PR 7: P2 Améliorations (15h) - MOD-P2-001: TODOs audit - MOD-P2-002: Points d'entrée - MOD-P2-003: Gestion erreurs - MOD-P2-005: Headers sécurité - MOD-P2-006: Retry HTTP externes - MOD-P2-007: Circuit breakers - MOD-P2-008: File I/O asynchrone - MOD-P2-009: Versioning API **Titre**: `feat: P2 improvements (error handling, security headers, retries, circuit breakers)` --- # BONUS — SPÉCIFICITÉS GO ## Go-Specific Findings **Context Propagation**: - ✅ Context propagé dans handlers → services → repositories - ⚠️ Pas toujours utilisé pour timeouts DB **Goroutines**: - ✅ Timeout middleware fixé (pas de leak) - ⚠️ À vérifier: autres goroutines sans cleanup **Error Wrapping**: - ✅ `fmt.Errorf("...: %w", err)` utilisé - ✅ `errors.Is()` / `errors.As()` supporté **Database**: - ✅ GORM utilisé (ORM) - ✅ Raw SQL paramétrisé (`$1, $2, ...`) - ✅ Pool configuré correctement **Testing**: - ✅ `testify/assert` utilisé - ✅ Testcontainers pour intégration - ⚠️ Tests d'intégration échouent (à fixer) --- # CONCLUSION ## Résumé Exécutif Le module `veza-backend-api` est **globalement en bon état** avec une architecture solide, une sécurité renforcée (JWT strict, ClamAV, RBAC), et une observabilité correcte (structured logging, Prometheus, Sentry). **Points Forts**: - ✅ Sécurité: JWT validation stricte, CORS configuré, ClamAV intégré - ✅ Observabilité: Logging structuré, metrics, healthchecks - ✅ Architecture: Structure claire, séparation des responsabilités - ✅ Tests: 229 fichiers de tests (34% ratio) **Points d'Amélioration**: - ⚠️ Tests d'intégration échouent (testcontainers) - ⚠️ Risque N+1 queries dans certains handlers - ⚠️ Timeouts partiels dans handlers - ⚠️ 25+ TODOs/FIXMEs dans code **Priorités**: 1. **P0**: 3 items (~3h) - Sécurité critique 2. **P1**: 6 items (~20h) - Bugs, robustesse, performance 3. **P2**: 10 items (~30h) - Qualité, maintenabilité 4. **P3**: 2 items (~10min) - Nettoyage **Effort Total Estimé**: ~53h (P0+P1+P2) ## Recommandations 1. **Immédiat**: Fixer P0 items (sécurité) 2. **Court terme**: Fixer P1 items (tests, robustesse, performance) 3. **Moyen terme**: Traiter P2 items (qualité, maintenabilité) 4. **Long terme**: Planifier versioning API, circuit breakers, retries --- **Fin du Rapport**