Le contexte
Quizzam est une API backend REST développée avec NestJS, démontrant la maîtrise de patterns d'architecture logicielle modernes. Ce projet a été développé de A à Z dans le cadre d'une formation, avec un focus particulier sur l'architecture modulaire et la séparation des responsabilités.
NestJS a été choisi plutôt que Node.js pur pour son architecture prédéfinie et son support TypeScript natif, facilitant le développement en équipe et garantissant une meilleure maintenabilité du code. Contrairement à Node.js qui manque d'architecture logicielle standard, NestJS impose des règles et conventions qui structurent le projet.
L'application implémente une architecture permettant de basculer entre différentes bases de données via l'injection de dépendances (MongoDB, Firebase) sans modifier la logique métier, avec un adapter In-Memory pour les tests. Le pattern CQRS sépare les opérations de lecture et d'écriture, ce qui peut améliorer les performances, la scalabilité et la sécurité d'une application (même si dans notre cas, c'est un petit projet fictif qui ne scale pas).
Le système d'authentification est également flexible, supportant JWT et Firebase Auth selon la configuration. Des tests E2E complets avec Supertest et des tests unitaires avec Jest garantissent la qualité du code.
Découvrez quelques articles sur les enjeux de ce projet:
Mes réalisations :
- Architecture et Patterns:
- Pattern Ports & Adapters : abstraction de la base de données (MongoDB, Firebase) avec adapter In-Memory pour les tests
- CQRS (Command Query Responsibility Segregation) : séparation des opérations de lecture/écriture pour améliorer performances, scalabilité et sécurité
- Inversion de Contrôle (IoC) et Injection de Dépendances (DI) via NestJS
- Architecture modulaire : organisation en modules fonctionnels (Quiz, User, Auth, Chat)
- Technologies Backend:
- NestJS : framework progressif avec support TypeScript natif
- TypeScript : typage statique pour une meilleure maintenabilité
- Express : serveur HTTP pour les routes REST
- Socket.io : communication temps réel pour le chat et l'exécution de quiz
- Gestion des Données:
- Support multi-base de données : MongoDB, Firebase Firestore, avec adapter In-Memory pour les tests
- Pattern Repository : abstraction de l'accès aux données
- Sélection dynamique de la base de données via variables d'environnement
- Authentification et Sécurité:
- Authentification JWT : tokens basés sur email/mot de passe
- Firebase Authentication : service d'authentification géré
- Bcrypt : hachage sécurisé des mots de passe
- Middleware d'authentification : protection des routes API
- Tests et Qualité:
- Tests End-to-End (E2E) : tests complets de l'API avec Supertest
- Tests unitaires : tests isolés des composants et services avec Jest
- Mocks et Stubs : simulation des dépendances pour les tests
- Helpers de test réutilisables : AuthHelper, QuizHelper
- Outils et DevOps:
- Docker : containerisation de MongoDB pour le développement
- Nx : monorepo pour gérer plusieurs projets
- Swagger : documentation automatique de l'API
- Class-validator et class-transformer : validation des DTOs
