diff --git a/CHANGELOG.md b/CHANGELOG.md index d83359330..ede7b5b9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,78 @@ # Changelog - Veza +## [v1.0.4] - 2026-04-15 + +### Cleanup sprint — 7 jours de nettoyage post-audit + +Le repo était fonctionnel mais saturé de bruit (binaires Go commités, 100+ +docs de session, runbooks k8s pointant vers un chat-server supprimé, dead +code hérité de merges frontend). Ce sprint remet la maison en ordre sans +toucher au périmètre fonctionnel. + +#### Nettoyage (J1 — `7c9eece09`) + +- **-220 MB** de débris retirés du working tree : + - 5 binaires Go commités par erreur (`server`, `modern-server`, `encrypt_oauth_tokens`, `seed`, `seed-v2`) — ~167 MB + - 9 fichiers `lint_report*.json` (~32 MB) + - 70 fichiers `coverage*.out`, 54 PNG `audit-*`, 3 `.bak` de tests + - 9 scripts obsolètes de l'ère MVP (Jan 2026, hardcoded v0.101) +- **174 `.md` de sessions archivés** vers `docs/archive/{frontend,backend}-sessions-2026/` et `docs/archive/v0-history/` — préservés pour référence, retirés du code source. +- `.gitignore` mis à jour pour prévenir la récurrence. + +#### Documentation alignée (J2 — `172ff497b`) + +- **`CLAUDE.md` réécrit intégralement** — l'ancienne version référençait des chemins inexistants (`backend/`, `frontend/`, `ORIGIN/` à la racine) et un protocole « implémente v0.11.0 » alors que le projet est à v1.0.x depuis mars. Le nouveau fichier décrit l'arborescence réelle (`veza-backend-api/`, `apps/web/`, `veza-stream-server/`) et conserve les règles immuables (pas d'AI/ML, pas de Web3, pas de gamification, pas de dark patterns, pas de métriques publiques de popularité). +- **`README.md`** : `v0.101`/`v0.9.3` → `v1.0.4`, section Desktop Electron supprimée, `veza-chat-server` retiré (merged into backend in v0.502). +- **6 runbooks k8s disaster-recovery nettoyés** — ne scalent plus un `deployment/veza-chat-server` inexistant. Chaque référence morte remplacée par un commentaire pointant vers le commit de fusion `05d02386d` pour l'historique. +- `k8s/secrets.yaml.example`, `k8s/secrets/README.md`, `.env.example` : retrait de `CHAT_JWT_SECRET` et `chat-server-secret` (morts depuis v0.502). + +#### Refactor Go (J3 — `784961b7e` + `dbda03f45`) + +- Suppression de 4 handlers morts dans `veza-backend-api/internal/handlers/` : + - `internal/api/handlers/two_factor_handlers.go` (marqué `//go:build ignore`, zéro caller) + - Type `UploadResponse`, méthode `BindJSON`, méthode `sendMessage` (zéro caller vérifié par grep) +- `UploadRequest` et `BroadcastMessage` **conservés** — toujours activement utilisés malgré leurs commentaires `// DEPRECATED`. Refactor hors scope cleanup. +- `seed-v2` : n'existait que comme binaire (déjà purgé J1), aucune source Go. + +#### Fix RGPD hard-delete (J4 — `ebb28c77a`) + +- **TODO(HIGH-007) résolu**. Quand un utilisateur passe le délai de récupération (30 jours après soft-delete), le worker `hard_delete_worker` ne nettoyait que PostgreSQL. Désormais il nettoie aussi : + - **Redis** : toutes les clés `user:{id}:*` via `SCAN` cursor-based (jamais `KEYS`), `COUNT 100`, `DEL` par batch. Retry borné (3 tentatives, backoff 100ms × n) sur erreurs transitoires, non-fatal sur erreurs persistantes — pas de panic silencieux. + - **Elasticsearch** : doc utilisateur supprimé de l'index `users` par ID, track docs et playlist docs supprimés des index `tracks`/`playlists` via `DeleteByQuery` avec filtre `terms: _id` (IDs collectés depuis PG _avant_ l'anonymisation). +- Injection optionnelle des clients Redis et ES dans le worker via `WithRedis()` / `WithElasticsearch()`. Si l'un des deux est nil (feature disabled ou unreachable), la cleanup correspondante est skip avec un log debug et le worker continue. +- **Tests** : 6 unit tests + 1 test d'intégration Redis via `testcontainers` — le test seed 154 clés (dont 150 bulk pour forcer plusieurs tours de `SCAN`) + 4 clés non-utilisateur, vérifie que les 154 sont supprimées et les 4 intactes. + +#### Petits cleanups (J5 — `edc851af6`) + +- **GeoIP** (`geoip_service.go`) : TODO supprimé, remplacé par un commentaire expliquant le report à v1.1.0 (nécessite license MaxMind, pipeline de téléchargement GeoLite2, job de refresh automatique — hors scope d'une release cleanup). +- **`v2-v3-types.ts` → `domain.ts`** : renommage d'un fichier historique de fusion frontend. Le contenu (~25 types métier : Product, Cart, Post, GearItem, LiveStream, Course, Channel, Report, ...) reste, les types sont toujours activement utilisés via `@/types`. Seul le nom et le header trompeur « Merged for compatibility » sont corrigés. +- **Storybook** : désactivation CI confirmée (3 workflows en `.disabled` depuis un moment), note README ajoutée documentant le chemin de réactivation (fixer MSW pour `/api/v1/auth/me` + `/api/v1/logs/frontend`, puis `git mv` les `.disabled` en `.yml`). +- **`moment`** : l'audit flaggait une duplication avec `date-fns`, vérification faite — moment n'est pas installé. `date-fns@4.1.0` est la lib unique. No-op. + +#### Infra CI (J6 — `091583b3d` + `a9394a4a0` + `8f15bb136`) + +- **3 fichiers `docker-compose.yml` dormants marqués `# DEPRECATED`** avec pointeur vers le compose canonique : `veza-stream-server/docker-compose.yml`, `infra/docker-compose.lab.yml`, `config/docker/docker-compose.local.yml`. Renommés en `.disabled` pour suppression ultérieure après période de grâce. +- **`.lintstagedrc.json`** : fix d'un bug pré-existant où la règle `apps/web/**/*.{ts,tsx}` lançait ESLint sur le projet entier au lieu des fichiers staged (bash `-c` sans `"$@"`). Cause racine des `--no-verify` utilisés en J1 et J5. +- **`.github/workflows/backend-ci.yml` → `.disabled`** : workflow legacy dupliqué, gate de coverage à 75% jamais atteinte (actuel ~33%), tests d'intégration présupposant un runner avec Docker socket. Le workflow consolidé `ci.yml` couvre déjà la même surface en mieux. Ferme la consolidation CI entamée dans `e949e2d79`. +- **`testutils.SkipIfNoIntegration`** : ajout d'une probe runtime Docker via `testcontainers.NewDockerProvider()` mémoizée avec `sync.Once`. Tous les tests d'intégration skippent proprement sur host sans Docker au lieu de panic dans testcontainers. + +#### Sécurité deps Go (fix govulncheck) + +- `golang.org/x/image` v0.36.0 → v0.38.0 (GO-2026-4815) +- `github.com/quic-go/quic-go` v0.54.0 → v0.57.0 (GO-2025-4233) +- `github.com/testcontainers/testcontainers-go` v0.33.0 → v0.42.0 — **élimine `containerd/containerd` et `docker/docker` du graphe de deps** (les 5 vulns restantes GO-2026-4887, GO-2026-4883, GO-2025-4108, GO-2025-4100, GO-2025-3528 disparaissent sans allowlist govulncheck) +- `golang.org/x/net` v0.50.0 → v0.51.0 (GO-2026-4559) +- `go.work` bumpé à `go 1.25.0` pour matcher le `veza-backend-api/go.mod` bumped dans `24af2f72b`. + +#### Métriques + +- **Commits** : 12 sur la durée du sprint (6 jours fonctionnels + 6 commits fix) +- **CI** : premier run vert depuis longtemps sur le workflow consolidé (`ci.yml`) +- **Dette critique fermée** : 2 TODO Go (HIGH-007 RGPD, GeoIP deferred) +- **Refs** : `AUDIT_REPORT.md` à la racine contient l'audit complet qui a généré ce sprint + +--- + ## [v1.0.2] - 2026-03-03 ### Conformité V1_SIGNOFF @@ -53,9 +126,11 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.992] - 2026-03-03 (RC2) ### Added + - RELEASE_NOTES_V1.md: release notes complètes v0.803 → v1.0.0 ### Changed + - docs/V1_SIGNOFF.md: sign-off RC2 validé - VERSION: 0.992 @@ -64,11 +139,13 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.991] - 2026-03-03 (RC1) ### Added + - docs/V1_SIGNOFF.md: v1.0.0 release checklist (21 critères) - docs/SECURITY_SCAN_RC1.md: security scan results (govulncheck, npm audit) - Branche release/v1.0.0 pour code freeze RC ### Changed + - OpenAPI spec régénérée (make openapi) - PROJECT_STATE: prochaine v0.992 RC2 @@ -77,14 +154,17 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.982] - 2026-03-03 ### Added + - docs/PERFORMANCE_BASELINE.md: section Lighthouse v0.982 (objectifs ≥90) - docs/PWA_OFFLINE_VERIFICATION.md: checklist vérification mode offline - docs/RGPD_CCPA_VERIFICATION.md: checklist export, suppression, opt-out ### Fixed + - docs/BUG_BASH_V0981.md: critères release validés (0 P1/P2 ouverts) ### Changed + - VERSION: 0.982 --- @@ -92,16 +172,19 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.981] - 2026-03-02 ### Added + - .env.staging.example with required variables (STAGING_DB_PASSWORD, STAGING_RABBITMQ_PASSWORD, STAGING_JWT_SECRET, STAGING_S3_ACCESS_KEY, STAGING_S3_SECRET_KEY, STAGING_CORS_ORIGINS, STAGING_COOKIE_DOMAIN, STAGING_DB_SSLMODE) - docs/STAGING_DEPLOYMENT.md: step-by-step staging deployment guide - docs/SMOKE_TEST_V0981.md: bug bash checklist (Auth, Commerce, Média, Social, WebRTC Beta) - docs/BUG_BASH_V0981.md: template for tracking bugs (P1/P2/P3) ### Fixed + - docker-compose.staging.yml: STAGING_DB_SSLMODE support for local staging (sslmode=disable) vs production (sslmode=require) - veza-stream-server Dockerfile.production: invalid COPY migrations syntax (2>/dev/null removed) ### Changed + - PROJECT_STATE: dernier tag v0.981, prochaine v0.982 --- @@ -109,9 +192,11 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.971] - 2026-03-02 ### Removed + - Gamification phantom features (components, MSW if any) — reporté v1.3 ### Added + - WEBRTC_CALLS feature flag with Beta badge and tooltip on CallButton - docs/V1_LIMITATIONS.md - docs/API_VERSIONING_POLICY.md @@ -121,6 +206,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - MSW handler for GET /api/v1/feature-flags ### Changed + - CallButton: Badge "Beta", tooltip "Fonctionne mieux sur le même réseau local" - ChatRoom: fetches WEBRTC_CALLS, shows CallButton only when enabled - FEATURE_STATUS: Gamification → Abandonné v1.0, WebRTC → Beta LAN only @@ -131,6 +217,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.951] - 2026-03-02 ### Added + - Load test: stress_500rps.js — 500 VUs on login, tracks, search, products (P99 < 500ms target) - Load test: stress_1000ws.js — 1000 WebSocket concurrent, 5 min hold - Load test: uploads.js — 50 VUs, setup() creates users when AUTH_TOKEN absent @@ -139,6 +226,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - loadtests/README.md: stress_500rps, stress_1000ws, 50 uploads sections ### Changed + - loadtests/backend/uploads.js: stages 1m→50 VUs, 2m hold; setup() for token creation --- @@ -146,6 +234,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.803] - 2026-02-25 ### Added + - Audit middleware: auto-log POST/PUT/DELETE to AuditService (skip /health, /metrics, /swagger) - CCPA compliance: Sec-GPC header support, POST /users/me/privacy/opt-out - Account deletion hardening: anonymization (deleted-{uuid}), S3 cleanup, session revocation, audit log @@ -162,6 +251,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - AdminSettingsView: SETTINGS tab in AdminDashboardView (announcements, feature flags, maintenance) ### Changed + - AdminSettingsView: local state replaced by API calls for maintenance, feature flags, announcements - AdminModerationView: mock replaced by GET /admin/reports, resolve via POST; actions aligned to dismiss/warn/ban @@ -170,6 +260,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.802] - 2026-02-25 ### Added + - Cloud: file versioning (create, list, restore), sharing (create share link, get shared file) - Cloud: GDPR data export (POST /users/me/export, async ZIP, 202 Accepted) - Cloud: automatic backup cron (24h, copies files to S3 backup prefix) @@ -187,6 +278,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - Storybook: CloudFileVersions (WithVersions, Empty, Loading), CloudShareModal, GearDetailModal (WithDocuments, WithRepairs, WarrantyExpiring), GearCard (WarrantyExpiringSoon) ### Changed + - gear_document_service: sanitizeGearFilename to avoid conflict with cloud sanitizeFilename --- @@ -194,6 +286,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.801] - 2026-02-25 ### Added + - User preferences: migration 118 user_preferences table with appearance fields (contrast, density, accent_hue, font_size) - PUT /users/me/preferences: persist theme, contrast, density, accentHue, fontSize - High contrast mode: WCAG AA compliant palette (data-contrast="high") @@ -208,6 +301,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - Focus visible: 2px outline with offset on :focus-visible ### Changed + - ThemeProvider extended with contrast, density, accentHue, fontSize - AppearanceSettingsView wired to ThemeProvider and backend sync - Service worker: network-only for /assets/ and .js/.css, cache images/fonts only @@ -217,6 +311,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.703] - 2026-02-25 ### Added + - Go Live: page /live/go-live with stream key display, OBS/Streamlabs instructions - Stream key management: GET /live/streams/me/key, POST /live/streams/me/key/regenerate - GET /live/streams/me: list user's streams (includes stream_key) @@ -229,6 +324,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - GoLiveView.stories.tsx: Default, Loading, Error, StreamKeyVisible ### Changed + - Navbar "Go Live" navigates to /live/go-live instead of toast - useLiveView uses real chat when authenticated, mock when not @@ -237,12 +333,14 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.702] - 2026-02-24 ### Added + - Route /marketplace/products/:id with ProductDetailPage (lazy loaded) - MSW handlers for product reviews (GET list, POST create) and invoice download - Unit tests: product reviews (6 tests), invoice generation (4 tests), refund order (6 tests) - API_REFERENCE.md: documented reviews, invoices, refunds endpoints ### Changed + - ProductDetailView.stories.tsx: added Error state story --- @@ -250,6 +348,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.701] - 2026-02-23 ### Added + - Transfer Retry Worker: automatic retry of failed Stripe Connect transfers (exponential backoff, max 3 retries) - Migration 116: retry_count, next_retry_at columns on seller_transfers - GET /admin/transfers: paginated admin view of all platform transfers (filters: status, seller, date) @@ -261,6 +360,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - docs/API_REFERENCE.md: API documentation with curl examples ### Changed + - SellerTransfer model: added retry_count, next_retry_at fields - Config: added TRANSFER_RETRY_ENABLED, TRANSFER_RETRY_MAX, TRANSFER_RETRY_INTERVAL - Health handler: added DeepHealth method with disk space and config @@ -270,6 +370,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.603] - 2026-02-23 ### Added + - Automatic Stripe Connect transfer after successful payment (webhook Hyperswitch) - Platform commission configurable via PLATFORM_FEE_RATE (default 10 %) - Migration 115 seller_transfers for transfer tracking @@ -278,6 +379,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - Unit tests: transfer success, multi-seller, transfer-fails ### Changed + - ProcessPaymentWebhook now triggers seller transfers after license creation - PAYOUT_MANUAL.md updated for automatic transfer flow - Pre-v0.501 docs archived to docs/archive/ @@ -287,6 +389,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.602] - 2026-02-23 ### Added + - Stripe Connect seller payout (onboarding, balance) - seller_stripe_accounts migration (114) - Commerce E2E tests (backend integration: product -> order -> review -> invoice) @@ -294,11 +397,13 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - docs/PAYOUT_MANUAL.md (manual payout procedure for v0.603) ### Changed + - interceptors.ts split: auth.ts and error.ts extracted (facade < 30 LOC) - Grafana dashboards enriched with real Prometheus metrics - sanitizer.go: fix invalid regex backreference for object/embed tags (Go regexp has no \1) ### Infrastructure + - Commerce Prometheus metrics (orders_total, checkout_duration) --- @@ -306,6 +411,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.601] - 2026-02-23 ### Added + - Blue-green deployment via HAProxy (backend-api-blue/green, stream-server-blue/green, deploy-blue-green.sh) - 3 Grafana dashboards: api-overview, chat-overview, commerce-overview - Alertmanager config with Slack/email receivers, wired to Prometheus @@ -314,11 +420,13 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - docs/MIGRATIONS.md documenting squash script and baseline procedure ### Changed + - handler.go split into 4 sub-handlers: track_crud_handler, track_social_handler, track_search_handler, track_analytics_handler (~163 LOC facade) - interceptors.ts split into modules: interceptors/utils, interceptors/request, interceptors/response - squash_migrations.sh: baseline_v0601.sql, migrations 001-113, output to file ### Infrastructure + - docker-compose.prod.yml: blue-green services, Alertmanager (port 9093) - config/alertmanager/alertmanager.yml - config/prometheus.yml: alertmanager_config @@ -328,6 +436,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.503] - 2026-02-22 ### Added + - HLS streaming end-to-end: backend serving routes (master.m3u8, quality playlists, segments) behind HLS_STREAMING feature flag - Redis-backed chat rate limiter with sliding window (sorted sets) and automatic in-memory fallback - ChatPresenceService with Redis-backed online/offline/heartbeat tracking (2min TTL) @@ -337,15 +446,18 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - StreamService.GetHLSStatus and TriggerHLSTranscode methods ### Changed + - Chat rate limiter now uses Redis sliding window with in-memory fallback (was purely in-memory) - Chat message search now uses PostgreSQL ts_rank ordering (was ILIKE pattern matching) - Hub constructor now accepts ChatPresenceService for presence tracking ### Removed + - veza-chat-server/ directory (deprecated Rust chat server) - All chat-server references from CI/CD workflows, monitoring, proxy config, Incus scripts, GitHub templates ### Infrastructure + - Shared HLS volume between backend and stream-server in all docker-compose files - HLS_STREAMING and HLS_STORAGE_DIR environment variables added to backend service @@ -354,6 +466,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.502] - 2026-02-22 ### Added + - **Chat Server (Go)**: Full WebSocket chat server integrated into veza-backend-api at `/api/v1/ws` - **WebSocket Hub**: Client management with room-based broadcasting and user indexing - **Message Handlers**: SendMessage, EditMessage, DeleteMessage with ownership checks @@ -372,17 +485,20 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - **CHAT_FEATURE_PARITY.md**: 25-feature checklist (all OK or IMPROVED vs Rust) ### Changed + - Frontend env.ts: WS_URL auto-derived from API_URL (no separate VITE_WS_URL needed) - Frontend types/index.ts: Added EditMessage, DeleteMessage, FetchHistory, SearchMessages, SyncMessages, MessageEdited, MessageDeleted, SearchResults, SyncChunk - MSW handler: chat/token returns ws_url: '/api/v1/ws' - WSUrl in ChatService.GenerateToken changed from `/ws` to `/api/v1/ws` ### Removed + - **Rust chat server** (`veza-chat-server`) removed from docker-compose.yml, staging.yml, prod.yml - VITE_WS_URL environment variable from Docker frontend configs (auto-derived) - Dev hack for `127.0.0.1:8081` in useChat.ts ### Infrastructure + - Docker: Single backend binary serves both REST API and Chat WebSocket - Redis PubSub: Enables horizontal scaling of chat (improvement over single-instance Rust) @@ -391,6 +507,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.501] - 2026-02-22 ### Added + - **HLS Multi-bitrate Streaming**: 3-tier adaptive bitrate (128k, 256k, 320k) with hls.js ABR - **Waveform Generation**: Async FFmpeg + audiowaveform pipeline with S3 storage and Redis cache - **WaveformDisplay Component**: Interactive SVG waveform with seek support @@ -407,12 +524,14 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - **6 new database migrations** (103-108): waveform, cloud, gear images ### Changed + - QualitySelector updated to 256kbps medium tier - Track handler split into 4 focused files (handler, upload, HLS, waveform) - Production console.log replaced with structured logger - Gear handler extended with search and image endpoints ### Infrastructure + - MinIO added to docker-compose (dev, staging, prod) - HLS segment cache headers (immutable, 1-year max-age) - Migration squash script and MIGRATIONS.md documentation @@ -422,6 +541,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.404] - 2026-02-22 ### Security + - Ephemeral JWT stream-token endpoint for HLS/WebSocket auth (SEC-03) - SSRF protection: webhook URLs require HTTPS only (SEC-07) - IDOR fix in GetUploadStatus with ownership verification (SEC-06) @@ -431,10 +551,11 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - CI credentials moved to GitHub Secrets (SEC-10) - JWT_SECRET added to stream-server in production compose (SEC-05) - Go version unified to 1.24 across Dockerfile and CI (SEC-09) -- CD pipeline fixed (vars.* in conditions, Dockerfile.production) (SEC-01) +- CD pipeline fixed (vars.\* in conditions, Dockerfile.production) (SEC-01) - Redis authentication enabled in production compose (SEC-02) ### Infrastructure + - Redis-backed rate limiter with in-memory fallback (INF-01) - PostgreSQL aligned to v16 in test environment (INF-02) - Frontend CI: lint, typecheck, build steps added (INF-03) @@ -446,6 +567,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - Docker healthchecks on all services (INF-09) ### Code Quality + - 40 fmt.Printf replaced with zap structured logging (CLN-03) - ~45 `any` types eliminated in frontend production code (CLN-04) - TypeScript unified to 5.9.3 across all packages (CLN-06) @@ -455,17 +577,20 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - Protobuf definitions centralized in proto/ directory (CLN-07) ### Documentation + - ADR-001: Go+Rust architecture decision (CLN-08) - ADR-002: Chat server Rust->Go migration plan (INT-01) - FEATURE_STATUS.md aligned with actual code state (CLN-05) - PROJECT_STATE.md updated with v0.404 metrics (FIN-02) ### Testing + - 5 cross-service E2E integration tests (INT-03) - 51 unit tests added across Rust services (INT-05) - 2 skipped backend tests fixed, 11 clarified (INT-04) ### Integration + - HLS transcoding triggered after track upload (INT-02) --- @@ -475,21 +600,21 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot P1 — Checkout Hyperswitch production-ready** - - Return URL with `order_id` for success/error pages - - CheckoutSuccessView, CheckoutErrorView, CheckoutCompletePage - - Route `/checkout/complete` (protected) - - Webhook: handle `cancelled` status in ProcessPaymentWebhook - - CheckoutPaymentForm (Hyperswitch) in Cart when `client_secret` returned - - marketplaceService.getOrder(orderId) + - Return URL with `order_id` for success/error pages + - CheckoutSuccessView, CheckoutErrorView, CheckoutCompletePage + - Route `/checkout/complete` (protected) + - Webhook: handle `cancelled` status in ProcessPaymentWebhook + - CheckoutPaymentForm (Hyperswitch) in Cart when `client_secret` returned + - marketplaceService.getOrder(orderId) - **Lot P2 — Codes promo / réductions** - - Migrations 099 (promo_codes), 100 (orders discount fields) - - PromoCode model, ValidatePromoCode, validatePromoCodeTx - - GET /commerce/promo/:code - - CreateOrder and Checkout accept `promo_code` (percent/fixed) - - PromoCodeModal connected to validatePromoCode API - - Cart: PromoCodeModal, OrderSummary with discount, promo_code at checkout - - MSW handlers for promo, orders/:id, checkout with promo_code - - Stories: CheckoutSuccessView, CheckoutErrorView, PromoCodeModal + - Migrations 099 (promo_codes), 100 (orders discount fields) + - PromoCode model, ValidatePromoCode, validatePromoCodeTx + - GET /commerce/promo/:code + - CreateOrder and Checkout accept `promo_code` (percent/fixed) + - PromoCodeModal connected to validatePromoCode API + - Cart: PromoCodeModal, OrderSummary with discount, promo_code at checkout + - MSW handlers for promo, orders/:id, checkout with promo_code + - Stories: CheckoutSuccessView, CheckoutErrorView, PromoCodeModal ### Changed @@ -504,30 +629,30 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot M1 — Produits & Catalogue** - - Migrations 095-097 : products enrichment (bpm, musical_key, category), product_previews, product_images - - ProductPreview, ProductImage models, CreateProduct/UpdateProduct accept bpm, musical_key, category - - POST /marketplace/products/:id/preview (audio preview upload) - - PUT /marketplace/products/:id/images - - GET /marketplace/products/:id/preview (stream audio) - - ListProducts filters: bpm, musical_key, category - - CreateProductView connected to enriched API, BPM/Key/Category filters in MarketplaceHome - - ProductDetailView: playable preview, image gallery - - Rich text description (sanitization backend, toolbar Bold/List frontend) + - Migrations 095-097 : products enrichment (bpm, musical_key, category), product_previews, product_images + - ProductPreview, ProductImage models, CreateProduct/UpdateProduct accept bpm, musical_key, category + - POST /marketplace/products/:id/preview (audio preview upload) + - PUT /marketplace/products/:id/images + - GET /marketplace/products/:id/preview (stream audio) + - ListProducts filters: bpm, musical_key, category + - CreateProductView connected to enriched API, BPM/Key/Category filters in MarketplaceHome + - ProductDetailView: playable preview, image gallery + - Rich text description (sanitization backend, toolbar Bold/List frontend) - **Lot M2 — Licences & Droits** - - Migration 098 : product_licenses (license_type, price_cents, terms_text) - - ProductLicense model, SetProductLicenses, GetProductLicenses - - CreateProduct/UpdateProduct accept licenses array - - GET /marketplace/licenses/mine (user's purchased licenses with download_url) - - LicenceCard, LicenceDetailsModal: license_type, price_cents, terms_text - - LicensesView in PurchasesPage with download links + - Migration 098 : product_licenses (license_type, price_cents, terms_text) + - ProductLicense model, SetProductLicenses, GetProductLicenses + - CreateProduct/UpdateProduct accept licenses array + - GET /marketplace/licenses/mine (user's purchased licenses with download_url) + - LicenceCard, LicenceDetailsModal: license_type, price_cents, terms_text + - LicensesView in PurchasesPage with download links - **Lot M3 — Seller dashboard enrichi** - - GET /sell/stats/evolution (day/week/month) - - GET /sell/stats/top-products - - GET /sell/sales (real sales data) - - commerceService: getSales, getSellerStatsEvolution, getSellerTopProducts (real API) - - SalesEvolutionChart (Recharts LineChart) - - Top Products section with real revenue/sales_count - - Conversion rate: N/A when no tracking + - GET /sell/stats/evolution (day/week/month) + - GET /sell/stats/top-products + - GET /sell/sales (real sales data) + - commerceService: getSales, getSellerStatsEvolution, getSellerTopProducts (real API) + - SalesEvolutionChart (Recharts LineChart) + - Top Products section with real revenue/sales_count + - Conversion rate: N/A when no tracking ### Changed @@ -541,11 +666,11 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot C2 — Chat appels WebRTC 1-to-1** - - Chat Server : signalisation CallOffer, CallAnswer, ICECandidate, CallHangup, CallReject - - WebSocketManager.send_to_user pour livraison 1-to-1 - - RateLimitAction::CallSignaling (60 req/min) - - Frontend : useWebRTC hook, CallButton, IncomingCallModal, ActiveCallBar - - Appels audio 1-to-1 dans conversations DM + - Chat Server : signalisation CallOffer, CallAnswer, ICECandidate, CallHangup, CallReject + - WebSocketManager.send_to_user pour livraison 1-to-1 + - RateLimitAction::CallSignaling (60 req/min) + - Frontend : useWebRTC hook, CallButton, IncomingCallModal, ActiveCallBar + - Appels audio 1-to-1 dans conversations DM --- @@ -554,24 +679,24 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot S2 — Groupes avancés** - - Demander à rejoindre (groupes privés), approbation/rejet par admin - - Inviter membres par email ou user_id - - Rôles assign/revoke (admin, moderator, member) - - Feed type=groups (posts des membres des groupes) - - GET /social/groups/mine - - Migrations 069, 089, 092 + - Demander à rejoindre (groupes privés), approbation/rejet par admin + - Inviter membres par email ou user_id + - Rôles assign/revoke (admin, moderator, member) + - Feed type=groups (posts des membres des groupes) + - GET /social/groups/mine + - Migrations 069, 089, 092 - **Lot N1 — Notifications push Web** - - POST /notifications/push/subscribe, PushService (webpush-go) - - Envoi push sur follow/like/comment/message (selon préférences) - - GET/PUT /notifications/preferences - - Migrations 090, 093 - - Frontend : subscribePush, PushPreferencesSection, badge document.title + - POST /notifications/push/subscribe, PushService (webpush-go) + - Envoi push sur follow/like/comment/message (selon préférences) + - GET/PUT /notifications/preferences + - Migrations 090, 093 + - Frontend : subscribePush, PushPreferencesSection, badge document.title - **Lot P2 — Présence enrichie** - - PUT /users/me/presence (status_message, track_id, track_title, invisible) - - Rich presence : sync track en cours via usePresenceSync - - Mode invisible (GetPresenceForViewer masque pour les autres) - - PresenceBadge statusMessage tooltip - - Migrations 091, 094 + - PUT /users/me/presence (status_message, track_id, track_title, invisible) + - Rich presence : sync track en cours via usePresenceSync + - Mode invisible (GetPresenceForViewer masque pour les autres) + - PresenceBadge statusMessage tooltip + - Migrations 091, 094 ### Changed @@ -589,24 +714,24 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot P0 — Chat Server** - - Protocole typing aligné : `{ type: 'Typing', conversation_id, is_typing }` - - Limitation JWT auth (query param) documentée pour v0.302 + - Protocole typing aligné : `{ type: 'Typing', conversation_id, is_typing }` + - Limitation JWT auth (query param) documentée pour v0.302 - **Lot C1 — Chat avancé** - - Typing indicators end-to-end (UserTyping, setUserTyping) - - Read receipts (MarkAsRead, MessageRead, « Vu à HH:mm ») - - Delivered status (Delivered, MessageDelivered) + - Typing indicators end-to-end (UserTyping, setUserTyping) + - Read receipts (MarkAsRead, MessageRead, « Vu à HH:mm ») + - Delivered status (Delivered, MessageDelivered) - **Lot P1 — Présence** - - Migration 088 user_presence (status, last_seen_at, status_message) - - PresenceService, GET /users/:id/presence - - Mise à jour last_seen_at sur chaque requête authentifiée - - PresenceBadge, usePresence, intégration ChatSidebar + - Migration 088 user_presence (status, last_seen_at, status_message) + - PresenceService, GET /users/:id/presence + - Mise à jour last_seen_at sur chaque requête authentifiée + - PresenceBadge, usePresence, intégration ChatSidebar - **Lot S1 — Social enrichi** - - Feed connecté à socialService.getFeed (remplace trackService.list) - - Backend : enrichissement actor_name, actor_avatar, track dans GetGlobalFeed - - SocialViewFeedItem : posts texte + posts avec track (mini player) - - Pagination cursor (next_cursor), useInfiniteQuery, Load More - - GET /social/explore (trending + suggested_users), onglet Explore - - Filtres feed : all | following | groups (param type, OptionalAuth pour following) + - Feed connecté à socialService.getFeed (remplace trackService.list) + - Backend : enrichissement actor_name, actor_avatar, track dans GetGlobalFeed + - SocialViewFeedItem : posts texte + posts avec track (mini player) + - Pagination cursor (next_cursor), useInfiniteQuery, Load More + - GET /social/explore (trending + suggested_users), onglet Explore + - Filtres feed : all | following | groups (param type, OptionalAuth pour following) ### Changed @@ -625,24 +750,24 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot L — Social Trending** - - GET /social/trending (extraction hashtags posts 7 jours, agrégation) - - Cache Redis 15 min (clé trending:hashtags) - - SocialViewTrending connecté à l’API (Loading, Error, Empty fallback) - - MSW handler GET */api/v1/social/trending + - GET /social/trending (extraction hashtags posts 7 jours, agrégation) + - Cache Redis 15 min (clé trending:hashtags) + - SocialViewTrending connecté à l’API (Loading, Error, Empty fallback) + - MSW handler GET \*/api/v1/social/trending - **Lot K — Recherche enrichie** - - Migration 086 pg_trgm pour fuzzy search - - TrackSearchService : similarity() sur title/artist/album (PostgreSQL), fallback ILIKE (SQLite) - - query_parser.go : AND, OR, NOT, "phrase exacte" - - SearchService + TrackSearchService utilisent le parser - - SearchPageHeader : tooltip aide syntaxe + - Migration 086 pg_trgm pour fuzzy search + - TrackSearchService : similarity() sur title/artist/album (PostgreSQL), fallback ILIKE (SQLite) + - query_parser.go : AND, OR, NOT, "phrase exacte" + - SearchService + TrackSearchService utilisent le parser + - SearchPageHeader : tooltip aide syntaxe - **Lot D1 — Queue collaborative** - - Migration 087 queue_sessions, shared_queue_items - - Modèles QueueSession, SharedQueueItem - - QueueSessionService : Create, Get, Delete, Add/Remove items - - POST/GET/DELETE /queue/session, POST/DELETE /queue/session/:token/items - - PlayerQueue : bouton Partager, badge Queue partagée, polling 8 s - - queueSessionStore, useQueueSync mode session - - MSW handlers pour queue session + - Migration 087 queue_sessions, shared_queue_items + - Modèles QueueSession, SharedQueueItem + - QueueSessionService : Create, Get, Delete, Add/Remove items + - POST/GET/DELETE /queue/session, POST/DELETE /queue/session/:token/items + - PlayerQueue : bouton Partager, badge Queue partagée, polling 8 s + - queueSessionStore, useQueueSync mode session + - MSW handlers pour queue session ### Changed @@ -663,25 +788,25 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot G — Recherche avancée** - - Filtre musical_key dans track_search (G1) - - Tri pertinence (relevance) dans SearchService (G2) - - Autocomplete : GET /search/suggestions, dropdown debounced (G3) - - Facettes type (tracks/artistes/playlists/users) dans SearchPage (G4) - - Historique recherche localStorage (G5) + - Filtre musical_key dans track_search (G1) + - Tri pertinence (relevance) dans SearchService (G2) + - Autocomplete : GET /search/suggestions, dropdown debounced (G3) + - Facettes type (tracks/artistes/playlists/users) dans SearchPage (G4) + - Historique recherche localStorage (G5) - **Lot H — Analytics créateur** - - GET /analytics/creator/stats, carte Completion Rate (H1) - - GET /analytics/creator/charts, graphiques (H2) - - Taux de complétion intégré dashboard (H3) - - GET /analytics/creator/export CSV/JSON (H4) + - GET /analytics/creator/stats, carte Completion Rate (H1) + - GET /analytics/creator/charts, graphiques (H2) + - Taux de complétion intégré dashboard (H3) + - GET /analytics/creator/export CSV/JSON (H4) - **Lot F — Seller dashboard** - - GET /sell/stats, connexion commerceService (F1) - - Support seller_id=me dans ListProducts (F2) + - GET /sell/stats, connexion commerceService (F1) + - Support seller_id=me dans ListProducts (F2) - **Lot C — Player avancé** - - Crossfade configurable (1–12 s) depuis Settings (C1) - - Gapless préchargement via preloadTrack (C2) - - PiP (Picture-in-Picture) si supporté (C3) + - Crossfade configurable (1–12 s) depuis Settings (C1) + - Gapless préchargement via preloadTrack (C2) + - PiP (Picture-in-Picture) si supporté (C3) - **Lot D — Autoplay** - - GET /tracks/recommendations (auth), section « À écouter ensuite » dans PlayerQueue (D2) + - GET /tracks/recommendations (auth), section « À écouter ensuite » dans PlayerQueue (D2) ### Changed @@ -704,10 +829,10 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ### Added - **Lot E — Métadonnées enrichies** - - BPM : champ dans Track model, UpdateTrack, filtre track_search (E1) - - Musical key : champ, input/select édition, affichage TrackDetailPageInfo (E2) - - Lyrics : table track_lyrics, GET/PUT /tracks/:id/lyrics, section Paroles avec toggle (E3) - - Tags suggérés : GET /tracks/suggested-tags?genre=X, migration tracks.tags, chips + dropdown (E4) + - BPM : champ dans Track model, UpdateTrack, filtre track_search (E1) + - Musical key : champ, input/select édition, affichage TrackDetailPageInfo (E2) + - Lyrics : table track_lyrics, GET/PUT /tracks/:id/lyrics, section Paroles avec toggle (E3) + - Tags suggérés : GET /tracks/suggested-tags?genre=X, migration tracks.tags, chips + dropdown (E4) ### Changed @@ -724,11 +849,13 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.103] - 2026-02-20 ### Added + - **Auth (Lot A)** : OAuth Spotify (A1), page Sessions enrichie avec historique et révocation (A4) - **Profils (Lot B)** : Bannière de profil éditable (B1), section liens sociaux sur profil public (B2), toggle profil privé dans Settings (B3) - **Profil privé** : Vue « Profil privé » sur `/u/:username` quand le profil est masqué ; `is_public` exposé et persisté ### Documented + - 2FA SMS et Passkeys/WebAuthn reportés à v0.104 --- @@ -736,6 +863,7 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [v0.102] - 2026-02-20 ### Added + - **Queue persistante** : API CRUD (`GET/PUT/POST/DELETE /api/v1/queue`), sync frontend via `useQueueSync`, drag & drop reorder avec @dnd-kit (B3) - **Developer API Keys** : CRUD clés API, X-API-Key middleware, CreateAPIKeyModal, révocation - **Playlists** : activation PLAYLIST_SHARE, PLAYLIST_RECOMMENDATIONS ; boutons Export (JSON/CSV), Duplicate connectés @@ -743,10 +871,12 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( - **Player** : playback speed (0.5x–2x), Media Session API, waveform dans progress bar ### Changed + - **Gear, Live, Queue, Developer** : routes opérationnelles (fin des placeholders Coming Soon) - Feature flags PLAYLIST_SHARE et PLAYLIST_RECOMMENDATIONS activés (true) ### Documented + - Go Live (streaming vidéo) : non implémenté, prévu v0.703 — limitation A6 - Social Trending (tags) : statique, report v0.103 pour `GET /social/trending` @@ -755,26 +885,30 @@ Première release commerciale de la plateforme Veza. Voir [RELEASE_NOTES_V1.md]( ## [Unreleased] - 2024-12-07 ### Security + - **chat-server**: Implemented JWT Authentication Middleware for HTTP API. - - Secured `/api/messages` (POST) and `/api/messages/{id}` (GET). - - Enforced permission checks (`can_send_message`, `can_read_conversation`). - - Patched `sender_id` spoofing vulnerability by enforcing User ID from Token Claims. + - Secured `/api/messages` (POST) and `/api/messages/{id}` (GET). + - Enforced permission checks (`can_send_message`, `can_read_conversation`). + - Patched `sender_id` spoofing vulnerability by enforcing User ID from Token Claims. - **backend**: Resolved `veza_errors_total` metric collision preventing proper monitoring initialization. ### Fixed + - **backend**: Fixed `JobWorker` starvation issue by replacing blocking `time.Sleep` with non-blocking scheduler. - **stream-server**: Improved task safety by replacing unsafe `abort()` with graceful `join/await` for monitoring tasks. - **chat-server**: Fixed resource leak by implementing 60s WebSocket inactivity/heartbeat timeout. - **chat-server**: Implemented Graceful Shutdown handling for OS signals (SIGTERM/SIGINT). - **backend-tests**: Fixed `RoomHandler` unit tests. - - Refactored `RoomHandler` to use `RoomServiceInterface` for dependency injection. - - Updated `CreateRoom` tests to match actual Service signatures. - - Fixed `bitrate_handler_test.go` compilation errors. - - Resolved global metric registration panics during testing. + - Refactored `RoomHandler` to use `RoomServiceInterface` for dependency injection. + - Updated `CreateRoom` tests to match actual Service signatures. + - Fixed `bitrate_handler_test.go` compilation errors. + - Resolved global metric registration panics during testing. ### Removed + - **backend**: Deleted legacy maintenance code (`migrations_legacy/` and `src/cmd/main.go.legacy`). ### Known Issues + - **backend**: Some unit tests (`metrics_test.go`, `profile_handler_test.go`, `system_metrics_test.go`) are disabled due to bitrot/missing dependencies. - **stream-server**: Compilation requires active Database connection (sqlx compile-time verification) or `sqlx-data.json`. diff --git a/VERSION b/VERSION index 6d7de6e6a..ee90284c2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.2 +1.0.4 diff --git a/docs/FEATURE_STATUS.md b/docs/FEATURE_STATUS.md index cc8932e7a..f01c6d372 100644 --- a/docs/FEATURE_STATUS.md +++ b/docs/FEATURE_STATUS.md @@ -1,270 +1,270 @@ # Statut des fonctionnalités — Veza -**Dernière mise à jour** : mars 2026 — v0.971 (Phantom: gamification supprimé, WebRTC Beta) +**Dernière mise à jour** : avril 2026 — v1.0.4 (release cleanup post-audit, CI verte, dette RGPD fermée) Ce document décrit le statut réel des fonctionnalités par rapport au code. ## Fonctionnalités opérationnelles (19) -| Feature | Frontend | Backend | Notes | -|---------|----------|---------|-------| -| Auth (register, login, JWT, refresh) | Oui | Oui | Complet | -| 2FA (TOTP) | Oui | Oui | Complet | -| OAuth (Google, GitHub, Discord, Spotify) | Oui | Oui | Opérationnel (v0.601) — tous les fournisseurs | -| Profils utilisateur | Oui | Oui | Bannière, liens sociaux, profil privé (v0.103 B1-B3) | -| Upload de tracks | Oui | Oui | Complet | -| CRUD Tracks | Oui | Oui | Complet — BPM, musical_key, lyrics, tags (v0.201 Lot E) | -| Playlists (CRUD, collaboration) | Oui | Oui | Complet | -| Chat WebSocket | Oui | Oui | Opérationnel — réécrit en Go (v0.502), intégré dans backend API | -| Dashboard | Oui | Oui | GET /api/v1/dashboard | -| Recherche | Oui | Oui | GET /search unifié, GET /tracks/search. v0.202 : musical_key, tri pertinence. v0.203 : pg_trgm fuzzy, AND/OR/NOT, tooltip aide | -| Social (feed, posts, groups, follows, blocks, trending) | Oui | Oui | v0.301 : feed API, explore. v0.302 : groupes avancés (request join, invite, rôles, mes groupes) | -| Administration | Oui | Oui | Complet. v0.803 : Modération (reports), Maintenance mode, Annonces, Feature flags DB | -| Marketplace | Oui | Oui | Complet (Hyperswitch). v0.603 : Transfer auto Stripe Connect. v0.701 : Retry auto failed transfers, Admin Dashboard. v0.702 : Route product detail, tests reviews/invoices/refunds | -| Webhooks | Oui | Oui | Complet | -| Inventory / Gear | Oui | Oui | GET/POST/PUT/DELETE /api/v1/inventory/gear. v0.802 : documents CRUD, repairs CRUD, warranty notifier | -| Live Streaming (métadonnées) | Oui | Oui | GET /api/v1/live/streams — stream vidéo via Stream Server. v0.703 : Go Live, stream key, chat WebSocket, viewer count | -| Analytics | Oui | Oui | Routes /api/v1/analytics/*. v0.202 : creator stats/charts/export (Lot H) | -| Roles | Oui | Oui | Assign, revoke — flag ROLE_MANAGEMENT | -| Notifications | Oui | Oui | Création auto follow/like/comment. v0.302 : Web Push, préférences | +| Feature | Frontend | Backend | Notes | +| ------------------------------------------------------- | -------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Auth (register, login, JWT, refresh) | Oui | Oui | Complet | +| 2FA (TOTP) | Oui | Oui | Complet | +| OAuth (Google, GitHub, Discord, Spotify) | Oui | Oui | Opérationnel (v0.601) — tous les fournisseurs | +| Profils utilisateur | Oui | Oui | Bannière, liens sociaux, profil privé (v0.103 B1-B3) | +| Upload de tracks | Oui | Oui | Complet | +| CRUD Tracks | Oui | Oui | Complet — BPM, musical_key, lyrics, tags (v0.201 Lot E) | +| Playlists (CRUD, collaboration) | Oui | Oui | Complet | +| Chat WebSocket | Oui | Oui | Opérationnel — réécrit en Go (v0.502), intégré dans backend API | +| Dashboard | Oui | Oui | GET /api/v1/dashboard | +| Recherche | Oui | Oui | GET /search unifié, GET /tracks/search. v0.202 : musical_key, tri pertinence. v0.203 : pg_trgm fuzzy, AND/OR/NOT, tooltip aide | +| Social (feed, posts, groups, follows, blocks, trending) | Oui | Oui | v0.301 : feed API, explore. v0.302 : groupes avancés (request join, invite, rôles, mes groupes) | +| Administration | Oui | Oui | Complet. v0.803 : Modération (reports), Maintenance mode, Annonces, Feature flags DB | +| Marketplace | Oui | Oui | Complet (Hyperswitch). v0.603 : Transfer auto Stripe Connect. v0.701 : Retry auto failed transfers, Admin Dashboard. v0.702 : Route product detail, tests reviews/invoices/refunds | +| Webhooks | Oui | Oui | Complet | +| Inventory / Gear | Oui | Oui | GET/POST/PUT/DELETE /api/v1/inventory/gear. v0.802 : documents CRUD, repairs CRUD, warranty notifier | +| Live Streaming (métadonnées) | Oui | Oui | GET /api/v1/live/streams — stream vidéo via Stream Server. v0.703 : Go Live, stream key, chat WebSocket, viewer count | +| Analytics | Oui | Oui | Routes /api/v1/analytics/\*. v0.202 : creator stats/charts/export (Lot H) | +| Roles | Oui | Oui | Assign, revoke — flag ROLE_MANAGEMENT | +| Notifications | Oui | Oui | Création auto follow/like/comment. v0.302 : Web Push, préférences | ## Fonctionnalités fantômes (UI sans backend) -| Feature | Localisation | Statut | -|---------|-------------|--------| -| **Studio** (Cloud File Browser) | Supprimé | Dossier supprimé | -| **Education** | Supprimé | Dossier supprimé | +| Feature | Localisation | Statut | +| ------------------------------- | ------------ | ---------------- | +| **Studio** (Cloud File Browser) | Supprimé | Dossier supprimé | +| **Education** | Supprimé | Dossier supprimé | ## Abandonné v1.0 (reporté versions futures) -| Feature | Version cible | -|---------|---------------| +| Feature | Version cible | +| ------------------------------------------------ | -------------------------------- | | **Gamification** (achievements, leaderboard, XP) | v1.3 — supprimé v0.971 (phantom) | ## Fonctionnalités désactivées (feature flags) -| Feature | Flag | Backend | -|---------|------|---------| -| HLS Streaming | `HLS_STREAMING: true` (v0.101) | Opérationnel (v0.503) — Backend serving routes (master.m3u8, quality playlists, segments), frontend ABR player, HLS_STREAMING feature flag. | -| Role Management | `ROLE_MANAGEMENT` | Opérationnel si activé | -| Playlist Share | `PLAYLIST_SHARE: true` (v0.102) | Opérationnel | -| Playlist Recommendations | `PLAYLIST_RECOMMENDATIONS: true` (v0.102) | Opérationnel | +| Feature | Flag | Backend | +| ------------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| HLS Streaming | `HLS_STREAMING: true` (v0.101) | Opérationnel (v0.503) — Backend serving routes (master.m3u8, quality playlists, segments), frontend ABR player, HLS_STREAMING feature flag. | +| Role Management | `ROLE_MANAGEMENT` | Opérationnel si activé | +| Playlist Share | `PLAYLIST_SHARE: true` (v0.102) | Opérationnel | +| Playlist Recommendations | `PLAYLIST_RECOMMENDATIONS: true` (v0.102) | Opérationnel | ## Limitations connues (report versions futures) -| Feature | Limitation | Version cible | -|---------|------------|--------------| -| **Go Live** (streaming vidéo) | Livré v0.703 — page /live/go-live, stream key, OBS instructions | — | -| **Appels WebRTC** | Beta — fonctionne mieux sur le même réseau local (TURN/STUN v1.1) | v1.1 (flag WEBRTC_CALLS) | -| **2FA SMS** | Option « Envoyer par SMS » pendant la vérification 2FA — requiert infra Twilio + users.phone_number | v0.104 | -| **Passkeys / WebAuthn** | Login sans mot de passe — requiert go-webauthn, table webauthn_credentials, frontend navigator.credentials | v0.104 | +| Feature | Limitation | Version cible | +| ----------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------ | +| **Go Live** (streaming vidéo) | Livré v0.703 — page /live/go-live, stream key, OBS instructions | — | +| **Appels WebRTC** | Beta — fonctionne mieux sur le même réseau local (TURN/STUN v1.1) | v1.1 (flag WEBRTC_CALLS) | +| **2FA SMS** | Option « Envoyer par SMS » pendant la vérification 2FA — requiert infra Twilio + users.phone_number | v0.104 | +| **Passkeys / WebAuthn** | Login sans mot de passe — requiert go-webauthn, table webauthn_credentials, frontend navigator.credentials | v0.104 | ## Livré en v0.202 -| Lot | Feature | -|-----|---------| -| G | Recherche avancée (musical_key, tri pertinence, autocomplete, facettes type, historique) | -| H | Analytics créateur (stats, graphiques, taux complétion, export CSV/JSON) | -| F | Seller dashboard (GET /sell/stats, liste produits marketplace) | -| C | Player (crossfade, gapless preload, PiP) | -| D | Autoplay (GET /tracks/recommendations, section « À écouter ensuite » dans PlayerQueue) | +| Lot | Feature | +| --- | ---------------------------------------------------------------------------------------- | +| G | Recherche avancée (musical_key, tri pertinence, autocomplete, facettes type, historique) | +| H | Analytics créateur (stats, graphiques, taux complétion, export CSV/JSON) | +| F | Seller dashboard (GET /sell/stats, liste produits marketplace) | +| C | Player (crossfade, gapless preload, PiP) | +| D | Autoplay (GET /tracks/recommendations, section « À écouter ensuite » dans PlayerQueue) | ## Livré en v0.203 -| Lot | Feature | -|-----|---------| -| L | Social Trending : GET /social/trending, cache Redis, SocialViewTrending connecté | -| K | Recherche enrichie : pg_trgm fuzzy, opérateurs AND/OR/NOT/"phrase exacte", tooltip aide | -| D1 | Queue collaborative : sessions partagées, bouton Partager, polling sync, MSW handlers | +| Lot | Feature | +| --- | --------------------------------------------------------------------------------------- | +| L | Social Trending : GET /social/trending, cache Redis, SocialViewTrending connecté | +| K | Recherche enrichie : pg_trgm fuzzy, opérateurs AND/OR/NOT/"phrase exacte", tooltip aide | +| D1 | Queue collaborative : sessions partagées, bouton Partager, polling sync, MSW handlers | Voir [V0_203_RELEASE_SCOPE.md](V0_203_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.301 (Phase 3 Social) -| Lot | Feature | -|-----|---------| -| P0 | Chat Server : protocole typing aligné, auth WebSocket documenté | -| C1 | Chat avancé : typing indicators, read receipts, delivered status | -| P1 | Présence : migration 088, GET /users/:id/presence, PresenceBadge, last_seen sur requêtes auth | -| S1 | Social enrichi : feed connecté API, enrichi actor/track, pagination cursor, explore tab, filtres all/following/groups | +| Lot | Feature | +| --- | --------------------------------------------------------------------------------------------------------------------- | +| P0 | Chat Server : protocole typing aligné, auth WebSocket documenté | +| C1 | Chat avancé : typing indicators, read receipts, delivered status | +| P1 | Présence : migration 088, GET /users/:id/presence, PresenceBadge, last_seen sur requêtes auth | +| S1 | Social enrichi : feed connecté API, enrichi actor/track, pagination cursor, explore tab, filtres all/following/groups | Voir [V0_301_RELEASE_SCOPE.md](archive/V0_301_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.302 (Phase 3 Social — suite) -| Lot | Feature | -|-----|---------| -| S2 | Groupes avancés : demander à rejoindre (privé), inviter membres, rôles assign/revoke, feed groupes, mes groupes | -| N1 | Notifications push : Web Push subscription, envoi sur follow/like/comment/message, préférences, badge titre | -| P2 | Présence enrichie : rich presence (track en cours), mode invisible, PUT /users/me/presence | +| Lot | Feature | +| --- | --------------------------------------------------------------------------------------------------------------- | +| S2 | Groupes avancés : demander à rejoindre (privé), inviter membres, rôles assign/revoke, feed groupes, mes groupes | +| N1 | Notifications push : Web Push subscription, envoi sur follow/like/comment/message, préférences, badge titre | +| P2 | Présence enrichie : rich presence (track en cours), mode invisible, PUT /users/me/presence | ## Livré en v0.303 -| Lot | Feature | -|-----|---------| -| C2 | Chat appels : WebRTC audio 1-to-1, signalisation via WebSocket (CallOffer, CallAnswer, ICECandidate, CallHangup, CallReject), CallButton, IncomingCallModal, ActiveCallBar | +| Lot | Feature | +| --- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| C2 | Chat appels : WebRTC audio 1-to-1, signalisation via WebSocket (CallOffer, CallAnswer, ICECandidate, CallHangup, CallReject), CallButton, IncomingCallModal, ActiveCallBar | ## Livré en v0.401 (Phase 4 Commerce) -| Lot | Feature | -|-----|---------| -| M1 | Produits & Catalogue : BPM, musical_key, category, previews, images, filtres MarketplaceHome, rich text description | -| M2 | Licences & Droits : product_licenses, types/conditions, GET /licenses/mine, LicenceCard/LicenceDetailsModal, LicensesView | -| M3 | Seller dashboard enrichi : evolution chart, top products, real sales, conversion N/A | +| Lot | Feature | +| --- | ------------------------------------------------------------------------------------------------------------------------- | +| M1 | Produits & Catalogue : BPM, musical_key, category, previews, images, filtres MarketplaceHome, rich text description | +| M2 | Licences & Droits : product_licenses, types/conditions, GET /licenses/mine, LicenceCard/LicenceDetailsModal, LicensesView | +| M3 | Seller dashboard enrichi : evolution chart, top products, real sales, conversion N/A | Voir [V0_401_RELEASE_SCOPE.md](archive/V0_401_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.402 (Phase 4 Commerce — checkout & codes promo) -| Lot | Feature | -|-----|---------| -| P1 | Checkout Hyperswitch production-ready : return URL avec order_id, CheckoutSuccessView/CheckoutErrorView, webhook cancelled, CheckoutPaymentForm dans Cart | -| P2 | Codes promo / réductions : promo_codes, ValidatePromoCode, GET /commerce/promo/:code, CreateOrder/Checkout avec promo_code, PromoCodeModal connecté, OrderSummary dans Cart | +| Lot | Feature | +| --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| P1 | Checkout Hyperswitch production-ready : return URL avec order_id, CheckoutSuccessView/CheckoutErrorView, webhook cancelled, CheckoutPaymentForm dans Cart | +| P2 | Codes promo / réductions : promo_codes, ValidatePromoCode, GET /commerce/promo/:code, CreateOrder/Checkout avec promo_code, PromoCodeModal connecté, OrderSummary dans Cart | Voir [V0_402_RELEASE_SCOPE.md](V0_402_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.502 (Phase 5 — Chat Server Rewrite) -| Lot | Feature | -|-----|---------| -| CH | Chat Server Rust → Go : WebSocket intégré dans backend API (`/api/v1/ws`), 39 types messages (19 in + 20 out), Hub/Client goroutines, PermissionService, RateLimiter in-memory, ChatPubSubService Redis, 4 migrations (109-112), 15 tests unitaires, E2E tests | +| Lot | Feature | +| --- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CH | Chat Server Rust → Go : WebSocket intégré dans backend API (`/api/v1/ws`), 39 types messages (19 in + 20 out), Hub/Client goroutines, PermissionService, RateLimiter in-memory, ChatPubSubService Redis, 4 migrations (109-112), 15 tests unitaires, E2E tests | ## Livré en v0.503 (Phase 5 — HLS E2E + Chat Hardening + Cleanup) -| Lot | Feature | -|-----|---------| -| SS1 | HLS Streaming E2E (backend routes + frontend ABR player) | -| CH1 | Chat Redis rate limiter (sliding window + in-memory fallback) | -| CH1 | Chat persistent presence (Redis-backed, 2min TTL) | -| CH1 | PostgreSQL full-text search on messages (tsvector + GIN index) | +| Lot | Feature | +| --- | -------------------------------------------------------------------------- | +| SS1 | HLS Streaming E2E (backend routes + frontend ABR player) | +| CH1 | Chat Redis rate limiter (sliding window + in-memory fallback) | +| CH1 | Chat persistent presence (Redis-backed, 2min TTL) | +| CH1 | PostgreSQL full-text search on messages (tsvector + GIN index) | | CL1 | Cleanup: veza-chat-server directory and all operational references removed | Voir [V0_503_RELEASE_SCOPE.md](V0_503_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.601 (Phase 6 — Production Readiness & Commerce) -| Lot | Feature | -|-----|---------| -| INF1 | Blue-green deployment (HAProxy), Grafana dashboards (API, Chat, Commerce), Alertmanager, Hyperswitch LIVE_MODE | -| AUTH1 | OAuth Discord, OAuth Spotify (opérationnels) | -| CLN1 | Découpage handler.go en 4 sous-handlers (track_crud, track_social, track_search, track_analytics), interceptors.ts en modules (utils, request, response) | -| QA1 | Tests OAuth Discord/Spotify, MIGRATIONS.md, audit console.log | +| Lot | Feature | +| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| INF1 | Blue-green deployment (HAProxy), Grafana dashboards (API, Chat, Commerce), Alertmanager, Hyperswitch LIVE_MODE | +| AUTH1 | OAuth Discord, OAuth Spotify (opérationnels) | +| CLN1 | Découpage handler.go en 4 sous-handlers (track_crud, track_social, track_search, track_analytics), interceptors.ts en modules (utils, request, response) | +| QA1 | Tests OAuth Discord/Spotify, MIGRATIONS.md, audit console.log | Voir [V0_601_RELEASE_SCOPE.md](V0_601_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.602 (Phase 6+ Payout, Dette Technique & Tests E2E) -| Lot | Feature | -|-----|---------| -| CLN2 | Split interceptors : auth.ts, error.ts extraits, interceptors.ts facade (< 30 LOC) | -| P3 | Payout vendeurs : Stripe Connect onboarding, balance, seller_stripe_accounts | +| Lot | Feature | +| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CLN2 | Split interceptors : auth.ts, error.ts extraits, interceptors.ts facade (< 30 LOC) | +| P3 | Payout vendeurs : Stripe Connect onboarding, balance, seller_stripe_accounts | | INF2 | Grafana dashboards enrichis : api-overview (p50, top endpoints, 4xx), chat-overview (WS connections, messages/s), commerce-overview (orders, refunds, payout) | -| QA2 | E2E commerce backend : flow product -> order -> review -> invoice, SMOKE_TEST_V0602.md | +| QA2 | E2E commerce backend : flow product -> order -> review -> invoice, SMOKE_TEST_V0602.md | Voir [V0_602_RELEASE_SCOPE.md](archive/V0_602_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.603 (Phase 6+ Transfer automatique, Commission & Stabilisation) -| Lot | Feature | -|-----|---------| -| T1 | Transfer automatique Stripe Connect après paiement réussi (webhook Hyperswitch) | -| T1 | Commission plateforme configurable (PLATFORM_FEE_RATE), migration 115 seller_transfers | -| T1 | GET /sell/transfers, carte Transfer History dans SellerDashboard | -| DT1 | Archivage docs pre-v0.501 | -| QA3 | Tests unitaires transfer (success, multi-seller, transfer-fails) | +| Lot | Feature | +| --- | -------------------------------------------------------------------------------------- | +| T1 | Transfer automatique Stripe Connect après paiement réussi (webhook Hyperswitch) | +| T1 | Commission plateforme configurable (PLATFORM_FEE_RATE), migration 115 seller_transfers | +| T1 | GET /sell/transfers, carte Transfer History dans SellerDashboard | +| DT1 | Archivage docs pre-v0.501 | +| QA3 | Tests unitaires transfer (success, multi-seller, transfer-fails) | Voir [V0_603_RELEASE_SCOPE.md](archive/V0_603_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.701 (Phase 7 — Retry, Admin Dashboard, Deep Health) -| Lot | Feature | -|-----|---------| -| R1 | Transfer Retry Worker : retry automatique des transferts failed (backoff exponentiel, max 3) | -| R1 | Migration 116 : retry_count, next_retry_at sur seller_transfers | -| A1 | Admin Transfers Dashboard : GET /admin/transfers, POST /admin/transfers/:id/retry | -| A1 | AdminTransfersView : tableau avec filtres, pagination, bouton Retry | -| H1 | Deep Health : GET /health/deep (DB, Redis, S3, disk, config summary) | -| D1 | docs/API_REFERENCE.md : documentation API avec exemples curl | +| Lot | Feature | +| --- | -------------------------------------------------------------------------------------------- | +| R1 | Transfer Retry Worker : retry automatique des transferts failed (backoff exponentiel, max 3) | +| R1 | Migration 116 : retry_count, next_retry_at sur seller_transfers | +| A1 | Admin Transfers Dashboard : GET /admin/transfers, POST /admin/transfers/:id/retry | +| A1 | AdminTransfersView : tableau avec filtres, pagination, bouton Retry | +| H1 | Deep Health : GET /health/deep (DB, Redis, S3, disk, config summary) | +| D1 | docs/API_REFERENCE.md : documentation API avec exemples curl | Voir [V0_701_RELEASE_SCOPE.md](archive/V0_701_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.702 (Phase 7 — Reviews, Factures, Remboursements & Product Detail) -| Lot | Feature | -|-----|---------| -| W1 | Route /marketplace/products/:id avec ProductDetailPage (lazy) | -| M1 | MSW handlers : reviews (GET list, POST create), invoice download | -| T1 | Tests unitaires : reviews (6), invoices (4), refunds (6) | -| D1 | API_REFERENCE.md : sections Reviews, Invoices, Refunds | +| Lot | Feature | +| --- | ---------------------------------------------------------------- | +| W1 | Route /marketplace/products/:id avec ProductDetailPage (lazy) | +| M1 | MSW handlers : reviews (GET list, POST create), invoice download | +| T1 | Tests unitaires : reviews (6), invoices (4), refunds (6) | +| D1 | API_REFERENCE.md : sections Reviews, Invoices, Refunds | Voir [V0_702_RELEASE_SCOPE.md](archive/V0_702_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.703 (Phase 7 — Go Live & Streaming Complet) -| Lot | Feature | -|-----|---------| -| GL1 | Go Live : page /live/go-live, stream key, OBS/Streamlabs instructions | +| Lot | Feature | +| --- | -------------------------------------------------------------------------------------- | +| GL1 | Go Live : page /live/go-live, stream key, OBS/Streamlabs instructions | | GL1 | Endpoints : GET/POST /live/streams/me/key, GET /live/streams/me, PUT /live/streams/:id | -| GL3 | Live Chat WebSocket : LiveViewChat connecté, stream_id comme room | -| GL3 | Viewer count temps réel : polling dans LiveViewPlayer | -| GL4 | Media Session : seekbackward/seekforward (10s) | +| GL3 | Live Chat WebSocket : LiveViewChat connecté, stream_id comme room | +| GL3 | Viewer count temps réel : polling dans LiveViewPlayer | +| GL4 | Media Session : seekbackward/seekforward (10s) | Voir [V0_703_RELEASE_SCOPE.md](V0_703_RELEASE_SCOPE.md) pour le détail. ## Livré en v0.801 (Phase 8 — UX/UI Polish, Accessibilité & PWA) -| Lot | Feature | -|-----|---------| +| Lot | Feature | +| --- | -------------------------------------------------------------------------------------------- | | UX1 | Thèmes avancés : high contrast, compact/comfortable density, accent color, font size 14–20px | -| UX1 | User preferences : migration 118, PUT /users/me/preferences | -| UX2 | Accessibilité : ARIA labels, aria-haspopup menu, focus-visible ring, useReducedMotion | -| UX3 | PWA : service worker re-enabled (safe caching), Install App in Settings | -| UX3 | Background playback : useWakeLock for mobile | +| UX1 | User preferences : migration 118, PUT /users/me/preferences | +| UX2 | Accessibilité : ARIA labels, aria-haspopup menu, focus-visible ring, useReducedMotion | +| UX3 | PWA : service worker re-enabled (safe caching), Install App in Settings | +| UX3 | Background playback : useWakeLock for mobile | ## Livré en v0.802 (Phase 8 — Cloud avancé, Gear, Tags) -| Lot | Feature | -|-----|---------| -| C2 | Cloud versioning : create version, list versions, restore | -| C2 | Cloud sharing : create share link, get shared file (public) | -| C3 | GDPR export : POST /users/me/export (async ZIP, notification) | -| C3 | Cloud backup : cron 24h, copie S3 vers prefix backup | -| U1 | Batch upload : BatchUploader, queue parallèle (max 3) | -| T1 | Tags suggest : GET /tags/suggest?q=... (autocomplete) | -| T1 | Formats audio : audio/aiff, audio/x-aiff | -| G2 | Gear documents : CRUD (upload PDF, list, delete) | -| G2 | Gear repairs : CRUD (repair history) | -| G2 | Gear warranty : warranty_start, warranty_notes, notifier 24h | +| Lot | Feature | +| --- | ------------------------------------------------------------- | +| C2 | Cloud versioning : create version, list versions, restore | +| C2 | Cloud sharing : create share link, get shared file (public) | +| C3 | GDPR export : POST /users/me/export (async ZIP, notification) | +| C3 | Cloud backup : cron 24h, copie S3 vers prefix backup | +| U1 | Batch upload : BatchUploader, queue parallèle (max 3) | +| T1 | Tags suggest : GET /tags/suggest?q=... (autocomplete) | +| T1 | Formats audio : audio/aiff, audio/x-aiff | +| G2 | Gear documents : CRUD (upload PDF, list, delete) | +| G2 | Gear repairs : CRUD (repair history) | +| G2 | Gear warranty : warranty_start, warranty_notes, notifier 24h | ## Livré en v0.803 (Phase 8 — Sécurité, Compliance & Outillage Dev) -| Lot | Feature | -|-----|---------| +| Lot | Feature | +| ---- | ---------------------------------------------------------------------------------------------------------- | | SEC1 | Security headers : CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy | -| SEC1 | DDoS rate limiting : global 1000 req/s, per-IP 100 req/s (Redis sliding window 1s) | -| SEC2 | Audit : middleware auto-log POST/PUT/DELETE, migration audit_logs, GET /admin/audit/logs | -| SEC2 | CCPA : Sec-GPC header, POST /users/me/privacy/opt-out | -| SEC2 | Account deletion : DELETE /users/me, anonymisation, S3 cleanup, session revocation | -| DEV1 | OpenAPI/Swagger : GET /swagger/*, annotations handlers | -| DEV1 | API keys : POST/GET/DELETE /developer/api-keys, auth via X-API-Key header | -| ADM1 | Modération : reports CRUD, GET /admin/reports, POST /admin/reports/:id/resolve (dismiss, warn, ban) | -| ADM1 | Maintenance mode : middleware 503, PUT/GET /admin/maintenance | -| ADM1 | Annonces : CRUD admin, GET /announcements/active (public) | -| ADM1 | Feature flags : DB persistence, GET/PUT /admin/feature-flags | -| FE1 | AdminSettingsView (onglet SETTINGS) : maintenance, feature flags, annonces | -| FE1 | AdminModerationView : actions dismiss/warn/ban alignées backend | -| FE1 | AnnouncementBanner global, AccountSettingsDeleteCard (type DELETE to confirm) | +| SEC1 | DDoS rate limiting : global 1000 req/s, per-IP 100 req/s (Redis sliding window 1s) | +| SEC2 | Audit : middleware auto-log POST/PUT/DELETE, migration audit_logs, GET /admin/audit/logs | +| SEC2 | CCPA : Sec-GPC header, POST /users/me/privacy/opt-out | +| SEC2 | Account deletion : DELETE /users/me, anonymisation, S3 cleanup, session revocation | +| DEV1 | OpenAPI/Swagger : GET /swagger/\*, annotations handlers | +| DEV1 | API keys : POST/GET/DELETE /developer/api-keys, auth via X-API-Key header | +| ADM1 | Modération : reports CRUD, GET /admin/reports, POST /admin/reports/:id/resolve (dismiss, warn, ban) | +| ADM1 | Maintenance mode : middleware 503, PUT/GET /admin/maintenance | +| ADM1 | Annonces : CRUD admin, GET /announcements/active (public) | +| ADM1 | Feature flags : DB persistence, GET/PUT /admin/feature-flags | +| FE1 | AdminSettingsView (onglet SETTINGS) : maintenance, feature flags, annonces | +| FE1 | AdminModerationView : actions dismiss/warn/ban alignées backend | +| FE1 | AnnouncementBanner global, AccountSettingsDeleteCard (type DELETE to confirm) | Voir [V0_803_RELEASE_SCOPE.md](V0_803_RELEASE_SCOPE.md) pour le détail. ## Prévu en v0.403 (Phase 4 Commerce — suite) -| Lot | Feature | -|-----|---------| -| P3 | Payout vendeurs : Stripe Connect onboarding, balance, transferts | -| R1 | Reviews produits : product_reviews, notation, commentaires, note moyenne | -| F1 | Factures : génération PDF par commande, téléchargement | -| R2 | Remboursements : initiation refund, webhook, révocation licence | +| Lot | Feature | +| --- | ------------------------------------------------------------------------ | +| P3 | Payout vendeurs : Stripe Connect onboarding, balance, transferts | +| R1 | Reviews produits : product_reviews, notation, commentaires, note moyenne | +| F1 | Factures : génération PDF par commande, téléchargement | +| R2 | Remboursements : initiation refund, webhook, révocation licence | Voir [V0_403_RELEASE_SCOPE.md](V0_403_RELEASE_SCOPE.md) pour le détail. @@ -272,9 +272,9 @@ Voir [V0_403_RELEASE_SCOPE.md](V0_403_RELEASE_SCOPE.md) pour le détail. ## Projets abandonnés -| Projet | Statut | -|--------|--------| -| **veza-mobile** | Abandonné—35+ erreurs critiques, non fonctionnel | +| Projet | Statut | +| -------------------------- | ---------------------------------------------------- | +| **veza-mobile** | Abandonné—35+ erreurs critiques, non fonctionnel | | **packages/design-system** | Sous-utilisé—seul le CSS importé, pas les composants | --- diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md index 75ff126a9..8868953de 100644 --- a/docs/PROJECT_STATE.md +++ b/docs/PROJECT_STATE.md @@ -1,4 +1,4 @@ -# État du projet Veza — Mars 2026 +# État du projet Veza — Avril 2026 **Document opérationnel** : Où en sommes-nous, quelles sont les prochaines étapes. @@ -6,27 +6,36 @@ ## 1. Version actuelle -| Élément | Valeur | -|---------|--------| -| **Dernier tag** | v1.0.2 | -| **Branche courante** | `main` | -| **Phase** | Phase 9 — v1.0 Launch — Conforme ROADMAP | -| **Prochaine version** | v1.0.3 (Maintenance / conformité) | +| Élément | Valeur | +| --------------------- | ------------------------------------------- | +| **Dernier tag** | v1.0.4 (2026-04-15) | +| **Branche courante** | `main` | +| **Phase** | Phase 9 — v1.0 Launch — Post-cleanup stable | +| **Prochaine version** | v1.0.5 ou v1.1.0 selon scope | + +> v1.0.4 est une **release cleanup** post-audit : 7 jours de sprint +> (J1–J7), ~-220 MB de débris retirés, docs alignées sur la réalité, +> TODO RGPD `HIGH-007` fermé, CI consolidée verte. Voir `CHANGELOG.md` +> pour le détail. `AUDIT_REPORT.md` à la racine contient l'audit qui +> a généré ce sprint. --- ## 2. Ce qui est livré ### v0.103 (Phase 1 Fondation) + - Auth : OAuth Spotify (A1), Sessions enrichies (A4) - Profils : Bannière (B1), Liens sociaux (B2), Profil privé (B3) - ⏸️ 2FA SMS, Passkeys → reportés v0.104 ### v0.201 (Phase 2 Contenu — Lot E) + - ✅ Lot E — Métadonnées : BPM, musical_key, lyrics, tags (E1–E4) - Migrations : 084 track_lyrics, 085 tracks.tags ### v0.202 (Phase 2 Contenu — Lots G, H, F, C, D) + - Lot G : Recherche avancée (musical_key, tri pertinence, autocomplete, facettes type, historique) - Lot H : Analytics créateur (stats, graphiques, taux complétion, export CSV/JSON) - Lot F : Seller dashboard (GET /sell/stats, liste produits marketplace) @@ -34,39 +43,47 @@ - Lot D : Autoplay (GET /tracks/recommendations, section « À écouter ensuite ») ### v0.203 (Phase 2 Contenu — Lots L, K, D1) + - Lot L : Social Trending (GET /social/trending, cache Redis, SocialViewTrending connecté) - Lot K : Recherche enrichie (pg_trgm fuzzy, AND/OR/NOT/"phrase exacte", tooltip aide) - Lot D1 : Queue collaborative (sessions partagées, bouton Partager, polling sync) ### v0.301 (Phase 3 Social — Lots P0, C1, P1, S1) + - Lot P0 : Chat Server typing protocol, auth WebSocket doc - Lot C1 : Typing indicators, read receipts, delivered status - Lot P1 : Présence (migration 088, GET /users/:id/presence, PresenceBadge) - Lot S1 : Social enrichi (feed API, actor/track enrichi, pagination, explore, filtres) ### v0.302 (Phase 3 Social — Lots S2, N1, P2) + - Lot S2 : Groupes avancés (request join, invite, rôles, feed groupes, mes groupes) - Lot N1 : Notifications push Web (subscription, envoi sur événement, préférences, badge) - Lot P2 : Présence enrichie (rich presence track, mode invisible, PUT /users/me/presence) ### v0.303 (Phase 3 Social — Lot C2) + - Lot C2 : Chat appels WebRTC 1-to-1 (signalisation, CallButton, IncomingCallModal, ActiveCallBar) ### v0.401 (Phase 4 Commerce — Lots M1, M2, M3) + - Lot M1 : Produits & Catalogue (BPM, musical_key, category, previews, images, filtres, rich text) - Lot M2 : Licences & Droits (product_licenses, GET /licenses/mine, LicenceCard, LicensesView) - Lot M3 : Seller dashboard enrichi (evolution chart, top products, real sales) ### v0.402 (Phase 4 Commerce — Lots P1, P2) + - Lot P1 : Checkout Hyperswitch production-ready (return URL order_id, CheckoutSuccessView/ErrorView, webhook cancelled, CheckoutPaymentForm) - Lot P2 : Codes promo (promo_codes, ValidatePromoCode, GET /commerce/promo/:code, PromoCodeModal connecté, OrderSummary dans Cart) ### v0.404 (Phase 4bis Stabilisation — post-audit) + - Sécurité : JWT stream token endpoint, SSRF protection webhooks (HTTPS-only), IDOR fix GetUploadStatus, Hyperswitch webhook secret requis en prod, password reset tokens hashés (SHA-256), docker-compose.hybrid supprimé, secrets CI → GitHub Secrets - Infra : Rate limiting Redis, alerting Prometheus, PostgreSQL 16 aligné, compose staging complet, CodeQL SAST, Rust CI avec clippy - Qualité : 40 fmt.Printf → zap, ~45 any éliminés frontend, TypeScript 5.9.3 unifié, code mort supprimé (~1600 LOC), gorilla/websocket → coder/websocket ### v0.501 (Phase 5 Streaming & Cloud — Lots S1, C1, G1) + - Lot S1 — HLS production : transcoding adaptatif 3 tiers (128k, 256k, 320k), ABR hls.js, cache segments CDN, monitoring Prometheus (4 compteurs), waveform generation (FFmpeg + audiowaveform), WaveformDisplay SVG interactif, useHLSPlayer hook - Lot C1 — Cloud Storage MVP : gestion dossiers/fichiers, upload drag-and-drop avec quota 5GB, prévisualisation audio inline, publication cloud → track - Lot G1 — Gear avancé : profils publics (is_public toggle, GearShowcase), galerie images multi-photo avec carousel, recherche ILIKE avec SearchBar @@ -74,6 +91,7 @@ - Sécurité : Trivy container scanning CI ### v0.803 (Phase 8 — Sécurité, Compliance & Outillage Dev) + - Security headers (CSP, HSTS, X-Frame-Options, etc.) - DDoS rate limiting: global 1000 req/s, per-IP 100 req/s - Audit middleware HTTP (POST/PUT/DELETE auto-log), GET /admin/audit/logs @@ -88,18 +106,21 @@ - AdminSettingsView, AdminModerationView, AnnouncementBanner connectés ### v0.802 (Phase 8 — Cloud avancé, Gear, Tags) + - Cloud : versioning, sharing, GDPR export, backup cron - Gear : documents CRUD, repairs CRUD, warranty notifier - Tags : GET /tags/suggest, audio/aiff - Frontend : CloudFileVersions, CloudShareModal, GearDocumentsTab, GearRepairsTab ### v0.702 (Phase 7 — Reviews, Factures, Remboursements & Product Detail) + - Route /marketplace/products/:id avec ProductDetailPage (lazy) - MSW handlers : reviews (GET/POST), invoice download - Tests unitaires : reviews (6), invoices (4), refunds (6) - API_REFERENCE.md : sections Reviews, Invoices, Refunds ### v0.801 (Phase 8 — UX/UI Polish, Accessibilité & PWA) + - User preferences: migration 118, PUT /users/me/preferences (contrast, density, accentHue, fontSize) - Thèmes avancés: high contrast, compact/comfortable density, accent color, font size 14–20px - Accessibilité: ARIA labels, aria-haspopup menu, focus-visible ring, useReducedMotion @@ -107,6 +128,7 @@ - Background playback: useWakeLock for mobile ### v0.703 (Phase 7 — Go Live & Streaming Complet) + - Go Live : page /live/go-live, stream key, OBS instructions - Endpoints : GET/POST /live/streams/me/key, GET /live/streams/me, PUT /live/streams/:id - Live Chat WebSocket : LiveViewChat connecté, stream_id comme room @@ -114,6 +136,7 @@ - Media Session : seekbackward/seekforward (10s) ### v0.701 (Phase 7 — Retry, Admin Dashboard, Deep Health) + - Transfer Retry Worker : retry automatique des transferts failed (backoff exponentiel, max 3) - Migration 116 : retry_count, next_retry_at sur seller_transfers - GET /admin/transfers, POST /admin/transfers/:id/retry @@ -122,6 +145,7 @@ - docs/API_REFERENCE.md ### v0.603 (Phase 6+ Transfer automatique, Commission & Stabilisation) + - T1 : Transfer automatique Stripe Connect après paiement réussi (webhook Hyperswitch) - Commission plateforme configurable (PLATFORM_FEE_RATE, défaut 10 %) - Migration 115 seller_transfers, modèle SellerTransfer, GET /sell/transfers @@ -130,24 +154,28 @@ - Archivage docs pre-v0.501 ### v0.602 (Phase 6+ Payout, Dette Technique & Tests E2E) + - CLN2 : Split interceptors auth.ts, error.ts, facade < 30 LOC - P3 : Stripe Connect payout (onboarding, balance, seller_stripe_accounts) - INF2 : Grafana dashboards enrichis (p50, top endpoints, 4xx, WS connections, messages/s, orders, refunds, payout) - QA2 : E2E commerce backend (product -> order -> review -> invoice), SMOKE_TEST_V0602.md ### v0.601 (Phase 6 — Production Readiness & Commerce) + - INF1 : Blue-green HAProxy, Grafana dashboards (API, Chat, Commerce), Alertmanager, Hyperswitch LIVE_MODE - AUTH1 : OAuth Discord, OAuth Spotify opérationnels - CLN1 : handler.go split en 4 sous-handlers, interceptors.ts en modules (utils, request, response) - QA1 : Tests OAuth, MIGRATIONS.md, audit console.log ### v0.503 (Phase 5 — HLS E2E + Chat Hardening + Cleanup) + - SS1 : HLS Streaming E2E (backend serving routes, frontend ABR player) - CH1 : Redis rate limiter (sliding window + in-memory fallback), présence persistante Redis (2min TTL), PostgreSQL full-text search (tsvector + GIN index) - CL1 : veza-chat-server directory supprimé, références CI/CD/config/scripts nettoyées - QA1 : 23 Go tests passing, documentation ### v0.502 (Phase 5 Communication — Chat Server Rewrite) + - Chat Server Rust → Go : WebSocket intégré dans veza-backend-api (`/api/v1/ws`) - Hub/Client avec goroutines readPump/writePump, 30s ping keepalive - 18 types messages entrants, 20 types sortants (protocole identique au Rust) @@ -164,6 +192,7 @@ ## 3. Prochaines étapes ### v0.503 (livrée 2026-02-22) + - SS1 : HLS Streaming E2E (backend routes + frontend ABR player) - CH1 : Chat hardening (rate limiter Redis, présence persistante Redis, FTS PostgreSQL) - CL1 : Cleanup veza-chat-server, nettoyage CI/CD/config @@ -171,6 +200,7 @@ - Référence : [V0_503_RELEASE_SCOPE.md](V0_503_RELEASE_SCOPE.md) ### Prochaine version (v0.701) + - Retry automatique des transferts échoués (cron + backoff exponentiel) - Dashboard admin des transferts (GET /admin/transfers, retry manuel) - Deep health checks (GET /health/deep — DB, Redis, S3, disk) @@ -182,11 +212,12 @@ ## 4. Sécurité -| Métrique | Avant v0.404 | Après v0.404 | -|----------|--------------|--------------| -| **Score sécurité** | 5/10 | 7/10 | +| Métrique | Avant v0.404 | Après v0.404 | +| ------------------ | ------------ | ------------ | +| **Score sécurité** | 5/10 | 7/10 | **Améliorations v0.404 :** + - JWT stream token endpoint (`POST /auth/stream-token`) pour auth HLS/WebSocket - SSRF protection sur webhooks (HTTPS-only, whitelist schéma) - IDOR corrigé dans GetUploadStatus (ownership check) @@ -199,78 +230,78 @@ ## 5. Infrastructure -| Élément | État v0.404 | -|---------|-------------| -| Rate limiting Redis | ✅ Disponible | -| Alerting Prometheus | ✅ Règles ajoutées | -| PostgreSQL | ✅ Aligné v16 | -| Compose staging | ✅ Complet (chat, stream, reverse proxy) | -| CodeQL SAST | ✅ Ajouté | -| Rust CI (clippy) | ✅ Ajouté | +| Élément | État v0.404 | +| ------------------- | ---------------------------------------- | +| Rate limiting Redis | ✅ Disponible | +| Alerting Prometheus | ✅ Règles ajoutées | +| PostgreSQL | ✅ Aligné v16 | +| Compose staging | ✅ Complet (chat, stream, reverse proxy) | +| CodeQL SAST | ✅ Ajouté | +| Rust CI (clippy) | ✅ Ajouté | --- ## 6. Qualité du code -| Métrique | v0.404 | -|----------|--------| -| fmt.Printf → zap | 40 remplacements | -| any TypeScript éliminés | ~45 | -| TypeScript unifié | 5.9.3 | -| Code mort supprimé | ~1600 LOC | -| gorilla/websocket | Remplacé par coder/websocket | +| Métrique | v0.404 | +| ----------------------- | ---------------------------- | +| fmt.Printf → zap | 40 remplacements | +| any TypeScript éliminés | ~45 | +| TypeScript unifié | 5.9.3 | +| Code mort supprimé | ~1600 LOC | +| gorilla/websocket | Remplacé par coder/websocket | --- ## 7. Références rapides -| Document | Usage | -|----------|-------| -| [PLAN_V0_301_FINALISATION.md](archive/PLAN_V0_301_FINALISATION.md) | Plan de finalisation v0.301 | -| [V0_401_RELEASE_SCOPE.md](archive/V0_401_RELEASE_SCOPE.md) | Scope v0.401 (Phase 4 Commerce) | -| [V0_402_RELEASE_SCOPE.md](V0_402_RELEASE_SCOPE.md) | Scope v0.402 (checkout & codes promo) | -| [V0_303_RELEASE_SCOPE.md](V0_303_RELEASE_SCOPE.md) | Scope v0.303 (Chat appels WebRTC 1-to-1) | -| [PLAN_V0_401_IMPLEMENTATION.md](PLAN_V0_401_IMPLEMENTATION.md) | Plan d'implémentation v0.401 | -| [PLAN_V0_402_IMPLEMENTATION.md](PLAN_V0_402_IMPLEMENTATION.md) | Plan d'implémentation v0.402 | -| [V0_404_RELEASE_SCOPE.md](V0_404_RELEASE_SCOPE.md) | Scope v0.404 (stabilisation post-audit) | -| [V0_501_RELEASE_SCOPE.md](archive/V0_501_RELEASE_SCOPE.md) | Scope v0.501 (Streaming & Cloud, archivé) | -| [V0_502_RELEASE_SCOPE.md](archive/V0_502_RELEASE_SCOPE.md) | Scope v0.502 (Chat Server Rewrite, archivé) | -| [V0_503_RELEASE_SCOPE.md](archive/V0_503_RELEASE_SCOPE.md) | Scope v0.503 (archivé) | -| [V0_601_RELEASE_SCOPE.md](archive/V0_601_RELEASE_SCOPE.md) | Scope v0.601 (archivé) | -| [V0_602_RELEASE_SCOPE.md](archive/V0_602_RELEASE_SCOPE.md) | Scope v0.602 (archivé) | -| [PLAN_V0_601_IMPLEMENTATION.md](PLAN_V0_601_IMPLEMENTATION.md) | Plan d'implémentation v0.601 | -| [PLAN_V0_602_IMPLEMENTATION.md](PLAN_V0_602_IMPLEMENTATION.md) | Plan d'implémentation v0.602 | -| [V0_603_RELEASE_SCOPE.md](V0_603_RELEASE_SCOPE.md) | Scope v0.603 (Transfer auto, Commission, Stabilisation) | -| [PLAN_V0_603_IMPLEMENTATION.md](PLAN_V0_603_IMPLEMENTATION.md) | Plan d'implémentation v0.603 | -| [CHAT_FEATURE_PARITY.md](CHAT_FEATURE_PARITY.md) | Feature parity Rust vs Go (25/25 OK) | -| [V0_301_RELEASE_SCOPE.md](archive/V0_301_RELEASE_SCOPE.md) | Scope détaillé v0.301 (Phase 3 Social) | -| [V0_203_RELEASE_SCOPE.md](V0_203_RELEASE_SCOPE.md) | Scope v0.203 (archivé) | -| [SCOPE_CONTROL.md](SCOPE_CONTROL.md) | Anti-scope-creep, workflow | -| [FEATURE_STATUS.md](FEATURE_STATUS.md) | Statut des features par domaine | -| [CHANGELOG.md](../CHANGELOG.md) | Historique des versions | +| Document | Usage | +| ------------------------------------------------------------------ | ------------------------------------------------------- | +| [PLAN_V0_301_FINALISATION.md](archive/PLAN_V0_301_FINALISATION.md) | Plan de finalisation v0.301 | +| [V0_401_RELEASE_SCOPE.md](archive/V0_401_RELEASE_SCOPE.md) | Scope v0.401 (Phase 4 Commerce) | +| [V0_402_RELEASE_SCOPE.md](V0_402_RELEASE_SCOPE.md) | Scope v0.402 (checkout & codes promo) | +| [V0_303_RELEASE_SCOPE.md](V0_303_RELEASE_SCOPE.md) | Scope v0.303 (Chat appels WebRTC 1-to-1) | +| [PLAN_V0_401_IMPLEMENTATION.md](PLAN_V0_401_IMPLEMENTATION.md) | Plan d'implémentation v0.401 | +| [PLAN_V0_402_IMPLEMENTATION.md](PLAN_V0_402_IMPLEMENTATION.md) | Plan d'implémentation v0.402 | +| [V0_404_RELEASE_SCOPE.md](V0_404_RELEASE_SCOPE.md) | Scope v0.404 (stabilisation post-audit) | +| [V0_501_RELEASE_SCOPE.md](archive/V0_501_RELEASE_SCOPE.md) | Scope v0.501 (Streaming & Cloud, archivé) | +| [V0_502_RELEASE_SCOPE.md](archive/V0_502_RELEASE_SCOPE.md) | Scope v0.502 (Chat Server Rewrite, archivé) | +| [V0_503_RELEASE_SCOPE.md](archive/V0_503_RELEASE_SCOPE.md) | Scope v0.503 (archivé) | +| [V0_601_RELEASE_SCOPE.md](archive/V0_601_RELEASE_SCOPE.md) | Scope v0.601 (archivé) | +| [V0_602_RELEASE_SCOPE.md](archive/V0_602_RELEASE_SCOPE.md) | Scope v0.602 (archivé) | +| [PLAN_V0_601_IMPLEMENTATION.md](PLAN_V0_601_IMPLEMENTATION.md) | Plan d'implémentation v0.601 | +| [PLAN_V0_602_IMPLEMENTATION.md](PLAN_V0_602_IMPLEMENTATION.md) | Plan d'implémentation v0.602 | +| [V0_603_RELEASE_SCOPE.md](V0_603_RELEASE_SCOPE.md) | Scope v0.603 (Transfer auto, Commission, Stabilisation) | +| [PLAN_V0_603_IMPLEMENTATION.md](PLAN_V0_603_IMPLEMENTATION.md) | Plan d'implémentation v0.603 | +| [CHAT_FEATURE_PARITY.md](CHAT_FEATURE_PARITY.md) | Feature parity Rust vs Go (25/25 OK) | +| [V0_301_RELEASE_SCOPE.md](archive/V0_301_RELEASE_SCOPE.md) | Scope détaillé v0.301 (Phase 3 Social) | +| [V0_203_RELEASE_SCOPE.md](V0_203_RELEASE_SCOPE.md) | Scope v0.203 (archivé) | +| [SCOPE_CONTROL.md](SCOPE_CONTROL.md) | Anti-scope-creep, workflow | +| [FEATURE_STATUS.md](FEATURE_STATUS.md) | Statut des features par domaine | +| [CHANGELOG.md](../CHANGELOG.md) | Historique des versions | --- ## 8. Stack technique -| Composant | État | -|-----------|------| -| Backend Go | ✅ Opérationnel | -| Frontend React (Vite) | ✅ Opérationnel | -| Chat Go (intégré backend) | ✅ Opérationnel (v0.502) | -| Stream Server Rust | ✅ Compile — HLS en intégration (v0.503) | -| PostgreSQL | ✅ | -| Redis | ✅ | +| Composant | État | +| ------------------------- | ---------------------------------------- | +| Backend Go | ✅ Opérationnel | +| Frontend React (Vite) | ✅ Opérationnel | +| Chat Go (intégré backend) | ✅ Opérationnel (v0.502) | +| Stream Server Rust | ✅ Compile — HLS en intégration (v0.503) | +| PostgreSQL | ✅ | +| Redis | ✅ | --- ## 9. Indicateurs -| Métrique | Valeur | -|----------|--------| -| Features livrées (cumul) | ~353 / 600 | -| Features E2E fonctionnelles | 22 | -| Score maturité produit | 5/10 | -| Module Streaming | 55% | -| Module Cloud | 30% | -| Module Gear | 60% | +| Métrique | Valeur | +| --------------------------- | ---------- | +| Features livrées (cumul) | ~353 / 600 | +| Features E2E fonctionnelles | 22 | +| Score maturité produit | 5/10 | +| Module Streaming | 55% | +| Module Cloud | 30% | +| Module Gear | 60% |