Intercalaire 3 : APPS & SERVICES

Généré le 4 Avril 2026 - Projet Talas


📄 README.md

Chemin: 03_APPS_&_SERVICES/APIs_&_Rust_Modules/README.md

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 :

Contenu :

Ces modules peuvent être exposés comme services REST ou microservices via gRPC.

📄 ROUTES_API.md

Chemin: 03_APPS_&_SERVICES/APIs_&_Rust_Modules/ROUTES_API.md

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

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)

  1. CORS — Validation des origines
  2. Cache Headers — En-têtes CDN
  3. Maintenance Mode — Retourne 503 sauf /health et /admin
  4. Request Logger — Logs structurés
  5. Prometheus Metrics — Compteurs/histogrammes
  6. Sentry Recovery — Capture d'erreurs
  7. Security Headers — HSTS, CSP, X-Content-Type-Options
  8. CCPA Header — Sec-GPC
  9. Audit Middleware — Auto-log POST/PUT/DELETE
  10. API Monitoring — Suivi pannes/alertes
  11. Error Handler — Stack traces en dev/DEBUG
  12. Recovery — Récupération après panic
  13. Request ID — UUID par requête
  14. Global Timeout — Timeout global
  15. DDoS Rate Limiting — 1000 req/s global, 100/s par IP
  16. Rate Limiter — Général
  17. Response Cache — Redis, TTL 5-15 min

Documents liés

📄 SERVEUR_STREAMING_RUST.md

Chemin: 03_APPS_&_SERVICES/APIs_&_Rust_Modules/SERVEUR_STREAMING_RUST.md

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

  1. Upload : Le backend Go reçoit le fichier audio et le stocke sur S3
  2. Événement : track.uploaded publié sur RabbitMQ
  3. Transcoding : Le stream server consomme l'événement, transcode via FFmpeg
  4. Stockage : Les segments HLS et playlists sont stockés sur S3
  5. Callback : POST /internal/tracks/:id/stream-ready vers le backend
  6. 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 :

  1. CORS — Restrictif par défaut, origines configurables
  2. Timeout — 30 secondes par requête
  3. Compression — gzip
  4. Security Headers — X-Content-Type-Options, X-Frame-Options, etc.
  5. Rate Limiting — Par IP
  6. 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.md

Chemin: 03_APPS_&_SERVICES/ARCHITECTURE_VEZA.md

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)

Stream Server (Rust)

Frontend (React)

Patterns architecturaux

1. Microservices avec communication asynchrone

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

4. Observabilité

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

📄 README.md

Chemin: 03_APPS_&_SERVICES/Auth_&_Core/README.md

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 :

Contenu recommandé :

Ce module doit être le plus découpé possible pour pouvoir s’adapter à la croissance future.

📄 CONFIGURATION_ENVIRONNEMENT.md

Chemin: 03_APPS_&_SERVICES/CONFIGURATION_ENVIRONNEMENT.md

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-alpinenginx: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

📄 README.md

Chemin: 03_APPS_&_SERVICES/Community/Groupes_Chat/README.md

Groupes & Chat

Module de messagerie communautaire pour groupes d’utilisateurs : collaboration, entraide, salon projet.

Objectifs :

Contenu recommandé :

Inspiré de Discord/Mattermost, mais minimaliste.

📄 README.md

Chemin: 03_APPS_&_SERVICES/Community/README.md

Talas Community – App Communautaire

Ce dossier regroupe les composants de l’application communautaire de Talas : partage, groupes, chat, échanges entre artistes.

Objectifs :

Sous-sections :

Peut évoluer vers un écosystème type SoundCloud + Discord + Coursera artisanal.

📄 FRONTEND_REACT.md

Chemin: 03_APPS_&_SERVICES/FRONTEND_REACT.md

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)

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-alpinenginx: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

📄 README.md

Chemin: 03_APPS_&_SERVICES/Personal/README.md

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 :

Sous-dossiers :

Tu peux l'étendre vers un "OS musical personnel" avec interopérabilité.

📄 README.md

Chemin: 03_APPS_&_SERVICES/README.md

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

Stack résumée

Connexions transversales

📄 SCHEMA_BASE_DE_DONNEES.md

Chemin: 03_APPS_&_SERVICES/SCHEMA_BASE_DE_DONNEES.md

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

Conventions


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

📄 README.md

Chemin: 03_APPS_&_SERVICES/Shop/Backend/README.md

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 :

Contenu recommandé :

Ce backend doit être indépendant de la logique d’auth, qui réside dans Auth_&_Core.

📄 README.md

Chemin: 03_APPS_&_SERVICES/Shop/Frontend/README.md

Frontend Talas Shop

Ce dossier contient l’interface web de la boutique en ligne Talas : navigation produit, panier, commande, espace client.

Objectifs :

Contenu recommandé :

L’interface doit être compatible mobile-first et intégrer des modules d'accessibilité.

📄 README.md

Chemin: 03_APPS_&_SERVICES/Shop/Paiement/README.md

Paiement – Talas Shop

Ce dossier isole la logique liée au paiement dans la boutique Talas (gestion des transactions, webhooks, factures, remboursements).

Objectifs :

Contenu recommandé :

Tu peux isoler ce module en microservice si besoin.