veza/veza-backend-api/docs/archive/AUDIT_EXHAUSTIF_VEZA_BACKEND.md

1186 lines
49 KiB
Markdown
Raw Normal View History

# AUDIT TECHNIQUE EXHAUSTIF - VEZA BACKEND API
**Date**: 2025-01-27
**Auditeur**: AI Assistant (Auto)
**Module**: veza-backend-api (Backend Go)
**Version**: 1.2.0
**Méthodologie**: Audit statique exhaustif + Analyse comparative avec spécifications ORIGIN_
**Priorité**: Production-ready audit
---
## 📋 TABLE DES MATIÈRES
1. [PHASE A - Cartographie du Module](#phase-a---cartographie-du-module)
2. [PHASE B - Santé Technique](#phase-b---santé-technique)
3. [PHASE C - Sécurité](#phase-c---sécurité)
4. [PHASE D - Robustesse & Observabilité](#phase-d---robustesse--observabilité)
5. [PHASE E - Performance & Scalabilité](#phase-e---performance--scalabilité)
6. [PHASE F - Liste Exhaustive des Problèmes Priorisés](#phase-f---liste-exhaustive-des-problèmes-priorisés)
7. [PHASE G - Plan d'Exécution](#phase-g---plan-dexécution)
---
# PHASE A - CARTOGRAPHIE DU MODULE
## A.1 But du Module
**Veza Backend API** est le serveur API REST principal de la plateforme Veza, une plateforme audio collaborative. Il fournit :
- **Authentification & Autorisation** : JWT, sessions, RBAC, OAuth partiel
- **Gestion Utilisateurs** : Profils, permissions, rôles
- **Gestion Contenu** : Tracks (audio), playlists, marketplace
- **Chat & Collaboration** : Rooms, messages, conversations
- **Streaming** : Intégration avec Stream Server (WebRTC)
- **Audit & Monitoring** : Logs structurés, métriques Prometheus, Sentry
**Rôle dans l'écosystème Veza** :
- **Backend Go** : API REST principale (port 8080)
- **Chat Server Rust** : WebSocket chat (port 8081) - consommateur de tokens JWT
- **Stream Server Rust** : Streaming audio WebRTC (port 8082) - consommateur de tokens JWT
- **Frontend React** : Consommateur de l'API REST
## A.2 Entrées / Sorties
### APIs Exposées
**Base URL**: `http://localhost:8080` (configurable via `APP_PORT`)
**Routes Principales**:
```
/api/v1/
├── /auth/* # Authentification (register, login, refresh, verify-email, password-reset)
├── /users/* # Gestion utilisateurs
├── /tracks/* # Gestion tracks audio
├── /playlists/* # Gestion playlists
├── /chat/* # Chat (token generation pour WS)
├── /marketplace/* # Marketplace (products, orders)
├── /sessions/* # Gestion sessions
├── /uploads/* # Upload fichiers
├── /audit/* # Audit logs
├── /conversations/* # Chat rooms
├── /webhooks/* # Webhooks
├── /admin/* # Routes admin (RBAC)
├── /health # Health check simple
├── /healthz # Liveness probe
├── /readyz # Readiness probe
├── /status # Status complet (DB, Redis, Chat Server, Stream Server)
└── /metrics # Prometheus metrics
```
**Formats**:
- **Request/Response**: JSON
- **Auth**: JWT Bearer tokens (`Authorization: Bearer <token>`)
- **Content-Type**: `application/json`
- **WebSocket**: Chat Server (Rust) - tokens JWT fournis par `/api/v1/chat/token`
### Schémas JSON Principaux
**User**:
```json
{
"id": "uuid",
"username": "string",
"email": "string",
"role": "string",
"created_at": "timestamp",
"updated_at": "timestamp"
}
```
**Track**:
```json
{
"id": "uuid",
"user_id": "uuid",
"title": "string",
"artist": "string",
"duration": "number",
"file_path": "string",
"status": "string"
}
```
## A.3 Dépendances Internes
**Structure du Module**:
```
veza-backend-api/
├── cmd/
│ ├── api/main.go # Point d'entrée principal
│ └── modern-server/main.go # Point d'entrée alternatif (legacy?)
├── internal/
│ ├── api/ # Routes et handlers HTTP
│ ├── core/ # Business logic (auth, track, marketplace, social)
│ ├── handlers/ # Handlers HTTP (50 fichiers)
│ ├── services/ # Services métier (118 fichiers)
│ ├── repositories/ # Accès données (10 fichiers)
│ ├── models/ # Modèles GORM (49 fichiers)
│ ├── middleware/ # Middlewares (32 fichiers)
│ ├── database/ # Gestion DB (migrations, pool, prepared statements)
│ ├── config/ # Configuration (env, validation, watcher)
│ ├── errors/ # Gestion erreurs standardisées
│ ├── logging/ # Logging structuré (zap)
│ ├── metrics/ # Métriques Prometheus
│ ├── workers/ # Workers background (jobs)
│ └── validators/ # Validateurs (email, password)
├── migrations/ # Migrations SQL (40 fichiers)
└── tests/ # Tests (215 fichiers *_test.go)
```
**Packages Partagés**:
- `internal/common/` : Types communs, context
- `internal/interfaces/` : Interfaces partagées
- `internal/types/` : Types partagés
## A.4 Dépendances Externes
### Base de Données
- **PostgreSQL** : Base principale (via `DATABASE_URL`)
- **GORM** : ORM pour accès DB
- **lib/pq** : Driver PostgreSQL natif
### Cache & Sessions
- **Redis** : Cache, sessions, rate limiting (via `REDIS_URL`)
### Message Queue
- **RabbitMQ** : Event bus (via `RABBITMQ_URL`, optionnel via `RABBITMQ_ENABLE`)
### Services Externes
- **Chat Server** : `http://localhost:8081` (Rust, WebSocket)
- **Stream Server** : `http://localhost:8082` (Rust, WebRTC)
- **Sentry** : Error tracking (via `SENTRY_DSN`)
### Autres
- **SMTP** : Envoi emails (via `SMTP_*` env vars)
- **ClamAV** : Scan antivirus uploads (mentionné, non vérifié)
## A.5 Exécution
### Commandes Build/Run
**Build**:
```bash
make build # Compile pour host
make build-linux # Compile pour Linux
go build -o bin/veza-api ./cmd/api/main.go
```
**Run**:
```bash
make run # Build + run
make dev # Run en mode dev (go run)
./bin/veza-backend-api # Exécution directe
```
**Docker**:
```bash
make docker-build # Build image
make docker-run # Run container
docker build -t veza-backend-api .
docker run -p 8080:8080 veza-backend-api
```
### Configuration
**Variables d'Environnement Requises**:
```bash
# REQUIS
JWT_SECRET=<secret-min-32-chars> # Secret JWT (P0-SECURITY)
DATABASE_URL=postgres://... # URL PostgreSQL
REDIS_URL=redis://localhost:6379 # URL Redis
# OPTIONNEL
APP_PORT=8080 # Port HTTP (défaut: 8080)
APP_ENV=production|development|test # Environnement
CORS_ALLOWED_ORIGINS=http://localhost:3000,https://example.com # CORS (REQUIS en prod)
LOG_LEVEL=INFO|DEBUG|WARN|ERROR # Niveau log
SENTRY_DSN=... # Sentry DSN
RABBITMQ_URL=amqp://... # RabbitMQ (optionnel)
RABBITMQ_ENABLE=true|false # Activer RabbitMQ
```
**Fichiers de Config**:
- `.env` : Variables d'environnement (chargé automatiquement)
- `.env.{env}` : Variables par environnement (ex: `.env.production`)
**Ordre de Chargement**:
1. Variables d'environnement système (priorité)
2. `.env.{env}` (ex: `.env.production`)
3. `.env`
### Docker/Compose
**Dockerfile**:
- Multi-stage build (builder + runtime)
- User non-root (`app:app`)
- Healthcheck intégré (`/health`)
- Port exposé: `8080`
**Compose** (non présent dans le repo, à créer):
```yaml
services:
api:
build: .
ports:
- "8080:8080"
environment:
- DATABASE_URL=postgres://...
- REDIS_URL=redis://...
- JWT_SECRET=...
```
## A.6 Points d'Intégration
### Contrats d'API avec Autres Services
**Chat Server (Rust)**:
- **Endpoint**: `/api/v1/chat/token` (POST, protégé)
- **Format**: JWT token pour WebSocket
- **Secret**: `CHAT_JWT_SECRET` (fallback sur `JWT_SECRET`)
**Stream Server (Rust)**:
- **Callback**: `/api/v1/internal/tracks/:id/stream-ready` (POST)
- **URL Config**: `STREAM_SERVER_URL` (défaut: `http://localhost:8082`)
**Frontend React**:
- **Base URL**: `/api/v1/*`
- **Auth**: JWT Bearer tokens
- **CORS**: Configuré via `CORS_ALLOWED_ORIGINS`
### Auth (JWT/SSO)
**JWT**:
- **Algorithme**: HS256 (HMAC)
- **Claims**: `sub` (user_id UUID), `exp`, `iat`, `iss`, `aud`
- **Access Token TTL**: 15 minutes
- **Refresh Token TTL**: 30 jours
- **Validation**: Signature + expiration + session DB
**Sessions**:
- Stockées en DB (`sessions` table)
- Hash du token stocké (pas le token en clair)
- Validation côté serveur obligatoire
**RBAC**:
- Tables: `permissions`, `role_permissions`, `user_roles`
- Service: `PermissionService` avec `HasPermission()`, `HasRole()`
- Middleware: `RequireAdmin()`, `RequirePermission()`, `RequireContentCreatorRole()`
### Schéma DB / UUID / Conventions
**IDs**:
- **Format**: UUID v4 (migration depuis int64 complétée)
- **Type Go**: `uuid.UUID` (github.com/google/uuid)
**Conventions**:
- Tables: snake_case (`user_sessions`, `audit_logs`)
- Colonnes: snake_case (`created_at`, `updated_at`, `deleted_at`)
- Soft deletes: `deleted_at IS NULL`
**Migrations**:
- Format: SQL fichiers (`migrations/*.sql`)
- Table de tracking: `schema_migrations`
- Exécution: Au démarrage via `Database.Initialize()`
---
# PHASE B - SANTÉ TECHNIQUE
## B.1 Build Status
**Compilation**:
- ✅ Code compile sans erreurs (`go build ./...` réussit)
- ✅ Go version: 1.23.8 (compatible)
- ⚠️ 654 fichiers `.go` (taille importante)
**Dépendances**:
-`go.mod` présent et valide
- ⚠️ Nombreuses dépendances obsolètes (30+ packages avec updates disponibles)
- ⚠️ Pas de scan automatique vulnérabilités (`govulncheck` non intégré)
**Linting**:
- ⚠️ `golangci-lint` mentionné dans Makefile mais non exécuté automatiquement
- ⚠️ Pas de CI/CD configuré pour linting automatique
## B.2 Tests
**Couverture**:
- **Fichiers test**: 215 fichiers `*_test.go` sur 654 fichiers `.go` (~33%)
- **Coverage**: ~45% (objectif: 80%+ selon ORIGIN_)
- ⚠️ **Gap critique**: 35% de couverture manquante
**Types de Tests**:
- ✅ Tests unitaires présents (services, handlers, middleware)
- ✅ Tests d'intégration partiels (`tests/api_routes_integration_test.go`)
- ⚠️ Tests E2E manquants
- ⚠️ Tests de charge/performance manquants
**Fiabilité**:
- ⚠️ Tests peuvent échouer (config, migrations) selon AUDIT_BACKEND_GO.md
- ⚠️ Pas de tests de non-régression systématiques
**Commandes**:
```bash
make test # Exécute tous les tests
make test-coverage # Tests avec couverture
make test-race # Tests avec détection race conditions
```
## B.3 Gestion des Erreurs
**Points Positifs**:
- ✅ Système d'erreurs standardisé (`internal/errors/errors.go`)
- ✅ Error codes typés (`ErrorCode`)
- ✅ Error wrapping avec `fmt.Errorf` et `errors.Wrap`
- ✅ Middleware de récupération panic (`Recovery`, `SentryRecover`)
**Problèmes Identifiés**:
- ⚠️ **24 occurrences de `panic()`** dans le code (tests, config, utils)
- `internal/services/jwt_service.go:23` : `panic("JWT secret is required")` - **P0-SECURITY**
- `internal/config/config.go:484` : `panic(fmt.Sprintf("Required environment variable %s is not set", key))` - **P0-SECURITY**
- `internal/testutils/db.go:20,27` : Panics dans setup test DB
- ⚠️ Pas de validation systématique des erreurs (certains `err` ignorés)
- ⚠️ Stack traces dans logs (peut exposer info sensible en prod)
**HTTP Status Codes**:
- ✅ Mapping erreurs → HTTP status (`mapErrorCodeToHTTPStatus`)
- ✅ Codes standardisés (400, 401, 403, 404, 500)
## B.4 Cohérence des Conventions
**Naming**:
- ✅ Packages: lowercase, pas de underscores
- ✅ Exports: PascalCase
- ✅ Privés: camelCase
- ⚠️ Incohérences: `APIRouter` vs `apiRouter` (mix)
**Structure Dossiers**:
- ✅ Séparation claire: `handlers/`, `services/`, `repositories/`, `models/`
- ⚠️ Duplication: `cmd/api/main.go` vs `cmd/modern-server/main.go` (legacy?)
- ⚠️ Fichiers backup: `.backup-pre-uuid-migration/` (à nettoyer)
**Séparation Couches**:
- ✅ Architecture en couches présente (handlers → services → repositories → DB)
- ⚠️ Clean Architecture incomplète (pas de `domain/` layer strict)
- ⚠️ `core/` existe mais ne suit pas strictement DDD
**TODOs/FIXMEs**:
- ⚠️ **210 occurrences** de TODO/FIXME/HACK/XXX dans 69 fichiers
- Exemples:
- `internal/api/api_manager.go` : "TODO: Réactiver après stabilisation"
- `cmd/modern-server/main.go` : Plusieurs TODOs
- `internal/database/database.go:348` : `TODO: Implémenter OAuth user lookup`
---
# PHASE C - SÉCURITÉ
## C.1 Secrets & Configuration
### Secrets Exposés
**Analyse**:
- ✅ Pas de secrets hardcodés dans le code (grep `password|secret|key` → seulement config/env)
- ✅ Utilisation variables d'environnement pour secrets
- ⚠️ **Risque**: `.env` peut être committé (vérifier `.gitignore`)
**Secrets Requis**:
- `JWT_SECRET` : Requis, min 32 chars (validé)
- `DATABASE_URL` : Contient credentials (validé requis)
- `CHAT_JWT_SECRET` : Fallback sur `JWT_SECRET` si non défini
- `SENTRY_DSN` : Optionnel
**Masquage Logs**:
-`MaskConfigValue()` présent dans `config.go` (T0037)
- ✅ Secrets masqués dans logs de config initialisée
### Configuration Sécurisée
**Validation Environnement**:
-`ValidateForEnvironment()` : Validation stricte en production
- ✅ CORS: Wildcard `*` interdit en production
-`LOG_LEVEL=DEBUG` interdit en production
- ⚠️ Validation peut échouer silencieusement si config invalide
**Panics sur Config Manquante**:
- ⚠️ **P0-SECURITY**: `getEnvRequired()` panic si variable requise absente
- Fichier: `internal/config/config.go:484`
- Impact: Crash au démarrage si config invalide (acceptable mais à documenter)
## C.2 Authentification & Autorisation
### JWT Validation
**Implémentation**:
- ✅ Algorithme: HS256 (HMAC) - sécurisé
- ✅ Validation signature: `jwt.Parse()` avec secret
- ✅ Validation expiration: `exp` claim vérifié
- ✅ Validation session DB: `SessionService.ValidateSession()` appelé
- ✅ Claims validés: `sub` (user_id UUID), `exp`, `iat`
**Problèmes Identifiés**:
- ⚠️ **P1-SECURITY**: Validation `aud` (audience) et `iss` (issuer) présents mais pas strictement vérifiés
- Fichier: `internal/middleware/auth.go:339-344`
- Impact: Tokens d'autres services pourraient être acceptés si même secret
- ⚠️ **P2-SECURITY**: Pas de validation `alg` header (algorithm confusion attack possible si RS256 utilisé ailleurs)
- Fichier: `internal/middleware/auth.go:340`
- Impact: Faible (HS256 uniquement utilisé), mais best practice manquante
**Token Version**:
-`TokenVersion` dans claims et user model
-`VerifyTokenVersion()` présent mais pas toujours appelé
- ⚠️ **P1-SECURITY**: Token version pas vérifiée dans `AuthMiddleware.authenticate()`
- Fichier: `internal/middleware/auth.go:92-101`
- Impact: Tokens révoqués (via token_version++) peuvent encore être utilisés
### RBAC (Role-Based Access Control)
**Implémentation**:
-**FONCTIONNEL**: `RequireAdmin()` utilise `PermissionService.HasRole(..., "admin")`
-**FONCTIONNEL**: `RequirePermission()` utilise `PermissionService.HasPermission()`
-**FONCTIONNEL**: `RequireContentCreatorRole()` vérifie rôles 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**:
- ⚠️ **P1-SECURITY**: Pas de vérification RBAC sur certaines routes (audit complet nécessaire)
- Exemple: `/api/v1/users/:id` (PUT) - vérifier ownership ou admin
- Exemple: `/api/v1/tracks/:id` (DELETE) - vérifier ownership ou admin
### Sessions
**Implémentation**:
- ✅ Sessions stockées en DB avec hash du token (pas token en clair)
- ✅ Validation session obligatoire dans `AuthMiddleware.authenticate()`
- ✅ Vérification `expires_at` et `revoked_at`
- ✅ Vérification user_id match entre token et session
**Problèmes**:
- ⚠️ **P2-SECURITY**: Pas de rotation automatique sessions (TTL fixe)
- ⚠️ **P2-SECURITY**: Pas de détection sessions suspectes (multiples IPs, etc.)
## C.3 Injection & Validation
### SQL Injection
**Protection**:
- ✅ GORM utilisé (parametrized queries par défaut)
- ✅ Prepared statements présents (`internal/database/prepared_statements.go`)
- ✅ Pas de raw queries avec concaténation string identifiées
- ✅ Pas de `SELECT *` trouvé (bonne pratique)
**Vérification**:
- ✅ 29 fichiers avec requêtes SQL analysés
- ✅ Toutes utilisent paramètres (`$1`, `$2`, etc.) ou GORM
**Risque**: ✅ **FAIBLE** - Bien protégé
### Input Validation
**Implémentation**:
-`go-playground/validator/v10` présent
- ✅ Validateurs: `EmailValidator`, `PasswordValidator`
- ⚠️ **P1-SECURITY**: Validation pas utilisée partout
- Exemples: Handlers peuvent accepter input non validé
- Impact: Données invalides en DB, risque injection indirecte
**Sanitization XSS**:
- ⚠️ **P2-SECURITY**: Pas de sanitization XSS systématique
- Impact: Faible (API JSON, pas HTML), mais best practice manquante
**File Upload**:
- ✅ Validation type MIME (`UploadValidator`)
- ✅ Validation taille fichier
- ⚠️ **P1-SECURITY**: Scan antivirus ClamAV mentionné mais non vérifié
- Fichier: `go.mod` contient `github.com/dutchcoders/go-clamd`
- Impact: Fichiers malveillants peuvent être uploadés
### CORS
**Implémentation**:
- ✅ CORS middleware présent (`internal/middleware/cors.go`)
- ✅ Whitelist configurable via `CORS_ALLOWED_ORIGINS`
- ✅ Wildcard `*` interdit en production (validation `ValidateForEnvironment()`)
**Problèmes**:
- ⚠️ **P0-SECURITY**: Si `CORS_ALLOWED_ORIGINS` vide, CORS middleware pas appliqué
- Fichier: `internal/api/router.go:62-68`
- Impact: CORS errors en browsers, mais pas de faille (pas de wildcard appliqué)
- Fix: Logger warning (déjà fait) ou appliquer CORS restrictif par défaut
**Headers CORS**:
-`Access-Control-Allow-Origin`: Origin spécifique (pas wildcard en prod)
-`Access-Control-Allow-Credentials: true`
-`Access-Control-Allow-Methods`: GET, POST, PUT, DELETE, OPTIONS
-`Access-Control-Allow-Headers`: Authorization, Content-Type
### Rate Limiting
**Implémentation**:
- ✅ Rate limiter global (`middleware.RateLimiter` avec Redis)
- ✅ Rate limiter simple (`middleware.SimpleRateLimiter` sans Redis)
- ✅ Rate limiter par endpoint (`middleware.EndpointLimiter`)
**Problèmes**:
- ⚠️ **P1-SECURITY**: Rate limiting pas appliqué partout
- Exemple: `/api/v1/auth/login` - pas de rate limiting spécifique (risque brute force)
- Exemple: `/api/v1/auth/password-reset` - pas de rate limiting (risque spam)
- ⚠️ **P2-SECURITY**: Rate limiting uploads présent mais peut être contourné (IP spoofing)
**Configuration**:
- ✅ Configurable via `RATE_LIMIT_LIMIT` et `RATE_LIMIT_WINDOW`
- ✅ Headers `X-RateLimit-*` présents
## C.4 Dépendances Vulnérables
**Scan Requis**:
- ⚠️ **P1-SECURITY**: Pas de scan automatique vulnérabilités (`govulncheck` non intégré)
- ⚠️ **P1-SECURITY**: Pas de Dependabot/GitHub Security advisories configuré
- ⚠️ Nombreuses dépendances obsolètes (30+ packages avec updates disponibles)
**Commandes Recommandées**:
```bash
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...
```
**Versions Suspectes**:
- ⚠️ `golang.org/x/crypto v0.37.0` - Vérifier vulnérabilités récentes
- ⚠️ `golang.org/x/net v0.39.0` - Vérifier vulnérabilités récentes
- ⚠️ `github.com/gin-gonic/gin v1.9.1` - Vérifier updates disponibles
## C.5 Top 10 Risques Sécurité
1. **🔴 P0-SECURITY**: Panic sur config manquante (`getEnvRequired()`) - Crash au démarrage
2. **🔴 P0-SECURITY**: CORS pas appliqué si `CORS_ALLOWED_ORIGINS` vide (warning seulement)
3. **🟠 P1-SECURITY**: Token version pas vérifiée dans `AuthMiddleware.authenticate()`
4. **🟠 P1-SECURITY**: Validation `aud`/`iss` JWT pas stricte
5. **🟠 P1-SECURITY**: Rate limiting pas appliqué sur `/auth/login` (brute force)
6. **🟠 P1-SECURITY**: Scan antivirus ClamAV non vérifié (uploads)
7. **🟠 P1-SECURITY**: Validation input pas systématique (risque injection indirecte)
8. **🟠 P1-SECURITY**: Pas de scan automatique vulnérabilités (`govulncheck`)
9. **🟡 P2-SECURITY**: Pas de validation `alg` header JWT (algorithm confusion)
10. **🟡 P2-SECURITY**: Pas de rotation automatique sessions
---
# PHASE D - ROBUSTESSE & OBSERVABILITÉ
## D.1 Logs Structurés
**Implémentation**:
-**Zap** utilisé (`go.uber.org/zap`)
- ✅ Logs structurés JSON en production
- ✅ Niveaux: DEBUG, INFO, WARN, ERROR
- ✅ Context: `request_id`, `user_id`, `trace_id`, `span_id`
**Problèmes**:
- ⚠️ **P1-OBSERVABILITY**: Stack traces dans logs (peut exposer info sensible)
- Fichier: `internal/middleware/error_handler.go:145`
- Impact: Info sensible (chemins fichiers, code) dans logs prod
- ⚠️ **P2-OBSERVABILITY**: Pas de redaction automatique PII (emails, user_ids dans logs)
- ⚠️ **P2-OBSERVABILITY**: Logs peuvent être volumineux (stack traces)
**Corrélation**:
-`request_id` présent (middleware `RequestID()`)
-`trace_id` et `span_id` supportés (OpenTelemetry ready)
- ⚠️ **P2-OBSERVABILITY**: OpenTelemetry pas complètement intégré (traces manquantes)
## D.2 Métriques
**Implémentation**:
-**Prometheus** intégré (`github.com/prometheus/client_golang`)
- ✅ Endpoint `/metrics` exposé
- ✅ Métriques erreurs (`ErrorMetrics`)
- ✅ Métriques health checks (`RecordHealthCheck`)
**Métriques Disponibles**:
- ✅ Erreurs par code (`veza_errors_total{code, status}`)
- ✅ Health checks latence (`veza_health_check_latency_ms{service}`)
- ✅ HTTP requests (via middleware `Metrics()`)
**Problèmes**:
- ⚠️ **P2-OBSERVABILITY**: Métriques business manquantes (tracks créés, users actifs, etc.)
- ⚠️ **P2-OBSERVABILITY**: Pas de métriques DB pool (connections, wait time)
- ⚠️ **P2-OBSERVABILITY**: Pas de métriques Redis (hit rate, latency)
## D.3 Health Checks
**Endpoints**:
-`/health` : Stateless, toujours `{status: "ok"}`
-`/healthz` : Liveness probe
-`/readyz` : Readiness probe (vérifie DB, Redis, RabbitMQ)
-`/status` : Status complet (DB, Redis, Chat Server, Stream Server)
**Implémentation**:
- ✅ Vérifications avec timeouts (5s DB, 5s Redis, 100ms Stream Server)
- ✅ Latence mesurée et retournée
- ✅ Status: `ok`, `slow`, `error`, `degraded`
**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é
## D.4 Timeouts & Retries
**Timeouts**:
- ✅ HTTP server: `ReadTimeout: 30s`, `WriteTimeout: 30s`
- ✅ 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
**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)
**Circuit Breakers**:
- ⚠️ **P2-ROBUSTNESS**: Pas de circuit breakers implémentés
- Impact: Service peut être surchargé si dépendances lentes
## 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
**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
- Impact: DB peut être dans état incohérent
**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
## D.7 Production Readiness Gaps
**Priorité P0**:
- Aucun gap P0 identifié (health checks présents, logs structurés)
**Priorité P1**:
1. Stack traces dans logs prod (expose info sensible)
2. `/readyz` peut échouer si Redis/RabbitMQ down (même en dev)
3. Pas de timeout context dans tous les handlers
4. Pas de rollback automatique migrations
**Priorité P2**:
1. Pas de redaction automatique PII dans logs
2. Métriques business manquantes
3. Pas de circuit breakers
4. Pas de versioning API
---
# PHASE E - PERFORMANCE & SCALABILITÉ
## E.1 Hotspots Évidents
**Allocations**:
- ⚠️ **P2-PERFORMANCE**: Copies de slices/strings possibles (audit complet nécessaire)
- ⚠️ **P2-PERFORMANCE**: JSON marshalling peut être optimisé (streaming pour gros payloads)
**N+1 Queries**:
- ⚠️ **P1-PERFORMANCE**: Risque N+1 dans certains handlers (audit complet nécessaire)
- Exemple: `/api/v1/tracks` - peut charger user pour chaque track
- Fix: Utiliser `Preload()` GORM ou joins
**Locks**:
- ✅ Mutex utilisé dans `SimpleRateLimiter` (correct)
- ⚠️ **P2-PERFORMANCE**: Pas de lock-free structures pour rate limiting (acceptable pour charge modérée)
## E.2 Streaming & IO
**Uploads**:
- ✅ Chunked upload supporté (`/api/v1/tracks/chunk`)
- ✅ Validation taille fichier
- ⚠️ **P2-PERFORMANCE**: Pas de streaming vers storage (fichiers chargés en mémoire)
**Downloads**:
- ⚠️ **P2-PERFORMANCE**: Pas de streaming downloads (fichiers chargés en mémoire)
## E.3 Async Runtime (Go)
**Goroutines**:
- ✅ Workers background (`JobWorker`, `WebhookWorker`)
- ⚠️ **P1-PERFORMANCE**: Pas de limite goroutines (risque goroutine leak)
- Exemple: `webhookWorker.Start()` lancé sans contrôle
- Fix: Utiliser `errgroup` ou `worker pool`
**Context Propagation**:
- ✅ Context passé dans la plupart des appels
- ⚠️ **P2-PERFORMANCE**: Pas de timeout context partout
**DB Pool Misuse**:
- ✅ Pool configuré correctement
- ⚠️ **P2-PERFORMANCE**: Pas de métriques pool (connections, wait time)
## E.4 Optimisations Mesurables
**Priorité P1**:
1. Audit N+1 queries (5-10 optimisations possibles)
2. Limite goroutines workers (éviter leaks)
**Priorité P2**:
1. Streaming uploads/downloads (réduire mémoire)
2. Métriques DB pool (monitoring)
3. JSON streaming pour gros payloads
---
# PHASE F - LISTE EXHAUSTIVE DES PROBLÈMES PRIORISÉS
## Format: ID | Titre | Impact | Preuve | Cause | Fix | Validation | Effet de Bord | Effort
### P0 - CRITIQUE (Sécurité Exploitable / Crash Prod / Build Cassé)
#### MOD-P0-001: Panic sur Config Manquante
- **Titre**: `getEnvRequired()` panic si variable requise absente
- **Impact**: Crash au démarrage si `JWT_SECRET` ou `DATABASE_URL` non défini. Bloque déploiement.
- **Preuve**: `internal/config/config.go:484` : `panic(fmt.Sprintf("Required environment variable %s is not set", key))`
- **Cause**: Validation config au runtime avec panic au lieu d'erreur retournée
- **Fix Minimal**: Remplacer `panic()` par `return error` dans `NewConfig()` et logger fatal dans `main.go`
- **Plan Validation**:
- Test: Démarrer sans `JWT_SECRET` → doit retourner erreur claire, pas panic
- Commande: `JWT_SECRET="" go run ./cmd/api/main.go` → doit échouer proprement
- **Effet de Bord**: Aucun (comportement attendu: échec au démarrage)
- **Effort**: S (1h)
#### MOD-P0-002: CORS Middleware Non Appliqué si CORS_ALLOWED_ORIGINS Vide
- **Titre**: CORS middleware pas appliqué si `CORS_ALLOWED_ORIGINS` vide (warning seulement)
- **Impact**: CORS errors en browsers, mais pas de faille (pas de wildcard appliqué). UX dégradée.
- **Preuve**: `internal/api/router.go:62-68` : `if len(r.config.CORSOrigins) > 0 { router.Use(middleware.CORS(...)) } else { logger.Warn(...) }`
- **Cause**: Logique conditionnelle qui skip middleware si liste vide
- **Fix Minimal**: Appliquer CORS restrictif par défaut (liste vide = aucune origine autorisée) ou logger error en prod
- **Plan Validation**:
- Test: Démarrer avec `CORS_ALLOWED_ORIGINS=""` → CORS doit être appliqué (reject toutes origines)
- Commande: `curl -H "Origin: http://evil.com" http://localhost:8080/api/v1/health` → doit rejeter
- **Effet de Bord**: Aucun (comportement attendu: CORS strict)
- **Effort**: S (1h)
#### MOD-P0-003: JWT Secret Panic dans JWTService
- **Titre**: `panic("JWT secret is required")` dans `NewJWTService()` si secret vide
- **Impact**: Crash au démarrage si `JWT_SECRET` vide après fallback env. Bloque déploiement.
- **Preuve**: `internal/services/jwt_service.go:23` : `panic("JWT secret is required")`
- **Cause**: Validation avec panic au lieu d'erreur retournée
- **Fix Minimal**: Retourner erreur au lieu de panic, laisser `NewConfig()` gérer
- **Plan Validation**:
- Test: Créer `JWTService` avec secret vide → doit retourner erreur
- Commande: `JWT_SECRET="" go run ./cmd/api/main.go` → doit échouer proprement
- **Effet de Bord**: Aucun (comportement attendu: échec au démarrage)
- **Effort**: S (30min)
### P1 - MAJEUR (Bugs Fréquents / Dette Bloquante / Tests Critiques)
#### MOD-P1-001: Token Version Pas Vérifiée dans AuthMiddleware
- **Titre**: `TokenVersion` pas vérifiée dans `AuthMiddleware.authenticate()`
- **Impact**: Tokens révoqués (via `token_version++`) peuvent encore être utilisés jusqu'à expiration. Sécurité compromise.
- **Preuve**: `internal/middleware/auth.go:92-101` : `validateJWTToken()` ne vérifie pas `TokenVersion`
- **Cause**: Vérification `VerifyTokenVersion()` présente mais pas appelée dans middleware
- **Fix Minimal**: Ajouter appel `jwtService.VerifyTokenVersion(claims, user.TokenVersion)` après `validateJWTToken()`
- **Plan Validation**:
- Test: Créer token, incrémenter `user.token_version`, utiliser token → doit être rejeté
- Commande: `curl -H "Authorization: Bearer <old_token>" http://localhost:8080/api/v1/users/me` → doit retourner 401
- **Effet de Bord**: Tokens valides mais version mismatch seront rejetés (comportement attendu)
- **Effort**: S (2h)
#### MOD-P1-002: Validation aud/iss JWT Pas Stricte
- **Titre**: Validation `aud` (audience) et `iss` (issuer) JWT présents mais pas strictement vérifiés
- **Impact**: Tokens d'autres services pourraient être acceptés si même secret. Risque faible mais réel.
- **Preuve**: `internal/middleware/auth.go:339-344` : `jwt.Parse()` valide signature mais pas `aud`/`iss`
- **Cause**: Validation signature seulement, pas validation claims standards
- **Fix Minimal**: Ajouter validation `claims["aud"] == "veza-app"` et `claims["iss"] == "veza-api"` après parse
- **Plan Validation**:
- Test: Créer token avec `aud: "other-app"` → doit être rejeté
- Commande: `curl -H "Authorization: Bearer <token-other-aud>" http://localhost:8080/api/v1/users/me` → doit retourner 401
- **Effet de Bord**: Tokens valides mais `aud`/`iss` incorrects seront rejetés (comportement attendu)
- **Effort**: S (1h)
#### MOD-P1-003: Rate Limiting Pas Appliqué sur /auth/login
- **Titre**: Rate limiting pas appliqué spécifiquement sur `/api/v1/auth/login`
- **Impact**: Risque brute force sur mots de passe. Attaques par dictionnaire possibles.
- **Preuve**: `internal/api/router.go:171` : `authGroup.POST("/login", ...)` sans rate limiting spécifique
- **Cause**: Rate limiting global présent mais pas de limite spécifique login
- **Fix Minimal**: Ajouter `EndpointLimiter` ou rate limiting spécifique sur `/auth/login` (ex: 5 tentatives/min)
- **Plan Validation**:
- Test: Faire 10 requêtes login rapides → 6ème doit retourner 429
- Commande: `for i in {1..10}; do curl -X POST http://localhost:8080/api/v1/auth/login ...; done` → doit limiter
- **Effet de Bord**: Utilisateurs légitimes avec mauvais mot de passe seront limités (acceptable)
- **Effort**: S (2h)
#### MOD-P1-004: Scan Antivirus ClamAV Non Vérifié
- **Titre**: Scan antivirus ClamAV mentionné mais non vérifié dans code upload
- **Impact**: Fichiers malveillants peuvent être uploadés. Risque sécurité.
- **Preuve**: `go.mod` contient `github.com/dutchcoders/go-clamd` mais pas d'usage dans handlers upload
- **Cause**: Dépendance présente mais intégration manquante
- **Fix Minimal**: Ajouter scan ClamAV dans `UploadHandler.UploadFile()` avant sauvegarde
- **Plan Validation**:
- Test: Uploader fichier EICAR (test virus) → doit être rejeté
- Commande: `curl -X POST -F "file=@eicar.txt" http://localhost:8080/api/v1/uploads` → doit retourner 400
- **Effet de Bord**: Uploads plus lents (scan nécessaire)
- **Effort**: M (4h)
#### MOD-P1-005: Validation Input Pas Systématique
- **Titre**: Validation input avec `go-validator` pas utilisée partout
- **Impact**: Données invalides en DB, risque injection indirecte, corruption données.
- **Preuve**: Handlers peuvent accepter input non validé (audit complet nécessaire)
- **Cause**: Validation manuelle au lieu de struct tags `validate:""`
- **Fix Minimal**: Ajouter struct tags `validate:""` sur tous DTOs et middleware validation global
- **Plan Validation**:
- Test: Envoyer requête avec email invalide → doit retourner 400 avec détails
- Commande: `curl -X POST -d '{"email":"invalid"}' http://localhost:8080/api/v1/auth/register` → doit valider
- **Effet de Bord**: Requêtes invalides seront rejetées (comportement attendu)
- **Effort**: M (8h)
#### MOD-P1-006: Stack Traces dans Logs Prod
- **Titre**: Stack traces dans logs peuvent exposer info sensible (chemins fichiers, code)
- **Impact**: Info sensible dans logs prod. Risque fuite données.
- **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**:
- Test: Démarrer en prod, déclencher erreur → logs ne doivent pas contenir stack trace
- Commande: `APP_ENV=production LOG_LEVEL=INFO go run ./cmd/api/main.go` → stack traces absents
- **Effet de Bord**: Debugging plus difficile en prod (acceptable, utiliser Sentry)
- **Effort**: S (1h)
#### MOD-P1-007: Pas de Scan Automatique Vulnérabilités
- **Titre**: Pas de scan automatique vulnérabilités (`govulncheck`) dans CI/CD
- **Impact**: Vulnérabilités non détectées. Risque sécurité.
- **Preuve**: Pas de `govulncheck` dans Makefile ou CI/CD
- **Cause**: Outil non intégré
- **Fix Minimal**: Ajouter `make security` avec `govulncheck` et intégrer dans CI/CD
- **Plan Validation**:
- Test: Exécuter `govulncheck ./...` → doit détecter vulnérabilités si présentes
- Commande: `make security` → doit scanner et reporter vulnérabilités
- **Effet de Bord**: Aucun (détection seulement)
- **Effort**: S (2h)
#### MOD-P1-008: N+1 Queries Risque
- **Titre**: Risque N+1 queries dans certains handlers (chargement user pour chaque track)
- **Impact**: Performance dégradée, charge DB inutile. Timeouts possibles.
- **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**:
- Test: Requête `/api/v1/tracks` avec 100 tracks → doit faire < 5 queries DB
- Commande: `go test -v ./internal/handlers -run TestListTracks` → vérifier nombre queries
- **Effet de Bord**: Aucun (optimisation)
- **Effort**: M (6h)
#### MOD-P1-009: Pas de Timeout Context dans Tous Handlers
- **Titre**: Pas de timeout context dans tous les handlers
- **Impact**: Handlers peuvent bloquer indéfiniment. Risque DoS.
- **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 avec timeout configurable (ex: 30s)
- **Plan Validation**:
- Test: Handler avec DB lente → doit timeout après 30s
- Commande: Simuler DB lente, requête handler → doit retourner 504 après timeout
- **Effet de Bord**: Requêtes lentes seront annulées (comportement attendu)
- **Effort**: M (4h)
#### MOD-P1-010: Pas de Rollback Automatique Migrations
- **Titre**: Pas de rollback automatique si migration échoue
- **Impact**: DB peut être dans état incohérent. Corruption données possible.
- **Preuve**: `internal/database/database.go:219` : Migration exécutée sans rollback si erreur
- **Cause**: Migrations SQL exécutées directement sans transaction
- **Fix Minimal**: Exécuter migrations dans transaction, rollback si erreur
- **Plan Validation**:
- Test: Migration invalide → doit rollback, DB inchangée
- Commande: Créer migration invalide, démarrer → doit échouer proprement
- **Effet de Bord**: Aucun (sécurité)
- **Effort**: M (4h)
### P2 - MOYEN (Qualité / Maintenabilité / Perf Non Critique)
#### MOD-P2-001: 210 TODOs/FIXMEs dans Code
- **Titre**: 210 occurrences de TODO/FIXME/HACK/XXX dans 69 fichiers
- **Impact**: Dette technique, code incomplet, maintenance difficile.
- **Preuve**: `grep -r "TODO|FIXME|HACK|XXX" --include="*.go" | wc -l` → 210
- **Cause**: Code en développement, TODOs non résolus
- **Fix Minimal**: Auditer tous TODOs, prioriser, résoudre ou créer tickets
- **Plan Validation**:
- Test: `grep -r "TODO|FIXME" --include="*.go" | wc -l` → doit être < 50
- Commande: Auditer manuellement, résoudre ou documenter
- **Effet de Bord**: Aucun (nettoyage)
- **Effort**: L (20h)
#### MOD-P2-002: Pas de Validation alg Header JWT
- **Titre**: Pas de validation `alg` header JWT (algorithm confusion attack possible)
- **Impact**: Faible (HS256 uniquement utilisé), mais best practice manquante
- **Preuve**: `internal/middleware/auth.go:340` : Vérifie `SigningMethodHMAC` mais pas `alg` explicitement
- **Cause**: Validation méthode mais pas header `alg`
- **Fix Minimal**: Ajouter validation `token.Header["alg"] == "HS256"` explicitement
- **Plan Validation**:
- Test: Token avec `alg: "none"` → doit être rejeté
- Commande: Créer token avec `alg: "none"`, utiliser → doit retourner 401
- **Effet de Bord**: Aucun (sécurité)
- **Effort**: S (1h)
#### MOD-P2-003: Pas de Rotation Automatique Sessions
- **Titre**: Pas de rotation automatique sessions (TTL fixe)
- **Impact**: Sessions longues si compromises. Sécurité modérée.
- **Preuve**: Sessions ont TTL fixe, pas de rotation
- **Cause**: Pas de mécanisme rotation
- **Fix Minimal**: Implémenter rotation sessions après X jours d'inactivité
- **Plan Validation**:
- Test: Session inactive 30 jours → doit être révoquée
- Commande: Créer session, attendre 30 jours, utiliser → doit être rejetée
- **Effet de Bord**: Utilisateurs devront se reconnecter (acceptable)
- **Effort**: M (4h)
#### MOD-P2-004: Pas de Redaction Automatique PII dans Logs
- **Titre**: Pas de redaction automatique PII (emails, user_ids) dans logs
- **Preuve**: Logs peuvent contenir emails, user_ids en clair
- **Cause**: Pas de middleware redaction
- **Fix Minimal**: Ajouter middleware redaction PII (masquer emails, user_ids partiels)
- **Plan Validation**:
- Test: Logger email → doit être masqué dans logs
- Commande: `grep -r "email" logs/ | head -5` → emails doivent être masqués
- **Effet de Bord**: Debugging plus difficile (acceptable pour sécurité)
- **Effort**: M (4h)
#### MOD-P2-005: Métriques Business Manquantes
- **Titre**: Métriques business manquantes (tracks créés, users actifs, etc.)
- **Impact**: Monitoring business limité. Décisions difficiles.
- **Preuve**: Métriques erreurs présentes mais pas métriques business
- **Cause**: Focus sur métriques techniques seulement
- **Fix Minimal**: Ajouter métriques Prometheus: `veza_tracks_created_total`, `veza_users_active_total`, etc.
- **Plan Validation**:
- Test: Créer track → métrique `veza_tracks_created_total` doit s'incrémenter
- Commande: `curl http://localhost:8080/metrics | grep veza_tracks` → doit exister
- **Effet de Bord**: Aucun (ajout)
- **Effort**: M (6h)
#### MOD-P2-006: Pas de Circuit Breakers
- **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**: Pas implémenté
- **Fix Minimal**: Implémenter circuit breaker pour Chat Server, Stream Server (ex: `github.com/sony/gobreaker`)
- **Plan Validation**:
- Test: Chat Server down, 10 requêtes → circuit breaker doit s'ouvrir
- Commande: Simuler Chat Server down, requêtes → doit retourner 503 rapidement
- **Effet de Bord**: Service dégradé si dépendances down (comportement attendu)
- **Effort**: M (6h)
#### MOD-P2-007: Pas de Versioning API
- **Titre**: Pas de versioning API (toutes routes `/api/v1/*`)
- **Impact**: Breaking changes difficiles. Migration clients complexe.
- **Preuve**: Toutes routes `/api/v1/*`, pas de `/api/v2/*`
- **Cause**: Versioning non planifié
- **Fix Minimal**: Documenter stratégie versioning, préparer `/api/v2/*` pour futurs breaking changes
- **Plan Validation**:
- Test: Route `/api/v2/*` doit exister (même impl que v1 pour l'instant)
- Commande: `curl http://localhost:8080/api/v2/health` → doit fonctionner
- **Effet de Bord**: Aucun (préparation)
- **Effort**: M (4h)
#### MOD-P2-008: Streaming Uploads/Downloads Manquant
- **Titre**: Pas de streaming uploads/downloads (fichiers chargés en mémoire)
- **Impact**: Mémoire élevée pour gros fichiers. Risque OOM.
- **Preuve**: Uploads/downloads chargent fichiers en mémoire
- **Cause**: Pas de streaming implémenté
- **Fix Minimal**: Implémenter streaming uploads/downloads avec `io.Pipe()` ou `io.Copy()`
- **Plan Validation**:
- Test: Uploader fichier 1GB → mémoire doit rester stable
- Commande: `curl -X POST -F "file=@large.mp3" http://localhost:8080/api/v1/tracks` → monitoring mémoire
- **Effet de Bord**: Aucun (optimisation)
- **Effort**: L (8h)
#### MOD-P2-009: Pas de Métriques DB Pool
- **Titre**: Pas de métriques DB pool (connections, wait time)
- **Impact**: Monitoring DB limité. Détection problèmes difficile.
- **Preuve**: Pool configuré mais stats pas exposées
- **Cause**: Stats pas intégrées dans Prometheus
- **Fix Minimal**: Exposer `sql.DB.Stats()` dans métriques Prometheus
- **Plan Validation**:
- Test: Requêtes DB → métriques `veza_db_pool_open_connections` doivent être présentes
- Commande: `curl http://localhost:8080/metrics | grep veza_db_pool` → doit exister
- **Effet de Bord**: Aucun (ajout)
- **Effort**: S (2h)
#### MOD-P2-010: Fichiers Backup Présents
- **Titre**: Fichiers backup `.backup-pre-uuid-migration/` présents (à nettoyer)
- **Impact**: Code mort, confusion. Maintenance difficile.
- **Preuve**: Dossiers `.backup-pre-uuid-migration/` dans plusieurs endroits
- **Cause**: Migration UUID complétée mais backups non supprimés
- **Fix Minimal**: Supprimer tous dossiers `.backup-*` après vérification
- **Plan Validation**:
- Test: `find . -name ".backup-*" -type d` → doit être vide
- Commande: `git rm -r **/.backup-*` → doit supprimer
- **Effet de Bord**: Aucun (nettoyage)
- **Effort**: S (30min)
### P3 - MINEUR (Cosmétique / Refactors Non Urgents)
#### MOD-P3-001: Duplication cmd/api vs cmd/modern-server
- **Titre**: Duplication `cmd/api/main.go` vs `cmd/modern-server/main.go` (legacy?)
- **Impact**: Confusion, maintenance double. Faible impact.
- **Preuve**: Deux points d'entrée présents
- **Cause**: Migration en cours, legacy non supprimé
- **Fix Minimal**: Documenter usage, supprimer legacy si inutile
- **Effort**: S (1h)
#### MOD-P3-002: Incohérences Naming (APIRouter vs apiRouter)
- **Titre**: Incohérences naming (mix PascalCase/camelCase)
- **Impact**: Faible, confusion mineure
- **Fix Minimal**: Standardiser naming (PascalCase pour exports)
- **Effort**: S (2h)
#### MOD-P3-003: Documentation Swagger Incomplète
- **Titre**: Swagger présent mais documentation incomplète
- **Impact**: Expérience développeur dégradée
- **Fix Minimal**: Compléter annotations Swagger sur tous endpoints
- **Effort**: M (8h)
---
# PHASE G - PLAN D'EXÉCUTION
## G.1 Checklist P0 (Ordre Strict)
1. **MOD-P0-001**: Remplacer `panic()` par erreur dans `getEnvRequired()` (1h)
2. **MOD-P0-002**: Appliquer CORS restrictif par défaut si `CORS_ALLOWED_ORIGINS` vide (1h)
3. **MOD-P0-003**: Retourner erreur au lieu de panic dans `NewJWTService()` (30min)
**Total P0**: ~2.5h
## G.2 Checklist P1 (Par Lots Cohérents)
### Lot 1: Sécurité Auth (4h)
1. **MOD-P1-001**: Vérifier `TokenVersion` dans `AuthMiddleware` (2h)
2. **MOD-P1-002**: Valider `aud`/`iss` JWT strictement (1h)
3. **MOD-P1-003**: Rate limiting sur `/auth/login` (2h)
### Lot 2: Sécurité Input (12h)
4. **MOD-P1-004**: Intégrer scan ClamAV uploads (4h)
5. **MOD-P1-005**: Validation input systématique (8h)
### Lot 3: Observabilité (3h)
6. **MOD-P1-006**: Stack traces conditionnels selon env (1h)
7. **MOD-P1-007**: Intégrer `govulncheck` dans CI/CD (2h)
### Lot 4: Performance & Robustesse (14h)
8. **MOD-P1-008**: Audit et fix N+1 queries (6h)
9. **MOD-P1-009**: Timeout context dans tous handlers (4h)
10. **MOD-P1-010**: Rollback automatique migrations (4h)
**Total P1**: ~33h
## G.3 Quick Wins (≤ 1h chacun)
1. **MOD-P2-010**: Supprimer fichiers backup (30min)
2. **MOD-P2-002**: Validation `alg` header JWT (1h)
3. **MOD-P2-009**: Métriques DB pool (2h) - peut être split
## G.4 Tests à Ajouter en Priorité
1. **Tests P0**:
- Test config manquante → erreur claire
- Test CORS restrictif par défaut
2. **Tests P1**:
- Test token version mismatch → rejeté
- Test rate limiting login → limite appliquée
- Test scan ClamAV → fichier malveillant rejeté
- Test validation input → données invalides rejetées
3. **Tests P2**:
- Test N+1 queries → nombre queries vérifié
- Test timeout context → timeout après 30s
## G.5 PR Plan
### PR 1: Fix P0 Security (2.5h)
- **Titre**: `fix(security): Replace panics with errors in config validation`
- **Fichiers**: `internal/config/config.go`, `internal/services/jwt_service.go`, `internal/api/router.go`
- **Tests**: Tests config manquante, CORS restrictif
### PR 2: Fix P1 Auth Security (4h)
- **Titre**: `fix(security): Add token version and aud/iss validation in JWT middleware`
- **Fichiers**: `internal/middleware/auth.go`
- **Tests**: Tests token version, aud/iss validation
### PR 3: Fix P1 Rate Limiting (2h)
- **Titre**: `feat(security): Add rate limiting on /auth/login endpoint`
- **Fichiers**: `internal/api/router.go`, `internal/middleware/ratelimit.go`
- **Tests**: Tests rate limiting login
### PR 4: Fix P1 Input Validation (8h)
- **Titre**: `feat(security): Add systematic input validation with go-validator`
- **Fichiers**: `internal/dto/*.go`, `internal/handlers/*.go`, `internal/middleware/validation.go` (nouveau)
- **Tests**: Tests validation tous DTOs
### PR 5: Fix P1 Observability (3h)
- **Titre**: `fix(observability): Conditional stack traces and govulncheck integration`
- **Fichiers**: `internal/middleware/error_handler.go`, `Makefile`, `.github/workflows/ci.yml` (nouveau)
- **Tests**: Tests stack traces conditionnels
### PR 6: Fix P1 Performance (10h)
- **Titre**: `perf: Fix N+1 queries and add timeout context in handlers`
- **Fichiers**: `internal/handlers/*.go`, `internal/services/*.go`
- **Tests**: Tests nombre queries, timeout context
### PR 7: Fix P1 Migrations (4h)
- **Titre**: `fix(db): Add automatic rollback on migration failure`
- **Fichiers**: `internal/database/database.go`
- **Tests**: Tests rollback migrations
### PR 8: Quick Wins P2 (3h)
- **Titre**: `chore: Remove backup files and add JWT alg validation`
- **Fichiers**: Suppression `.backup-*`, `internal/middleware/auth.go`
- **Tests**: Tests validation alg
---
## RÉSUMÉ EXÉCUTIF
### État Global
- **Build**: ✅ Compile sans erreurs
- **Tests**: ⚠️ Coverage ~45% (objectif: 80%+)
- **Sécurité**: ⚠️ 3 P0, 10 P1 identifiés
- **Robustesse**: ⚠️ Gaps observabilité, timeouts
- **Performance**: ⚠️ N+1 queries, pas de streaming
### Priorités Immédiates
1. **P0 Security** (2.5h) : Fix panics config, CORS, JWT
2. **P1 Auth Security** (4h) : Token version, aud/iss, rate limiting
3. **P1 Input Validation** (8h) : Validation systématique
4. **P1 Performance** (10h) : N+1 queries, timeouts
### Estimation Totale
- **P0**: 2.5h
- **P1**: 33h
- **P2**: ~40h
- **P3**: ~15h
- **Total**: ~90h (~11 jours développeur)
---
**Fin du Rapport**