Intercalaire 3 : APPS & SERVICES
Généré le 4 Avril 2026 - Projet Talas
APIs & Modules Rust – Performances & Interop
Ce dossier contient les spécifications API de Talas (REST/gRPC), ainsi que les modules Rust haute performance pour le streaming audio, le traitement en ligne, et le rendu.
Objectifs :
- Créer une interopérabilité robuste entre les différents services.
- Offrir un moteur Rust performant pour les traitements audio.
- Structurer une API claire, documentée, et évolutive.
Contenu :
API_Specs/ : OpenAPI, gRPC Protobuf, GraphQL schemas
Rust_Engines/ : streaming, encodage, plugins
Benchmarks/ : perfs sur FLAC, Opus, WebRTC
Ces modules peuvent être exposés comme services REST ou microservices via gRPC.
Référence Complète des Routes API Veza
Inventaire exhaustif de tous les endpoints REST et WebSocket.
Source : veza-backend-api/internal/api/routes_*.go et veza-stream-server/src/routes/api.rs
~500+ endpoints au total.
Conventions
- Base URL :
/api/v1
- Auth : JWT RS256 via cookie HTTP-only ou header
Authorization: Bearer <token>
- CSRF : Token Redis obligatoire sur tous les POST/PUT/DELETE protégés
- Rate limiting : Global (1000 req/s), par IP (100 req/s), par endpoint (variable)
- Réponses : JSON, pagination par
?page=N&limit=N
Légende des badges
| Badge |
Signification |
| 🔓 |
Public (pas d'auth) |
| 🔒 |
Auth requise |
| 🔒👑 |
Auth + admin + MFA |
| 🔒🎨 |
Auth + rôle content_creator |
| ⚡ |
Rate limité spécifiquement |
1. Authentification (/auth)
Fichier : routes_auth.go
Endpoints publics
| Méthode |
Route |
Description |
Notes |
| 🔓 POST |
/auth/register |
Inscription |
⚡ Rate limité |
| 🔓 POST |
/auth/login |
Connexion |
⚡ Rate limité |
| 🔓 POST |
/auth/login/2fa |
Connexion avec 2FA |
|
| 🔓 POST |
/auth/refresh |
Rafraîchir le token |
⚡ Rate limité |
| 🔓 POST |
/auth/verify-email |
Vérification email |
⚡ Rate limité |
| 🔓 POST |
/auth/resend-verification |
Renvoyer email vérification |
⚡ Rate limité |
| 🔓 GET |
/auth/check-username |
Disponibilité pseudo |
⚡ Rate limité |
| 🔓 POST |
/auth/password/reset-request |
Demande reset mot de passe |
⚡ Rate limité |
| 🔓 POST |
/auth/password/reset |
Reset mot de passe |
|
| 🔓 GET |
/auth/oauth/providers |
Liste des providers OAuth |
|
| 🔓 GET |
/auth/oauth/:provider |
Initier OAuth |
|
| 🔓 GET |
/auth/oauth/:provider/callback |
Callback OAuth |
|
Endpoints protégés
| Méthode |
Route |
Description |
| 🔒 POST |
/auth/logout |
Déconnexion |
| 🔒 GET |
/auth/me |
Info utilisateur courant |
| 🔒 POST |
/auth/stream-token |
Générer token streaming |
| 🔒 POST |
/auth/2fa/setup |
Configurer 2FA |
| 🔒 POST |
/auth/2fa/verify |
Vérifier 2FA |
| 🔒 POST |
/auth/2fa/disable |
Désactiver 2FA |
| 🔒 GET |
/auth/2fa/status |
Statut 2FA |
| 🔒 GET |
/auth/passkeys |
Lister Passkeys/WebAuthn |
| 🔒 POST |
/auth/passkeys/register/begin |
Début enregistrement passkey |
| 🔒 POST |
/auth/passkeys/register/finish |
Fin enregistrement passkey |
| 🔒 PUT |
/auth/passkeys/:id |
Renommer passkey |
| 🔒 DELETE |
/auth/passkeys/:id |
Supprimer passkey |
| 🔒 GET |
/auth/login-history |
Historique connexions |
2. Utilisateurs (/users)
Fichier : routes_users.go
Endpoints publics
| Méthode |
Route |
Description |
| 🔓 GET |
/users |
Lister les utilisateurs |
| 🔓 GET |
/users/:id |
Profil utilisateur |
| 🔓 GET |
/users/by-username/:username |
Profil par pseudo |
| 🔓 GET |
/users/search |
Recherche utilisateurs |
| 🔓 GET |
/users/:id/reposts |
Reposts de l'utilisateur |
| 🔓 GET |
/users/:id/gear |
Profil équipement public |
Endpoints protégés
| Méthode |
Route |
Description |
| 🔒 GET |
/users/suggestions |
Suggestions de follow |
| 🔒 GET |
/users/settings |
Paramètres utilisateur |
| 🔒 PUT |
/users/settings |
Modifier paramètres |
| 🔒 PUT |
/users/:id |
Modifier profil (ownership) |
| 🔒 DELETE |
/users/:id |
Supprimer utilisateur (ownership) |
| 🔒 GET |
/users/:id/completion |
Complétion profil |
| 🔒 PUT |
/users/me/presence |
Mettre à jour présence |
| 🔒 GET |
/users/:id/presence |
Voir la présence |
| 🔒 POST |
/users/:id/follow |
Suivre |
| 🔒 DELETE |
/users/:id/follow |
Ne plus suivre |
| 🔒 POST |
/users/:id/block |
Bloquer |
| 🔒 DELETE |
/users/:id/block |
Débloquer |
| 🔒 POST |
/users/:id/roles |
Assigner rôle |
| 🔒 DELETE |
/users/:id/roles/:roleId |
Révoquer rôle |
| 🔒 POST |
/users/:id/avatar |
Upload avatar |
| 🔒 DELETE |
/users/:id/avatar |
Supprimer avatar |
| 🔒 GET |
/users/:id/likes |
Pistes likées |
| 🔒 PUT |
/users/me/password |
Changer mot de passe |
| 🔒 GET |
/users/me/export |
Export JSON (sync, fallback) |
| 🔒 POST |
/users/me/export |
Export RGPD (async) |
| 🔒 GET |
/users/me/exports |
Lister exports |
| 🔒 GET |
/users/me/exports/:id/download |
Télécharger export |
| 🔒 GET |
/users/me/exports/:id |
Statut export |
| 🔒 DELETE |
/users/me |
Supprimer compte |
| 🔒 POST |
/users/me/privacy/opt-out |
CCPA Do Not Sell |
3. Rôles (/roles)
Fichier : routes_users.go
| Méthode |
Route |
Description |
| 🔒 GET |
/roles |
Lister les rôles |
| 🔒 GET |
/roles/:id |
Détail d'un rôle |
| 🔒 POST |
/roles |
Créer un rôle |
| 🔒 PUT |
/roles/:id |
Modifier un rôle |
| 🔒 DELETE |
/roles/:id |
Supprimer un rôle |
4. Pistes audio (/tracks)
Fichier : routes_tracks.go
Endpoints publics
| Méthode |
Route |
Description |
| 🔓 GET |
/tracks |
Lister les pistes (auth optionnelle) |
| 🔓 GET |
/tracks/search |
Recherche de pistes |
| 🔓 GET |
/tracks/suggested-tags |
Suggestions de tags |
| 🔓 GET |
/tracks/:id |
Détail piste (auth optionnelle) |
| 🔓 GET |
/tracks/:id/lyrics |
Paroles |
| 🔓 GET |
/tracks/:id/stats |
Statistiques |
| 🔓 GET |
/tracks/:id/waveform |
Forme d'onde |
| 🔓 GET |
/tracks/:id/history |
Historique |
| 🔓 GET |
/tracks/:id/download |
Téléchargement |
| 🔓 GET |
/tracks/shared/:token |
Piste partagée |
| 🔓 GET |
/tracks/:id/repost |
Statut repost (auth optionnelle) |
| 🔓 GET |
/tracks/:id/comments |
Commentaires |
Endpoints HLS (publics)
| Méthode |
Route |
Description |
| 🔓 GET |
/tracks/:id/hls/info |
Info stream HLS |
| 🔓 GET |
/tracks/:id/hls/status |
Statut stream HLS |
| 🔓 GET |
/tracks/:id/hls/master.m3u8 |
Playlist master HLS |
| 🔓 GET |
/tracks/:id/hls/:bitrate/playlist.m3u8 |
Playlist qualité |
| 🔓 GET |
/tracks/:id/hls/:bitrate/:segment |
Segment HLS |
Endpoints protégés
| Méthode |
Route |
Description |
| 🔒🎨 POST |
/tracks |
Upload piste |
| 🔒 GET |
/tracks/recommendations |
Recommandations |
| 🔒 PUT |
/tracks/:id |
Modifier piste (ownership) |
| 🔒 PUT |
/tracks/:id/lyrics |
Modifier paroles (ownership) |
| 🔒 DELETE |
/tracks/:id |
Supprimer piste (ownership) |
| 🔒 GET |
/tracks/:id/status |
Statut upload |
| 🔒 POST |
/tracks/initiate |
Initier upload chunked |
| 🔒 POST |
/tracks/chunk |
Upload chunk |
| 🔒 POST |
/tracks/complete |
Finaliser upload chunked |
| 🔒 GET |
/tracks/quota/:id |
Quota upload |
| 🔒 GET |
/tracks/resume/:uploadId |
Reprendre upload |
| 🔒 POST |
/tracks/batch/delete |
Suppression batch |
| 🔒 POST |
/tracks/batch/update |
Mise à jour batch |
| 🔒 POST |
/tracks/:id/like |
Liker |
| 🔒 DELETE |
/tracks/:id/like |
Unliker |
| 🔒 GET |
/tracks/:id/likes |
Likes de la piste |
| 🔒 POST |
/tracks/:id/repost |
Reposter |
| 🔒 DELETE |
/tracks/:id/repost |
Annuler repost |
| 🔒 POST |
/tracks/:id/share |
Créer partage |
| 🔒 DELETE |
/tracks/share/:id |
Révoquer partage |
| 🔒 POST |
/tracks/:id/versions/:versionId/restore |
Restaurer version |
| 🔒 POST |
/tracks/:id/play |
Enregistrer lecture |
| 🔒 POST |
/tracks/:id/stems |
Upload stem |
| 🔒 GET |
/tracks/:id/stems |
Lister stems |
| 🔒 GET |
/tracks/:id/stems/:name/download |
Télécharger stem |
Commentaires
| Méthode |
Route |
Description |
| 🔒 POST |
/tracks/:id/comments |
Créer commentaire |
| 🔒 DELETE |
/comments/:id |
Supprimer commentaire |
5. Playlists (/playlists)
Fichier : routes_playlists.go
| Méthode |
Route |
Description |
| 🔓 GET |
/playlists/shared/:token |
Playlist partagée |
| 🔒 GET |
/playlists |
Mes playlists |
| 🔒 POST |
/playlists |
Créer playlist |
| 🔒 POST |
/playlists/import |
Importer playlist |
| 🔒 GET |
/playlists/search |
Recherche |
| 🔒 GET |
/playlists/recommendations |
Recommandations |
| 🔒 GET |
/playlists/favoris |
Playlist favoris |
| 🔒 GET |
/playlists/:id |
Détail playlist |
| 🔒 GET |
/playlists/:id/analytics |
Stats playlist |
| 🔒 PUT |
/playlists/:id |
Modifier (ownership) |
| 🔒 DELETE |
/playlists/:id |
Supprimer (ownership) |
| 🔒 POST |
/playlists/:id/tracks |
Ajouter piste |
| 🔒 DELETE |
/playlists/:id/tracks/:track_id |
Retirer piste |
| 🔒 PUT |
/playlists/:id/tracks/reorder |
Réordonner |
| 🔒 POST |
/playlists/:id/collaborators |
Ajouter collaborateur |
| 🔒 GET |
/playlists/:id/collaborators |
Lister collaborateurs |
| 🔒 PUT |
/playlists/:id/collaborators/:userId |
Modifier permission |
| 🔒 DELETE |
/playlists/:id/collaborators/:userId |
Retirer collaborateur |
| 🔒 POST |
/playlists/:id/share |
Créer lien de partage |
| 🔒 GET |
/playlists/:id/export/json |
Export JSON |
| 🔒 GET |
/playlists/:id/export/csv |
Export CSV |
| 🔒 GET |
/playlists/:id/export/m3u |
Export M3U |
| 🔒 POST |
/playlists/:id/duplicate |
Dupliquer |
6. Chat & Conversations (/chat, /conversations)
Fichier : router.go, routes_core.go
Chat
| Méthode |
Route |
Description |
| 🔒 GET |
/chat/ws |
WebSocket chat |
| 🔒 POST |
/chat/token |
Obtenir token chat |
| 🔒 GET |
/chat/stats |
Stats chat |
| 🔒 POST |
/chat/rooms/:roomId/messages/:messageId/reactions |
Ajouter réaction |
| 🔒 DELETE |
/chat/rooms/:roomId/messages/:messageId/reactions |
Retirer réaction |
| 🔒 GET |
/chat/rooms/:roomId/messages/search |
Recherche messages |
| 🔒 POST |
/chat/rooms/:roomId/attachments |
Upload pièce jointe |
Conversations
| Méthode |
Route |
Description |
| 🔒 GET |
/conversations |
Mes conversations |
| 🔒 POST |
/conversations |
Créer conversation |
| 🔒 GET |
/conversations/join/:token |
Rejoindre par token |
| 🔒 GET |
/conversations/:id |
Détail conversation |
| 🔒 PUT |
/conversations/:id |
Modifier conversation |
| 🔒 DELETE |
/conversations/:id |
Supprimer conversation |
| 🔒 POST |
/conversations/:id/leave |
Quitter |
| 🔒 GET |
/conversations/:id/members |
Lister membres |
| 🔒 POST |
/conversations/:id/members |
Ajouter membre |
| 🔒 DELETE |
/conversations/:id/members/:userId |
Exclure membre |
| 🔒 PATCH |
/conversations/:id/members/:userId |
Modifier rôle membre |
| 🔒 POST |
/conversations/:id/participants |
Ajouter participant |
| 🔒 DELETE |
/conversations/:id/participants/:userId |
Retirer participant |
| 🔒 POST |
/conversations/:id/invitations |
Créer invitation |
| 🔒 GET |
/conversations/:id/history |
Historique |
7. Social (/social)
Fichier : routes_social.go
Endpoints publics
| Méthode |
Route |
Description |
| 🔓 GET |
/social/feed |
Feed (auth optionnelle) |
| 🔓 GET |
/social/explore |
Explorer |
| 🔓 GET |
/social/trending |
Tendances |
| 🔓 GET |
/social/posts/user/:user_id |
Posts utilisateur |
| 🔓 GET |
/social/groups |
Lister groupes |
Endpoints protégés
| Méthode |
Route |
Description |
| 🔒 GET |
/social/groups/mine |
Mes groupes |
| 🔒 GET |
/social/groups/:id |
Détail groupe |
| 🔒 POST |
/social/posts |
Créer post |
| 🔒 POST |
/social/like |
Toggle like |
| 🔒 POST |
/social/comments |
Ajouter commentaire |
| 🔒 POST |
/social/groups |
Créer groupe |
| 🔒 POST |
/social/groups/:id/join |
Rejoindre groupe |
| 🔒 DELETE |
/social/groups/:id/leave |
Quitter groupe |
| 🔒 POST |
/social/groups/:id/request |
Demande adhésion |
| 🔒 GET |
/social/groups/:id/requests |
Demandes en attente |
| 🔒 POST |
/social/groups/:id/requests/:request_id/approve |
Approuver |
| 🔒 POST |
/social/groups/:id/requests/:request_id/reject |
Rejeter |
| 🔒 POST |
/social/groups/:id/invite |
Inviter membre |
| 🔒 PUT |
/social/groups/:id/members/:user_id/role |
Modifier rôle |
8. Découverte (/discover)
Fichier : routes_discover.go
| Méthode |
Route |
Description |
| 🔓 GET |
/discover/genres |
Lister genres |
| 🔓 GET |
/discover/genre/:genre |
Pistes par genre |
| 🔓 GET |
/discover/tag/:tag |
Pistes par tag |
| 🔓 GET |
/discover/playlists/editorial |
Playlists éditoriales |
| 🔒 POST |
/discover/genre/:genre/follow |
Suivre genre |
| 🔒 DELETE |
/discover/genre/:genre/follow |
Ne plus suivre genre |
| 🔒 POST |
/discover/tag/:tag/follow |
Suivre tag |
| 🔒 DELETE |
/discover/tag/:tag/follow |
Ne plus suivre tag |
9. Recherche (/search)
Fichier : routes_search.go
| Méthode |
Route |
Description |
| 🔓 GET |
/search |
Recherche unifiée (pistes, users, playlists) |
| 🔓 GET |
/search/suggestions |
Suggestions |
Backend : Elasticsearch (fallback PostgreSQL full-text).
10. Feed (/feed)
Fichier : routes_feed.go
| Méthode |
Route |
Description |
| 🔒 GET |
/feed |
Feed chronologique des pistes |
11. File d'attente (/queue)
Fichier : routes_queue.go
| Méthode |
Route |
Description |
| 🔒 GET |
/queue |
Ma file d'attente |
| 🔒 PUT |
/queue |
Mettre à jour |
| 🔒 POST |
/queue/items |
Ajouter item |
| 🔒 DELETE |
/queue/items/:id |
Retirer item |
| 🔒 DELETE |
/queue |
Vider la file |
| 🔒 POST |
/queue/session |
Créer session collaborative |
| 🔒 DELETE |
/queue/session/:token |
Supprimer session |
| 🔒 POST |
/queue/session/:token/items |
Ajouter à session |
| 🔒 DELETE |
/queue/session/:token/items/:id |
Retirer de session |
| 🔓 GET |
/queue/session/:token |
Voir session (auth optionnelle) |
12. Marketplace (/marketplace, /sell, /commerce)
Fichier : routes_marketplace.go
Marketplace (publics)
| Méthode |
Route |
Description |
| 🔓 GET |
/marketplace/products |
Lister produits |
| 🔓 GET |
/marketplace/products/:id |
Détail produit |
| 🔓 GET |
/marketplace/products/:id/preview |
Prévisualiser |
| 🔓 GET |
/marketplace/products/:id/reviews |
Avis |
Marketplace (protégés)
| Méthode |
Route |
Description |
| 🔒🎨 POST |
/marketplace/products |
Créer produit |
| 🔒🎨 POST |
/marketplace/products/:id/preview |
Upload preview |
| 🔒 PUT |
/marketplace/products/:id |
Modifier (ownership) |
| 🔒 PUT |
/marketplace/products/:id/images |
Modifier images |
| 🔒 GET |
/marketplace/orders |
Mes commandes |
| 🔒 GET |
/marketplace/orders/:id |
Détail commande |
| 🔒 GET |
/marketplace/orders/:id/invoice |
Facture |
| 🔒 POST |
/marketplace/orders/:id/refund |
Remboursement |
| 🔒 POST |
/marketplace/orders |
Créer commande |
| 🔒 GET |
/marketplace/download/:product_id |
URL téléchargement |
| 🔒 GET |
/marketplace/licenses/mine |
Mes licences |
| 🔒 POST |
/marketplace/products/:id/reviews |
Laisser avis |
| 🔒 GET |
/marketplace/wishlist |
Wishlist |
| 🔒 POST |
/marketplace/wishlist |
Ajouter à wishlist |
| 🔒 DELETE |
/marketplace/wishlist/:productId |
Retirer de wishlist |
Vendeur (/sell)
| Méthode |
Route |
Description |
| 🔒🎨 GET |
/sell/stats |
Stats ventes |
| 🔒🎨 GET |
/sell/stats/evolution |
Évolution stats |
| 🔒🎨 GET |
/sell/stats/top-products |
Top produits |
| 🔒🎨 GET |
/sell/sales |
Historique ventes |
| 🔒🎨 POST |
/sell/connect/onboard |
Onboarding Stripe Connect |
| 🔒🎨 GET |
/sell/connect/callback |
Callback Stripe |
| 🔒🎨 GET |
/sell/balance |
Solde |
| 🔒🎨 GET |
/sell/transfers |
Transferts |
| 🔒🎨 GET |
/sell/marketplace-balance |
Solde marketplace |
| 🔒🎨 GET |
/sell/payouts |
Historique versements |
| 🔒🎨 POST |
/sell/payouts/request |
Demander versement |
| 🔒🎨 POST |
/sell/kyc/start |
Démarrer KYC |
| 🔒🎨 GET |
/sell/kyc/status |
Statut KYC |
Commerce (/commerce)
| Méthode |
Route |
Description |
| 🔒 GET |
/commerce/cart |
Panier |
| 🔒 GET |
/commerce/promo/:code |
Valider code promo |
| 🔒 POST |
/commerce/cart/items |
Ajouter au panier |
| 🔒 DELETE |
/commerce/cart/items/:id |
Retirer du panier |
| 🔒 POST |
/commerce/cart/checkout |
Payer |
Support
| Méthode |
Route |
Description |
| 🔓 POST |
/support/tickets |
Soumettre ticket |
13. Webhooks (/webhooks)
Fichier : routes_webhooks.go
| Méthode |
Route |
Description |
| 🔓 POST |
/webhooks/hyperswitch |
Webhook paiement (vérif. signature) |
| 🔒 POST |
/webhooks |
Enregistrer webhook |
| 🔒 GET |
/webhooks |
Lister webhooks |
| 🔒 DELETE |
/webhooks/:id |
Supprimer webhook |
| 🔒 GET |
/webhooks/stats |
Stats webhooks |
| 🔒 POST |
/webhooks/:id/test |
Tester webhook |
| 🔒 POST |
/webhooks/:id/regenerate-key |
Régénérer clé API |
14. Analytics (/analytics, /creator/analytics)
Fichier : routes_analytics.go
| Méthode |
Route |
Description |
| 🔒 GET |
/analytics/creator/stats |
Stats créateur |
| 🔒 GET |
/analytics/creator/charts |
Graphiques |
| 🔒 GET |
/analytics/creator/export |
Export |
| 🔒 GET |
/analytics |
Analytics globales |
| 🔒 POST |
/analytics/events |
Enregistrer événement |
| 🔒 GET |
/analytics/tracks/:id |
Analytics piste |
| 🔒 GET |
/analytics/traffic-sources |
Sources de trafic |
| 🔒 GET |
/analytics/device-breakdown |
Répartition appareils |
| 🔒 GET |
/creator/analytics/dashboard |
Dashboard créateur |
| 🔒 GET |
/creator/analytics/plays |
Évolution lectures |
| 🔒 GET |
/creator/analytics/sales |
Ventes |
| 🔒 GET |
/creator/analytics/discovery |
Sources découverte |
| 🔒 GET |
/creator/analytics/geographic |
Géographie |
| 🔒 GET |
/creator/analytics/audience |
Audience |
| 🔒 GET |
/creator/analytics/live/:streamId |
Métriques live |
| 🔒 GET |
/creator/analytics/tracks |
Pistes |
| 🔒 GET |
/creator/analytics/export |
Export analytics |
| 🔒 GET |
/creator/analytics/heatmap/:trackId |
Heatmap piste |
| 🔒 GET |
/creator/analytics/compare |
Comparaison périodes |
| 🔒 GET |
/creator/analytics/marketplace |
Analytics marketplace |
| 🔒 GET |
/creator/analytics/alerts |
Alertes métriques |
| 🔒 POST |
/creator/analytics/alerts |
Créer alerte |
| 🔒 PUT |
/creator/analytics/alerts/preferences |
Préférences alertes |
| 🔒 DELETE |
/creator/analytics/alerts/:alertId |
Supprimer alerte |
| 🔒 POST |
/creator/analytics/alerts/check |
Vérifier alertes |
15. Modération (/admin/moderation, /reports, /strikes)
Fichier : routes_moderation.go
Admin
| Méthode |
Route |
Description |
| 🔒👑 GET |
/admin/moderation/queue |
File de modération |
| 🔒👑 POST |
/admin/moderation/reports/:id/process |
Traiter signalement |
| 🔒👑 POST |
/admin/moderation/reports/:id/assign |
Assigner signalement |
| 🔒👑 GET |
/admin/moderation/spam |
Détections spam |
| 🔒👑 GET |
/admin/moderation/fingerprints |
Empreintes en attente |
| 🔒👑 POST |
/admin/moderation/fingerprints/:trackId/review |
Vérifier empreinte |
| 🔒👑 GET |
/admin/moderation/users/:userId/strikes |
Strikes utilisateur |
| 🔒👑 GET |
/admin/moderation/appeals |
Appels en attente |
| 🔒👑 POST |
/admin/moderation/appeals/:strikeId/resolve |
Résoudre appel |
| 🔒👑 GET |
/admin/moderation/stats |
Stats modération |
Utilisateur
| Méthode |
Route |
Description |
| 🔒 POST |
/reports |
Signaler contenu |
| 🔒 GET |
/me/strikes |
Mes strikes |
| 🔒 POST |
/strikes/:strikeId/appeal |
Faire appel |
16. Administration plateforme (/admin/platform)
Fichier : routes_admin_platform.go
| Méthode |
Route |
Description |
| 🔒👑 GET |
/admin/platform/metrics |
Métriques plateforme |
| 🔒👑 GET |
/admin/platform/users |
Recherche utilisateurs |
| 🔒👑 GET |
/admin/platform/users/:userId |
Détail utilisateur |
| 🔒👑 PUT |
/admin/platform/users/:userId/role |
Modifier rôle |
| 🔒👑 POST |
/admin/platform/users/:userId/suspend |
Suspendre |
| 🔒👑 POST |
/admin/platform/users/:userId/unsuspend |
Réactiver |
| 🔒👑 GET |
/admin/platform/content |
Recherche contenu |
| 🔒👑 POST |
/admin/platform/content/:id/hide |
Masquer contenu |
| 🔒👑 POST |
/admin/platform/content/:id/restore |
Restaurer contenu |
| 🔒👑 GET |
/admin/platform/payments |
Aperçu paiements |
| 🔒👑 POST |
/admin/platform/orders/:id/refund |
Rembourser commande |
17. Live streaming (/live)
Fichier : routes_live.go
| Méthode |
Route |
Description |
| 🔓 GET |
/live/streams |
Lister streams live |
| 🔓 GET |
/live/streams/:id |
Détail stream |
| 🔒 GET |
/live/streams/me |
Mes streams |
| 🔒 GET |
/live/streams/me/key |
Clé de stream |
| 🔒 POST |
/live/streams/me/key/regenerate |
Régénérer clé |
| 🔒 POST |
/live/streams |
Créer live |
| 🔒 PUT |
/live/streams/:id |
Modifier live |
| POST |
/live/callback/publish |
Callback RTMP (secret) |
| POST |
/live/callback/publish_done |
Callback fin RTMP |
18. Co-écoute (/co-listening)
Fichier : routes_co_listening.go
| Méthode |
Route |
Description |
| 🔒 POST |
/co-listening/sessions |
Créer session |
| 🔒 GET |
/co-listening/sessions/:id |
Détail session |
| 🔒 DELETE |
/co-listening/sessions/:id |
Terminer session |
| 🔒 GET |
/co-listening/ws |
WebSocket co-écoute (JWT en query) |
19. Inventaire / Équipement (/inventory, /users/:id/gear)
Fichier : routes_gear.go
| Méthode |
Route |
Description |
| 🔓 GET |
/users/:id/gear |
Profil équipement public |
| 🔒 GET |
/inventory/gear |
Lister mon équipement |
| 🔒 POST |
/inventory/gear |
Ajouter équipement |
| 🔒 GET |
/inventory/gear/:id |
Détail équipement |
| 🔒 PUT |
/inventory/gear/:id |
Modifier |
| 🔒 DELETE |
/inventory/gear/:id |
Supprimer |
| 🔒 POST |
/inventory/gear/:id/images |
Upload image |
| 🔒 DELETE |
/inventory/gear/:id/images/:img_id |
Supprimer image |
| 🔒 POST |
/inventory/gear/:id/documents |
Upload document |
| 🔒 GET |
/inventory/gear/:id/documents |
Lister documents |
| 🔒 DELETE |
/inventory/gear/:id/documents/:docId |
Supprimer document |
| 🔒 POST |
/inventory/gear/:id/repairs |
Ajouter réparation |
| 🔒 GET |
/inventory/gear/:id/repairs |
Lister réparations |
| 🔒 DELETE |
/inventory/gear/:id/repairs/:repairId |
Supprimer réparation |
20. Cloud personnel (/cloud)
Fichier : routes_cloud.go
| Méthode |
Route |
Description |
| 🔓 GET |
/cloud/shared/:token |
Fichier partagé |
| 🔒 GET |
/cloud/folders |
Lister dossiers |
| 🔒 POST |
/cloud/folders |
Créer dossier |
| 🔒 PUT |
/cloud/folders/:id |
Renommer dossier |
| 🔒 DELETE |
/cloud/folders/:id |
Supprimer dossier |
| 🔒 GET |
/cloud/files |
Lister fichiers |
| 🔒 POST |
/cloud/files |
Upload fichier |
| 🔒 GET |
/cloud/files/:id |
Détail fichier |
| 🔒 DELETE |
/cloud/files/:id |
Supprimer fichier |
| 🔒 GET |
/cloud/files/:id/stream |
Streamer fichier |
| 🔒 POST |
/cloud/files/:id/publish |
Publier comme piste |
| 🔒 GET |
/cloud/files/:id/versions |
Lister versions |
| 🔒 POST |
/cloud/files/:id/versions |
Créer version |
| 🔒 POST |
/cloud/files/:id/restore/:version |
Restaurer version |
| 🔒 POST |
/cloud/files/:id/share |
Partager fichier |
| 🔒 GET |
/cloud/quota |
Quota stockage |
21. Abonnements (/subscriptions)
Fichier : routes_subscription.go
| Méthode |
Route |
Description |
| 🔓 GET |
/subscriptions/plans |
Lister forfaits |
| 🔓 GET |
/subscriptions/plans/:id |
Détail forfait |
| 🔒 GET |
/subscriptions/me |
Mon abonnement |
| 🔒 POST |
/subscriptions/subscribe |
S'abonner |
| 🔒 POST |
/subscriptions/cancel |
Annuler |
| 🔒 POST |
/subscriptions/reactivate |
Réactiver |
| 🔒 PUT |
/subscriptions/billing-cycle |
Changer cycle |
| 🔒 GET |
/subscriptions/invoices |
Factures |
| 🔒 GET |
/subscriptions/history |
Historique |
22. Distribution (/distributions)
Fichier : routes_distribution.go
| Méthode |
Route |
Description |
| 🔒 POST |
/distributions/submit |
Soumettre distribution |
| 🔒 GET |
/distributions |
Lister distributions |
| 🔒 GET |
/distributions/:id |
Détail |
| 🔒 GET |
/distributions/:id/status-history |
Historique statut |
| 🔒 POST |
/distributions/:id/remove |
Retirer |
| 🔒 GET |
/tracks/:id/distributions |
Distributions d'une piste |
| 🔒 GET |
/creators/me/external-royalties |
Royalties externes |
23. Éducation (/courses, /enrollments, /lessons, /certificates)
Fichier : routes_education.go
Endpoints publics
| Méthode |
Route |
Description |
| 🔓 GET |
/courses |
Cours publiés |
| 🔓 GET |
/courses/:id |
Détail cours |
| 🔓 GET |
/courses/:id/lessons |
Leçons du cours |
| 🔓 GET |
/courses/:id/reviews |
Avis |
| 🔓 GET |
/courses/slug/:slug |
Cours par slug |
| 🔓 GET |
/certificates/:code |
Vérifier certificat |
Endpoints protégés
| Méthode |
Route |
Description |
| 🔒 POST |
/courses |
Créer cours |
| 🔒 PUT |
/courses/:id |
Modifier cours |
| 🔒 DELETE |
/courses/:id |
Supprimer cours |
| 🔒 POST |
/courses/:id/publish |
Publier |
| 🔒 POST |
/courses/:id/archive |
Archiver |
| 🔒 POST |
/courses/:id/lessons |
Créer leçon |
| 🔒 PUT |
/courses/:id/lessons/:lesson_id |
Modifier leçon |
| 🔒 DELETE |
/courses/:id/lessons/:lesson_id |
Supprimer leçon |
| 🔒 POST |
/courses/:id/lessons/reorder |
Réordonner leçons |
| 🔒 POST |
/courses/:id/lessons/:lesson_id/video |
Upload vidéo |
| 🔒 POST |
/courses/:id/enroll |
S'inscrire |
| 🔒 GET |
/courses/:id/progress |
Progression |
| 🔒 POST |
/courses/:id/certificate |
Obtenir certificat |
| 🔒 POST |
/courses/:id/reviews |
Laisser avis |
| 🔒 GET |
/enrollments |
Mes inscriptions |
| 🔒 POST |
/lessons/:lesson_id/progress |
Mise à jour progression |
| 🔒 GET |
/certificates |
Mes certificats |
| 🔒 GET |
/creators/me/courses |
Mes cours (créateur) |
24. Tags & Suggestions (/tags)
Fichier : routes_tag.go
| Méthode |
Route |
Description |
| 🔒 GET |
/tags/suggest |
Suggestions de tags |
25. Développeur (/developer)
Fichier : routes_developer.go
| Méthode |
Route |
Description |
| 🔒 GET |
/developer/api-keys |
Lister clés API |
| 🔒 POST |
/developer/api-keys |
Créer clé API |
| 🔒 DELETE |
/developer/api-keys/:id |
Supprimer clé API |
26. Sessions (/sessions)
Fichier : routes_core.go
| Méthode |
Route |
Description |
| 🔒 POST |
/sessions/logout |
Déconnexion |
| 🔒 POST |
/sessions/logout-all |
Déconnexion tous appareils |
| 🔒 POST |
/sessions/logout-others |
Déconnexion autres appareils |
| 🔒 GET |
/sessions |
Sessions actives |
| 🔒 DELETE |
/sessions/:session_id |
Révoquer session |
| 🔒 GET |
/sessions/stats |
Stats sessions |
| 🔒 POST |
/sessions/refresh |
Rafraîchir session |
27. Uploads (/uploads)
Fichier : routes_core.go
| Méthode |
Route |
Description |
| 🔓 GET |
/upload/limits |
Limites upload |
| 🔓 GET |
/upload/validate-type |
Valider type fichier |
| 🔒 POST |
/uploads/ |
Upload fichier |
| 🔒 POST |
/uploads/batch |
Upload batch |
| 🔒 GET |
/uploads/:id/status |
Statut upload |
| 🔒 GET |
/uploads/:id/progress |
Progression |
| 🔒 DELETE |
/uploads/:id |
Supprimer upload |
| 🔒 GET |
/uploads/stats |
Stats uploads |
28. Notifications (/notifications)
Fichier : routes_core.go
| Méthode |
Route |
Description |
| 🔒 GET |
/notifications |
Mes notifications |
| 🔒 GET |
/notifications/unread-count |
Non lues |
| 🔒 GET |
/notifications/preferences |
Préférences |
| 🔒 PUT |
/notifications/preferences |
Modifier préférences |
| 🔒 POST |
/notifications/push/subscribe |
S'abonner push |
| 🔒 POST |
/notifications/:id/read |
Marquer lue |
| 🔒 POST |
/notifications/read-all |
Tout marquer lu |
| 🔒 DELETE |
/notifications/:id |
Supprimer |
| 🔒 DELETE |
/notifications |
Tout supprimer |
29. Audit (/audit)
Fichier : routes_core.go
| Méthode |
Route |
Description |
| 🔒 GET |
/audit/logs |
Rechercher logs |
| 🔒 GET |
/audit/stats |
Stats audit |
| 🔒 GET |
/audit/activity |
Activité utilisateur |
| 🔒 GET |
/audit/suspicious |
Activité suspecte |
| 🔒 GET |
/audit/ip/:ip |
Activité d'une IP |
| 🔒 GET |
/audit/logs/:id |
Détail log |
| 🔒 POST |
/audit/cleanup |
Nettoyage anciens logs |
30. Santé & Métriques (publics)
Fichier : routes_core.go
| Méthode |
Route |
Description |
| 🔓 GET |
/health |
Santé basique |
| 🔓 GET |
/health/deep |
Santé approfondie |
| 🔓 GET |
/healthz |
Liveness probe |
| 🔓 GET |
/readyz |
Readiness probe |
| 🔓 GET |
/api/v1/status |
Statut API |
| 🔓 GET |
/api/v1/csrf-token |
Token CSRF |
| 🔓 POST |
/api/v1/logs/frontend |
Logs frontend ⚡ |
| 🔓 GET |
/api/v1/announcements/active |
Annonces actives |
| GET |
/metrics |
Prometheus (protégé metrics middleware) |
31. Administration générale (/admin)
Fichier : routes_core.go
| Méthode |
Route |
Description |
| 🔒👑 GET |
/admin/audit/logs |
Logs audit admin |
| 🔒👑 GET |
/admin/audit/stats |
Stats audit admin |
| 🔒👑 GET |
/admin/audit/suspicious |
Activité suspecte |
| 🔒👑 GET |
/admin/reports |
Signalements |
| 🔒👑 POST |
/admin/reports/:id/resolve |
Résoudre signalement |
| 🔒👑 PUT |
/admin/maintenance |
Mode maintenance |
| 🔒👑 GET |
/admin/maintenance |
Statut maintenance |
| 🔒👑 GET |
/admin/announcements |
Lister annonces |
| 🔒👑 POST |
/admin/announcements |
Créer annonce |
| 🔒👑 DELETE |
/admin/announcements/:id |
Supprimer annonce |
| 🔒👑 GET |
/admin/transfers |
Transferts |
| 🔒👑 POST |
/admin/transfers/:id/retry |
Relancer transfert |
| 🔒👑 POST |
/admin/auth/unlock-account |
Débloquer compte |
| 🔒👑 POST |
/admin/search/reindex |
Réindexer Elasticsearch |
| 🔒👑 GET |
/admin/feature-flags |
Feature flags |
| 🔒👑 PUT |
/admin/feature-flags/:name |
Toggle feature flag |
32. Routes internes (entre services)
| Méthode |
Route |
Description |
| POST |
/internal/tracks/:id/stream-ready |
Callback stream (header X-Stream-Secret) |
| POST |
/internal/stream-events |
Événements stream |
Serveur Streaming Rust (Axum)
Voir [[SERVEUR_STREAMING_RUST]] pour le détail complet.
| Méthode |
Route |
Description |
| 🔓 GET |
/ |
Info serveur |
| 🔓 GET |
/health |
Santé |
| 🔓 GET |
/healthz |
Liveness |
| 🔓 GET |
/readyz |
Readiness |
| 🔓 GET |
/metrics |
Prometheus |
| 🔓 GET |
/stream/{filename} |
Stream audio (signature) |
| POST |
/internal/jobs/transcode |
Job transcoding (clé interne) |
| 🔒 POST |
/v1/stream/transcode |
Initier transcoding |
| 🔒 GET |
/v1/stream/job/{id} |
Statut job |
| 🔒 GET |
/v1/stream/hls/{job_id}/index.m3u8 |
Playlist HLS |
| 🔒 GET |
/v1/stream/hls/{job_id}/{segment} |
Segment HLS |
| 🔒 GET |
/hls/{track_id}/master.m3u8 |
Master playlist |
| 🔒 GET |
/hls/{track_id}/{quality}/playlist.m3u8 |
Playlist qualité |
| 🔒 GET |
/hls/{track_id}/{quality}/{segment} |
Segment qualité |
| 🔓 GET |
/ws |
WebSocket streaming |
Pile de middlewares globaux (ordre d'exécution)
- CORS — Validation des origines
- Cache Headers — En-têtes CDN
- Maintenance Mode — Retourne 503 sauf /health et /admin
- Request Logger — Logs structurés
- Prometheus Metrics — Compteurs/histogrammes
- Sentry Recovery — Capture d'erreurs
- Security Headers — HSTS, CSP, X-Content-Type-Options
- CCPA Header — Sec-GPC
- Audit Middleware — Auto-log POST/PUT/DELETE
- API Monitoring — Suivi pannes/alertes
- Error Handler — Stack traces en dev/DEBUG
- Recovery — Récupération après panic
- Request ID — UUID par requête
- Global Timeout — Timeout global
- DDoS Rate Limiting — 1000 req/s global, 100/s par IP
- Rate Limiter — Général
- Response Cache — Redis, TTL 5-15 min
Documents liés
- [[ARCHITECTURE_VEZA]] — Architecture globale
- [[SCHEMA_BASE_DE_DONNEES]] — Schéma PostgreSQL
- [[SERVEUR_STREAMING_RUST]] — Serveur Rust détaillé
Serveur Streaming Rust (veza-stream-server)
Architecture du serveur audio haute performance basé sur Axum.
Source : veza-stream-server/src/
Vue d'ensemble
Le stream server est un service Rust autonome qui gère :
- Streaming audio HLS adaptatif multi-bitrate
- WebSocket temps réel pour la lecture synchronisée
- Transcoding audio via FFmpeg (WAV → MP3, HLS)
- Métriques Prometheus pour le monitoring
Il communique avec le backend Go via RabbitMQ (événements asynchrones) et des callbacks REST internes.
Stack technique
| Composant |
Technologie |
| Framework HTTP |
Axum (async Rust) |
| Runtime |
Tokio |
| Auth |
JWT (validation) |
| Audio |
FFmpeg (transcoding), HLS.js (côté client) |
| Messaging |
RabbitMQ (consommateur) |
| Cache |
In-memory (playlists HLS) |
| Monitoring |
Prometheus |
| Stockage |
S3/MinIO |
| Base de données |
PostgreSQL (requêtes directes) |
Structure des modules
veza-stream-server/src/
├── main.rs # Point d'entrée, initialisation Axum
├── routes/
│ └── api.rs # Définition de toutes les routes
├── streaming/
│ ├── websocket.rs # Handler WebSocket avec protocole de sync
│ ├── hls.rs # Génération de playlists HLS
│ └── adaptive.rs # Sélection adaptative du bitrate
├── transcoding/
│ └── mod.rs # Orchestration transcoding FFmpeg
├── codecs/
│ └── mod.rs # Wrappers FFmpeg
├── audio/
│ └── mod.rs # Utilitaires audio
├── middleware/
│ ├── logging.rs # Logs structurés
│ ├── security.rs # Headers de sécurité
│ └── rate_limit.rs # Rate limiting par IP
├── auth/
│ └── mod.rs # Validation JWT
├── config/
│ └── mod.rs # Configuration depuis env
├── health/
│ └── mod.rs # Health checks
├── monitoring/
│ └── mod.rs # Métriques Prometheus
├── cache/
│ └── mod.rs # Cache mémoire playlists
└── database/
└── mod.rs # Requêtes PostgreSQL
Routes
Santé & monitoring
| Méthode |
Route |
Description |
| GET |
/ |
Message racine (info serveur) |
| GET |
/health |
Health check détaillé |
| GET |
/healthz |
Liveness probe (Kubernetes) |
| GET |
/readyz |
Readiness probe |
| GET |
/metrics |
Métriques Prometheus |
Streaming audio
| Méthode |
Route |
Description |
Auth |
| GET |
/stream/{filename} |
Stream fichier audio |
Signature URL |
| GET |
/hls/{track_id}/master.m3u8 |
Playlist master HLS |
JWT |
| GET |
/hls/{track_id}/{quality}/playlist.m3u8 |
Playlist par qualité |
JWT |
| GET |
/hls/{track_id}/{quality}/{segment} |
Segment HLS |
JWT |
| WS |
/ws |
WebSocket streaming temps réel |
JWT (query param) |
Transcoding
| Méthode |
Route |
Description |
Auth |
| POST |
/internal/jobs/transcode |
Lancer job transcoding |
Clé API interne |
| POST |
/v1/stream/transcode |
Initier transcoding |
JWT |
| GET |
/v1/stream/job/{id} |
Statut du job |
JWT |
| GET |
/v1/stream/hls/{job_id}/index.m3u8 |
Playlist du job |
JWT |
| GET |
/v1/stream/hls/{job_id}/{segment} |
Segment du job |
JWT |
| GET |
/api/streams/jobs/{id}/status |
Statut détaillé |
JWT |
Protocole WebSocket
Le WebSocket (/ws?track_id=...) utilise un protocole personnalisé pour la lecture synchronisée.
Commandes client → serveur
| Commande |
Payload |
Description |
play |
{ position: float } |
Démarrer la lecture à la position |
pause |
— |
Mettre en pause |
seek |
{ position: float } |
Sauter à une position |
sync |
{ position: float } |
Synchroniser (co-écoute) |
heartbeat |
— |
Maintenir la connexion |
error |
{ message: string } |
Signaler une erreur client |
Réponses serveur → client
| Réponse |
Payload |
Description |
ready |
{ duration, bitrates } |
Serveur prêt à streamer |
chunk |
{ data, position, bitrate } |
Chunk audio avec métadonnées |
sync_ack |
{ position } |
Accusé de réception sync |
error |
{ code, message } |
Erreur serveur |
Cycle de vie d'une connexion
Client Serveur
│ │
│── WS Connect ─────────────────▶│
│ (track_id, JWT en query) │
│ │── Validation JWT
│ │── Chargement playlist HLS
│◀── ready ──────────────────────│
│ (duration, bitrates) │
│ │
│── play { position: 0 } ──────▶│
│ │── Sélection bitrate adaptatif
│◀── chunk ──────────────────────│
│◀── chunk ──────────────────────│
│◀── chunk ──────────────────────│
│ │
│── heartbeat ──────────────────▶│ (toutes les 30s)
│ │
│── seek { position: 120 } ────▶│
│◀── chunk ──────────────────────│
│ │
│── pause ──────────────────────▶│
│ │
│── WS Close ───────────────────▶│
Streaming HLS adaptatif
Le serveur génère et sert des playlists HLS multi-bitrate avec sélection adaptative.
Qualités disponibles
Le transcoding produit plusieurs qualités à partir du fichier source :
| Qualité |
Bitrate |
Usage |
| low |
64 kbps |
Mobile / réseau faible |
| medium |
128 kbps |
Standard |
| high |
256 kbps |
Haute qualité |
| lossless |
Original |
Audiophile |
Fonctionnement
- Upload : Le backend Go reçoit le fichier audio et le stocke sur S3
- Événement :
track.uploaded publié sur RabbitMQ
- Transcoding : Le stream server consomme l'événement, transcode via FFmpeg
- Stockage : Les segments HLS et playlists sont stockés sur S3
- Callback :
POST /internal/tracks/:id/stream-ready vers le backend
- Lecture : Le client demande le master playlist, le serveur sert les segments
Structure des fichiers HLS sur S3
hls/{track_id}/
├── master.m3u8 # Master playlist (liste les qualités)
├── low/
│ ├── playlist.m3u8 # Playlist 64 kbps
│ ├── segment_000.ts # Segments audio
│ ├── segment_001.ts
│ └── ...
├── medium/
│ ├── playlist.m3u8 # Playlist 128 kbps
│ └── ...
├── high/
│ ├── playlist.m3u8 # Playlist 256 kbps
│ └── ...
└── lossless/
├── playlist.m3u8
└── ...
Pile de middlewares
Appliqués dans l'ordre à toutes les routes :
- CORS — Restrictif par défaut, origines configurables
- Timeout — 30 secondes par requête
- Compression — gzip
- Security Headers — X-Content-Type-Options, X-Frame-Options, etc.
- Rate Limiting — Par IP
- Request Logging — Logs JSON structurés
Configuration
pub struct Config {
port: u16, // PORT (default: 18082)
database_url: String, // DATABASE_URL
rabbit_mq: RabbitMQConfig, // RABBITMQ_URL
s3_bucket: String, // S3_BUCKET
s3_region: String, // S3_REGION
log_level: String, // LOG_LEVEL
allowed_origins: Vec<String>, // ALLOWED_ORIGINS
}
Toute la configuration provient des variables d'environnement (voir [[CONFIGURATION_ENVIRONNEMENT]]).
Communication inter-services
Événements RabbitMQ consommés
| Événement |
Action |
track.uploaded |
Lance le transcoding HLS |
track.deleted |
Supprime les segments HLS de S3 |
Callbacks REST vers le backend Go
| Callback |
Description |
POST /internal/tracks/:id/stream-ready |
Notifie que le transcoding est terminé |
POST /internal/stream-events |
Envoie des événements de streaming |
Header d'authentification : X-Stream-Secret
Dockerfiles
| Fichier |
Base |
Usage |
Dockerfile |
rust:latest |
Développement (avec debug symbols) |
Dockerfile.production |
debian:bookworm-slim |
Production (binaire optimisé, minimal) |
Documents liés
- [[ARCHITECTURE_VEZA]] — Architecture globale
- [[ROUTES_API]] — Référence complète des routes
- [[CONFIGURATION_ENVIRONNEMENT]] — Variables d'environnement
Architecture Technique Veza
Document de référence — architecture globale de la plateforme Veza.
Source : code dans /home/senke/git/talas/veza/
Vue d'ensemble
Veza est une plateforme musicale communautaire composée de 3 services principaux communiquant via REST, WebSocket et RabbitMQ, le tout orchestré par Docker Compose.
┌─────────────────────────────────────────────────────────────┐
│ FRONTEND │
│ React 18 · TypeScript · Tailwind │
│ Vite · Zustand · TanStack Query │
│ (apps/web/) │
└──────────┬──────────────┬───────────────┬────────────────────┘
│ REST /api/v1 │ WS /chat/ws │ WS /stream
▼ ▼ ▼
┌──────────────────┐ ┌────────────────────────────────────────┐
│ BACKEND API │ │ STREAM SERVER │
│ Go · Gin · GORM │ │ Rust · Axum │
│ (veza-backend- │ │ (veza-stream-server/) │
│ api/) │ │ │
│ │ │ • Streaming audio (HLS adaptatif) │
│ • 500+ endpoints│ │ • WebSocket temps réel │
│ • Auth JWT RS256│ │ • Transcoding FFmpeg │
│ • RBAC complet │ │ • Métriques Prometheus │
│ • CSRF Redis │ │ │
│ • Rate limiting │ └──────────────┬─────────────────────────┘
│ • Audit logging │ │
└──────┬───────────┘ │
│ │
▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ INFRASTRUCTURE │
│ │
│ PostgreSQL 16 (:15432) Redis 7 (:16379) │
│ Elasticsearch (:19200) RabbitMQ 3 (:15672) │
│ MinIO S3 (:19000) ClamAV 1.4 (:13310) │
└──────────────────────────────────────────────────────────────┘
Structure du monorepo
veza/
├── apps/web/ # Frontend React (SPA + PWA)
├── veza-backend-api/ # API REST Go (Gin + GORM)
├── veza-stream-server/ # Serveur streaming Rust (Axum)
├── veza-common/ # Code partagé Go/Rust
├── veza-docs/ # Documentation technique
├── veza-desktop/ # Wrapper Electron (charge apps/web)
├── docker-compose.yml # Infra développement
├── docker-compose.prod.yml # Infra production
├── docker-compose.dev.yml # Services dev uniquement
├── .env.example # Template de configuration
├── Makefile # Commandes build & dev
└── k8s/ # Manifests Kubernetes
Ports réseau (isolation pour éviter les conflits)
| Service |
Port |
Protocole |
| Backend API |
18080 |
HTTP/REST |
| Stream Server |
18082 |
HTTP/WS |
| Frontend (dev) |
5173 |
HTTP |
| PostgreSQL |
15432 |
TCP |
| Redis |
16379 |
TCP |
| RabbitMQ AMQP |
15672 |
AMQP |
| RabbitMQ Management |
25672 |
HTTP |
| ClamAV |
13310 |
TCP |
| MinIO S3 |
19000 |
HTTP |
| Elasticsearch |
19200 |
HTTP |
Stack technique détaillée
Backend API (Go)
- Framework : Gin
- ORM : GORM v1 (mapping uniquement, migrations en SQL pur)
- Auth : JWT RS256 (fallback HS256), OAuth 2.0, WebAuthn/Passkeys, MFA TOTP
- Sécurité : CSRF Redis, rate limiting multi-niveaux, ClamAV antivirus, audit logging
- Recherche : Elasticsearch (fallback PostgreSQL full-text)
- Stockage : MinIO S3 compatible
- Monitoring : Prometheus, Sentry
- Base : PostgreSQL 16 avec UUIDs, soft deletes
Stream Server (Rust)
- Framework : Axum (async)
- Audio : HLS adaptatif multi-bitrate, FFmpeg transcoding
- Temps réel : WebSocket avec protocole de synchronisation
- Résilience : Circuit breaker, rate limiting, health checks
- Messaging : RabbitMQ pour les jobs de transcoding asynchrones
Frontend (React)
- Build : Vite v7.1.5
- UI : Tailwind CSS v4, Radix UI
- État : Zustand (stores), TanStack Query (data fetching)
- Formulaires : React Hook Form + Zod (validation)
- Routage : React Router v6 (52+ routes)
- i18n : i18next (EN/FR/ES)
- Tests : Vitest, Storybook
- Desktop : Electron wrapper (même codebase)
Patterns architecturaux
1. Microservices avec communication asynchrone
- Backend API (Go) → logique métier
- Stream Server (Rust) → streaming audio haute performance
- RabbitMQ → distribution d'événements entre services
2. Event-driven architecture
Événements principaux via RabbitMQ :
- user.created → notifications, indexation
- track.uploaded → scan ClamAV → transcoding HLS → indexation Elasticsearch
- payment.completed → mise à jour commande, notification vendeur
3. Sécurité en profondeur
- CSRF tokens (Redis-backed, obligatoire en production)
- JWT RS256 avec rotation de clés
- OAuth 2.0 avec chiffrement des tokens
- ClamAV pour scan antivirus des uploads
- Rate limiting : global (1000 req/s), par IP (100 req/s), par endpoint
- Verrouillage de compte après N tentatives échouées
- Audit logging automatique sur POST/PUT/DELETE
- Headers de sécurité (HSTS, CSP, X-Content-Type-Options)
- CCPA/RGPD : opt-out, export de données, suppression de compte
4. Observabilité
- Logs structurés (JSON en production, texte en dev)
- Métriques Prometheus (endpoints
/metrics)
- Sentry pour le tracking d'erreurs
- Health checks (liveness
/healthz, readiness /readyz)
Flux de données principaux
Inscription utilisateur
Frontend POST /api/v1/auth/register
→ Backend : validation Zod, hash bcrypt, création User en DB
→ Email de vérification envoyé
→ JWT retourné en cookie HTTP-only
→ Frontend redirige vers /verify-email
Upload de piste audio
Frontend POST /api/v1/tracks (multipart/form-data)
→ Backend : scan ClamAV → stockage S3 → parsing métadonnées FFmpeg
→ Création Track en DB (status: processing)
→ Publication événement track.uploaded sur RabbitMQ
Stream Server (écoute RabbitMQ)
→ Réception track.uploaded
→ Transcoding WAV → MP3 + HLS multi-bitrate
→ Upload segments sur S3
→ Publication transcoding.completed
Backend (écoute événement)
→ Mise à jour Track (status: completed, stream_manifest_url)
→ Indexation Elasticsearch
→ Notification utilisateur
Lecture audio streaming
Frontend WS /stream?track_id=xxx&position=0
→ Stream Server : validation JWT
→ Chargement playlist HLS depuis cache/S3
→ Sélection bitrate adaptatif selon réseau
→ Envoi chunks audio via WebSocket
→ Heartbeat toutes les 30s
Commandes de développement
# Stack complète (backend Docker, web local)
make dev
# Tous les services locaux avec hot reload
make dev-full
# Infrastructure seule (DB, Redis, RabbitMQ, MinIO)
docker-compose up -d
# Services individuels
make dev-web # Frontend seul
make dev-backend-api # Backend seul
make dev-stream-server # Stream server seul
# Build production
make build
# Migrations base de données
cd veza-backend-api && go run ./cmd/migrate_tool/main.go up
Fichiers clés (chemins absolus)
| Fichier |
Rôle |
veza-backend-api/cmd/api/main.go |
Point d'entrée backend |
veza-backend-api/internal/api/router.go |
Enregistrement des routes |
veza-backend-api/internal/config/config.go |
Configuration |
veza-backend-api/internal/models/ |
68 modèles GORM |
veza-backend-api/internal/middleware/ |
17 middlewares |
veza-backend-api/migrations/ |
115 fichiers SQL |
veza-stream-server/src/main.rs |
Point d'entrée streaming |
veza-stream-server/src/routes/api.rs |
Routes Axum |
veza-stream-server/src/streaming/ |
WebSocket, HLS, adaptatif |
apps/web/src/main.tsx |
Point d'entrée frontend |
apps/web/src/router/routeConfig.tsx |
Définition des routes |
apps/web/src/stores/ |
Stores Zustand |
apps/web/src/services/api/ |
Clients API |
docker-compose.yml |
Stack développement |
docker-compose.prod.yml |
Stack production |
.env.example |
Template de configuration |
Documents liés
- [[ROUTES_API]] — Référence complète des endpoints API
- [[SCHEMA_BASE_DE_DONNEES]] — Schéma PostgreSQL complet (60+ tables)
- [[SERVEUR_STREAMING_RUST]] — Architecture du serveur Rust Axum
- [[FRONTEND_REACT]] — Architecture frontend React
- [[CONFIGURATION_ENVIRONNEMENT]] — Variables d'environnement et Docker
Authentification & Core System
Ce dossier contient les composants de base partagés entre les applications Talas : gestion des utilisateurs, sécurité, sessions, permissions et configuration générale.
Objectifs :
- Centraliser la logique d’authentification (JWT, OAuth, SSO).
- Fournir des services partagés pour toutes les apps (profil, sessions, ACL).
- Préparer une architecture modulaire facilement extensible.
Contenu recommandé :
auth_controller.go / users.rs (ou équivalents)
middleware/ : validation de token, CORS, accès protégé
schemas/ : modèles utilisateur, rôles, permissions
utils/ : génération tokens, encodage, vérification
tests/ : login/signup, forgot password, refresh
Ce module doit être le plus découpé possible pour pouvoir s’adapter à la croissance future.
Configuration & Environnement Veza
Variables d'environnement, Docker Compose, et paramètres de déploiement.
Source : .env.example, docker-compose*.yml, Makefile
Variables d'environnement
Toutes les variables sont définies dans .env.example à la racine du monorepo.
Core
| Variable |
Exemple |
Description |
APP_DOMAIN |
veza.fr |
Domaine principal |
FRONTEND_URL |
http://veza.fr:5173 |
URL frontend |
PORT_BACKEND |
18080 |
Port API backend |
PORT_STREAM |
18082 |
Port stream server |
APP_ENV |
development |
Environnement (development/staging/production) |
Base de données (PostgreSQL)
| Variable |
Exemple |
Description |
DB_USER |
veza |
Utilisateur PostgreSQL |
DB_PASSWORD |
password |
Mot de passe |
DB_NAME |
veza |
Nom de la base |
DATABASE_URL |
postgres://veza:password@localhost:15432/veza?sslmode=disable |
URL complète |
Redis
| Variable |
Exemple |
Description |
REDIS_URL |
redis://:password@localhost:16379 |
URL Redis |
REDIS_PASSWORD |
devpassword |
Mot de passe Redis |
RabbitMQ
| Variable |
Exemple |
Description |
RABBITMQ_URL |
amqp://veza:password@localhost:15672/ |
URL AMQP |
RABBITMQ_DEFAULT_USER |
veza |
Utilisateur |
RABBITMQ_DEFAULT_PASS |
devpassword |
Mot de passe |
JWT & Sécurité
| Variable |
Exemple |
Description |
JWT_SECRET |
min-32-characters... |
Secret JWT (fallback HS256) |
JWT_PRIVATE_KEY_PATH |
/path/to/jwt-private.pem |
Clé privée RS256 |
JWT_PUBLIC_KEY_PATH |
/path/to/jwt-public.pem |
Clé publique RS256 |
JWT_ISSUER |
veza-api |
Émetteur JWT |
JWT_AUDIENCE |
veza-platform |
Audience JWT |
OAUTH_ENCRYPTION_KEY |
<32-byte-hex> |
Chiffrement OAuth |
OAUTH_ALLOWED_REDIRECT_DOMAINS |
https://veza.fr:5173 |
Domaines OAuth autorisés |
CHAT_JWT_SECRET |
<différent de JWT_SECRET> |
Secret JWT chat |
Stockage S3 (MinIO)
| Variable |
Exemple |
Description |
S3_ENABLED |
true |
Activer S3 |
S3_BUCKET |
veza-uploads |
Nom du bucket |
S3_REGION |
us-east-1 |
Région |
S3_ENDPOINT |
http://localhost:19000 |
Endpoint MinIO |
S3_ACCESS_KEY |
... |
Clé d'accès |
S3_SECRET_KEY |
... |
Clé secrète |
Streaming & Live
| Variable |
Exemple |
Description |
STREAM_HLS_BASE_URL |
http://localhost:18083/live |
URL base HLS |
NGINX_RTMP_HOST |
localhost |
Hôte RTMP |
RTMP_CALLBACK_SECRET |
<shared-secret> |
Secret callbacks RTMP |
Elasticsearch
| Variable |
Exemple |
Description |
ELASTICSEARCH_URL |
http://localhost:19200 |
URL Elasticsearch |
ELASTICSEARCH_AUTO_INDEX |
true |
Auto-indexation au démarrage |
Antivirus
| Variable |
Exemple |
Description |
ENABLE_CLAMAV |
true |
Activer le scan antivirus |
CLAMAV_REQUIRED |
true |
Échouer si ClamAV indisponible |
Paiements
| Variable |
Exemple |
Description |
STRIPE_CONNECT_ENABLED |
true |
Activer Stripe Connect |
HYPERSWITCH_WEBHOOK_SECRET |
<secret> |
Secret webhook paiement |
Logs & Monitoring
| Variable |
Exemple |
Description |
LOG_LEVEL |
INFO |
Niveau de log (DEBUG active les stack traces) |
LOG_DIR |
/var/log/veza |
Répertoire des logs |
LOG_FORMAT |
json |
Format (json en prod, text en dev) |
SENTRY_DSN |
https://...@ingest.sentry.io/0 |
DSN Sentry |
SENTRY_ENVIRONMENT |
development |
Environnement Sentry |
SENTRY_SAMPLE_RATE_ERRORS |
1.0 |
Taux échantillonnage erreurs |
SENTRY_SAMPLE_RATE_TRANSACTIONS |
0.1 |
Taux échantillonnage transactions |
PROMETHEUS_URL |
http://prometheus:9090 |
URL Prometheus |
Frontend
| Variable |
Exemple |
Description |
VITE_API_URL |
/api/v1 |
URL API (relative ou absolue) |
VITE_USE_MSW |
1 |
Activer mocks MSW |
VITE_STORYBOOK |
1 |
Mode Storybook |
VITE_SENTRY_DSN |
https://... |
DSN Sentry frontend |
Docker Compose
Développement (docker-compose.yml)
Services d'infrastructure pour le développement local :
| Service |
Image |
Port exposé |
Port interne |
postgres |
PostgreSQL 16 |
15432 |
5432 |
redis |
Redis 7 |
16379 |
6379 |
rabbitmq |
RabbitMQ 3 |
15672 (AMQP), 25672 (management) |
5672, 15672 |
clamav |
ClamAV 1.4 |
13310 |
3310 |
minio |
MinIO |
19000 |
9000 |
elasticsearch |
Elasticsearch |
19200 |
9200 |
# Lancer l'infrastructure
docker-compose up -d
# Ou via Makefile
make infra
Production (docker-compose.prod.yml)
Mêmes services avec :
- Volumes persistants pour les données
- Limites de ressources (CPU, mémoire)
- Health checks sur tous les services
- Configuration logging centralisée
- Isolation réseau entre services
- Restart policy : unless-stopped
Dockerfiles des services applicatifs
Backend API (Go)
| Fichier |
Base |
Taille |
Usage |
veza-backend-api/Dockerfile |
golang:1.21-alpine |
~300 Mo |
Développement |
veza-backend-api/Dockerfile.production |
scratch |
~15 Mo |
Production (binaire statique) |
Stream Server (Rust)
| Fichier |
Base |
Taille |
Usage |
veza-stream-server/Dockerfile |
rust:latest |
~1 Go |
Développement |
veza-stream-server/Dockerfile.production |
debian:bookworm-slim |
~100 Mo |
Production |
Frontend (React)
| Fichier |
Base |
Taille |
Usage |
apps/web/Dockerfile |
node:20-alpine → nginx:alpine |
~50 Mo |
Développement |
apps/web/Dockerfile.production |
nginx:latest |
~30 Mo |
Production |
Commandes Makefile
# Développement
make dev # Stack complète (backend Docker, web local)
make dev-full # Tous les services locaux + hot reload
make dev-web # Frontend seul
make dev-backend-api # Backend seul
make dev-stream-server # Stream server seul
# Infrastructure
make infra # docker-compose up -d
# Build
make build # Build tous les conteneurs
# Base de données
make migrate-up # Appliquer les migrations
make migrate-down # Rollback dernière migration
# Tests
make test # Tous les tests
make test-backend # Tests backend Go
make test-frontend # Tests frontend Vitest
make test-e2e # Tests end-to-end
Nginx (reverse proxy frontend)
Fichier : apps/web/nginx.conf
Configuration du reverse proxy en production :
Client → Nginx (port 80/443)
├── / → fichiers statiques (SPA)
├── /api/* → Backend Go (port 8080)
├── /ws/* → Chat WebSocket (port 8081)
└── /stream/* → Stream Server Rust (port 8082)
Fonctionnalités :
- SPA fallback : Toutes les routes non-API renvoient index.html
- Gzip : Compression activée
- Cache : Headers pour assets statiques (JS, CSS, images)
- Sécurité : X-Frame-Options, X-Content-Type-Options
Différences dev / staging / production
| Aspect |
Développement |
Staging |
Production |
APP_ENV |
development |
staging |
production |
| CORS |
Wildcard * |
Domaines staging |
Domaines stricts |
| CSRF |
Optionnel (si Redis) |
Obligatoire |
Obligatoire |
| Swagger/docs |
Activé |
Activé |
Désactivé |
| pprof debug |
Activé |
Désactivé |
Désactivé |
| Logs |
Texte, DEBUG |
JSON, INFO |
JSON, WARN+ |
| Stack traces |
Dans les réponses |
Pas dans les réponses |
Pas dans les réponses |
| Sentry |
Optionnel |
Activé |
Activé |
| ClamAV |
Optionnel |
Recommandé |
Obligatoire |
| Redis |
Optionnel |
Obligatoire |
Obligatoire |
| Rate limiting |
Souple |
Modéré |
Strict (DDoS) |
Documents liés
- [[ARCHITECTURE_VEZA]] — Architecture globale
- [[ROUTES_API]] — Endpoints API
- [[SCHEMA_BASE_DE_DONNEES]] — Schéma PostgreSQL
- [[SERVEUR_STREAMING_RUST]] — Serveur streaming
- [[FRONTEND_REACT]] — Architecture frontend
Groupes & Chat
Module de messagerie communautaire pour groupes d’utilisateurs : collaboration, entraide, salon projet.
Objectifs :
- Créer des espaces privés/publics de discussion.
- Gérer les rôles, notifications, permissions.
- Permettre l’upload de fichiers légers (images, samples).
Contenu recommandé :
- WebSocket ou SSE backend
rooms/, messages/, users/
permissions/ : modérateurs, membres
- Web UI intégrable (chat component)
Inspiré de Discord/Mattermost, mais minimaliste.
Talas Community – App Communautaire
Ce dossier regroupe les composants de l’application communautaire de Talas : partage, groupes, chat, échanges entre artistes.
Objectifs :
- Offrir une plateforme fluide pour les petits créateurs.
- Favoriser les échanges, l’entraide, la collaboration et la visibilité.
- Permettre des extensions type forum, salon, recherche collaborateur.
Sous-sections :
Groupes_Chat/ : groupes privés/publics, messagerie
Partage/ : fichiers audio, presets, projets
Troc/ : plateforme de don, échange matériel ou services
Formation/ : espace de diffusion tutoriels, guides, lives
Peut évoluer vers un écosystème type SoundCloud + Discord + Coursera artisanal.
Architecture Frontend Veza (React)
Application web SPA + PWA avec support desktop Electron.
Source : apps/web/src/
Stack technique
| Composant |
Technologie |
Version |
| Framework UI |
React |
18 |
| Langage |
TypeScript |
strict |
| Build |
Vite |
7.1.5 |
| CSS |
Tailwind CSS |
v4 |
| Composants |
Radix UI + custom |
|
| État global |
Zustand |
|
| Data fetching |
TanStack Query (React Query) |
|
| Formulaires |
React Hook Form + Zod |
|
| Routage |
React Router |
v6 |
| i18n |
i18next |
EN/FR/ES |
| Tests unitaires |
Vitest |
|
| Tests composants |
Storybook |
|
| Desktop |
Electron (wrapper) |
|
Structure du projet
apps/web/src/
├── app/ # Composant App + initialisation
├── components/ # Composants UI (36 sous-dossiers)
│ ├── admin/ # Panel admin
│ ├── auth/ # Guards + flows auth
│ ├── commerce/ # Marketplace, checkout
│ ├── dashboard/ # Widgets dashboard
│ ├── feedback/ # Toasts, notifications
│ ├── layout/ # Sidebar, Header, MainLayout
│ ├── marketplace/ # Affichage produits, panier
│ ├── modals/ # Dialogues modaux
│ ├── player/ # Lecteur audio
│ ├── search/ # Recherche, filtres
│ ├── social/ # Likes, follows
│ ├── upload/ # Upload de fichiers
│ └── ui/ # Composants de base (19 sous-dossiers)
├── features/ # Modules fonctionnels (38 sous-dossiers)
│ ├── admin/ # Fonctionnalité admin
│ ├── analytics/ # Stats, graphiques
│ ├── auth/ # Flows d'authentification
│ ├── chat/ # Chat temps réel
│ ├── commerce/ # Logique marketplace
│ ├── developer/ # Outils développeur
│ ├── library/ # Bibliothèque musicale
│ ├── live/ # Streaming live
│ ├── marketplace/ # Marketplace
│ ├── notifications/ # Notifications
│ ├── playlists/ # Gestion playlists
│ ├── player/ # Logique lecteur audio
│ ├── profile/ # Profil utilisateur
│ ├── settings/ # Paramètres
│ ├── social/ # Social
│ ├── streaming/ # Streaming audio
│ └── tracks/ # Gestion pistes
├── hooks/ # Hooks React custom (46 fichiers)
├── router/ # Configuration routage
│ ├── routeConfig.tsx # Définition des routes
│ ├── AppRouter.tsx # Wrapper routeur
│ ├── ProtectedRoute.tsx # Guard authentification
│ └── PublicRoute.tsx # Wrapper pages publiques
├── services/ # Clients API & logique métier
│ ├── api/ # Couche API REST
│ ├── websocket/ # Handlers WebSocket
│ └── storage/ # Storage local/session
├── stores/ # Stores Zustand
├── types/ # Types TypeScript (9 fichiers)
├── utils/ # Utilitaires (52 fichiers)
├── schemas/ # Schémas Zod (validation)
├── config/ # Configuration (env, URLs API)
├── context/ # Providers React Context
├── lib/ # Intégrations tierces
│ ├── i18n.ts # Configuration i18next
│ └── sentry.ts # Sentry error tracking
├── locales/ # Traductions i18n
├── styles/ # Styles globaux
└── __tests__/ # Tests
Routes de l'application
Routes publiques (sans authentification)
| Route |
Page |
Description |
/login |
Login |
Page de connexion |
/register |
Register |
Inscription |
/forgot-password |
ForgotPassword |
Récupération mot de passe |
/verify-email |
VerifyEmail |
Vérification email |
/reset-password |
ResetPassword |
Reset avec token |
/ |
Landing |
Page d'accueil |
/discover |
Discover |
Découverte publique |
/p/:playlistToken |
SharedPlaylist |
Playlist partagée |
Routes protégées (authentification requise)
| Route |
Page |
Description |
/dashboard |
Dashboard |
Feed principal |
/library |
Library |
Bibliothèque musicale |
/settings/* |
Settings |
Paramètres utilisateur |
/u/:username |
Profile |
Profil utilisateur |
/playlist/:id |
PlaylistDetail |
Détail playlist |
/track/:id |
TrackDetail |
Détail piste |
/marketplace/* |
Marketplace |
Pages marketplace |
/cart |
Cart |
Panier |
/checkout |
Checkout |
Paiement |
/chat |
Chat |
Interface de chat |
/notifications |
Notifications |
Notifications |
/analytics |
Analytics |
Dashboard analytics |
/webhooks |
Webhooks |
Gestion webhooks |
/admin/* |
Admin |
Panel admin |
/search |
Search |
Résultats recherche |
/social/* |
Social |
Fonctionnalités sociales |
/live/* |
Live |
Streaming live |
/seller/* |
Seller |
Dashboard vendeur |
/developer/* |
Developer |
Outils développeur |
/queue |
Queue |
File d'attente |
/listen-together |
CoListening |
Co-écoute |
/wishlist |
Wishlist |
Liste de souhaits |
/purchases |
Purchases |
Historique achats |
Gestion d'état (Zustand)
Stores principaux
// UI State (stores/ui.ts)
{
sidebarOpen: boolean,
darkMode: boolean,
activeModal: string | null,
}
// Library State (stores/library.ts)
{
favorites: Track[],
recentlyPlayed: Track[],
playlists: Playlist[],
}
// Cart State (stores/cartStore.ts)
{
items: CartItem[],
total: number,
}
// Rate Limit State (stores/rateLimit.ts)
{
remaining: number,
resetTime: Date,
}
Services API (services/api/)
| Fichier |
Domaine |
Exemples d'opérations |
auth.ts |
Authentification |
login, register, refresh, logout |
tracks.ts |
Pistes |
CRUD, upload, search, like |
playlists.ts |
Playlists |
CRUD, collaborators, share |
users.ts |
Utilisateurs |
profil, follow, block, settings |
marketplace.ts |
Marketplace |
products, orders, reviews |
search.ts |
Recherche |
unified search, suggestions |
streaming.ts |
Streaming |
intégration stream server |
chat.ts |
Chat |
rooms, messages, reactions |
notifications.ts |
Notifications |
list, preferences, push |
analytics.ts |
Analytics |
stats, charts, export |
Hooks personnalisés (hooks/)
| Hook |
Usage |
useUser() |
Données utilisateur courant |
useAuth() |
État d'authentification |
useTracks() |
Opérations sur les pistes |
usePlaylists() |
Opérations sur les playlists |
usePlayer() |
État du lecteur audio |
useSearch() |
Fonctionnalité recherche |
useChat() |
Opérations chat |
useNotifications() |
État notifications |
useLocalStorage() |
Persistance locale |
useQueryClient() |
Intégration TanStack Query |
46 hooks au total pour encapsuler la logique métier.
Configuration
// config/env.ts
export const env = {
API_URL: import.meta.env.VITE_API_URL || '/api/v1',
FRONTEND_URL: 'http://localhost:5173',
USE_MSW: import.meta.env.VITE_USE_MSW === 'true',
STORYBOOK: import.meta.env.VITE_STORYBOOK === 'true',
SENTRY_DSN: import.meta.env.VITE_SENTRY_DSN,
}
Variables d'environnement frontend
| Variable |
Description |
VITE_API_URL |
URL de l'API backend |
VITE_USE_MSW |
Activer les mocks MSW |
VITE_STORYBOOK |
Mode Storybook |
VITE_SENTRY_DSN |
DSN Sentry pour error tracking |
Internationalisation (i18n)
- Bibliothèque : i18next
- Langues : Anglais (EN), Français (FR), Espagnol (ES)
- Fichiers :
src/locales/
- Détection : Langue du navigateur automatique
- Persistance : localStorage
Scripts de développement
# Développement avec hot reload
npm run dev # ou : make dev-web
# Développement avec API mockée (MSW)
npm run dev:mocks
# Build production
npm run build
# Tests
npm run test # Vitest
npm run test:e2e # E2E (au root du repo)
# Qualité
npm run lint # ESLint
npm run typecheck # TypeScript strict
# Storybook (catalogue composants)
npm run storybook # Port 6006
npm run build-storybook
Nginx (production)
En production, le frontend est servi par Nginx avec :
- SPA routing : Toutes les routes renvoient vers index.html
- Proxy /api → Backend Go (port 8080)
- Proxy /ws → Chat WebSocket (port 8081)
- Proxy /stream → Stream server (port 8082)
- Compression gzip activée
- Cache headers pour les assets statiques
- Security headers : X-Frame-Options, X-Content-Type-Options
Configuration : apps/web/nginx.conf
Dockerfiles
| Fichier |
Base |
Usage |
Dockerfile |
node:20-alpine → nginx:alpine |
Développement |
Dockerfile.production |
nginx:latest |
Production |
Desktop (Electron)
Le dossier veza-desktop/ contient un wrapper Electron minimal qui charge apps/web. Pas d'application native séparée — le même code frontend est utilisé partout.
Statistiques
| Métrique |
Valeur |
| Composants UI |
661 |
| Routes |
52+ |
| Hooks custom |
46 |
| Utilitaires |
52 |
| Sous-dossiers features |
38 |
| Langues i18n |
3 (EN/FR/ES) |
Documents liés
- [[ARCHITECTURE_VEZA]] — Architecture globale
- [[ROUTES_API]] — Endpoints API backend
- [[CONFIGURATION_ENVIRONNEMENT]] — Variables d'environnement
Talas Personal – Application Utilisateur
Ce dossier contient l’application personnelle Talas : gestion des produits achetés, plugins hébergés, fichiers audio, presets favoris.
Objectifs :
- Fournir à chaque artiste un “atelier personnel” connecté à Talas.
- Centraliser docs, garanties, ressources, historique d’usage.
- Intégrer des outils avancés (AudioGridder, presets, favoris cloud).
Sous-dossiers :
AudioGridder_Client/ : serveur distant de plugins
Cloud_Perso/ : fichiers audio, presets, snapshots
Produits_Personnels/ : garanties, docs, historique
Tu peux l'étendre vers un "OS musical personnel" avec interopérabilité.
03_APPS_&_SERVICES – Développement Applicatif
Contient toutes les spécifications techniques de la plateforme Veza : architecture, API, schéma de données, streaming, frontend et configuration.
Le code source vit dans /home/senke/git/talas/veza/ — ce dossier ne contient que la documentation technique.
Documents de référence
| Document |
Description |
| [[ARCHITECTURE_VEZA]] |
Architecture globale (3 services, stack, flux de données) |
| [[ROUTES_API]] |
Référence des 500+ endpoints REST et WebSocket |
| [[SCHEMA_BASE_DE_DONNEES]] |
60+ tables PostgreSQL, relations, Redis |
| [[SERVEUR_STREAMING_RUST]] |
Serveur Axum : HLS adaptatif, WebSocket, transcoding |
| [[FRONTEND_REACT]] |
React 18, 661 composants, 52+ routes, Zustand |
| [[CONFIGURATION_ENVIRONNEMENT]] |
Docker, variables d’env, différences dev/staging/prod |
Modules fonctionnels
Auth_&_Core/ : inscription, login, sessions JWT RS256, RBAC, MFA, WebAuthn/Passkeys
Shop/ : marketplace, panier, paiements Stripe Connect, KYC, royalties
Community/ : social (feed, groupes, likes), chat temps réel, co-écoute
Personal/ : cloud personnel, inventaire équipement, file d’attente
APIs_&_Rust_Modules/ : routes API détaillées, serveur streaming Rust
Stack résumée
- Backend : Go (Gin, GORM) — 500+ endpoints, 68 modèles, 115 migrations SQL
- Streaming : Rust (Axum) — HLS adaptatif, WebSocket, transcoding FFmpeg
- Frontend : React 18, TypeScript, Tailwind v4, Zustand, TanStack Query
- Infra : PostgreSQL 16, Redis 7, RabbitMQ 3, Elasticsearch, MinIO S3, ClamAV
Connexions transversales
- [[04_INFRA_DEPLOIEMENT]] (CI/CD, conteneurisation, serveurs)
- [[05_EXPERIENCE_UTILISATEUR]] (interface + feedback UX)
- [[06_COMMUNAUTE_ECOSYSTEME]] (fonctions communautaires)
Schéma Base de Données Veza
Référence complète du schéma PostgreSQL — 60+ tables, UUIDs, soft deletes.
Source : veza-backend-api/internal/models/ (68 fichiers Go) et migrations/ (115 fichiers SQL)
ORM : GORM v1 (mapping uniquement, migrations 100% SQL)
Stratégie de migration
- Migrations SQL pures dans
veza-backend-api/migrations/ (001 à 115+)
- GORM utilisé uniquement pour le mapping Go ↔ PostgreSQL, pas pour la création de schéma
- AutoMigrate() est vide — tout est géré par SQL
- Outil :
go run ./cmd/migrate_tool/main.go up (ou down pour rollback)
- Table
schema_migrations pour le suivi des migrations appliquées
Conventions
- Clés primaires : UUID v4 (
uuid.UUID avec google/uuid)
- Soft delete : Colonne
deleted_at indexée sur 20+ tables
- Timestamps :
created_at, updated_at sur toutes les tables
- JSONB : Utilisé pour les données flexibles (social_links, specs, metadata)
- Enums : Types PostgreSQL custom (user_role, track_status, etc.)
- Foreign keys : Contraintes PostgreSQL natives, toujours actives
A. Utilisateurs & Authentification
users
Table centrale — profil utilisateur.
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
username |
VARCHAR(30) |
NOT NULL |
|
email |
VARCHAR |
NOT NULL, UNIQUE |
|
password_hash |
VARCHAR |
NOT NULL |
Masqué en JSON |
token_version |
INT |
DEFAULT 0 |
Pour révocation de tokens |
first_name |
VARCHAR |
|
|
last_name |
VARCHAR |
|
|
avatar |
TEXT |
|
URL avatar |
banner_url |
TEXT |
|
URL bannière |
bio |
TEXT |
|
|
location |
VARCHAR |
|
|
birthdate |
TIMESTAMP |
NULLABLE |
|
gender |
VARCHAR(20) |
|
|
role |
user_role ENUM |
DEFAULT 'user' |
|
is_active |
BOOL |
DEFAULT true |
|
is_verified |
BOOL |
DEFAULT false |
|
is_banned |
BOOL |
DEFAULT false |
|
is_admin |
BOOL |
DEFAULT false |
|
is_public |
BOOL |
DEFAULT true |
|
last_login_at |
TIMESTAMP |
NULLABLE |
|
login_count |
INT |
DEFAULT 0 |
|
password_changed_at |
TIMESTAMP |
NULLABLE |
|
social_links |
JSONB |
DEFAULT '{}' |
|
created_at |
TIMESTAMP |
|
|
updated_at |
TIMESTAMP |
|
|
deleted_at |
TIMESTAMP |
INDEX |
Soft delete |
Relations : roles (M2M via user_roles), track_likes (has many, CASCADE)
sessions
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users, INDEX |
|
token_hash |
VARCHAR |
UNIQUE INDEX |
Token hashé |
ip_address |
VARCHAR |
|
|
user_agent |
VARCHAR |
|
|
revoked_at |
TIMESTAMP |
NULLABLE |
|
expires_at |
TIMESTAMP |
NOT NULL |
|
created_at |
TIMESTAMP |
|
|
refresh_tokens
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users (CASCADE), NOT NULL, INDEX |
|
token_hash |
VARCHAR |
NOT NULL, INDEX |
|
expires_at |
TIMESTAMP |
NOT NULL |
|
created_at |
TIMESTAMP |
|
|
updated_at |
TIMESTAMP |
|
|
deleted_at |
TIMESTAMP |
|
Soft delete |
roles
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
name |
VARCHAR(50) |
UNIQUE, NOT NULL |
|
display_name |
VARCHAR(100) |
NOT NULL |
|
description |
TEXT |
|
|
is_system |
BOOL |
|
Rôle système (non supprimable) |
is_active |
BOOL |
DEFAULT true |
|
created_at |
TIMESTAMP |
|
|
updated_at |
TIMESTAMP |
|
|
Relations : users (M2M), permissions (M2M)
permissions
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
name |
VARCHAR(100) |
UNIQUE, NOT NULL |
|
resource |
VARCHAR(50) |
NOT NULL |
|
action |
VARCHAR(50) |
NOT NULL |
|
description |
TEXT |
|
|
created_at |
TIMESTAMP |
|
|
user_roles (table pivot)
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users (CASCADE), UNIQUE(user_id, role_id) |
|
role_id |
UUID |
FK → roles (CASCADE) |
|
role |
VARCHAR(50) |
|
Nom du rôle (dénormalisé) |
assigned_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
|
assigned_by |
UUID |
NULLABLE, INDEX |
|
expires_at |
TIMESTAMP |
NULLABLE |
|
is_active |
BOOL |
DEFAULT true |
|
role_permissions (table pivot)
| Colonne |
Type |
Contraintes |
role_id |
UUID |
FK → roles (CASCADE), UNIQUE(role_id, permission_id) |
permission_id |
UUID |
FK → permissions (CASCADE) |
mfa_configs
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
NOT NULL, UNIQUE INDEX |
|
secret |
VARCHAR |
NOT NULL |
Masqué en JSON |
backup_codes |
TEXT |
|
JSON array |
is_enabled |
BOOL |
DEFAULT false |
|
last_used_at |
TIMESTAMP |
NULLABLE |
|
created_at |
TIMESTAMP |
|
|
updated_at |
TIMESTAMP |
|
|
deleted_at |
TIMESTAMP |
|
Soft delete |
recovery_codes
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
INDEX |
code |
VARCHAR |
Masqué |
is_used |
BOOL |
DEFAULT false |
used_at |
TIMESTAMP |
NULLABLE |
expires_at |
TIMESTAMP |
|
created_at |
TIMESTAMP |
|
webauthn_credentials
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
NOT NULL |
|
credential_id |
BYTEA |
UNIQUE, NOT NULL |
|
public_key |
BYTEA |
NOT NULL |
|
attestation_type |
VARCHAR(50) |
DEFAULT 'none' |
|
aaguid |
BYTEA |
|
|
sign_count |
INT |
DEFAULT 0 |
|
name |
VARCHAR(100) |
DEFAULT 'My Passkey' |
|
created_at |
TIMESTAMP |
|
|
last_used_at |
TIMESTAMP |
NULLABLE |
|
federated_identities
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users (CASCADE), INDEX |
|
provider |
VARCHAR |
|
google, github, facebook, twitter |
provider_id |
VARCHAR |
|
|
email |
VARCHAR |
|
|
display_name |
VARCHAR |
|
|
avatar_url |
VARCHAR |
|
|
access_token |
TEXT |
|
Masqué |
refresh_token |
TEXT |
|
Masqué |
expires_at |
TIMESTAMP |
NULLABLE |
|
api_keys
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
INDEX |
name |
VARCHAR(100) |
|
prefix |
VARCHAR(16) |
INDEX |
hashed_key |
VARCHAR(128) |
Masqué |
scopes |
TEXT[] |
PostgreSQL array |
last_used_at |
TIMESTAMP |
NULLABLE |
expires_at |
TIMESTAMP |
NULLABLE |
created_at |
TIMESTAMP |
|
user_settings
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
UNIQUE |
email_notifications |
BOOL |
|
push_notifications |
BOOL |
|
browser_notifications |
BOOL |
|
email_on_follow |
BOOL |
|
email_on_like |
BOOL |
|
email_on_comment |
BOOL |
|
email_on_message |
BOOL |
|
email_on_mention |
BOOL |
|
email_marketing |
BOOL |
|
allow_search_indexing |
BOOL |
|
show_activity |
BOOL |
|
explicit_content |
BOOL |
|
autoplay |
BOOL |
|
user_profiles
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
UNIQUE |
language |
VARCHAR |
DEFAULT 'en' |
timezone |
VARCHAR |
DEFAULT 'UTC' |
theme |
VARCHAR |
DEFAULT 'auto' |
user_presence
| Colonne |
Type |
Contraintes |
Description |
user_id |
UUID |
PK |
|
status |
VARCHAR(20) |
DEFAULT 'offline' |
online/away/busy/offline |
last_seen_at |
TIMESTAMP |
|
|
status_message |
TEXT |
|
|
track_id |
UUID |
NULLABLE |
Piste en écoute |
track_title |
TEXT |
|
|
invisible |
BOOL |
DEFAULT false |
|
updated_at |
TIMESTAMP |
|
|
B. Pistes audio
tracks
Table principale des pistes audio.
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
creator_id |
UUID |
FK → users (CASCADE), INDEX |
|
file_id |
UUID |
NULLABLE |
|
title |
VARCHAR(255) |
NOT NULL |
|
artist |
VARCHAR(255) |
|
|
album |
VARCHAR(255) |
|
|
duration |
INT |
|
Secondes |
genre |
VARCHAR(100) |
|
|
tags |
TEXT[] |
|
PostgreSQL array |
year |
INT |
DEFAULT 0 |
|
bpm |
INT |
NULLABLE |
|
musical_key |
VARCHAR(10) |
|
|
file_path |
VARCHAR(500) |
|
|
file_size |
BIGINT |
|
Octets |
format |
VARCHAR(10) |
|
wav, mp3, flac... |
bitrate |
INT |
|
kbps |
sample_rate |
INT |
|
Hz |
waveform_path |
VARCHAR |
|
|
waveform_url |
VARCHAR |
|
|
cover_art_path |
VARCHAR |
|
|
is_public |
BOOL |
DEFAULT true |
|
status |
track_status ENUM |
|
uploading/processing/completed/failed |
status_message |
TEXT |
|
|
stream_status |
VARCHAR |
DEFAULT 'pending' |
pending/processing/ready/error |
stream_manifest_url |
VARCHAR |
|
URL playlist HLS |
play_count |
BIGINT |
|
Non exposé en API |
like_count |
BIGINT |
|
Non exposé en API |
created_at |
TIMESTAMP |
|
|
updated_at |
TIMESTAMP |
|
|
deleted_at |
TIMESTAMP |
INDEX |
Soft delete |
Relations : user (belongs to), playlists (M2M), likes (has many), shares (has many), versions (has many), hls_streams (has many)
track_versions
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
track_id |
UUID |
FK → tracks (CASCADE), UNIQUE(track_id, version_number) |
version_number |
INT |
|
file_path |
VARCHAR(500) |
|
file_size |
BIGINT |
Octets |
changelog |
TEXT |
|
track_likes
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
FK → users (CASCADE), UNIQUE(user_id, track_id) |
track_id |
UUID |
FK → tracks (CASCADE) |
created_at |
TIMESTAMP |
|
track_plays
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
track_id |
UUID |
FK → tracks, INDEX |
|
user_id |
UUID |
FK → users (SET NULL), NULLABLE, INDEX |
Anonyme si non connecté |
duration |
INT |
|
Secondes jouées |
played_at |
TIMESTAMP |
INDEX |
|
device |
VARCHAR(100) |
|
|
ip_address |
VARCHAR(45) |
|
|
track_shares
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
track_id |
UUID |
INDEX |
user_id |
UUID |
INDEX |
share_token |
VARCHAR(255) |
UNIQUE |
permissions |
VARCHAR(50) |
DEFAULT 'read' (read/download) |
expires_at |
TIMESTAMP |
NULLABLE |
access_count |
BIGINT |
DEFAULT 0 |
track_comments
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
track_id |
UUID |
FK → tracks (CASCADE), INDEX |
|
user_id |
UUID |
FK → users (CASCADE), INDEX |
|
parent_id |
UUID |
FK → track_comments (CASCADE), NULLABLE |
Réponses |
content |
TEXT |
NOT NULL |
|
timestamp |
FLOAT |
|
Position en secondes |
is_edited |
BOOL |
DEFAULT false |
|
Relations : parent (self-ref), replies (has many self-ref)
track_reposts
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
FK → users (CASCADE), INDEX |
track_id |
UUID |
FK → tracks (CASCADE), INDEX |
created_at |
TIMESTAMP |
INDEX |
track_stems
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
track_id |
UUID |
FK → tracks (CASCADE), INDEX |
name |
VARCHAR(100) |
|
file_path |
VARCHAR(500) |
|
format |
VARCHAR(10) |
|
size_bytes |
BIGINT |
|
created_at |
TIMESTAMP |
|
deleted_at |
TIMESTAMP |
Soft delete |
track_lyrics
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
track_id |
UUID |
FK → tracks (CASCADE), UNIQUE |
content |
TEXT |
NOT NULL |
track_history
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
track_id |
UUID |
INDEX |
|
user_id |
UUID |
FK → users (SET NULL) |
|
action |
ENUM |
INDEX |
created/updated/deleted/published/unpublished/restored |
old_value |
TEXT |
|
|
new_value |
TEXT |
|
|
tags
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
name |
VARCHAR(30) |
UNIQUE |
use_count |
INT |
DEFAULT 0 |
track_tags (pivot)
| Colonne |
Type |
Contraintes |
track_id |
UUID |
PK composite |
tag_id |
UUID |
PK composite |
created_at |
TIMESTAMP |
|
genres
| Colonne |
Type |
Contraintes |
slug |
VARCHAR(50) |
PK |
name |
VARCHAR(100) |
|
track_genres (pivot)
| Colonne |
Type |
Contraintes |
track_id |
UUID |
PK composite |
genre_slug |
VARCHAR(50) |
PK composite |
position |
INT |
DEFAULT 0 |
playback_analytics
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
track_id |
UUID |
FK → tracks (CASCADE), INDEX |
|
user_id |
UUID |
FK → users (CASCADE), INDEX |
|
play_time |
INT |
|
Secondes |
pause_count |
INT |
|
|
seek_count |
INT |
|
|
completion_rate |
DECIMAL(5,2) |
|
0-100% |
started_at |
TIMESTAMP |
|
|
ended_at |
TIMESTAMP |
NULLABLE |
|
C. Playlists
playlists
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users (CASCADE), INDEX |
|
name |
VARCHAR(200) |
|
Titre (colonne DB: name) |
description |
TEXT |
|
|
is_public |
BOOL |
DEFAULT true |
|
cover_url |
VARCHAR(500) |
|
|
track_count |
INT |
DEFAULT 0 |
|
follower_count |
INT |
DEFAULT 0 |
|
is_editorial |
BOOL |
DEFAULT false |
Playlist éditoriale |
is_default_favorites |
BOOL |
DEFAULT false |
Playlist favoris auto |
deleted_at |
TIMESTAMP |
|
Soft delete |
Relations : user (belongs to), tracks (has many PlaylistTrack), collaborators (has many, CASCADE)
playlist_tracks (pivot ordonné)
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
playlist_id |
UUID |
FK → playlists (CASCADE), INDEX |
track_id |
UUID |
FK → tracks (CASCADE), INDEX |
position |
INT |
Ordre dans la playlist |
added_by |
UUID |
|
added_at |
TIMESTAMP |
|
playlist_collaborators
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
playlist_id |
UUID |
FK → playlists, INDEX |
|
user_id |
UUID |
FK → users, INDEX |
|
permission |
VARCHAR(20) |
DEFAULT 'read' |
read/write/admin |
playlist_follows
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
playlist_id |
UUID |
INDEX |
user_id |
UUID |
INDEX |
playlist_share_links
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
playlist_id |
UUID |
INDEX |
user_id |
UUID |
INDEX |
share_token |
VARCHAR(255) |
UNIQUE |
expires_at |
TIMESTAMP |
NULLABLE |
access_count |
BIGINT |
DEFAULT 0 |
playlist_versions
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
playlist_id |
UUID |
INDEX |
|
user_id |
UUID |
FK → users (SET NULL) |
|
version |
INT |
|
|
action |
ENUM |
|
Type de modification |
title |
VARCHAR(200) |
|
|
description |
TEXT |
|
|
is_public |
BOOL |
|
|
cover_url |
VARCHAR(500) |
|
|
tracks_snapshot |
TEXT |
|
JSON des pistes à cette version |
user_genre_follows (pivot)
| Colonne |
Type |
Contraintes |
user_id |
UUID |
PK composite |
genre_slug |
VARCHAR |
PK composite |
user_tag_follows (pivot)
| Colonne |
Type |
Contraintes |
user_id |
UUID |
PK composite |
tag_id |
UUID |
PK composite |
D. Chat & Messagerie
rooms
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
name |
VARCHAR(255) |
|
|
description |
TEXT |
|
|
room_type |
VARCHAR |
DEFAULT 'public' |
public/private/dm |
is_private |
BOOL |
DEFAULT false |
|
creator_id |
UUID |
FK → users (CASCADE) |
|
deleted_at |
TIMESTAMP |
|
Soft delete |
Relations : members (has many, CASCADE), messages (has many, CASCADE)
room_members
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
room_id |
UUID |
FK → rooms (CASCADE) |
user_id |
UUID |
FK → users (CASCADE) |
role |
VARCHAR |
DEFAULT 'member' |
joined_at |
TIMESTAMP |
|
room_invitations
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
room_id |
UUID |
FK → rooms |
inviter_id |
UUID |
FK → users |
invitee_id |
UUID |
NULLABLE |
token |
UUID |
UNIQUE |
status |
VARCHAR(20) |
DEFAULT 'pending' (pending/accepted/expired) |
expires_at |
TIMESTAMP |
|
messages
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
room_id |
UUID |
FK → rooms |
|
sender_id |
UUID |
FK → users |
|
content |
TEXT |
|
|
message_type |
VARCHAR |
DEFAULT 'text' |
text/image/audio/system |
reply_to_id |
UUID |
NULLABLE, self-ref |
Réponse à |
is_edited |
BOOL |
DEFAULT false |
|
is_deleted |
BOOL |
DEFAULT false |
|
is_pinned |
BOOL |
DEFAULT false |
|
edited_at |
TIMESTAMP |
NULLABLE |
|
status |
VARCHAR(20) |
DEFAULT 'sent' |
|
metadata |
JSONB |
NULLABLE |
|
content_tsv |
TSVECTOR |
|
Recherche full-text |
message_reactions
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
UNIQUE(user_id, message_id, emoji) |
message_id |
UUID |
|
emoji |
VARCHAR(50) |
|
read_receipts
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
UNIQUE(user_id, message_id) |
message_id |
UUID |
|
read_at |
TIMESTAMP |
|
delivered_status
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
UNIQUE(user_id, message_id) |
message_id |
UUID |
|
delivered_at |
TIMESTAMP |
|
E. Streaming & Collaboration
hls_streams
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
track_id |
UUID |
FK → tracks (CASCADE), INDEX |
|
playlist_url |
VARCHAR(500) |
|
|
segments_count |
INT |
DEFAULT 0 |
|
bitrates |
JSONB |
|
Liste des bitrates disponibles |
status |
VARCHAR(20) |
DEFAULT 'pending', INDEX |
pending/processing/ready/failed |
hls_transcode_queue
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
track_id |
UUID |
INDEX |
|
priority |
INT |
DEFAULT 5 |
|
status |
VARCHAR(20) |
DEFAULT 'pending', INDEX |
pending/processing/completed/failed |
retry_count |
INT |
|
|
max_retries |
INT |
|
|
error_message |
TEXT |
NULLABLE |
|
started_at |
TIMESTAMP |
NULLABLE |
|
completed_at |
TIMESTAMP |
NULLABLE |
|
live_streams
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users (CASCADE) |
|
title |
VARCHAR(200) |
|
|
description |
TEXT |
|
|
category |
VARCHAR(100) |
|
|
thumbnail_url |
VARCHAR(500) |
|
|
stream_key |
VARCHAR(100) |
|
Masqué en JSON |
streamer_name |
VARCHAR(100) |
|
|
is_live |
BOOL |
DEFAULT false |
|
started_at |
TIMESTAMP |
NULLABLE |
|
ended_at |
TIMESTAMP |
NULLABLE |
|
viewer_count |
INT |
DEFAULT 0 |
|
tags |
JSONB |
DEFAULT '[]' |
|
scheduled_at |
TIMESTAMP |
NULLABLE |
|
stream_url |
TEXT |
DEFAULT '' |
|
is_vod |
BOOL |
DEFAULT false |
|
deleted_at |
TIMESTAMP |
|
Soft delete |
co_listening_sessions
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
host_id |
UUID |
FK → users, INDEX |
track_id |
UUID |
FK → tracks, INDEX |
expires_at |
TIMESTAMP |
|
queues
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
UNIQUE |
|
current_track_id |
UUID |
NULLABLE |
|
current_position |
INT |
DEFAULT 0 |
|
is_playing |
BOOL |
DEFAULT false |
|
shuffle |
BOOL |
DEFAULT false |
|
repeat_mode |
VARCHAR(20) |
DEFAULT 'off' |
off/one/all |
volume |
INT |
DEFAULT 100 |
|
queue_items
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
queue_id |
UUID |
FK → queues |
track_id |
UUID |
FK → tracks |
position |
INT |
|
queue_sessions (sessions collaboratives)
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
share_token |
VARCHAR(32) |
UNIQUE |
creator_id |
UUID |
INDEX |
shared_queue_items
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
session_id |
UUID |
INDEX |
track_id |
UUID |
|
position |
INT |
|
F. Fichiers & Stockage
user_files
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users |
|
folder_id |
UUID |
FK → user_folders (SET NULL), NULLABLE |
|
filename |
VARCHAR(255) |
|
|
s3_key |
VARCHAR(500) |
|
Clé MinIO/S3 |
size_bytes |
BIGINT |
DEFAULT 0 |
|
mime_type |
VARCHAR(100) |
DEFAULT 'application/octet-stream' |
|
user_folders
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users (CASCADE) |
|
name |
VARCHAR(255) |
|
|
parent_id |
UUID |
FK → user_folders (CASCADE), NULLABLE |
Hiérarchie |
Relations : parent (self-ref), children (has many), files (has many)
cloud_file_versions
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
file_id |
UUID |
FK → user_files (CASCADE) |
version |
INT |
|
storage_key |
TEXT |
|
size_bytes |
BIGINT |
DEFAULT 0 |
cloud_file_shares
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
file_id |
UUID |
FK → user_files (CASCADE) |
token |
VARCHAR(64) |
UNIQUE |
permissions |
VARCHAR(20) |
DEFAULT 'read' |
expires_at |
TIMESTAMP |
|
user_storage_quotas
| Colonne |
Type |
Contraintes |
Description |
user_id |
UUID |
PK |
|
max_bytes |
BIGINT |
DEFAULT 5368709120 |
~5 Go |
used_bytes |
BIGINT |
DEFAULT 0 |
|
G. Équipement (Gear)
gear_items
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users |
|
name |
VARCHAR(200) |
|
|
category |
VARCHAR(100) |
|
micro, interface, casque... |
brand |
VARCHAR |
|
|
model |
VARCHAR |
|
|
serial_number |
VARCHAR |
|
|
image |
VARCHAR(500) |
|
|
images |
JSONB |
DEFAULT '[]' |
|
status |
VARCHAR(50) |
|
actif, en réparation, vendu |
condition |
VARCHAR(50) |
|
neuf, bon, usé |
purchase_date |
TIMESTAMP |
NULLABLE |
|
purchase_price |
DECIMAL(12,2) |
|
|
currency |
VARCHAR(3) |
DEFAULT 'USD' |
|
vendor |
VARCHAR |
|
|
order_number |
VARCHAR |
|
|
warranty_start |
TIMESTAMP |
NULLABLE |
|
warranty_expire |
TIMESTAMP |
NULLABLE |
|
warranty_type |
VARCHAR |
|
|
warranty_notes |
TEXT |
|
|
support_contact |
VARCHAR |
|
|
specs |
JSONB |
|
Spécifications techniques |
notes |
TEXT |
|
|
documents |
JSONB |
|
|
maintenance_history |
JSONB |
|
|
is_public |
BOOL |
DEFAULT false |
Visible sur le profil |
deleted_at |
TIMESTAMP |
|
Soft delete |
gear_images
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
gear_id |
UUID |
FK → gear_items (CASCADE) |
image_url |
VARCHAR(500) |
|
position |
INT |
DEFAULT 0 |
gear_repairs
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
gear_id |
UUID |
FK → gear_items (CASCADE) |
repair_date |
DATE |
|
description |
TEXT |
|
cost_cents |
INT |
DEFAULT 0 |
currency |
VARCHAR(3) |
DEFAULT 'EUR' |
provider |
VARCHAR(255) |
|
notes |
TEXT |
|
gear_documents
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
gear_id |
UUID |
FK → gear_items (CASCADE) |
type |
VARCHAR(50) |
DEFAULT 'invoice' |
storage_key |
TEXT |
|
filename |
VARCHAR(255) |
|
H. Paiements & Royalties
seller_stripe_accounts
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
user_id |
UUID |
UNIQUE |
stripe_account_id |
VARCHAR(255) |
UNIQUE |
charges_enabled |
BOOL |
|
payouts_enabled |
BOOL |
|
onboarding_completed |
BOOL |
|
kyc_status |
VARCHAR(32) |
DEFAULT 'not_started' |
kyc_verification_session_id |
VARCHAR(255) |
|
kyc_verified_at |
TIMESTAMP |
NULLABLE |
kyc_last_error |
TEXT |
|
royalty_records
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
content_id |
UUID |
INDEX |
|
creator_id |
UUID |
INDEX |
|
period |
VARCHAR |
INDEX |
Période (ex: 2026-03) |
plays |
BIGINT |
|
|
revenue |
FLOAT |
|
|
royalty_amount |
FLOAT |
|
|
royalty_rate |
FLOAT |
|
|
status |
VARCHAR |
DEFAULT 'calculated' |
calculated/paid |
calculated_at |
TIMESTAMP |
|
|
paid_at |
TIMESTAMP |
NULLABLE |
|
royalty_payouts
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
payout_id |
VARCHAR |
UNIQUE |
creator_id |
UUID |
INDEX |
amount |
FLOAT |
|
currency |
VARCHAR |
DEFAULT 'EUR' |
period |
VARCHAR |
INDEX |
status |
VARCHAR |
DEFAULT 'pending' |
payment_method |
VARCHAR |
|
transaction_id |
VARCHAR |
|
processed_at |
TIMESTAMP |
|
estimated_arrival |
TIMESTAMP |
|
notes |
VARCHAR |
|
royalty_rates
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
content_type |
VARCHAR |
UNIQUE |
rate |
FLOAT |
|
description |
VARCHAR |
|
is_active |
BOOL |
DEFAULT true |
creator_royalty_rates
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
creator_id |
UUID |
UNIQUE |
|
rate |
FLOAT |
|
Taux personnalisé |
reason |
VARCHAR |
|
|
is_active |
BOOL |
DEFAULT true |
|
royalty_config
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
platform_fee_rate |
FLOAT |
DEFAULT 0.15 |
15% frais plateforme |
minimum_payout_amount |
FLOAT |
DEFAULT 50.0 |
Seuil minimum versement |
payout_schedule |
VARCHAR |
DEFAULT 'monthly' |
|
processing_delay |
INT |
DEFAULT 3 |
Jours |
currency |
VARCHAR |
DEFAULT 'EUR' |
|
is_active |
BOOL |
DEFAULT true |
|
I. Modération & Administration
reports
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
reporter_id |
UUID |
|
reported_user_id |
UUID |
NULLABLE |
content_type |
VARCHAR(50) |
|
content_id |
UUID |
NULLABLE |
reason |
TEXT |
|
status |
VARCHAR(20) |
DEFAULT 'pending' |
resolved_by |
UUID |
NULLABLE |
resolved_at |
TIMESTAMP |
NULLABLE |
announcements
| Colonne |
Type |
Contraintes |
id |
UUID |
PK |
title |
VARCHAR(200) |
|
content |
TEXT |
|
type |
VARCHAR(20) |
DEFAULT 'info' |
is_active |
BOOL |
DEFAULT true |
starts_at |
TIMESTAMP |
|
ends_at |
TIMESTAMP |
NULLABLE |
created_by |
UUID |
NULLABLE |
notifications
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
FK → users (CASCADE), INDEX |
|
type |
VARCHAR(50) |
INDEX |
follow, like, comment, system... |
title |
VARCHAR(255) |
|
|
content |
TEXT |
|
|
link |
VARCHAR(500) |
|
|
read |
BOOL |
DEFAULT false |
INDEX composite avec user_id |
read_at |
TIMESTAMP |
NULLABLE |
|
created_at |
TIMESTAMP |
INDEX |
|
J. Exports de données
data_exports (RGPD)
| Colonne |
Type |
Contraintes |
Description |
id |
UUID |
PK |
|
user_id |
UUID |
|
|
status |
VARCHAR(20) |
DEFAULT 'pending' |
pending/processing/completed/failed |
s3_key |
TEXT |
NULLABLE |
|
file_size_bytes |
BIGINT |
NULLABLE |
|
expires_at |
TIMESTAMP |
|
|
completed_at |
TIMESTAMP |
NULLABLE |
|
error_message |
TEXT |
NULLABLE |
|
Utilisation de Redis
Redis est optionnel — dégradation gracieuse si indisponible.
| Cas d'usage |
Pattern de clé |
TTL |
Fallback |
| Sessions |
sessions:{token_hash} |
Configurable |
Table sessions |
| Cache HTTP |
http_cache:{sha256(url)} |
5-15 min |
Pas de cache |
| Rate limiting |
ratelimit:{key} |
Variable |
In-memory avec mutex |
| Verrouillage compte |
lockout:{email}:count, lockout:{email}:locked_until |
Configurable |
In-memory map |
| Token blacklist |
token_blacklist:{jti} |
Durée JWT |
Pas de révocation |
| Présence utilisateur |
presence:{user_id} |
Variable |
Table user_presence |
| Cache applicatif |
Via CacheService |
Variable |
Pas de cache |
Headers de cache : X-Cache: HIT ou X-Cache: MISS
Statistiques
| Métrique |
Valeur |
| Fichiers modèles Go |
68 |
| Tables PostgreSQL |
60+ |
| Migrations SQL |
115 |
| Tables avec soft delete |
20+ |
| Tables avec UUIDs |
95%+ |
| Cas d'usage Redis |
6 principaux |
Documents liés
- [[ARCHITECTURE_VEZA]] — Architecture globale
- [[ROUTES_API]] — Endpoints API complets
- [[SERVEUR_STREAMING_RUST]] — Serveur streaming
- [[CONFIGURATION_ENVIRONNEMENT]] — Variables d'environnement
Backend Talas Shop
Ce dossier contient le serveur backend de la boutique Talas : gestion des produits, du panier, des commandes, des paiements et des retours.
Objectifs :
- Offrir un backend sécurisé, rapide, et évolutif pour la vente de matériel.
- Intégrer les paiements (Stripe, ou simulateur).
- Gérer les droits, stocks, suivis de commande et retours.
Contenu recommandé :
- API REST/GraphQL (
/products, /cart, /orders)
services/ : logique produit, commande, paiement
models/ : schéma base de données (PostgreSQL recommandé)
admin/ : endpoints internes (dashboard, statistiques)
webhooks/ : Stripe, emails transactionnels, retours
Ce backend doit être indépendant de la logique d’auth, qui réside dans Auth_&_Core.
Frontend Talas Shop
Ce dossier contient l’interface web de la boutique en ligne Talas : navigation produit, panier, commande, espace client.
Objectifs :
- Créer une expérience utilisateur fluide et accessible.
- Mettre en avant les produits, leurs avantages et la réparabilité.
- Intégrer le paiement et l’espace client.
Contenu recommandé :
pages/ : accueil, produit, panier, commande, espace client
components/ : ProductCard, Cart, PaymentForm
hooks/ : gestion panier, authentification
styles/ : design system (Tailwind, SCSS, etc.)
api/ : appels backend (GET produits, POST commande…)
L’interface doit être compatible mobile-first et intégrer des modules d'accessibilité.
Paiement – Talas Shop
Ce dossier isole la logique liée au paiement dans la boutique Talas (gestion des transactions, webhooks, factures, remboursements).
Objectifs :
- Sécuriser le processus d’achat.
- Gérer les erreurs, les remboursements, et les cas limites.
- Permettre des extensions futures (paiement fractionné, bons d’achat, etc.).
Contenu recommandé :
integrations/stripe/ : checkout, webhooks
simulations/ : sandbox de test local
pdf/ : génération des factures
failures/ : logs d’échecs, cas d’usage atypiques
README_infra.md : configuration webhook/port
Tu peux isoler ce module en microservice si besoin.