# 🚀 Prochaines Étapes - Plan d'Action **Date de création:** 2025-01-27 **Statut:** En cours de planification --- ## 📋 Vue d'Ensemble Ce document détaille les prochaines étapes pour finaliser le projet Veza après la fusion des frontends. Chaque section contient des actions concrètes, des fichiers à modifier, et des critères de validation. --- ## 1. 🧪 Tests : Créer les Tests Unitaires et d'Intégration ### 1.1 État Actuel - ✅ Vitest configuré (`vitest.config.ts`) - ✅ Playwright configuré (`playwright.config.ts`) - ✅ MSW configuré pour le mocking API - ⚠️ Couverture de tests ~40% (objectif: 80%+) - ⚠️ Tests unitaires manquants pour plusieurs services - ⚠️ Tests d'intégration partiels ### 1.2 Actions à Réaliser #### Tests Unitaires (Frontend) **Priorité 1 - Services critiques** - [ ] `src/services/apiClient.ts` - Tests pour intercepteurs, retry, error handling - [ ] `src/services/tokenRefresh.ts` - Tests pour refresh automatique, queue management - [ ] `src/services/authService.ts` - Tests pour login, logout, token management - [ ] `src/services/trackService.ts` - Tests pour upload, CRUD operations - [ ] `src/services/playlistService.ts` - Tests pour CRUD playlists **Priorité 2 - Hooks personnalisés** - [ ] `src/hooks/useAuth.ts` - Tests pour état auth, redirections - [ ] `src/hooks/useTracks.ts` - Tests pour fetching, caching, mutations - [ ] `src/hooks/usePlaylists.ts` - Tests pour gestion playlists - [ ] `src/hooks/useUpload.ts` - Tests pour upload par chunks, progress tracking **Priorité 3 - Composants métier** - [ ] `src/components/features/auth/LoginForm.tsx` - Tests pour validation, soumission - [ ] `src/components/features/tracks/TrackUpload.tsx` - Tests pour upload flow - [ ] `src/components/features/playlists/PlaylistManager.tsx` - Tests pour CRUD **Fichiers à créer:** ``` apps/web/src/services/__tests__/ ├── apiClient.test.ts ├── tokenRefresh.test.ts ├── authService.test.ts ├── trackService.test.ts └── playlistService.test.ts apps/web/src/hooks/__tests__/ ├── useAuth.test.ts ├── useTracks.test.ts ├── usePlaylists.test.ts └── useUpload.test.ts apps/web/src/components/features/__tests__/ ├── auth/ │ └── LoginForm.test.tsx ├── tracks/ │ └── TrackUpload.test.tsx └── playlists/ └── PlaylistManager.test.tsx ``` #### Tests d'Intégration **E2E avec Playwright** - [ ] Parcours complet d'authentification (register → login → logout) - [ ] Upload de track complet (initiate → chunks → complete) - [ ] Gestion de playlist (création → ajout tracks → suppression) - [ ] Navigation et routing - [ ] Gestion d'erreurs (network errors, validation errors) **Fichiers à créer/modifier:** ``` apps/web/e2e/ ├── auth-flow.spec.ts # Parcours auth complet ├── track-upload.spec.ts # Upload par chunks ├── playlist-flow.spec.ts # CRUD playlists ├── navigation.spec.ts # Routing et navigation └── error-handling.spec.ts # Gestion d'erreurs ``` #### Tests Backend (Go) **Tests d'intégration existants à compléter:** - [ ] `tests/integration/auth_test.go` - Compléter tests refresh token avec cookies - [ ] `tests/integration/track_test.go` - Tests upload par chunks complets - [ ] `tests/integration/playlist_test.go` - Tests CRUD playlists **Commandes pour exécuter les tests:** ```bash # Tests unitaires frontend cd apps/web npm run test:unit # Tests E2E frontend npm run test:e2e # Tests backend unitaires cd veza-backend-api go test ./internal/... -v # Tests backend intégration go test ./tests/integration/... -tags integration -v ``` ### 1.3 Critères de Validation - ✅ Couverture de code ≥ 80% pour les services critiques - ✅ Tous les tests unitaires passent - ✅ Tous les tests E2E passent - ✅ Tests d'intégration backend passent - ✅ CI/CD intégré avec exécution automatique des tests --- ## 2. ⚙️ Configuration : Variables d'Environnement ### 2.1 Objectif Ajouter les variables d'environnement nécessaires pour gérer les cookies sécurisés, notamment `Secure=false` en développement local. ### 2.2 Variables à Ajouter #### Backend (`veza-backend-api`) **Fichier:** `veza-backend-api/.env.example` et `veza-backend-api/internal/config/config.go` ```env # Cookie Security Settings COOKIE_SECURE=false # true en production, false en dev local COOKIE_SAME_SITE=strict # strict, lax, ou none COOKIE_DOMAIN= # vide pour domaine actuel COOKIE_HTTP_ONLY=true # toujours true pour refresh_token COOKIE_PATH=/ # chemin du cookie ``` **Modifications dans `internal/config/config.go`:** ```go type Config struct { // ... existing fields ... // Cookie settings CookieSecure bool `env:"COOKIE_SECURE" envDefault:"false"` CookieSameSite string `env:"COOKIE_SAME_SITE" envDefault:"strict"` CookieDomain string `env:"COOKIE_DOMAIN" envDefault:""` CookieHttpOnly bool `env:"COOKIE_HTTP_ONLY" envDefault:"true"` CookiePath string `env:"COOKIE_PATH" envDefault:"/"` } // Helper method to get http.SameSite from string func (c *Config) GetCookieSameSite() http.SameSite { switch c.CookieSameSite { case "lax": return http.SameSiteLaxMode case "none": return http.SameSiteNoneMode default: return http.SameSiteStrictMode } } // Helper to determine if cookie should be secure based on environment func (c *Config) ShouldUseSecureCookies() bool { if c.CookieSecure { return true } // Auto-detect: secure in production, insecure in development return c.Environment == "production" } ``` **Modifications dans `internal/handlers/auth.go`:** ```go // Dans Login handler cookieSecure := cfg.ShouldUseSecureCookies() c.SetCookie( "refresh_token", tokens.RefreshToken, int(refreshTokenExpires.Seconds()), cfg.CookiePath, cfg.CookieDomain, cookieSecure, cfg.CookieHttpOnly, ) c.SetSameSite(cfg.GetCookieSameSite()) ``` #### Frontend (`apps/web`) **Fichier:** `apps/web/.env.example` et `apps/web/.env.local` ```env # API Configuration VITE_API_URL=http://localhost:8080 VITE_API_BASE_PATH=/api/v1 # Environment VITE_APP_ENV=development # Cookie Configuration (pour référence, géré par backend) # Les cookies sont gérés par le backend via Set-Cookie headers # Le frontend doit simplement activer withCredentials dans les requêtes ``` **Vérification dans `src/services/apiClient.ts`:** ```typescript // S'assurer que withCredentials est activé const apiClient = axios.create({ baseURL: import.meta.env.VITE_API_URL + import.meta.env.VITE_API_BASE_PATH, withCredentials: true, // ✅ Nécessaire pour les cookies httpOnly headers: { 'Content-Type': 'application/json', }, }); ``` #### Docker Compose **Fichier:** `docker-compose.yml` (dev) et `docker-compose.prod.yml` (production) ```yaml # docker-compose.yml (development) services: backend-api: environment: - APP_ENV=development - COOKIE_SECURE=false # ✅ false en dev local - COOKIE_SAME_SITE=lax # lax pour permettre localhost - COOKIE_DOMAIN= - COOKIE_HTTP_ONLY=true - COOKIE_PATH=/ # docker-compose.prod.yml (production) services: backend-api: environment: - APP_ENV=production - COOKIE_SECURE=true # ✅ true en production - COOKIE_SAME_SITE=strict # strict pour sécurité maximale - COOKIE_DOMAIN=.veza.app # domaine de production - COOKIE_HTTP_ONLY=true - COOKIE_PATH=/ ``` ### 2.3 Fichiers à Modifier - [ ] `veza-backend-api/.env.example` - Ajouter variables cookies - [ ] `veza-backend-api/internal/config/config.go` - Ajouter struct CookieConfig - [ ] `veza-backend-api/internal/handlers/auth.go` - Utiliser config cookies - [ ] `apps/web/.env.example` - Documenter variables frontend - [ ] `docker-compose.yml` - Ajouter variables dev - [ ] `docker-compose.prod.yml` - Ajouter variables production - [ ] `docs/ENV_CONFIG.md` - Mettre à jour documentation ### 2.4 Critères de Validation - ✅ Variables d'environnement documentées dans `.env.example` - ✅ Cookies `Secure=false` en développement local - ✅ Cookies `Secure=true` en production - ✅ Tests passent avec les nouvelles configurations - ✅ Documentation mise à jour --- ## 3. 📚 Documentation : Mettre à Jour la Documentation API ### 3.1 État Actuel - ✅ Swagger/OpenAPI configuré (`/swagger/index.html`) - ✅ Documentation générée dans `veza-backend-api/docs/` - ⚠️ Certains handlers manquent d'annotations Swagger - ⚠️ Documentation des cookies httpOnly à ajouter - ⚠️ Exemples de requêtes/réponses à compléter ### 3.2 Actions à Réaliser #### Compléter les Annotations Swagger **Handlers manquants d'annotations:** - [ ] `internal/handlers/audit.go` - `SearchLogs`, `GetStats`, `GetSuspiciousActivity` - [ ] `internal/handlers/webhook_handlers.go` - Tous les handlers webhooks - [ ] `internal/handlers/comment_handler.go` - Handlers commentaires - [ ] `internal/handlers/analytics_handler.go` - Handlers analytics **Exemple d'annotation à ajouter:** ```go // @Summary User Login // @Description Authenticate user and return access token. Refresh token is set in httpOnly cookie. // @Tags Auth // @Accept json // @Produce json // @Param request body dto.LoginRequest true "Login Credentials" // @Success 200 {object} dto.LoginResponse "Access token returned in body, refresh token in httpOnly cookie" // @Failure 400 {object} handlers.APIResponse "Validation error" // @Failure 401 {object} handlers.APIResponse "Invalid credentials" // @Router /auth/login [post] func (h *AuthHandler) Login(c *gin.Context) { // ... } ``` #### Documenter les Cookies httpOnly **Fichier:** `veza-backend-api/docs/API_DOCUMENTATION.md` Ajouter section: ```markdown ## Authentication Cookies ### Refresh Token Cookie After successful login or token refresh, a `refresh_token` cookie is set with the following properties: - **Name:** `refresh_token` - **HttpOnly:** `true` (not accessible via JavaScript) - **Secure:** `true` in production, `false` in development - **SameSite:** `strict` (prevents CSRF attacks) - **Path:** `/` - **Max-Age:** 30 days (or 90 days if "remember me" is selected) **Important:** The refresh token is NOT returned in the JSON response body for security reasons. It is only available as an httpOnly cookie. ### Using Refresh Token To refresh your access token, make a POST request to `/auth/refresh`: ```bash curl -X POST http://localhost:8080/api/v1/auth/refresh \ -H "Content-Type: application/json" \ --cookie "refresh_token=" \ -b cookies.txt -c cookies.txt ``` The new access token will be returned in the response body, and a new refresh token cookie will be set. ``` #### Mettre à Jour les Exemples - [ ] Ajouter exemples avec cookies dans `docs/API_DOCUMENTATION.md` - [ ] Mettre à jour Postman collection (`tools/tests/http/postman_collection.json`) - [ ] Ajouter exemples curl avec `--cookie` flag - [ ] Documenter les changements de comportement (refresh token dans cookie vs body) ### 3.3 Fichiers à Modifier - [ ] `veza-backend-api/internal/handlers/audit.go` - Ajouter annotations Swagger - [ ] `veza-backend-api/internal/handlers/webhook_handlers.go` - Ajouter annotations - [ ] `veza-backend-api/internal/handlers/comment_handler.go` - Ajouter annotations - [ ] `veza-backend-api/docs/API_DOCUMENTATION.md` - Documenter cookies - [ ] `veza-backend-api/docs/docs.go` - Régénérer après ajout annotations - [ ] `tools/tests/http/postman_collection.json` - Mettre à jour collection ### 3.4 Génération de la Documentation ```bash # Installer swag si nécessaire go install github.com/swaggo/swag/cmd/swag@latest # Générer la documentation Swagger cd veza-backend-api swag init -g cmd/api/main.go # Vérifier la documentation # Démarrer le serveur et visiter http://localhost:8080/swagger/index.html ``` ### 3.5 Critères de Validation - ✅ Tous les handlers ont des annotations Swagger complètes - ✅ Documentation des cookies httpOnly ajoutée - ✅ Exemples de requêtes mis à jour - ✅ Swagger UI affiche tous les endpoints correctement - ✅ Postman collection à jour --- ## 4. 🚢 Déploiement : Tester en Staging Avant Production ### 4.1 Environnements - **Development:** `http://localhost:8080` (local) - **Staging:** `https://staging-api.veza.app` (à configurer) - **Production:** `https://api.veza.app` (production) ### 4.2 Checklist de Déploiement Staging #### Pré-déploiement - [ ] Tous les tests passent (unitaires + intégration + E2E) - [ ] Code review effectué - [ ] Variables d'environnement staging configurées - [ ] Base de données staging migrée - [ ] Documentation à jour #### Configuration Staging **Fichier:** `docker-compose.staging.yml` (à créer) ```yaml version: '3.8' services: backend-api: build: context: ./veza-backend-api environment: - APP_ENV=staging - DATABASE_URL=${STAGING_DATABASE_URL} - REDIS_URL=${STAGING_REDIS_URL} - JWT_SECRET=${STAGING_JWT_SECRET} - COOKIE_SECURE=true - COOKIE_SAME_SITE=strict - CORS_ALLOWED_ORIGINS=https://staging.veza.app ports: - "8080:8080" depends_on: - postgres - redis frontend: build: context: ./apps/web environment: - VITE_API_URL=https://staging-api.veza.app - VITE_APP_ENV=staging ports: - "3000:3000" ``` #### Tests de Validation Staging **Tests fonctionnels:** - [ ] Authentification complète (register → login → logout) - [ ] Refresh token avec cookies httpOnly - [ ] Upload de track par chunks - [ ] CRUD playlists - [ ] Navigation et routing - [ ] Gestion d'erreurs **Tests de performance:** - [ ] Temps de réponse API < 500ms (p95) - [ ] Upload de fichiers fonctionne correctement - [ ] WebSocket chat fonctionne - [ ] Pas de fuites mémoire **Tests de sécurité:** - [ ] Cookies httpOnly fonctionnent - [ ] CORS configuré correctement - [ ] HTTPS forcé - [ ] Headers de sécurité présents #### Script de Déploiement **Fichier:** `scripts/deploy-staging.sh` (à créer) ```bash #!/bin/bash set -e echo "🚀 Déploiement en staging..." # Vérifier que les tests passent echo "📋 Exécution des tests..." npm run test:unit npm run test:e2e cd veza-backend-api && go test ./... && cd .. # Build des images Docker echo "🔨 Build des images..." docker-compose -f docker-compose.staging.yml build # Déploiement echo "🚢 Déploiement..." docker-compose -f docker-compose.staging.yml up -d # Vérification santé echo "🏥 Vérification santé..." sleep 10 curl -f https://staging-api.veza.app/health || exit 1 echo "✅ Déploiement staging réussi!" ``` ### 4.3 Rollback Plan En cas de problème en staging: ```bash # Rollback vers version précédente docker-compose -f docker-compose.staging.yml down git checkout docker-compose -f docker-compose.staging.yml up -d ``` ### 4.4 Critères de Validation - ✅ Application déployée en staging sans erreurs - ✅ Tous les tests fonctionnels passent en staging - ✅ Performance acceptable - ✅ Sécurité validée - ✅ Documentation de déploiement à jour --- ## 5. 📊 Monitoring : Surveiller les Performances Après Déploiement ### 5.1 Métriques à Surveiller #### Métriques Application - **Temps de réponse API:** p50, p95, p99 - **Taux d'erreur:** 4xx, 5xx - **Throughput:** Requêtes/seconde - **Taux de succès:** % de requêtes réussies #### Métriques Infrastructure - **CPU:** Utilisation moyenne et pics - **Mémoire:** Utilisation et fuites - **Disque:** Espace utilisé, IOPS - **Réseau:** Bande passante, latence #### Métriques Métier - **Authentification:** Taux de login réussis, échecs - **Upload:** Taux de succès upload, temps moyen - **Playlists:** Créations, modifications - **Utilisateurs actifs:** DAU, MAU ### 5.2 Outils de Monitoring #### Backend (Go) **Options:** - Prometheus + Grafana (recommandé) - Datadog - New Relic - Custom logging + ELK stack **Implémentation Prometheus:** ```go // Dans veza-backend-api/internal/middleware/metrics.go import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) var ( httpRequestsTotal = promauto.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "endpoint", "status"}, ) httpRequestDuration = promauto.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "HTTP request duration in seconds", }, []string{"method", "endpoint"}, ) ) // Middleware pour collecter les métriques func MetricsMiddleware() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() c.Next() duration := time.Since(start).Seconds() httpRequestsTotal.WithLabelValues( c.Request.Method, c.FullPath(), strconv.Itoa(c.Writer.Status()), ).Inc() httpRequestDuration.WithLabelValues( c.Request.Method, c.FullPath(), ).Observe(duration) } } ``` #### Frontend (React) **Options:** - Sentry (erreurs) - Google Analytics / Plausible (analytics) - Custom metrics avec API **Implémentation Sentry:** ```typescript // Dans apps/web/src/lib/sentry.ts import * as Sentry from "@sentry/react"; Sentry.init({ dsn: import.meta.env.VITE_SENTRY_DSN, environment: import.meta.env.VITE_APP_ENV, tracesSampleRate: 1.0, beforeSend(event) { // Filtrer les erreurs en développement if (import.meta.env.DEV) { console.error(event); return null; } return event; }, }); ``` ### 5.3 Dashboards à Créer #### Dashboard Principal (Grafana) **Métriques à afficher:** - Graphique: Temps de réponse API (p50, p95, p99) - Graphique: Taux d'erreur (4xx, 5xx) - Graphique: Throughput (req/s) - Graphique: CPU et mémoire - Tableau: Top endpoints par latence - Alerte: Taux d'erreur > 5% #### Dashboard Métier - Graphique: Utilisateurs actifs (DAU, MAU) - Graphique: Uploads par jour - Graphique: Taux de succès authentification - Graphique: Créations de playlists ### 5.4 Alertes à Configurer **Alertes critiques:** - [ ] Taux d'erreur 5xx > 5% pendant 5 minutes - [ ] Temps de réponse p95 > 1s pendant 10 minutes - [ ] CPU > 80% pendant 10 minutes - [ ] Mémoire > 90% pendant 5 minutes - [ ] Service down (health check échoue) **Alertes warning:** - [ ] Taux d'erreur 4xx > 10% pendant 15 minutes - [ ] Temps de réponse p95 > 500ms pendant 15 minutes - [ ] Disque > 80% utilisé ### 5.5 Fichiers à Créer/Modifier - [ ] `veza-backend-api/internal/middleware/metrics.go` - Middleware Prometheus - [ ] `veza-backend-api/cmd/api/main.go` - Exposer endpoint `/metrics` - [ ] `docker-compose.prod.yml` - Ajouter Prometheus et Grafana - [ ] `apps/web/src/lib/sentry.ts` - Configuration Sentry - [ ] `grafana/dashboards/main.json` - Dashboard principal - [ ] `grafana/dashboards/business.json` - Dashboard métier - [ ] `prometheus/alerts.yml` - Règles d'alertes ### 5.6 Critères de Validation - ✅ Métriques collectées et exposées - ✅ Dashboards créés et configurés - ✅ Alertes configurées et testées - ✅ Monitoring actif en production - ✅ Documentation du monitoring à jour --- ## 📅 Planning Suggéré ### Semaine 1: Tests et Configuration - **Jour 1-2:** Tests unitaires services critiques - **Jour 3:** Configuration variables d'environnement - **Jour 4-5:** Tests d'intégration et E2E ### Semaine 2: Documentation et Staging - **Jour 1-2:** Compléter documentation API - **Jour 3:** Configuration staging - **Jour 4-5:** Tests et validation staging ### Semaine 3: Monitoring et Production - **Jour 1-2:** Configuration monitoring - **Jour 3:** Dashboards et alertes - **Jour 4-5:** Déploiement production et surveillance --- ## ✅ Checklist Globale ### Tests - [ ] Tests unitaires services critiques créés - [ ] Tests d'intégration complets - [ ] Tests E2E Playwright fonctionnels - [ ] Couverture ≥ 80% ### Configuration - [ ] Variables d'environnement documentées - [ ] Cookies Secure=false en dev, true en prod - [ ] Configuration staging prête - [ ] Configuration production prête ### Documentation - [ ] Annotations Swagger complètes - [ ] Documentation cookies httpOnly - [ ] Exemples de requêtes mis à jour - [ ] Guide de déploiement à jour ### Déploiement - [ ] Staging déployé et validé - [ ] Tests fonctionnels staging passent - [ ] Performance staging acceptable - [ ] Production prête pour déploiement ### Monitoring - [ ] Métriques collectées - [ ] Dashboards configurés - [ ] Alertes configurées - [ ] Monitoring actif --- ## 📝 Notes - Ce document doit être mis à jour au fur et à mesure de l'avancement - Les priorités peuvent être ajustées selon les besoins - Chaque section peut être traitée en parallèle par différentes équipes --- **Dernière mise à jour:** 2025-01-27 **Prochaine révision:** Après déploiement staging