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

1297 lines
55 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 code + Tests + Configuration
**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 (HS256), sessions DB, RBAC, OAuth partiel, 2FA (TOTP)
- **Gestion Utilisateurs** : Profils, permissions, rôles, token versioning pour révocation
- **Gestion Contenu** : Tracks (audio), playlists, marketplace (products, orders)
- **Chat & Collaboration** : Rooms, messages, conversations (intégration Chat Server Rust)
- **Streaming** : Intégration avec Stream Server (WebRTC) pour streaming audio
- **Audit & Monitoring** : Logs structurés (zap), métriques Prometheus, Sentry error tracking
- **Jobs & Workers** : Job queue (RabbitMQ), workers (email, thumbnails, analytics, webhooks)
**Rôle dans l'écosystème Veza** :
- **Backend Go** : API REST principale (port 8080) - **MODULE COURANT**
- **Chat Server Rust** : WebSocket chat (port 8081) - consommateur de tokens JWT via `/api/v1/chat/token`
- **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`, défaut: 8080)
**Routes Principales** (`/api/v1/`):
```
/api/v1/
├── /auth/*
│ ├── POST /register # Inscription
│ ├── POST /login # Connexion (rate limited)
│ ├── POST /refresh # Renouvellement token
│ ├── POST /verify-email # Vérification email
│ ├── POST /resend-verification # Renvoyer vérification
│ ├── GET /check-username # Vérifier disponibilité username
│ ├── POST /password/reset-request # Demande reset password
│ ├── POST /password/reset # Reset password
│ ├── POST /logout # Déconnexion (protégé)
│ └── GET /me # Profil utilisateur (protégé)
├── /users/*
│ ├── GET /:id # Profil utilisateur
│ ├── GET /by-username/:username # Profil par username
│ ├── PUT /:id # Mise à jour profil (protégé)
│ └── GET /:id/completion # Complétion profil (protégé)
├── /tracks/*
│ ├── GET / # Liste tracks
│ ├── GET /:id # Détails track
│ ├── GET /:id/stats # Statistiques track
│ ├── GET /:id/history # Historique track
│ ├── GET /:id/download # Téléchargement track
│ ├── GET /shared/:token # Track partagé (public)
│ ├── POST / # Upload track (protégé, creator role)
│ ├── PUT /:id # Mise à jour track (protégé)
│ ├── DELETE /:id # Suppression track (protégé)
│ ├── POST /:id/like # Like track (protégé)
│ ├── DELETE /:id/like # Unlike track (protégé)
│ ├── GET /:id/likes # Liste likes (protégé)
│ ├── POST /:id/share # Partager track (protégé)
│ └── DELETE /share/:id # Révoquer partage (protégé)
├── /playlists/* # Gestion playlists (protégé)
├── /chat/*
│ └── POST /token # Génération token WS (protégé)
├── /marketplace/*
│ ├── GET /products # Liste produits
│ ├── POST /products # Créer produit (protégé, creator role)
│ ├── POST /orders # Créer commande (protégé)
│ └── GET /download/:product_id # URL téléchargement (protégé)
├── /sessions/* # Gestion sessions (protégé)
├── /uploads/* # Upload fichiers (protégé, rate limited)
├── /audit/* # Audit logs (protégé)
├── /conversations/* # Chat rooms (protégé)
├── /webhooks/* # Webhooks (protégé)
├── /admin/* # Routes admin (protégé, admin role)
├── /health # Health check simple
├── /healthz # Liveness probe
├── /readyz # Readiness probe
├── /status # Status complet (DB, Redis, Chat, Stream)
└── /metrics # Prometheus metrics
```
**Formats**:
- **Request/Response**: JSON (`application/json`)
- **Auth**: JWT Bearer tokens (`Authorization: Bearer <token>`)
- **Content-Type**: `application/json`
- **File Upload**: `multipart/form-data` (tracks, thumbnails)
- **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": "user|admin|creator|premium|artist|producer|label",
"token_version": 1,
"created_at": "2025-01-27T10:00:00Z",
"updated_at": "2025-01-27T10:00:00Z"
}
```
**Track**:
```json
{
"id": "uuid",
"user_id": "uuid",
"title": "string",
"artist": "string",
"duration": 180.5,
"file_path": "string",
"status": "processing|ready|error"
}
```
**Error Response** (standardisé):
```json
{
"success": false,
"data": null,
"error": {
"code": 2001,
"message": "Validation failed",
"details": [
{"field": "email", "message": "Invalid email format"}
],
"request_id": "uuid",
"timestamp": "2025-01-27T10:00:00Z"
}
}
```
## A.3 Dépendances Internes
**Structure du Module**:
```
veza-backend-api/
├── cmd/
│ ├── api/main.go # Point d'entrée principal (legacy?)
│ └── modern-server/main.go # Point d'entrée moderne (ACTIF)
├── internal/
│ ├── api/ # Routes et handlers HTTP
│ │ ├── router.go # Configuration routes (APIRouter)
│ │ └── [user|track|chat|...]/ # Routes par domaine
│ ├── config/ # Configuration centralisée
│ │ ├── config.go # Config struct + NewConfig()
│ │ ├── env_loader.go # Chargement .env
│ │ └── validator.go # Validation config
│ ├── database/ # Gestion DB
│ │ ├── database.go # Connexion + migrations
│ │ └── migrations.go # Migrations GORM (indexes)
│ ├── handlers/ # Handlers HTTP (legacy + modern)
│ ├── middleware/ # Middlewares Gin
│ │ ├── auth.go # AuthMiddleware (JWT + sessions)
│ │ ├── rbac_middleware.go # RBAC permissions
│ │ ├── rate_limiter.go # Rate limiting (Redis)
│ │ ├── error_handler.go # Error handling standardisé
│ │ └── timeout.go # Timeout middleware
│ ├── services/ # Business logic
│ │ ├── jwt_service.go # JWT generation/validation
│ │ ├── session_service.go # Sessions DB
│ │ ├── user_service.go # User management
│ │ └── [auth|track|playlist|...]/ # Services par domaine
│ ├── models/ # Modèles GORM
│ ├── repositories/ # Data access layer
│ ├── workers/ # Background workers
│ │ ├── job_worker.go # Job queue worker
│ │ ├── email_job.go # Email worker
│ │ └── [analytics|thumbnail|webhook]/ # Autres workers
│ ├── errors/ # Error handling
│ ├── metrics/ # Prometheus metrics
│ └── logging/ # Logging (zap)
├── migrations/ # Migrations SQL (100% SQL strategy)
│ ├── 001_extensions_and_types.sql
│ ├── 010_auth_and_users.sql
│ └── [020-900]_*.sql
└── tests/ # Tests d'intégration
```
**Packages Partagés**:
- `internal/common/` : Types communs, validation
- `internal/types/` : Types métier (auth, user, stats)
- `internal/interfaces/` : Interfaces pour découplage
## A.4 Dépendances Externes
**Base de Données**:
- **PostgreSQL** (principal) : Via `github.com/lib/pq` + GORM (`gorm.io/driver/postgres`)
- **SQLite** (tests uniquement) : Via `gorm.io/driver/sqlite`
- **Stratégie Migrations** : 100% SQL (fichiers `.sql` dans `migrations/`), GORM uniquement pour indexes additionnels
**Cache & Sessions**:
- **Redis** (`github.com/redis/go-redis/v9`) : Cache, rate limiting, sessions (optionnel via `REDIS_ENABLE`)
**Message Queue**:
- **RabbitMQ** (`github.com/rabbitmq/amqp091-go`) : Job queue, event bus (optionnel via `RABBITMQ_ENABLE`)
**HTTP Framework**:
- **Gin** (`github.com/gin-gonic/gin`) : Router HTTP
**Auth & Security**:
- **JWT** (`github.com/golang-jwt/jwt/v5`) : Tokens JWT (HS256)
- **OTP** (`github.com/pquerna/otp`) : 2FA TOTP
- **Crypto** (`golang.org/x/crypto`) : Hashing passwords (bcrypt)
**Monitoring & Observability**:
- **Prometheus** (`github.com/prometheus/client_golang`) : Métriques
- **Sentry** (`github.com/getsentry/sentry-go`) : Error tracking
- **Zap** (`go.uber.org/zap`) : Logging structuré
**Validation**:
- **Validator** (`github.com/go-playground/validator/v10`) : Validation struct tags
**Autres**:
- **UUID** (`github.com/google/uuid`) : Génération UUID
- **OAuth2** (`golang.org/x/oauth2`) : OAuth (partiel)
- **Rate Limiting** (`golang.org/x/time`) : Rate limiting
## A.5 Exécution
### Commandes Build/Run/Dev
**Build**:
```bash
make build # Compile (bin/veza-backend-api)
make build-linux # Compile pour Linux
```
**Run**:
```bash
make run # Build + run
make dev # Run en mode dev (go run)
make run-lab # Run en mode lab (dégradé 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 (nécessite Redis)
```
**Qualité**:
```bash
make lint # golangci-lint
make vet # go vet
make format # go fmt + goimports
make security # gosec + govulncheck
```
**Migrations**:
```bash
make migrate # Exécute migrations
make migrate-lab # Migrations en environnement lab
```
### Configuration
**Variables d'Environnement Requises**:
```bash
# REQUIS
JWT_SECRET=<32+ chars> # Secret JWT (minimum 32 caractères)
DATABASE_URL=postgres://... # URL PostgreSQL
# OPTIONNEL (avec defaults)
APP_PORT=8080 # Port serveur HTTP
APP_ENV=development|test|staging|production
REDIS_URL=redis://localhost:6379
REDIS_ENABLE=true
RABBITMQ_URL=amqp://guest:guest@localhost:5672/
RABBITMQ_ENABLE=true
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173
LOG_LEVEL=INFO|DEBUG|WARN|ERROR
HANDLER_TIMEOUT=30s
RATE_LIMIT_LIMIT=100
RATE_LIMIT_WINDOW=60
AUTH_RATE_LIMIT_LOGIN_ATTEMPTS=5
AUTH_RATE_LIMIT_LOGIN_WINDOW=1
```
**Fichiers de Configuration**:
- `.env` : Variables d'environnement (chargé automatiquement)
- `.env.{env}` : Variables par environnement (ex: `.env.production`)
- Priorité : Variables système > `.env.{env}` > `.env`
**Secrets Management**:
- Secrets dans variables d'environnement (pas de fichiers secrets)
- Masquage dans logs via `SecretsProvider` (`internal/config/secrets.go`)
### Docker
**Build**:
```bash
make docker-build # Construit image Docker
```
**Dockerfile**:
- Multi-stage build (Go 1.23-alpine → alpine:latest)
- Non-root user (`app:app`)
- Health check (`/health`)
- Expose port 8080
**Run**:
```bash
make docker-run # Build + run container
```
## A.6 Points d'Intégration
### Contrats d'API avec Autres Services
**Chat Server (Rust)**:
- **Endpoint Backend → Chat** : `/api/v1/chat/token` génère JWT pour WebSocket
- **Format Token** : JWT avec `sub` (user_id UUID), `iss` (JWT_ISSUER), `aud` (JWT_AUDIENCE)
- **Secret Partagé** : `CHAT_JWT_SECRET` (fallback: `JWT_SECRET`)
- **URL Chat Server** : `CHAT_SERVER_URL` (défaut: `http://localhost:8081`)
**Stream Server (Rust)**:
- **Endpoint Backend → Stream** : Callback `/api/v1/internal/tracks/:id/stream-ready`
- **Format Token** : JWT (même format que Chat)
- **URL Stream Server** : `STREAM_SERVER_URL` (défaut: `http://localhost:8082`)
**Frontend React**:
- **Base URL** : `http://localhost:8080/api/v1`
- **Auth** : JWT Bearer tokens
- **CORS** : Configuré via `CORS_ALLOWED_ORIGINS` (wildcard `*` interdit en production)
### Auth (JWT/SSO)
**JWT**:
- **Algorithme** : HS256 (strictement vérifié, `none`/`RS256` rejetés)
- **Claims Requis** : `sub` (user_id UUID), `exp`, `iat`, `iss`, `aud`, `token_version`
- **TTL** : Access token 15min, Refresh token 30 jours
- **Révocation** : Token versioning (incrément `user.token_version` → tous tokens invalides)
**Sessions**:
- **Stockage** : DB (`user_sessions` table)
- **Validation** : Obligatoire dans `AuthMiddleware.authenticate()`
- **Expiration** : Configurable (défaut: 30 jours)
**RBAC**:
- **Rôles** : `user`, `admin`, `creator`, `premium`, `artist`, `producer`, `label`
- **Permissions** : Tables `permissions`, `role_permissions`, `user_roles`
- **Middleware** : `RequireAdmin()`, `RequirePermission()`, `RequireContentCreatorRole()`
**OAuth**:
- **Partiel** : Implémentation présente mais incomplète (TODO dans code)
### Schéma DB / UUID / Conventions
**IDs**:
- **Format** : UUID v4 (`github.com/google/uuid`)
- **Migration** : Migration complète de `int64``uuid.UUID` effectuée
- **Tables** : Toutes tables utilisent `id UUID PRIMARY KEY DEFAULT gen_random_uuid()`
**Soft Delete**:
- **Colonne** : `deleted_at TIMESTAMPTZ` (nullable)
- **GORM** : `gorm.DeletedAt` pour soft delete automatique
- **Tables** : `users`, `tracks`, `playlists`, `messages`, etc.
**Timestamps**:
- **Colonnes** : `created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()`, `updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()`
- **GORM** : `gorm.Model` (inclut `CreatedAt`, `UpdatedAt`, `DeletedAt`)
**Foreign Keys**:
- **Format** : `user_id UUID REFERENCES users(id) ON DELETE CASCADE`
- **Indexes** : Index automatiques sur foreign keys
---
# PHASE B - SANTÉ TECHNIQUE
## B.1 Build Status
**Compilation**:
-**Status** : Code compile sans erreurs (`go build ./...` réussit)
-**Go Version** : 1.23.8 (requis dans `go.mod`)
- ⚠️ **Warnings** : Quelques warnings de dépendances obsolètes
**Fichiers**:
- **Total Go Files** : 663 fichiers
- **Test Files** : 221 fichiers (`*_test.go`)
- **Ratio Tests** : ~33% (221/663)
## B.2 Tests
**Exécution**:
```bash
make test # Tests unitaires
```
**Résultats**:
- ⚠️ **3 Tests Échouent** :
- `TestLoad_MissingRequiredVariable_DBPassword` : Devrait panic mais ne panic pas
- `TestLoad_MissingRequiredVariable_JWTSecret` : Devrait panic mais ne panic pas
- `TestNewConfig_RequiresJWTSecret` : Devrait panic mais ne panic pas
-**Autres Tests** : Passent (cached ou ok)
**Couverture**:
- ⚠️ **Non Mesurée Automatiquement** : Pas de CI/CD avec coverage report
- **Commande** : `make test-coverage` génère `coverage.html`
**Types de Tests**:
-**Unitaires** : Présents dans chaque package (`*_test.go`)
-**Intégration** : `tests/integration/` (nécessite Redis)
-**Transactions** : `tests/transactions/` (tests transactionnels)
**Fiabilité**:
- ⚠️ **Race Conditions** : Tests avec `-race` non exécutés automatiquement
- ⚠️ **Flaky Tests** : Non identifiés (nécessite plusieurs runs)
## B.3 Linting & Qualité Code
**Linters**:
-**golangci-lint** : Configuré dans Makefile
- ⚠️ **Non Exécuté Automatiquement** : Pas de CI/CD
- **Commande** : `make lint`
**Go Vet**:
-**Configuré** : `make vet`
- ⚠️ **Non Exécuté Automatiquement** : Pas de CI/CD
**Format**:
-**go fmt** : Configuré
-**goimports** : Configuré dans Makefile
- **Commande** : `make format`
**TODO/FIXME**:
- ⚠️ **90 TODOs/FIXMEs** trouvés dans le code
- **Fichiers Principaux** :
- `internal/config/config.go` : 6 TODOs
- `internal/services/job_service.go` : 3 TODOs
- `internal/database/database.go` : 4 TODOs
- `internal/api/api_manager.go` : 4 TODOs
## B.4 Gestion des Erreurs
**Patterns**:
-**AppError** : Erreurs standardisées (`internal/errors/errors.go`)
-**Error Codes** : Codes numériques (1000-9999) par catégorie
-**Error Wrapping** : `fmt.Errorf("...: %w", err)` pour chaînage
-**HTTP Status Mapping** : `mapErrorCodeToHTTPStatus()` dans `internal/handlers/error_response.go`
**Problèmes**:
- ⚠️ **P1-ERRORS** : Panics non capturés dans certains handlers (recovery middleware présent mais peut manquer)
- ⚠️ **P2-ERRORS** : Erreurs non loggées dans certains services (audit nécessaire)
**Recovery**:
-**Recovery Middleware** : `middleware.Recovery()` présent
-**Sentry Recovery** : `middleware.SentryRecover()` pour tracking erreurs
## B.5 Conventions & Structure
**Naming**:
-**Cohérent** : Go conventions respectées (PascalCase exports, camelCase privés)
-**Packages** : Packages par domaine (`auth`, `track`, `playlist`, etc.)
**Structure Dossiers**:
-**Organisée** : Séparation claire (`handlers/`, `services/`, `repositories/`, `models/`)
- ⚠️ **Duplication** : Certains handlers dans `internal/handlers/` ET `internal/api/handlers/` (legacy?)
**Séparation Couches**:
-**Respectée** : Handlers → Services → Repositories → DB
- ⚠️ **Couplage** : Certains services appellent directement GORM (bypass repositories)
---
# PHASE C - SÉCURITÉ
## C.1 Secrets & Configuration
**Secrets Hardcodés**:
-**Aucun Trouvé** : Grep `password|secret|key|token` ne révèle pas de secrets hardcodés
-**Variables d'Environnement** : Tous secrets via env vars
**Fichiers .env**:
- ⚠️ **P0-SECURITY** : `.env` peut être committé (vérifier `.gitignore`)
-**Masquage Logs** : `SecretsProvider` masque secrets dans logs (`internal/config/secrets.go`)
**Configuration**:
-**Validation** : `Config.Validate()` + `ValidateForEnvironment()` (stricte en production)
- ⚠️ **P0-SECURITY** : `getEnvRequired()` retourne erreur (pas panic) → tests échouent car attendent panic
- **Fichier** : `internal/config/config.go:524-529`
- **Impact** : Tests incorrects (devraient vérifier erreur, pas panic)
## C.2 Authentification & Autorisation
### JWT Validation
**Implémentation**:
-**Algorithme** : HS256 (HMAC) - sécurisé
-**Validation Signature** : `jwt.ParseWithClaims()` avec secret
-**Validation Expiration** : `exp` claim vérifié
-**Validation Session DB** : `SessionService.ValidateSession()` appelé
-**Validation Claims** : `sub` (user_id UUID), `exp`, `iat`, `iss`, `aud` vérifiés
-**Validation Algorithme** : `alg` header vérifié (HS256 uniquement) - **FIXÉ** (`internal/services/jwt_service.go:121-127`)
-**Token Version** : Vérifié dans `AuthMiddleware.authenticate()` (`internal/middleware/auth.go:119-129`)
**Problèmes**:
-**RÉSOLU** : Validation `aud`/`iss` JWT stricte (`jwt.WithIssuer()`, `jwt.WithAudience()`)
-**RÉSOLU** : Token version vérifiée dans `authenticate()`
### 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 ownership sur certaines routes
- Exemple: `/api/v1/users/:id` (PUT) - vérifier ownership ou admin
- Exemple: `/api/v1/tracks/:id` (DELETE) - vérifier ownership ou admin
- **Fichiers** : `internal/api/router.go:248`, `internal/api/router.go:299`
### 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** : Aucune raw query avec concaténation string identifiée
-**Pas de SELECT *** : Bonne pratique respectée
**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: XSS possible si données affichées côté frontend sans échappement
**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
- **Fichier** : `internal/handlers/upload.go` - pas d'usage ClamAV trouvé
### 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:68-74`
- 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`)
- ✅ Rate limiting sur `/api/v1/auth/login` (via `EndpointLimiter.LoginRateLimit()`)
**Problèmes**:
-**RÉSOLU** : Rate limiting sur `/auth/login` présent (`internal/api/router.go:193-195`)
- ⚠️ **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é en CI)
- ⚠️ **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**: CORS pas appliqué si `CORS_ALLOWED_ORIGINS` vide (warning seulement)
2. **🔴 P0-SECURITY**: Tests config incorrects (attendent panic au lieu d'erreur)
3. **🟠 P1-SECURITY**: Scan antivirus ClamAV non vérifié (uploads)
4. **🟠 P1-SECURITY**: Validation input pas systématique (risque injection indirecte)
5. **🟠 P1-SECURITY**: Pas de vérification ownership sur routes PUT/DELETE
6. **🟠 P1-SECURITY**: Pas de scan automatique vulnérabilités (`govulncheck`)
7. **🟡 P2-SECURITY**: Pas de sanitization XSS systématique
8. **🟡 P2-SECURITY**: Pas de rotation automatique sessions
9. **🟡 P2-SECURITY**: Pas de détection sessions suspectes
10. **🟡 P2-SECURITY**: Rate limiting uploads peut être contourné (IP spoofing)
---
# 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` (conditionnel via `includeStackTrace`)
- Impact: Info sensible (chemins fichiers, code) dans logs prod
- **FIX PARTIEL** : `includeStackTrace` désactivé en production (`internal/api/router.go:63`)
- ⚠️ **P2-OBSERVABILITY** : Pas de redaction automatique PII (emails, user_ids dans logs)
- ⚠️ **P2-OBSERVABILITY** : Logs peuvent être volumineux (stack traces en dev)
**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: Kubernetes peut tuer le pod si readiness échoue
- Fix: Mode dégradé si services optionnels down
## D.4 Timeouts & Retries
**Timeouts**:
-**Global Handler Timeout** : `HANDLER_TIMEOUT` (défaut: 30s)
-**Timeout Middleware** : `middleware.Timeout()` appliqué globalement
- ⚠️ **P1-ROBUSTNESS** : Timeout middleware appliqué **2 fois** (duplication)
- Fichier: `internal/api/router.go:77-79`
- Impact: Redondant mais pas bloquant
- ⚠️ **P1-ROBUSTNESS** : Pas de timeout DB configuré explicitement (utilise contexte)
**Retries**:
-**DB Retries** : `DBMaxRetries` (défaut: 5) + `DBRetryInterval` (défaut: 5s)
-**RabbitMQ Retries** : `RabbitMQMaxRetries` (défaut: 3) + `RabbitMQRetryInterval` (défaut: 2s)
**Circuit Breakers**:
- ⚠️ **P2-ROBUSTNESS** : Pas de circuit breakers implémentés
- Impact: Pas de protection contre cascading failures
## D.5 Gestion de Charge
**DB Pool**:
- ✅ Configuré: `MaxOpenConns: 25`, `MaxIdleConns: 10`, `MaxLifetime: 5min`, `MaxIdleTime: 1min`
- ⚠️ **P2-PERFORMANCE** : Pas de métriques pool (connections in use, wait time)
**Rate Limiting**:
- ✅ Global: 100 req/min par IP (configurable)
- ✅ Par endpoint: Login 5 attempts/min (configurable)
- ✅ Uploads: Rate limiting spécifique
**Backpressure**:
- ⚠️ **P2-ROBUSTNESS** : Pas de backpressure explicite (dépend de rate limiting)
## D.6 Migrations & Compatibilité
**Stratégie Migrations**:
-**100% SQL** : Migrations SQL dans `migrations/*.sql`
-**Transactions** : Chaque migration dans transaction (atomicité)
-**Versioning** : Table `schema_migrations` pour tracking
-**GORM Indexes** : Indexes additionnels via GORM après migrations SQL
**Compatibilité**:
-**UUID Migration** : Migration complète `int64``uuid.UUID` effectuée
-**Soft Delete** : Compatible avec GORM
**Problèmes**:
- ⚠️ **P2-ROBUSTNESS** : Pas de rollback automatique (migrations SQL seulement)
- Impact: Rollback manuel nécessaire en cas d'échec
---
# PHASE E - PERFORMANCE & SCALABILITÉ
## E.1 Hotspots Évidents
**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**:
- ⚠️ **P2-PERFORMANCE** : Risque N+1 dans `ListTracks()` si relations chargées (audit nécessaire)
-**GORM Preload** : Utilisé dans certains services (`Preload("User")`)
**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)
## E.3 Go-Specific Issues
**Goroutine Leaks**:
- ⚠️ **P1-ROBUSTNESS** : Goroutines dans timeout middleware peuvent leak si handler ne termine pas
- Fichier: `internal/middleware/timeout.go:24-27`
- Impact: Memory leak potentiel
- Fix: Context cancellation + cleanup goroutine
**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
## E.4 Optimisations Mesurables
1. **P2-PERFORMANCE** : Ajouter métriques DB pool (connections, wait time)
2. **P2-PERFORMANCE** : Optimiser JSON marshalling (streaming pour grandes réponses)
3. **P2-PERFORMANCE** : Précharger relations dans `ListTracks()` (éviter N+1)
4. **P2-PERFORMANCE** : File I/O asynchrone (goroutines pour uploads)
5. **P1-ROBUSTNESS** : Fix goroutine leak dans timeout middleware
---
# 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 - CRITIQUES (À CORRIGER IMMÉDIATEMENT)
### MOD-P0-001: CORS Middleware Non Appliqué si CORS_ALLOWED_ORIGINS Vide
- **ID** : `MOD-P0-001`
- **Titre** : CORS middleware pas appliqué si `CORS_ALLOWED_ORIGINS` vide
- **Impact** : CORS errors en browsers (requêtes bloquées). En production, si `CORS_ALLOWED_ORIGINS` vide (strict mode), CORS middleware n'est pas appliqué → requêtes cross-origin rejetées par navigateur (comportement attendu mais non documenté).
- **Preuve** :
- Fichier: `internal/api/router.go:68-74`
- Code: `if r.config != nil && len(r.config.CORSOrigins) > 0 { router.Use(middleware.CORS(...)) } else { logger.Warn(...) }`
- **Cause Racine** : Condition `len(r.config.CORSOrigins) > 0` empêche application middleware si liste vide (strict mode).
- **Fix Minimal** : Appliquer CORS middleware même si liste vide (middleware doit rejeter toutes origines sauf celles explicitement autorisées). OU documenter que liste vide = strict mode (pas de CORS).
- **Plan Validation** :
- Test: Requête cross-origin avec `CORS_ALLOWED_ORIGINS=""` → doit retourner erreur CORS
- Commande: `curl -H "Origin: http://evil.com" http://localhost:8080/api/v1/health` → doit rejeter
- **Effet de Bord** : Aucun (comportement attendu en strict mode)
- **Effort** : S (1h)
### MOD-P0-002: Tests Config Incorrects (Attendent Panic au lieu d'Erreur)
- **ID** : `MOD-P0-002`
- **Titre** : Tests config attendent panic mais `getEnvRequired()` retourne erreur
- **Impact** : Tests échouent, confusion sur comportement attendu. Si config invalide, application doit crash au démarrage (acceptable) mais tests incorrects.
- **Preuve** :
- Fichiers: `internal/config/config_test.go:137`, `166`, `315`
- Tests: `TestLoad_MissingRequiredVariable_DBPassword`, `TestLoad_MissingRequiredVariable_JWTSecret`, `TestNewConfig_RequiresJWTSecret`
- Code: `getEnvRequired()` retourne `error` (ligne 524-529), pas panic
- **Cause Racine** : Tests écrits avant implémentation ou changement de comportement.
- **Fix Minimal** : Corriger tests pour vérifier erreur retournée au lieu de panic. OU modifier `getEnvRequired()` pour panic (mais moins idiomatique en Go).
- **Plan Validation** :
- Test: Exécuter `make test` → tests doivent passer
- Commande: `go test ./internal/config/... -v`
- **Effet de Bord** : Aucun (correction tests seulement)
- **Effort** : S (30min)
### MOD-P0-003: Timeout Middleware Appliqué 2 Fois (Duplication)
- **ID** : `MOD-P0-003`
- **Titre** : Timeout middleware appliqué 2 fois (lignes 77 et 79)
- **Impact** : Redondant mais pas bloquant. Deux timeouts peuvent créer confusion (lequel s'applique?).
- **Preuve** :
- Fichier: `internal/api/router.go:77-79`
- Code: `router.Use(middleware.Timeout(r.config.HandlerTimeout))` (ligne 77) puis ligne 79 identique
- **Cause Racine** : Copier-coller ou merge conflict non résolu.
- **Fix Minimal** : Supprimer une des deux lignes (garder ligne 77).
- **Plan Validation** :
- Test: Vérifier qu'un seul timeout s'applique
- Commande: `grep -n "Timeout" internal/api/router.go` → doit trouver 1 occurrence
- **Effet de Bord** : Aucun (suppression duplication)
- **Effort** : S (5min)
---
## P1 - IMPORTANTS (À CORRIGER AVANT PROD)
### MOD-P1-001: Scan Antivirus ClamAV Non Vérifié (Uploads)
- **ID** : `MOD-P1-001`
- **Titre** : Scan antivirus ClamAV mentionné mais non vérifié dans code upload
- **Impact** : Fichiers malveillants peuvent être uploadés. Risque sécurité (malware, virus).
- **Preuve** :
- Fichier: `go.mod` contient `github.com/dutchcoders/go-clamd`
- Fichier: `internal/handlers/upload.go` - pas d'usage ClamAV trouvé
- **Cause Racine** : Dépendance présente mais intégration manquante.
- **Fix Minimal** : Ajouter scan ClamAV dans `UploadHandler.UploadFile()` avant sauvegarde. Si ClamAV unavailable, rejeter upload (fail-secure).
- **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). Nécessite ClamAV daemon running.
- **Effort** : M (4h)
### MOD-P1-002: Validation Input Pas Systématique
- **ID** : `MOD-P1-002`
- **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). Exemples: `UpdateProfile`, `UpdateTrack`.
- **Cause Racine** : Validation manuelle au lieu de struct tags `validate:""`.
- **Fix Minimal** : Ajouter struct tags `validate:""` sur tous DTOs et middleware validation global. Exemple: `type UpdateProfileRequest struct { Email string `validate:"omitempty,email"` }`
- **Plan Validation** :
- Test: Envoyer requête avec email invalide → doit retourner 400 avec détails
- Commande: `curl -X PUT -d '{"email":"invalid"}' http://localhost:8080/api/v1/users/123` → doit valider
- **Effet de Bord** : Requêtes invalides seront rejetées (comportement attendu)
- **Effort** : M (8h)
### MOD-P1-003: Pas de Vérification Ownership sur Routes PUT/DELETE
- **ID** : `MOD-P1-003`
- **Titre** : Pas de vérification ownership sur routes PUT/DELETE (users, tracks)
- **Impact** : Utilisateurs peuvent modifier/supprimer ressources d'autres utilisateurs si ID connu. Risque sécurité (modification non autorisée).
- **Preuve** :
- Fichier: `internal/api/router.go:248` - `PUT /users/:id` pas de vérification ownership
- Fichier: `internal/api/router.go:299` - `PUT /tracks/:id` pas de vérification ownership
- Fichier: `internal/api/router.go:300` - `DELETE /tracks/:id` pas de vérification ownership
- **Cause Racine** : Middleware auth vérifie seulement authentification, pas ownership.
- **Fix Minimal** : Ajouter vérification ownership dans handlers. Exemple: `if track.UserID != userID && !isAdmin { return 403 }`. OU middleware `RequireOwnership()`.
- **Plan Validation** :
- Test: User A essaie modifier track de User B → doit retourner 403
- Commande: `curl -X PUT -H "Authorization: Bearer <token_user_a>" http://localhost:8080/api/v1/tracks/<track_id_user_b>` → doit rejeter
- **Effet de Bord** : Utilisateurs ne peuvent plus modifier ressources d'autres (comportement attendu)
- **Effort** : M (6h)
### MOD-P1-004: Pas de Scan Automatique Vulnérabilités (govulncheck)
- **ID** : `MOD-P1-004`
- **Titre** : Pas de scan automatique vulnérabilités (`govulncheck`) en CI/CD
- **Impact** : Vulnérabilités non détectées automatiquement. Risque sécurité (exploitation vulnérabilités connues).
- **Preuve** : Pas de CI/CD configuré. `govulncheck` présent dans Makefile mais pas exécuté automatiquement.
- **Cause Racine** : Pas de CI/CD configuré (GitHub Actions, GitLab CI, etc.).
- **Fix Minimal** : Ajouter étape CI/CD: `govulncheck ./...`. OU intégrer Dependabot/GitHub Security advisories.
- **Plan Validation** :
- Test: Exécuter `govulncheck ./...` → doit détecter vulnérabilités si présentes
- Commande: `make security` → doit inclure govulncheck
- **Effet de Bord** : Aucun (détection seulement)
- **Effort** : S (2h pour CI/CD)
### MOD-P1-005: Stack Traces dans Logs Prod (Partiellement Fixé)
- **ID** : `MOD-P1-005`
- **Titre** : Stack traces dans logs peuvent exposer info sensible (chemins fichiers, code)
- **Impact** : Info sensible dans logs prod. Risque fuite données (chemins fichiers, structure code).
- **Preuve** :
- Fichier: `internal/middleware/error_handler.go:145` - stack traces conditionnels
- **FIX PARTIEL** : `includeStackTrace` désactivé en production (`internal/api/router.go:63`)
- **Cause Racine** : Stack traces utiles en dev mais dangereux en prod.
- **Fix Minimal** : Vérifier que `includeStackTrace` est bien `false` en production. Ajouter redaction automatique chemins fichiers si stack traces nécessaires.
- **Plan Validation** :
- Test: Erreur en production → logs ne doivent pas contenir stack traces
- Commande: `APP_ENV=production go run ...` → vérifier logs
- **Effet de Bord** : Aucun (déjà fixé partiellement)
- **Effort** : S (1h pour vérification)
### MOD-P1-006: /readyz Peut Échouer si Redis/RabbitMQ Down
- **ID** : `MOD-P1-006`
- **Titre** : `/readyz` peut échouer si Redis/RabbitMQ down (même en dev)
- **Impact** : Kubernetes peut tuer le pod si readiness échoue. Service peut être marqué "not ready" même si DB OK (services optionnels down).
- **Preuve** :
- Fichier: `internal/handlers/health.go:143-159`
- Code: Vérifie Redis et RabbitMQ même si `REDIS_ENABLE=false` ou `RABBITMQ_ENABLE=false` (à vérifier)
- **Cause Racine** : Readiness vérifie tous services sans distinction optionnels/requis.
- **Fix Minimal** : Mode dégradé si services optionnels down. `/readyz` doit retourner OK si DB OK et services optionnels down (mais status "degraded").
- **Plan Validation** :
- Test: Redis down, DB OK → `/readyz` doit retourner 200 avec status "degraded"
- Commande: `curl http://localhost:8080/api/v1/readyz` → doit retourner OK même si Redis down
- **Effet de Bord** : Service marqué "ready" même si services optionnels down (acceptable)
- **Effort** : M (4h)
### MOD-P1-007: Goroutine Leak Potentiel dans Timeout Middleware
- **ID** : `MOD-P1-007`
- **Titre** : Goroutines dans timeout middleware peuvent leak si handler ne termine pas
- **Impact** : Memory leak potentiel. Goroutines non nettoyées → consommation mémoire croissante.
- **Preuve** :
- Fichier: `internal/middleware/timeout.go:24-27`
- Code: `go func() { c.Next(); close(done) }()` - goroutine peut ne pas terminer si handler bloque
- **Cause Racine** : Goroutine lancée sans garantie de cleanup si timeout.
- **Fix Minimal** : Context cancellation + cleanup goroutine. Utiliser `context.WithCancel()` et annuler contexte si timeout.
- **Plan Validation** :
- Test: Handler qui bloque indéfiniment → goroutine doit être nettoyée après timeout
- Commande: Stress test avec handlers lents → vérifier nombre goroutines (stable)
- **Effet de Bord** : Aucun (fix memory leak)
- **Effort** : M (3h)
---
## P2 - QUALITÉ & MAINTENABILITÉ
### MOD-P2-001: Pas de Sanitization XSS Systématique
- **ID** : `MOD-P2-001`
- **Titre** : Pas de sanitization XSS systématique
- **Impact** : XSS possible si données affichées côté frontend sans échappement. Risque faible (backend ne génère pas HTML).
- **Preuve** : Pas de sanitization trouvée dans handlers.
- **Cause Racine** : Backend REST (JSON) ne génère pas HTML, sanitization côté frontend.
- **Fix Minimal** : Documenter que sanitization doit être côté frontend. OU ajouter sanitization si endpoints génèrent HTML (ex: emails).
- **Plan Validation** : N/A (backend REST)
- **Effet de Bord** : Aucun
- **Effort** : S (1h pour documentation)
### MOD-P2-002: Pas de Rotation Automatique Sessions
- **ID** : `MOD-P2-002`
- **Titre** : Pas de rotation automatique sessions (TTL fixe)
- **Impact** : Sessions longues (30 jours) sans rotation. Risque sécurité faible (tokens révoquables via token_version).
- **Preuve** : Sessions ont TTL fixe, pas de rotation automatique.
- **Cause Racine** : Design simple (TTL fixe).
- **Fix Minimal** : Ajouter rotation automatique (renouveler session après X jours d'inactivité). OU documenter que révocation via token_version est suffisante.
- **Plan Validation** : N/A (amélioration UX)
- **Effet de Bord** : Aucun
- **Effort** : M (4h)
### MOD-P2-003: Pas de Détection Sessions Suspectes
- **ID** : `MOD-P2-003`
- **Titre** : Pas de détection sessions suspectes (multiples IPs, etc.)
- **Impact** : Pas de détection compromission compte. Risque sécurité faible (détection proactive).
- **Preuve** : Pas de détection trouvée.
- **Cause Racine** : Feature non implémentée.
- **Fix Minimal** : Ajouter détection (multiples IPs, géolocalisation, etc.) et alerter utilisateur. OU documenter comme future amélioration.
- **Plan Validation** : N/A (feature additionnelle)
- **Effet de Bord** : Aucun
- **Effort** : L (8h)
### MOD-P2-004: Métriques Business Manquantes
- **ID** : `MOD-P2-004`
- **Titre** : Métriques business manquantes (tracks créés, users actifs, etc.)
- **Impact** : Monitoring business limité. Pas de visibilité sur métriques métier.
- **Preuve** : Métriques Prometheus présentes pour erreurs/health, pas pour business.
- **Cause Racine** : Focus sur métriques techniques.
- **Fix Minimal** : Ajouter métriques business: `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/api/v1/metrics | grep tracks_created`
- **Effet de Bord** : Aucun
- **Effort** : M (6h)
### MOD-P2-005: Pas de Métriques DB Pool
- **ID** : `MOD-P2-005`
- **Titre** : Pas de métriques DB pool (connections, wait time)
- **Impact** : Monitoring DB limité. Pas de visibilité sur utilisation pool.
- **Preuve** : Pas de métriques pool trouvées.
- **Cause Racine** : Métriques pool non exposées.
- **Fix Minimal** : Exposer métriques `sql.DB.Stats()` via Prometheus: `veza_db_pool_open_connections`, `veza_db_pool_wait_count`, etc.
- **Plan Validation** :
- Test: Stress test → métriques pool doivent refléter utilisation
- Commande: `curl http://localhost:8080/api/v1/metrics | grep db_pool`
- **Effet de Bord** : Aucun
- **Effort** : M (4h)
### MOD-P2-006: Pas de Métriques Redis
- **ID** : `MOD-P2-006`
- **Titre** : Pas de métriques Redis (hit rate, latency)
- **Impact** : Monitoring Redis limité. Pas de visibilité sur performance cache.
- **Preuve** : Pas de métriques Redis trouvées.
- **Cause Racine** : Métriques Redis non exposées.
- **Fix Minimal** : Exposer métriques Redis via Prometheus: `veza_redis_hit_rate`, `veza_redis_latency_ms`, etc.
- **Plan Validation** :
- Test: Requêtes avec cache → métriques Redis doivent refléter hits/misses
- Commande: `curl http://localhost:8080/api/v1/metrics | grep redis`
- **Effet de Bord** : Aucun
- **Effort** : M (4h)
### MOD-P2-007: Pas de Redaction Automatique PII dans Logs
- **ID** : `MOD-P2-007`
- **Titre** : Pas de redaction automatique PII (emails, user_ids dans logs)
- **Impact** : PII dans logs (RGPD compliance). Risque faible si logs sécurisés.
- **Preuve** : Logs peuvent contenir emails, user_ids sans redaction.
- **Cause Racine** : Redaction PII non implémentée.
- **Fix Minimal** : Ajouter redaction automatique PII dans logs (emails → `***@***`, user_ids → hash). OU documenter que logs sont sécurisés.
- **Plan Validation** :
- Test: Logger email → logs ne doivent pas contenir email en clair
- Commande: `grep -r "email" logs/` → emails doivent être redactés
- **Effet de Bord** : Aucun
- **Effort** : M (6h)
### MOD-P2-008: OpenTelemetry Pas Complètement Intégré
- **ID** : `MOD-P2-008`
- **Titre** : OpenTelemetry pas complètement intégré (traces manquantes)
- **Impact** : Distributed tracing limité. Pas de visibilité sur traces complètes.
- **Preuve** : `trace_id` et `span_id` supportés mais traces non générées.
- **Cause Racine** : OpenTelemetry partiellement intégré.
- **Fix Minimal** : Intégrer OpenTelemetry complet (traces, spans). OU documenter comme future amélioration.
- **Plan Validation** : N/A (feature additionnelle)
- **Effet de Bord** : Aucun
- **Effort** : L (12h)
### MOD-P2-009: Pas de Circuit Breakers
- **ID** : `MOD-P2-009`
- **Titre** : Pas de circuit breakers implémentés
- **Impact** : Pas de protection contre cascading failures. Risque faible (retries présents).
- **Preuve** : Pas de circuit breakers trouvés.
- **Cause Racine** : Feature non implémentée.
- **Fix Minimal** : Ajouter circuit breakers pour services externes (Chat Server, Stream Server). OU documenter comme future amélioration.
- **Plan Validation** : N/A (feature additionnelle)
- **Effet de Bord** : Aucun
- **Effort** : M (8h)
### MOD-P2-010: Pas de Rollback Automatique Migrations
- **ID** : `MOD-P2-010`
- **Titre** : Pas de rollback automatique migrations (migrations SQL seulement)
- **Impact** : Rollback manuel nécessaire en cas d'échec. Risque faible (migrations transactionnelles).
- **Preuve** : Migrations SQL n'ont pas de `.down.sql` correspondants.
- **Cause Racine** : Stratégie 100% SQL sans down migrations.
- **Fix Minimal** : Ajouter down migrations (`.down.sql`) OU documenter procédure rollback manuelle.
- **Plan Validation** : N/A (amélioration DX)
- **Effet de Bord** : Aucun
- **Effort** : L (16h pour toutes migrations)
---
## P3 - COSMÉTIQUE & REFACTORS
### MOD-P3-001: 90 TODOs/FIXMEs dans Code
- **ID** : `MOD-P3-001`
- **Titre** : 90 TODOs/FIXMEs dans code
- **Impact** : Dette technique. Maintenance difficile.
- **Preuve** : Grep trouve 90 TODOs/FIXMEs.
- **Cause Racine** : Features incomplètes, refactors différés.
- **Fix Minimal** : Trier TODOs par priorité, créer issues GitHub, résoudre progressivement.
- **Plan Validation** : N/A
- **Effet de Bord** : Aucun
- **Effort** : L (variable)
### MOD-P3-002: Duplication Handlers (legacy + modern)
- **ID** : `MOD-P3-002`
- **Titre** : Duplication handlers (`internal/handlers/` ET `internal/api/handlers/`)
- **Impact** : Confusion, maintenance difficile.
- **Preuve** : Handlers dans deux emplacements.
- **Cause Racine** : Migration legacy → modern incomplète.
- **Fix Minimal** : Consolider handlers dans `internal/api/handlers/`, supprimer `internal/handlers/` (si possible).
- **Plan Validation** : N/A
- **Effet de Bord** : Aucun
- **Effort** : M (8h)
### MOD-P3-003: Couplage Services → GORM Direct
- **ID** : `MOD-P3-003`
- **Titre** : Certains services appellent directement GORM (bypass repositories)
- **Impact** : Violation séparation couches. Maintenance difficile.
- **Preuve** : Services utilisent `db.GormDB` directement.
- **Cause Racine** : Refactor incomplet vers repositories.
- **Fix Minimal** : Migrer services vers repositories. OU documenter exceptions.
- **Plan Validation** : N/A
- **Effet de Bord** : Aucun
- **Effort** : L (variable)
---
# PHASE G - PLAN D'EXÉCUTION
## G.1 Checklist P0 (Ordre Strict)
1. **MOD-P0-001** : Fix CORS middleware (appliquer même si liste vide) - **1h**
2. **MOD-P0-002** : Fix tests config (vérifier erreur au lieu de panic) - **30min**
3. **MOD-P0-003** : Supprimer duplication timeout middleware - **5min**
**Total P0** : ~2h
## G.2 Checklist P1 (Par Lots Cohérents)
### Lot 1: Sécurité Uploads & Validation (1 sprint)
1. **MOD-P1-001** : Intégrer scan ClamAV (uploads) - **4h**
2. **MOD-P1-002** : Validation input systématique - **8h**
3. **MOD-P1-003** : Vérification ownership routes PUT/DELETE - **6h**
**Total Lot 1** : ~18h (2-3 jours)
### Lot 2: Robustesse & Observabilité (1 sprint)
4. **MOD-P1-004** : Scan vulnérabilités CI/CD - **2h**
5. **MOD-P1-005** : Vérifier stack traces logs prod - **1h**
6. **MOD-P1-006** : Fix /readyz (mode dégradé) - **4h**
7. **MOD-P1-007** : Fix goroutine leak timeout - **3h**
**Total Lot 2** : ~10h (1-2 jours)
**Total P1** : ~28h (3-5 jours)
## G.3 Quick Wins (≤ 1h chacun)
1. **MOD-P0-003** : Supprimer duplication timeout - **5min**
2. **MOD-P1-004** : Ajouter govulncheck CI/CD - **2h** (si CI/CD configuré)
3. **MOD-P2-001** : Documenter sanitization XSS - **1h**
**Total Quick Wins** : ~3h
## G.4 Tests à Ajouter en Priorité
1. **Tests Ownership** : Vérifier que users ne peuvent pas modifier ressources d'autres
2. **Tests ClamAV** : Vérifier rejet fichiers malveillants
3. **Tests Validation** : Vérifier rejet input invalide
4. **Tests CORS** : Vérifier comportement avec `CORS_ALLOWED_ORIGINS` vide
5. **Tests Timeout** : Vérifier timeout middleware (pas de leak)
## G.5 PR Plan
### PR 1: Fix P0 Critiques
- **Titre** : `fix(security): Fix CORS middleware and config tests (P0)`
- **Fichiers** : `internal/api/router.go`, `internal/config/config_test.go`
- **Tests** : Tests CORS, tests config
- **Taille** : Petite (~200 lignes)
### PR 2: Sécurité Uploads
- **Titre** : `feat(security): Add ClamAV scan for file uploads (P1)`
- **Fichiers** : `internal/handlers/upload.go`, `internal/services/upload_validator.go`
- **Tests** : Tests ClamAV (EICAR)
- **Taille** : Moyenne (~500 lignes)
### PR 3: Validation Input
- **Titre** : `feat(validation): Add systematic input validation (P1)`
- **Fichiers** : DTOs, middleware validation
- **Tests** : Tests validation tous endpoints
- **Taille** : Grande (~1000 lignes)
### PR 4: Ownership Verification
- **Titre** : `feat(security): Add ownership verification for PUT/DELETE (P1)`
- **Fichiers** : `internal/api/router.go`, handlers users/tracks
- **Tests** : Tests ownership
- **Taille** : Moyenne (~600 lignes)
### PR 5: Robustesse
- **Titre** : `feat(robustness): Fix /readyz and goroutine leak (P1)`
- **Fichiers** : `internal/handlers/health.go`, `internal/middleware/timeout.go`
- **Tests** : Tests health checks, tests timeout
- **Taille** : Moyenne (~400 lignes)
### PR 6: Observabilité (P2)
- **Titre** : `feat(observability): Add business and DB pool metrics (P2)`
- **Fichiers** : `internal/metrics/`, handlers
- **Tests** : Tests métriques
- **Taille** : Moyenne (~500 lignes)
---
## G.6 Estimation Totale
- **P0** : 2h
- **P1** : 28h
- **P2** : ~60h (optionnel)
- **P3** : Variable (refactors)
**Total Critique (P0+P1)** : ~30h (1 semaine développeur)
---
# CONCLUSION
**Module** : veza-backend-api (Backend Go)
**Status Global** : ✅ **Fonctionnel** avec **améliorations nécessaires**
**Points Forts** :
- ✅ Architecture solide (handlers → services → repositories)
- ✅ Sécurité JWT bien implémentée (HS256, token versioning, sessions DB)
- ✅ RBAC fonctionnel
- ✅ Observabilité de base (logs structurés, Prometheus, Sentry)
- ✅ Migrations SQL transactionnelles
**Points Faibles** :
- ⚠️ 3 problèmes P0 (CORS, tests, duplication)
- ⚠️ 7 problèmes P1 (sécurité uploads, validation, ownership, robustesse)
- ⚠️ 10+ problèmes P2 (observabilité, performance)
**Recommandation** : Corriger P0 immédiatement, puis P1 avant production, P2 progressivement.
---
**Fin du Rapport**