Catalogue des fonctionnalités
Ce catalogue liste toutes les fonctionnalités présentes dans le code, regroupées par domaine. Pour chacune, il indique sur quels supports elle est disponible, la route ou le contrat qui la porte et son état réel.
Lire le catalogue
| Colonne | Valeurs |
|---|---|
| Web | Page du frontend web (frontend-web/src/app/) |
| Mobile | Écran de l'application (mobile-app/src/screens/) ; un tiret signifie absent du mobile |
| État | Réel : fonctionne de bout en bout avec le contrat en mode onchain. Partiel : fonctionne avec une limite notable. Fictif : données ou comportement codés en dur |
Les limites sont détaillées dans Réel, simulé ou à venir. La liste exhaustive des routes est dans la référence de l'API.
Smart contract
Fonctions portées par smart-contract/contracts/BlockLucky.sol et smart-contract/contracts/BlockLuckyPOAP.sol.
| Fonctionnalité | Fonctions | État |
|---|---|---|
| Tours successifs, ouverture automatique du suivant | _openRound, appelé à la fin de chaque tour terminé ou annulé |
Réel |
| Achat de tickets au prix exact | buyTickets, buyTicketsFor (achat pour un tiers) |
Réel |
| Fermeture par capacité ou par durée | isDrawReady, requestDraw appelable par tous |
Réel |
| Tirage aléatoire vérifiable | Chainlink VRF v2.5, fulfillRandomWords |
Réel (coordinateur simulé en local) |
| Relance d'un tirage sans réponse de l'oracle | retryDraw après drawTimeout |
Réel |
| Annulation et remboursement intégral | closeExpiredRound, cancelRound, claimRefund |
Réel |
| Versement de la cagnotte au gagnant | claimPrize (retrait en mode pull) |
Réel |
| Commission de la Mairie plafonnée | feeBps (10 % par défaut, 20 % au plus), withdrawFees vers treasury |
Réel |
| Disjoncteur | pause, unpause (rôle PAUSER_ROLE) |
Réel |
| Plafond de tickets par participant | maxTicketsPerPlayer (1 par défaut au déploiement, MAX_TICKETS_PER_PLAYER) |
Réel |
| Compatibilité Chainlink Automation | checkUpkeep, performUpkeep |
Réel, non enregistré auprès de Chainlink |
| Badge de participation non transférable | mintBadge (ERC-721, un par participant et par tour) |
Réel |
Voir Contrat BlockLucky et Badge POAP.
Compte et connexion
| Fonctionnalité | Web | Mobile | Route ou fichier | État |
|---|---|---|---|---|
| Onboarding illustré | /connexion (quatre écrans) |
OnboardingScreen (trois écrans écrits dans l'écran) |
GET /api/v1/auth/onboarding pour le web |
Réel |
| Déclaration de majorité obligatoire et tranche d'âge | /connexion |
SignUpScreen (case « 18 ans ou plus ») |
socialLoginSchema, signupSchema (isAdultConfirmed: true) |
Réel (déclaratif) |
| Acceptation des conditions générales et du règlement | /connexion (case obligatoire, liens vers /cgu et /reglement) |
SignUpScreen (case obligatoire, liens vers l'écran Legal) |
acceptTerms: true, exigé par /auth/signup, facultatif mais vérifié par /auth/login |
Réel, acceptation non enregistrée en base |
| Connexion sans mot de passe par code à 6 chiffres | /connexion, /connexion/verification |
- | POST /api/v1/auth/login, POST /api/v1/auth/2fa/verify |
Réel |
| Inscription par email et mot de passe, confirmée par un code à 6 chiffres | - | SignUpScreen, Verify2FAScreen |
POST /api/v1/auth/signup, POST /api/v1/auth/2fa/verify |
Réel |
| Connexion par email et mot de passe | - | SignInScreen |
POST /api/v1/auth/signin |
Réel |
| Mot de passe oublié et réinitialisation par code | - | ForgotPasswordScreen, ResetPasswordScreen |
POST /api/v1/auth/password/forgot, POST /api/v1/auth/password/reset |
Réel |
| Connexion Google | - | SignInScreen, SignUpScreen |
POST /api/v1/auth/oauth/google |
Partiel : 503 tant que GOOGLE_CLIENT_IDS est vide |
| Vérification d'âge par pièce d'identité validée par la Mairie | /profil/identite |
VerifyAgeScreen |
POST /api/v1/user/identity, GET /api/v1/user/identity |
Réel |
| Double authentification TOTP avec codes de secours | /profil/securite/2fa |
Setup2FAScreen |
POST /api/v1/auth/2fa/setup ; à la connexion, code accepté avec le loginTicket délivré après le premier facteur |
Réel |
| Double authentification par email | /profil/securite/2fa |
Setup2FAScreen |
même route, méthode EMAIL |
Réel |
| Désactivation de la 2FA (code ou connexion récente) | /profil/securite |
SecurityScreen |
POST /api/v1/auth/2fa/disable |
Réel |
| Déconnexion de l'appareil, ou de tous les appareils | /profil/securite |
ProfileScreen (cet appareil seulement) |
POST /api/v1/auth/logout |
Réel |
| Changement d'adresse email confirmé par un code envoyé à la nouvelle adresse | - | SecurityScreen, ChangeEmailScreen |
POST /api/v1/auth/email/change, POST /api/v1/auth/email/confirm |
Réel |
| Création ou changement du mot de passe, avec déconnexion des autres appareils | - | SecurityScreen, ChangePasswordScreen |
POST /api/v1/auth/password/change |
Réel |
| Alertes de sécurité par email | - | - | Template security-alert |
Réel |
| Verrouillage après codes ou mots de passe erronés | - | - | 5 essais par code, 10 échecs par heure et par compte | Réel |
Détails : Authentification, Authentification et 2FA.
Portefeuille intégré
| Fonctionnalité | Web | Mobile | Route ou fichier | État |
|---|---|---|---|---|
| Création d'un portefeuille Ethereum par citoyen, clé chiffrée AES-256-GCM | automatique | automatique | backend/src/blockchain/wallet.service.ts |
Réel |
| Dotation de bienvenue en ethers fictifs (0,5 ETH par défaut, une fois) | automatique | automatique | WELCOME_GRANT_WEI |
Réel |
| Adresse, solde et lien vers l'explorateur | /accueil |
HomeScreen, ProfileScreen |
GET /api/v1/lottery/wallet |
Réel ; aucun solde en mode simulé |
| Effacement de la clé à la suppression RGPD | /profil/rgpd |
PersonalDataScreen |
backend/src/api/user/user.repo.ts |
Réel |
Loterie
| Fonctionnalité | Web | Mobile | Route | État |
|---|---|---|---|---|
| État du tour, compte à rebours, jauge | /accueil, / |
HomeScreen |
GET /api/v1/lottery/status |
Réel |
| Phase du tour (ouvert, salle d'attente, tirage, terminé, annulé) et heure de révélation | /accueil |
HomeScreen, WaitingRoomScreen |
même route, champs phase et revealAt |
Réel |
| Paliers communautaires de la jauge (5 000, 7 500, 9 000 et 10 000 participants) | /accueil |
HomeScreen |
même route | Fictif : récompenses jamais appliquées |
| Achat de son ticket unique du grand tirage en un geste, âge vérifié | /billetterie |
BuyTicketScreen |
POST /api/v1/lottery/buy |
Réel |
| Numéro de ticket à cinq chiffres | /historique |
MyTicketsScreen, TransactionHistoryScreen |
champ ticketNumber |
Réel |
| Ticket offert à un proche par email, s'il n'a pas encore le sien | /billetterie |
GiftTicketScreen |
POST /api/v1/lottery/gift |
Réel |
| Historique des tickets et galerie POAP | /historique |
MyTicketsScreen, TransactionHistoryScreen |
GET /api/v1/lottery/my-tickets |
Réel |
Tirage automatique (keeper) après le délai de révélation DRAW_REVEAL_DELAY_SECONDS |
- | - | backend/src/blockchain/lottery.keeper.ts, backend/src/blockchain/draw-reveal.ts |
Réel |
| Versement automatique de la cagnotte et des remboursements | - | - | backend/src/blockchain/chain-actions.ts |
Réel |
| Réclamation manuelle de la cagnotte | /accueil, /tirage |
LiveDrawScreen |
POST /api/v1/lottery/claim-prize |
Réel |
| Classement anonymisé des ambassadeurs | /accueil |
SponsorsScreen |
GET /api/v1/lottery/leaderboard |
Réel |
| Charte de transparence, avec l'environnement courant (Hardhat, Sepolia ou simulé) | /transparence, /profil/aide |
HowItWorksScreen, écran Legal |
Texte de frontend-web/src/content/legal.ts sur le web ; GET /api/v1/lottery/transparency-charter sur HowItWorksScreen |
Réel |
| Métadonnées et visuel des badges POAP | - | - | GET /api/v1/lottery/poap/:file |
Réel |
Tirage en direct
| Fonctionnalité | Web | Mobile | Événement Socket.IO | État |
|---|---|---|---|---|
| Salle d'attente entre la fermeture des achats et la révélation | /tirage |
WaitingRoomScreen |
draw:join, draw:waiting-room |
Réel |
| Chat en direct et réactions | /tirage |
WaitingRoomScreen, LiveDrawScreen (sans réactions) |
chat:send, chat:message, chat:react, chat:reaction |
Réel |
| Annonce du gagnant à tous les clients, roue animée sur mobile | /tirage |
LiveDrawScreen |
draw:winner |
Réel |
| Sons de la roue et du chronomètre des 8 dernières secondes, coupables | /tirage, /accueil (bouton SoundToggle) |
LiveDrawScreen, WaitingRoomScreen, interrupteur « Sons » de DisplaySettingsScreen |
- | Réel |
| Notification des EtherPoints gagnés | modale | modale | points:awarded |
Réel |
Détails : Temps réel Socket.IO.
EtherPoints et boutique
| Fonctionnalité | Web | Mobile | Route | État |
|---|---|---|---|---|
| Gain de points : 50 par ticket, 75 par ticket offert, 25 à l'inscription, 100 au parrain et 50 au filleul | automatique | automatique | Montants dans backend/src/api/auth/auth.services.ts et backend/src/blockchain/lottery.indexer.ts, écriture par backend/src/services/ledger.service.ts |
Réel |
| Solde et historique des points | /boutique |
RewardsCatalogScreen, HomeScreen |
GET /api/v1/marketplace/points |
Réel |
| Catalogue des offres et détail avec stock | /boutique, /boutique/[rewardId] |
RewardsCatalogScreen, RewardDetailScreen |
GET /api/v1/marketplace/catalog, GET /api/v1/marketplace/rewards/:id |
Réel |
| Échange d'une offre choisie contre une carte à gratter et un code promo, âge vérifié | /boutique/carte |
RewardDetailScreen, ScratchCardScreen |
POST /api/v1/marketplace/claim |
Réel |
| Ticket à gratter acheté en EtherPoints (violet 50, lucky 100), qui tire au hasard une offre en stock, âge vérifié | - | ScratchCardScreen |
POST /api/v1/marketplace/scratch |
Réel |
| Codes obtenus avec QR code | /boutique/mes-codes |
MyCodesScreen |
GET /api/v1/marketplace/my-codes |
Réel |
| Quêtes sociales | /profil |
SponsorsScreen |
GET /api/v1/user/quests, POST /api/v1/user/quests/complete |
Partiel : validées sur déclaration |
| Parrainage et liens de partage | /profil, /invite/[code] |
SponsorsScreen |
GET /api/v1/user/referrals |
Réel |
Les EtherPoints sont tenus en base (table PointTransaction), pas sur la chaîne.
Espace partenaire
| Fonctionnalité | Web | Route | État |
|---|---|---|---|
| Liste des partenaires et choix de l'établissement | /partenaire, /mairie/partenaires |
GET /api/v1/partners/ |
Réel |
| Création de son établissement | /partenaire |
POST /api/v1/partners/ |
Réel |
| Création d'une offre | /partenaire/offres |
POST /api/v1/partners/offers |
Partiel : la date d'expiration n'est pas appliquée |
| Import de codes promo (CSV ou JSON) | /partenaire/codes |
POST /api/v1/partners/codes/upload |
Partiel : codes stockés dans Redis |
| Validation d'un code en caisse | /partenaire/validation |
POST /api/v1/marketplace/redeem |
Réel |
| Suivi de consommation des codes | /partenaire |
GET /api/v1/partners/:partnerId/consumption |
Réel |
L'espace partenaire n'existe que sur le web. Détails : Partenaires.
Dashboard Mairie
| Fonctionnalité | Web | Route | État |
|---|---|---|---|
| Indicateurs globaux | /mairie |
GET /api/v1/admin/dashboard |
Partiel : commission estimée à 10 % en base |
| Tirage manuel | /mairie |
POST /api/v1/lottery/draw |
Réel, si le contrat l'autorise |
| Annulation et remboursement du tour | /mairie |
POST /api/v1/lottery/refund |
Réel |
| Disjoncteur | /mairie/securite |
POST /api/v1/admin/circuit-breaker |
Réel |
| Reversement de la commission | /mairie/securite |
POST /api/v1/admin/treasury/withdraw |
Réel, libellé « multi-signatures » trompeur |
| Approbation ou suspension d'un partenaire | /mairie/partenaires |
PATCH /api/v1/admin/partners/:partnerId/status |
Réel |
| Analytique : âges et sources d'acquisition | /mairie/analytique |
GET /api/v1/analytics/dashboard |
Partiel : répartition par âge fictive sans données |
| Export de rapport CSV ou PDF | /mairie/analytique |
GET /api/v1/admin/reports/export |
Partiel : le « PDF » serveur est du JSON ; le web imprime le PDF dans le navigateur |
| Vérification des pièces d'identité : consultation journalisée, décision, effacement des images, email au citoyen | /mairie/identites |
GET /api/v1/admin/identity-verifications, GET /api/v1/admin/identity-verifications/:id, POST /api/v1/admin/identity-verifications/:id/decision |
Réel |
| Comptes Mairie et partenaires : liste, création avec invitation, changement ou retrait de rôle | /mairie/comptes |
GET /api/v1/admin/accounts, POST /api/v1/admin/accounts, PATCH /api/v1/admin/accounts/:id/role |
Réel |
| Journal d'audit | /mairie/audit |
GET /api/v1/admin/audit-logs |
Réel |
Détails : Administration Mairie.
Profil, préférences et RGPD
| Fonctionnalité | Web | Mobile | Route | État |
|---|---|---|---|---|
| Profil et statistiques | /profil |
ProfileScreen |
GET /api/v1/user/profile |
Réel |
| Accueil des paramètres, ouvert par la roue dentée de l'en-tête | - | SettingsScreen |
GET /api/v1/user/profile |
Réel |
| Thème clair ou sombre, français ou anglais | partout | DisplaySettingsScreen |
PUT /api/v1/user/preferences |
Réel |
| Choix des notifications par catégorie | - | NotificationSettingsScreen |
PUT /api/v1/user/preferences |
Partiel : filtre le centre de notifications, aucun envoi push |
| Prénom et nom | - | PersonalDataScreen |
PATCH /api/v1/user/profile |
Réel |
| Centre de notifications | cloche | NotificationsScreen |
GET /api/v1/user/notifications |
Fictif : trois notifications codées en dur |
| Export des données personnelles en JSON | /profil/rgpd |
PersonalDataScreen |
GET /api/v1/user/gdpr/export |
Réel |
| Suppression du compte confirmée par email | /profil/rgpd |
PersonalDataScreen |
POST /api/v1/user/gdpr/delete-request, POST /api/v1/user/gdpr/confirm-delete |
Réel |
| Consentement à la mesure d'audience (bandeau, « Gérer mes traceurs ») | bandeau, /confidentialite, /traceurs |
- | stockage local bl.consent.choice, valable 6 mois |
Réel |
| Documents légaux : conditions générales, règlement, mentions légales, confidentialité, traceurs, transparence | /cgu, /reglement, /mentions-legales, /confidentialite, /traceurs, /transparence, liens du pied de page |
écran Legal, section « Informations légales » de HelpSupportScreen |
contenu partagé content/legal.ts |
Réel |
| Aide et support | /profil/aide |
HelpSupportScreen |
POST /api/v1/user/support (mobile) |
Réel ; centre d'aide « Bientôt » tant que EXPO_PUBLIC_HELP_CENTER_URL est vide |
Plateforme et exploitation
| Fonctionnalité | Fichier ou route | État |
|---|---|---|
| Sondes de vivacité, de disponibilité et diagnostic | /health, /health/live, /health/ready, /health/deep |
Réel |
| Configuration des clients (version mobile minimale, maintenance) | GET /api/config |
Réel |
| Mode maintenance | MAINTENANCE_MODE |
Réel |
| Métriques Prometheus protégées par jeton | /metrics |
Réel |
| Documentation interactive | /api/docs |
Réel |
| Journaux JSON et identifiant de corrélation | backend/src/observability/request-context.ts |
Réel |
| Idempotence des achats, cadeaux, échanges et tickets à gratter | Idempotency-Key |
Réel côté API ; le mobile n'envoie pas l'en-tête |
| Nœud RPC de secours | FALLBACK_RPC_URL |
Réel |
| Indexation des événements du contrat | backend/src/blockchain/lottery.indexer.ts |
Réel |
| Webhook blockchain signé HMAC | POST /api/v1/webhooks/blockchain |
Mode simulé uniquement ; répond 409 en mode onchain |
| Stockage des rapports sur S3 | backend/src/services/s3.service.ts |
Partiel : aucun service S3 en local |
| Remontée d'erreurs Sentry | mobile-app/src/services/sentry.client.ts |
Fictif : journal en mémoire |
Office de Tourisme
Le site statique frontend-office-tourisme/ (14 pages) présente la destination : découverte, agenda, restaurants, hébergements, magazine, favoris, billetterie avec panier, tunnel de commande simulé et billets avec QR code. Il ne communique pas avec le backend. Voir Rôle dans le projet.