Modules métier
Le dossier backend/src/api contient neuf modules. Chacun est un routeur Express monté par backend/src/app.ts sous /api/v1/<module> et, pour compatibilité, sous /api/<module>. Le module système fait exception : ses routes sont montées à la racine du serveur. Les pages de cette section décrivent chaque route avec ses règles métier, sa validation, ses autorisations, ses erreurs et ses effets de bord. La liste brute des 70 routes est générée sur la page Référence de l'API.
Vue d'ensemble
| Module | Préfixe | Routes | Responsabilité | Page |
|---|---|---|---|---|
system |
racine | 5 (+ /metrics) |
Sondes de santé, configuration des clients | Webhooks et système |
auth |
/api/v1/auth |
14 | Connexion par mot de passe, Google ou code email, réinitialisation et changement du mot de passe, changement d'adresse email, création de compte et de portefeuille, 2FA, déconnexion | Authentification |
lottery |
/api/v1/lottery |
11 | État et phase du tour, achat et cadeau du ticket unique, tirage, annulation, portefeuille, POAP | Loterie |
marketplace |
/api/v1/marketplace |
7 | Catalogue, solde d'EtherPoints, échange de récompenses, ticket à gratter, validation en magasin | Boutique et récompenses |
partners |
/api/v1/partners |
5 | Entreprises partenaires, offres, lots de codes promo, statistiques | Partenaires |
user |
/api/v1/user |
13 | Profil (prénom et nom), vérification d'âge, parrainage, quêtes, préférences, message au support, RGPD | Utilisateur et RGPD |
analytics |
/api/v1/analytics |
2 | Collecte d'événements, tableau de bord démographique | Analytique |
admin |
/api/v1/admin |
12 | Tableau de bord Mairie, disjoncteur, trésorerie, partenaires, comptes Mairie et partenaires, pièces d'identité, rapports, audit | Administration Mairie |
webhooks |
/api/v1/webhooks |
1 | Indexation simulée signée HMAC | Webhooks et système |
Dépendances entre modules
Les modules ne s'appellent pas par HTTP. Ils importent directement les services et repositories les uns des autres, ainsi que les services transverses.
flowchart LR
auth["auth"] --> ledger["ledgerService"]
auth --> wallet["walletService"]
auth --> oauth["oauthVerifierService"]
lottery["lottery"] --> authRepo["authRepository"]
lottery --> ledger
lottery --> gateway["lotteryGateway"]
lottery --> bsvc["blockchainService"]
marketplace["marketplace"] --> ledger
marketplace --> partners["partners : assertPartnerAccess"]
marketplace --> authRepo
user["user"] --> ledger
admin["admin"] --> analytics["analytics"]
admin --> bsvc
admin --> gateway
admin --> emails["file emails-queue"]
admin --> wallet
webhooks["webhooks"] --> indexer["blockchainIndexerWorker"]
gateway --> indexer2["lotteryIndexer"]
indexer2 --> ledgerConventions communes
Toutes les pages de module s'appuient sur les mêmes conventions, détaillées dans Réponses et erreurs.
| Sujet | Règle |
|---|---|
| Format de réponse | { "success": true, "message": "...", "data": {...} }, ou { "success": false, "message": "...", "errors": ... } |
| Authentification | Authorization: Bearer <jeton>. Sans jeton : 401 Authentification requise (Token JWT manquant). Jeton invalide, expiré ou révoqué : 401 Session expirée ou token JWT invalide. |
| Rôles | requireRoles renvoie 403 Accès refusé (RBAC) : Rôle ADMIN requis pour cette ressource si le rôle du jeton ne convient pas, 403 Droits révoqués ou modifiés : reconnectez-vous si le compte a changé de rôle ou a été supprimé, et 403 sur la 2FA manquante d'un administrateur. |
| Validation | 400 Erreur de validation des données avec errors: [{ "path": "body.champ", "message": "..." }] |
| Idempotence | En-tête Idempotency-Key sur buy, gift, claim-prize, marketplace/claim et marketplace/scratch |
| Âge | 403 Vérifiez votre âge pour jouer. avec errors.code = AGE_VERIFICATION_REQUIRED sur buy, gift, marketplace/claim et marketplace/scratch tant que la pièce d'identité n'est pas validée |
| Exemples | Les identifiants sont des UUID v7 (@default(uuid(7))) ; les adresses sont stockées en minuscules |
Le chemin d'une erreur de validation commence par body., query. ou params. car le schéma valide l'objet { body, query, params }.
Matrice des droits
Résumé des accès par rôle. Les règles fines (propriété d'une entreprise partenaire, 2FA des administrateurs) sont décrites sur chaque page et dans Autorisations et matrice des droits.
| Routes | Anonyme | USER | PARTNER | ADMIN |
|---|---|---|---|---|
Système, GET /auth/onboarding, POST /auth/login, /signup, /signin, /password/forgot, /password/reset, /oauth/*, /2fa/verify |
oui | oui | oui | oui |
POST /auth/2fa/setup, /2fa/disable, /logout, /password/change, /email/change, /email/confirm |
non | oui | oui | oui |
GET /lottery/status, /transparency-charter, /leaderboard, /poap/:file |
oui | oui | oui | oui |
POST /lottery/claim-prize, GET /my-tickets, /wallet |
non | oui | oui | oui |
POST /lottery/buy, /gift |
non | âge vérifié | âge vérifié | âge vérifié |
POST /lottery/draw, /refund |
non | non | non | oui |
GET /marketplace/catalog, /rewards/:id, GET /partners |
oui | oui | oui | oui |
GET /marketplace/points, /my-codes |
non | oui | oui | oui |
POST /marketplace/claim, /scratch |
non | âge vérifié | âge vérifié | âge vérifié |
POST /marketplace/redeem, POST /partners, /offers, /codes/upload, GET /partners/:id/consumption |
non | non | ses entreprises | oui |
/user/* sauf confirm-delete |
non | son compte | son compte | son compte |
POST /user/gdpr/confirm-delete |
jeton reçu par email | idem | idem | idem |
POST /analytics/track |
oui | oui | oui | oui |
GET /analytics/dashboard, /admin/* |
non | non | non | oui, 2FA active |
POST /webhooks/blockchain |
signature HMAC | idem | idem | idem |
Deux modes d'exécution
Plusieurs modules se comportent différemment selon BLOCKCHAIN_MODE. Le test est fait par chainClient.isOnchain dans chaque service.
| Fonction | onchain |
simulated |
|---|---|---|
| Achat et cadeau | transaction signée par le portefeuille intégré, tickets créés par l'indexeur | ticket inséré en base avec un hachage aléatoire |
| Points d'achat | crédités par l'indexeur à la lecture de TicketsPurchased |
crédités par le service loterie |
| Tirage | requestDraw puis réponse de Chainlink VRF |
gagnant choisi par crypto.randomInt |
| Annulation | cancelRound, remboursements réclamés par la file chain-actions |
statut CANCELLED en base, aucun remboursement réel |
| Disjoncteur | pause et unpause du contrat |
clé Redis blockchain:circuit_breaker |
| Trésorerie | withdrawFees du contrat |
hachage aléatoire, rien n'est versé |
| Webhook blockchain | désactivé (409) | indexe les événements reçus |
La page Mode onchain ou simulé décrit ces deux modes du point de vue de l'intégration blockchain.