# Veza Backend API **Version**: 1.2.0 **Language**: Go 1.23+ **Framework**: Gin **Database**: PostgreSQL (GORM) **License**: Apache 2.0 --- ## 📋 Table des MatiĂšres 1. [Vue d'ensemble](#vue-densemble) 2. [Installation](#installation) 3. [Configuration](#configuration) 4. [Architecture](#architecture) 5. [API Endpoints](#api-endpoints) 6. [DĂ©veloppement](#dĂ©veloppement) 7. [Tests](#tests) 8. [DĂ©ploiement](#dĂ©ploiement) 9. [IntĂ©gration avec autres services](#intĂ©gration-avec-autres-services) --- ## 🎯 Vue d'ensemble **Veza Backend API** est le serveur HTTP principal de la plateforme Veza (audio collaborative). Il expose une API REST pour : - **Authentification & Autorisation** : JWT, sessions, RBAC - **Gestion Utilisateurs** : Profils, settings, completion - **Gestion Tracks** : Upload, streaming, mĂ©tadonnĂ©es, likes, partage - **Playlists** : CrĂ©ation, collaboration, tracks - **Marketplace** : Produits, commandes, tĂ©lĂ©chargements - **Chat** : GĂ©nĂ©ration de tokens JWT pour WebSocket (dĂ©lĂ©guĂ© au Chat Server Rust) - **Audit & Monitoring** : Logs, mĂ©triques Prometheus, health checks - **Webhooks** : SystĂšme d'Ă©vĂ©nements asynchrones **RĂŽle dans Veza** : - **Backend Go** : API REST principale (port 8080) - **Frontend React** : Consommateur de l'API REST - **Chat Server Rust** : WebSocket (port 8081) — reçoit tokens JWT depuis `/api/v1/chat/token` - **Stream Server Rust** : Streaming audio WebRTC (port 8082) — reçoit callbacks depuis `/api/v1/internal/tracks/:id/stream-ready` --- ## 🚀 Installation ### PrĂ©requis - **Go** 1.23 ou supĂ©rieur - **PostgreSQL** 12+ (base de donnĂ©es principale) - **Redis** (optionnel, pour cache et rate limiting) - **ClamAV** (optionnel, pour scan antivirus des uploads) - **RabbitMQ** (optionnel, pour event bus) ### Installation depuis les sources ```bash # Cloner le repository git clone cd veza-backend-api # Installer les dĂ©pendances go mod download # Build make build # Ou build pour Linux make build-linux ``` ### Installation via Docker ```bash # Build image make docker-build # Run container make docker-run ``` --- ## ⚙ Configuration ### Variables d'Environnement Requises ```bash # REQUIS - SĂ©curitĂ© JWT_SECRET=<32+ chars> # Secret JWT (minimum 32 caractĂšres) DATABASE_URL=postgres://user:pass@host:5432/dbname # URL PostgreSQL APP_ENV=production # development|staging|production # REQUIS en production CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com # Origines CORS autorisĂ©es # Optionnel - Base de donnĂ©es DB_MAX_RETRIES=5 # Nombre de tentatives de connexion DB DB_RETRY_INTERVAL=5s # Intervalle entre tentatives # Optionnel - Redis REDIS_URL=redis://localhost:6379 # URL Redis REDIS_ENABLE=true # Activer/dĂ©sactiver Redis # Optionnel - RabbitMQ RABBITMQ_URL=amqp://guest:guest@localhost:5672/ # URL RabbitMQ RABBITMQ_ENABLE=true # Activer/dĂ©sactiver RabbitMQ RABBITMQ_MAX_RETRIES=3 # Tentatives de connexion RABBITMQ_RETRY_INTERVAL=2s # Intervalle entre tentatives # Optionnel - ClamAV CLAMAV_REQUIRED=true # Rejeter uploads si ClamAV down (true) ou accepter en mode dĂ©gradĂ© (false) CLAMAV_ADDRESS=localhost:3310 # Adresse ClamAV # Optionnel - Uploads UPLOAD_DIR=uploads # RĂ©pertoire d'upload MAX_CONCURRENT_UPLOADS=10 # Limite uploads simultanĂ©s (backpressure) # Optionnel - Serveur APP_PORT=8080 # Port HTTP (dĂ©faut: 8080) HANDLER_TIMEOUT=30s # Timeout global handlers # Optionnel - JWT JWT_ISSUER=veza-api # Issuer claim JWT_AUDIENCE=veza-app # Audience claim CHAT_JWT_SECRET= # Secret pour tokens Chat (fallback: JWT_SECRET) # Optionnel - Rate Limiting RATE_LIMIT_LIMIT=100 # Limite requĂȘtes RATE_LIMIT_WINDOW=60 # FenĂȘtre en secondes AUTH_RATE_LIMIT_LOGIN_ATTEMPTS=5 # Tentatives login max AUTH_RATE_LIMIT_LOGIN_WINDOW=1 # FenĂȘtre login en minutes # Optionnel - Sentry SENTRY_DSN=https://... # DSN Sentry pour error tracking SENTRY_ENVIRONMENT=production # Environnement Sentry SENTRY_SAMPLE_RATE_ERRORS=1.0 # Sample rate erreurs (0.0-1.0) SENTRY_SAMPLE_RATE_TRANSACTIONS=0.1 # Sample rate transactions (0.0-1.0) # Optionnel - Logging LOG_LEVEL=INFO # DEBUG|INFO|WARN|ERROR # Optionnel - Services externes STREAM_SERVER_URL=http://localhost:8082 # URL Stream Server STREAM_SERVER_INTERNAL_API_KEY= # ClĂ© partagĂ©e pour callbacks stream-ready (doit correspondre Ă  INTERNAL_API_KEY du Stream Server) CHAT_SERVER_URL=http://localhost:8081 # URL Chat Server # DEV/TEST UNIQUEMENT - Ne jamais utiliser en production # CSRF_DISABLED=true # DĂ©sactive CSRF (dev/test seulement) # BYPASS_CONTENT_CREATOR_ROLE=true # Bypass vĂ©rification rĂŽle crĂ©ateur (dev/test seulement) # DISABLE_RATE_LIMIT_FOR_TESTS=true # DĂ©sactive rate limiting (E2E/integration tests seulement) ``` ### Fichiers de Configuration - `.env` : Variables d'environnement (optionnel, chargĂ© via `godotenv`) - `.env.{APP_ENV}` : Variables spĂ©cifiques Ă  l'environnement - `migrations/*.sql` : Migrations SQL (exĂ©cutĂ©es au dĂ©marrage) ### Validation de Configuration La configuration est validĂ©e au dĂ©marrage : - **Production** : `CORS_ALLOWED_ORIGINS` est **REQUIS** (fail-fast si vide) - **JWT_SECRET** : Minimum 32 caractĂšres (fail-fast si trop court) - **DATABASE_URL** : Requis pour tous les environnements --- ## đŸ—ïž Architecture ### Structure du Projet ``` veza-backend-api/ ├── cmd/ │ └── api/ │ └── main.go # Point d'entrĂ©e ├── internal/ │ ├── api/ # Routes et configuration router │ ├── core/ # Business logic (auth, track, marketplace, social) │ │ ├── auth/ # Authentification │ │ ├── track/ # Gestion tracks │ │ ├── marketplace/ # Marketplace │ │ └── social/ # Social features │ ├── config/ # Configuration (env, validation, secrets) │ ├── database/ # DB connection, migrations, pool │ ├── handlers/ # HTTP handlers (legacy + modern) │ ├── middleware/ # Auth, CORS, rate limiting, recovery, metrics │ ├── models/ # GORM models (User, Track, Playlist, etc.) │ ├── repositories/ # Data access layer (GORM) │ ├── services/ # Business services (JWT, Session, Upload, etc.) │ ├── workers/ # Background jobs (webhooks, analytics) │ ├── metrics/ # Prometheus metrics │ ├── monitoring/ # Business metrics (tracks_uploaded, users_registered) │ ├── logging/ # Structured logging (zap) │ └── validators/ # Input validation ├── migrations/ # Migrations SQL ├── tests/ # Tests d'intĂ©gration ├── docs/ # Documentation └── Makefile # Commandes build/test ``` ### Patterns **Pattern Moderne** (recommandĂ©) : - Handlers dans `internal/core/*/handler.go` - Services dans `internal/core/*/service.go` - Utilisation de `context.Context` pour timeouts - Gestion d'erreurs via `internal/errors` **Pattern Legacy** (dĂ©prĂ©ciĂ©) : - Handlers dans `internal/handlers/*.go` - Migration progressive vers pattern moderne ### DĂ©pendances Internes - `internal/errors` : Error handling uniforme - `internal/response` : RĂ©ponses HTTP standardisĂ©es - `internal/common` : Types et utilitaires communs ### DĂ©pendances Externes - **PostgreSQL** : Base principale (GORM + `database/sql`) - **Redis** : Cache, rate limiting, sessions (optionnel) - **RabbitMQ** : Event bus (optionnel) - **ClamAV** : Scan antivirus uploads (optionnel) - **Sentry** : Error tracking (optionnel) --- ## 🌐 API Endpoints ### Base URL ``` http://localhost:8080/api/v1 ``` ### Routes Principales #### Authentification (`/auth`) ``` POST /auth/register # Inscription POST /auth/login # Connexion (rate limited) POST /auth/refresh # Renouvellement token POST /auth/verify-email # VĂ©rification email POST /auth/resend-verification # Renvoyer vĂ©rification GET /auth/check-username # VĂ©rifier disponibilitĂ© username POST /auth/password/reset-request # Demande reset password POST /auth/password/reset # Reset password POST /auth/logout # DĂ©connexion (protĂ©gĂ©) GET /auth/me # Profil utilisateur (protĂ©gĂ©) ``` #### Utilisateurs (`/users`) ``` GET /users/:id # Profil utilisateur GET /users/by-username/:username # Profil par username PUT /users/:id # Mise Ă  jour profil (protĂ©gĂ©, ownership) GET /users/:id/completion # ComplĂ©tion profil (protĂ©gĂ©) ``` #### Tracks (`/tracks`) ``` GET /tracks # Liste tracks GET /tracks/:id # DĂ©tails track GET /tracks/:id/stats # Statistiques track GET /tracks/:id/history # Historique track GET /tracks/:id/download # TĂ©lĂ©chargement track GET /tracks/shared/:token # Track partagĂ© (public) POST /tracks # Upload track (protĂ©gĂ©, creator role) PUT /tracks/:id # Mise Ă  jour track (protĂ©gĂ©, ownership) DELETE /tracks/:id # Suppression track (protĂ©gĂ©, ownership) POST /tracks/:id/like # Like track (protĂ©gĂ©) DELETE /tracks/:id/like # Unlike track (protĂ©gĂ©) GET /tracks/:id/likes # Liste likes (protĂ©gĂ©) POST /tracks/:id/share # Partager track (protĂ©gĂ©) DELETE /tracks/share/:id # RĂ©voquer partage (protĂ©gĂ©) ``` #### Playlists (`/playlists`) ``` GET /playlists # Liste playlists GET /playlists/:id # DĂ©tails playlist POST /playlists # CrĂ©er playlist (protĂ©gĂ©) PUT /playlists/:id # Mettre Ă  jour playlist (protĂ©gĂ©) DELETE /playlists/:id # Supprimer playlist (protĂ©gĂ©) POST /playlists/:id/tracks # Ajouter track (protĂ©gĂ©) DELETE /playlists/:id/tracks/:track_id # Retirer track (protĂ©gĂ©) ``` #### Marketplace (`/marketplace`) ``` GET /marketplace/products # Liste produits POST /marketplace/products # CrĂ©er produit (protĂ©gĂ©, creator role) POST /marketplace/orders # CrĂ©er commande (protĂ©gĂ©) GET /marketplace/download/:product_id # URL tĂ©lĂ©chargement (protĂ©gĂ©) ``` #### Chat (`/chat`) ``` POST /chat/token # GĂ©nĂ©ration token WS (protĂ©gĂ©) ``` #### Admin (`/admin`) ``` GET /admin/audit/logs # Logs audit (protĂ©gĂ©, admin role) GET /admin/audit/stats # Statistiques audit (protĂ©gĂ©, admin role) GET /admin/audit/suspicious # ActivitĂ© suspecte (protĂ©gĂ©, admin role) GET /admin/debug/pprof/*path # Profiling pprof (protĂ©gĂ©, admin role) ``` #### Health & Monitoring ``` GET /health # Health check simple GET /healthz # Liveness probe (Kubernetes) GET /readyz # Readiness probe (DB, Redis, RabbitMQ) GET /status # Status dĂ©taillĂ© (DB, Redis, Chat, Stream) GET /metrics # Prometheus metrics ``` ### Authentification **JWT Bearer Token** : ``` Authorization: Bearer ``` **JWT Claims** : ```json { "sub": "uuid-v4", "iss": "veza-api", "aud": "veza-app", "exp": 1234567890, "iat": 1234567890, "token_version": 1, "role": "user" } ``` **RĂŽles** : `user`, `admin`, `creator`, `premium`, `artist`, `producer`, `label` --- ## đŸ’» DĂ©veloppement ### Commandes Build/Run ```bash # Build make build # Compile pour OS courant make build-linux # Compile pour Linux # Run make run # Build + run make dev # Mode dĂ©veloppement (go run) ``` ### Commandes QualitĂ© ```bash make lint # golangci-lint make vet # go vet make security # gosec + govulncheck ``` ### Mode DĂ©veloppement ```bash # DĂ©finir environnement export APP_ENV=development export LOG_LEVEL=DEBUG # Lancer make dev ``` --- ## đŸ§Ș Tests ### Tests Unitaires ```bash make test # Tests unitaires (sans integration) make test-coverage # Tests avec couverture ``` ### Tests d'IntĂ©gration ```bash make test-integration # Tests d'intĂ©gration (requiert Docker) ``` ### ExĂ©cution Manuelle ```bash # Tests unitaires go test ./... # Tests avec couverture go test ./... -cover # Tests d'intĂ©gration go test ./tests/integration/... -tags=integration ``` --- ## 🚱 DĂ©ploiement ### Docker ```bash # Build image docker build -t veza-backend-api . # Run container docker run -p 8080:8080 \ -e JWT_SECRET= \ -e DATABASE_URL=postgres://... \ -e APP_ENV=production \ -e CORS_ALLOWED_ORIGINS=https://app.veza.com \ veza-backend-api ``` ### Kubernetes Les health checks sont disponibles : - `/healthz` : Liveness probe - `/readyz` : Readiness probe ### Variables d'Environnement Production **REQUIS** : - `JWT_SECRET` (min 32 chars) - `DATABASE_URL` - `CORS_ALLOWED_ORIGINS` (fail-fast si vide en production) - `APP_ENV=production` **RecommandĂ©** : - `REDIS_ENABLE=true` - `RABBITMQ_ENABLE=true` - `CLAMAV_REQUIRED=true` - `SENTRY_DSN` (pour error tracking) --- ## 🔗 IntĂ©gration avec autres services ### Frontend React - Consomme `/api/v1/*` avec JWT Bearer tokens - Headers requis: `Authorization: Bearer ` - Content-Type: `application/json` ### Chat Server (Rust) - Reçoit tokens JWT depuis `/api/v1/chat/token` - Valide tokens avec `CHAT_JWT_SECRET` (ou `JWT_SECRET` si non dĂ©fini) - WebSocket endpoint: `ws://localhost:8081/ws` ### Stream Server (Rust) - Reçoit callbacks depuis `/api/v1/internal/tracks/:id/stream-ready` - Endpoint interne (pas de auth JWT, validation par IP/secret si nĂ©cessaire) ### SchĂ©ma DB / UUID - **UUID v4** : Tous les IDs utilisent `uuid.UUID` - Tables: `users`, `tracks`, `playlists`, `sessions`, `rooms`, `messages`, etc. --- ## 📊 Monitoring & ObservabilitĂ© ### MĂ©triques Prometheus ExposĂ©es via `/metrics` : - **HTTP** : `veza_http_requests_total`, `veza_http_request_duration_seconds` - **Auth** : `veza_auth_login_attempts_total`, `veza_auth_sessions_active` - **Database** : `veza_database_query_duration_seconds`, `veza_database_connections_active` - **Business** : `veza_tracks_uploaded_total`, `veza_users_registered_total`, `veza_playlists_created_total` - **Uploads** : `veza_file_uploads_total`, `veza_uploads_failed_total` ### Profiling - **pprof** : `/api/v1/admin/debug/pprof/*path` (protĂ©gĂ© par auth admin) ### Logs - **Structured Logging** : Zap (JSON en production) - **Request ID** : CorrĂ©lation des logs via `request_id` - **Niveaux** : DEBUG, INFO, WARN, ERROR --- ## 🔒 SĂ©curitĂ© ### Validation - **JWT Secret** : Minimum 32 caractĂšres (fail-fast au dĂ©marrage) - **CORS** : Strict en production (fail-fast si `CORS_ALLOWED_ORIGINS` vide) - **Input Validation** : Tags `validate` sur tous les DTOs - **Ownership Checks** : Middleware `RequireOwnershipOrAdmin` pour ressources sensibles ### Uploads - **ClamAV** : Scan antivirus (configurable via `CLAMAV_REQUIRED`) - **Backpressure** : Limite uploads simultanĂ©s (`MAX_CONCURRENT_UPLOADS`) - **Validation** : Type MIME, taille, extension ### Rate Limiting Rate limiting est **toujours actif** (A04). Limites par dĂ©faut selon l'environnement : | Environnement | Global (req/min) | Register (inscriptions/heure) | |---------------|------------------|------------------------------| | development, test | 1000 | 20 | | staging, production | 200 | 3 | - **Global** : `RATE_LIMIT_LIMIT` requĂȘtes par `RATE_LIMIT_WINDOW` secondes (override possible) - **Login** : `AUTH_RATE_LIMIT_LOGIN_ATTEMPTS` tentatives par `AUTH_RATE_LIMIT_LOGIN_WINDOW` minutes --- ## 📝 License Apache 2.0 --- ## đŸ€ Support - **Documentation API** : `/swagger/index.html` (Swagger UI) - **Issues** : [GitHub Issues](https://github.com/veza/veza-backend-api/issues)