Un back-end pragmatique et solide
Tisseco collecte et revend des vêtements d’occasion dans des friperies, avec une forte mission environnementale et sociale (programmes de réinsertion professionnelle).
Besoin métier : Gérer efficacement une flotte de conteneurs dispersés sur le territoire, avec suivi en temps réel, planification des tournées de collecte, et signalement citoyen pour les conteneurs pleins ou endommagés.
Solution technique : Plateforme complète intégrant recherche géospatiale (trouver les conteneurs à proximité), imports CSV massifs (mise à jour rapide des données terrain), et interface publique pour l’engagement citoyen.
Bénéfices :
- Traçabilité complète de la chaîne de collecte
- Optimisation des tournées grâce à la géolocalisation
- Réduction des erreurs de saisie via imports automatisés
- Amélioration de l’expérience utilisateur pour les citoyens cherchant un point de collecte
Objectifs
- Back-end production-ready avec des limites DDD claires
- Suivi multi-entités : Sites → Zones → Conteneurs
- Gestion de la création et du suivi des Tournées (pour définir le “programme” qu’un chauffeur doit suivre)
- Recherche géospatiale avancée (PostGIS)
- Imports CSV massifs fiables avec mise en file d’attente et reporting
- QR codes pour des opérations terrain fluides
- Déploiement et monitoring robustes
Architecture
- Structure DDD :
presentation/,application/,domain/,infrastructure/ - Persistance : TypeORM (migrations, seeders)
- Géospatial : PostgreSQL PostGIS (Haversine, ST_DWithin, polygones)
- Traitement asynchrone : BullMQ pour les tâches lourdes (imports, emails)
- Cache & rate limiting : Redis avec clés explicites et cache scopé par utilisateur
- Mailing : Templates MJML
- Tests : unitaires (Jest) + E2E transactionnels (rollback par test)
- Observabilité : logs structurés + Netdata
- Ops : Docker, Coolify (déploiement), GitHub Actions (CI/CD), sauvegardes AWS S3
Points forts
- Boilerplate NestJS réutilisable avec conventions strictes : logging, gestion d’erreurs, validation
.env, cache sécurisé - Recherche PostGIS par rayon ou polygone, avec filtres par type
- Pipeline d’import CSV : staging, validation, mise en file (BullMQ), erreurs ligne par ligne, rapport par email
- Stratégie de cache sans “caches zombies” via clés contrôlées (problème survenant avec les tags Redis)
- Sécurité renforcée : guards, rôles, contrôle de cache par route et par utilisateur
- UX terrain : QR codes sur les conteneurs pour scan rapide
Fonctionnalités
- CRUD pour sites, zones, conteneurs
- Recherche géospatiale (rayon, polygone, filtres par type)
- Imports CSV haute volumétrie avec rapports détaillés
- Auth & rôles (JWT), rate limiting, logs contextuels
- Emails transactionnels avec templates MJML
- Ops admin : déploiements automatisés, monitoring, sauvegardes S3
Défis & apprentissages
- Résilience en charge : les imports pilotés par file d’attente évitent les verrous DB et maintiennent l’interface réactive
- Isolation des règles métier : les règles du domaine sont testables sans base de données
- Sécurité du cache : clés explicites et décorateurs scopés par utilisateur empêchent les mauvaises invalidations
- Précision géospatiale : les fonctions PostGIS sont plus rapides et compatibles avec les index
Stack technique
Back-end : NestJS, TypeScript, TypeORM, PostgreSQL + PostGIS, BullMQ, Redis, JWT, MJML
Front-end : React, Vite, Tailwind + DaisyUI
Qualité : Jest (unitaires), tests E2E transactionnels
Ops : Docker, GitHub Actions, Coolify, Netdata, AWS S3