Architecture du Monorepo
Bienvenue dans la documentation d’architecture de la mini-marketplace. Ce projet est structuré en Monorepo géré par Turborepo, permettant de regrouper le backend, les interfaces frontends et la documentation dans un espace de travail unique et optimisé.
1. Vue d’Ensemble & Diagramme
Le projet est divisé en trois applications principales interconnectées, ainsi qu’une suite de packages partagés :
2. Rôles des Entités
⚙️ Backend : NestJS (apps/api)
- Framework : NestJS (TypeScript).
- Rôle : Cœur logique de la marketplace. Il expose une API REST robuste consommée par les deux frontends. Il gère l’authentification (JWT), la validation des comptes vendeur, le catalogue de produits (avec sponsorisation, certifications, avis), les commandes multi-pays (TVA/frais de port/devise), la passerelle de paiement (CinetPay), le journal d’audit, et le contrôle d’accès basé sur les rôles (RBAC).
- Modules métier notables :
auth,users,sellers(validation vendeur + annuaire public),products,orders,payments(+payments/gateways),addresses(+ géocodage),countries,currency,leads(Grands Comptes B2B),audit,stats,settings,events(SSE temps réel). - Accès Données : Connecté à PostgreSQL via Prisma ORM pour la gestion sémantique des requêtes et les migrations de base de données.
📊 Dashboard Frontend : Next.js (apps/dashboard)
- Framework : Next.js.
- Rôle : Portail privé réservé aux administrateurs (gestion de la plateforme, modération) et aux vendeurs (gestion des stocks, commandes reçues, tableau de bord de revenus).
- Communication : Requêtes HTTP asynchrones vers
apps/apià l’aide de clients API sécurisés.
🛒 Store Frontend : Next.js (apps/store)
- Framework : Next.js.
- Rôle : Boutique publique et dynamique accessible aux acheteurs pour consulter le catalogue, rechercher des articles, gérer leur panier et effectuer leurs achats.
- Communication : Consomme la même API REST publique/privée exposée par
apps/api.
3. Communication entre les Entités
Client vers Serveur (REST API)
- Les applications Store et Dashboard ne se connectent jamais directement à la base de données.
- Elles communiquent avec le backend NestJS (
apps/api) exclusivement par l’intermédiaire de requêtes HTTP REST structurées. - Les requêtes sensibles sont authentifiées à l’aide de tokens JWT transmis dans les en-têtes d’autorisation HTTP (
Bearer token).
Serveur vers Base de Données (Prisma & PostgreSQL)
- Le backend NestJS utilise Prisma ORM comme couche d’abstraction de données.
- Prisma génère un client fortement typé basé sur le schéma (
schema.prisma), garantissant que les entités manipulées côté NestJS correspondent exactement aux types physiques de PostgreSQL.
4. Avantages de la Structure Monorepo avec Turborepo
-
Partage de Code Simplifié : Les configurations TypeScript, les règles ESLint, et les composants d’interface utilisateur (
packages/ui) sont partagés directement à travers les espaces de travail. Il n’est pas nécessaire de publier de packages npm externes. -
Builds ultra-rapides grâce au Cache : Turborepo met en cache les résultats des builds, des tests et des linters. Si le code d’un projet ou de ses dépendances n’a pas changé, Turborepo restitue instantanément la version en cache, réduisant drastiquement le temps d’intégration continue (CI) et de développement.
-
Mises à Jour Atomiques : Une modification d’un composant partagé ou du schéma Prisma peut être propagée et testée simultanément sur les trois projets (
api,store,dashboard) dans un seul commit Git. -
Gestion unifiée des Dépendances : L’installation des paquets Node se fait en une seule commande au niveau du dossier racine via npm workspaces, assurant la cohérence des versions de librairies partagées (comme React).
5. Gestion de l’Environnement de Base de Données avec Docker
Pour garantir la parité des environnements entre les développeurs et éviter d’installer PostgreSQL localement sur chaque machine, la base de données est virtualisée à l’aide de Docker.
Le fichier de configuration est situé dans apps/api/docker-compose.yml.
Configuration du Service PostgreSQL
services:
postgres:
image: postgres:17
container_name: marketplace-postgres
restart: unless-stopped
environment:
POSTGRES_USER: [USERNAME]
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: marketplace_db
ports:
- "5432:5432"
volumes:
- ./postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:Commandes Utiles
Pour administrer la base de données de développement :
-
Démarrer la base de données (en arrière-plan) :
cd apps/api docker compose up -dCette commande télécharge l’image PostgreSQL 17 (si absente) et démarre le conteneur.
-
Arrêter la base de données :
cd apps/api docker compose down -
Consulter les logs de la base de données :
cd apps/api docker compose logs -f -
Appliquer les migrations de schéma Prisma (une fois le conteneur démarré) :
cd apps/api npx prisma migrate dev