GymTeam
Gestion de clubs : une plateforme, de nombreux clubs
Le volet staff de l’écosystème Fitofan : les clubs sportifs gèrent membres, cours, check-in, progression et paiements, chaque club dans son propre espace privé.
- Rôle
- Senior Full-Stack Engineer
- Période
- 2025 – 2026


Contexte
GymTeam est l’outil des propriétaires, gérants et entraîneurs de clubs ; les athlètes et les parents utilisent Fitofan, qui les connecte aussi. Je l’ai extrait de la base de code Fitofan pour en faire un produit à part et j’en ai livré l’essentiel.
Le défi
Servir de nombreux clubs indépendants depuis une seule application avec une isolation stricte des données, encaisser les paiements sur chaque marché où les clubs opèrent, et garder les données de clubs cohérentes avec la plateforme des athlètes en temps réel.
Construit sur toutes les couches
- Admin Next.js 16 en Feature-Sliced Design : plus de 80 pages, 11 locales
- Backend NestJS : un module par entité avec cas d’usage, repositories et DTO validés ; 95 migrations
- Isolation des tenants : un guard résout chaque club par id ou slug et vérifie l’appartenance avant tout handler
- Membres, invitations et essais, plannings hebdomadaires avec listes d’attente, check-in en direct, présences, programme et niveaux de ceinture, décharges, devoirs, évaluations
- Paiements : Finix, Stripe, PayPal, Square, Monopay, LiqPay, GCash et Mercado Pago plus espèces et dettes, un planificateur de facturation quotidien, stockage des identifiants en AES-256-GCM
- Contrat RabbitMQ partagé avec Fitofan : 29 clés de routage, une enveloppe typée avec identifiants de corrélation, topologie documentée
- Connexion par QR via WebSockets, une passerelle de session Socket.IO, stockage média compatible S3
- Analyses de revenus, de présences et d’entraîneurs avec export CSV et PDF
- Même pipeline de livraison que Fitofan : contrôle de types et Jest, image Docker, déploiement SSH
Points d’ingénierie
- Périmètre du tenant imposé côté serveur, jamais confié au client
- Webhooks idempotents par prestataire et id d’événement ; les intentions de paiement portent des clés d’idempotence
- Une règle ESLint sur mesure, avec ses propres tests, garde les couches Feature-Sliced honnêtes
- Les parcours d’inscription et de création de club viennent de packages partagés par les deux produits
Ce que cela permet
Chaque club obtient un produit qui semble conçu pour lui, tandis que l’ingénierie reste une seule base de code et un seul déploiement.