API backend pour une boutique en ligne de mobilier (furniture e-store), construite avec Express, TypeScript, Prisma (PostgreSQL) et Redis.
- Node.js 18+
- PostgreSQL (une base accessible, ex: Neon)
- Redis (ex: Upstash)
- Cloudflare R2 (ou compatible S3) pour le stockage des images — optionnel pour démarrer en local sans upload d'images
git clone <url-du-repo>
cd ecommerce-api
npm installCopie le fichier d'exemple :
cp .env.example .envRemplis les valeurs dans .env :
NODE_ENV=development
PORT=3000
# PostgreSQL — Neon.tech (ou toute instance Postgres)
DATABASE_URL=postgresql://user:password@host:5432/dbname
# Redis — Upstash (ou toute instance Redis)
REDIS_URL=redis://default:password@host:port
# Cloudflare R2 (upload d'images) — optionnel en dev
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET_PRODUCTS=products
R2_BUCKET_INVOICES=invoices
R2_PUBLIC_URL=
# Auth — génère une chaîne aléatoire d'au moins 32 caractères
JWT_SECRET=change_this_to_a_random_32char_string
JWT_EXPIRES_IN=3600
# Providers externes (non utilisés actuellement, laissés vides)
STRIPE_SECRET_KEY=
PAYDUNYA_API_KEY=
AFRICASTALKING_API_KEY=
RESEND_API_KEY=
⚠️ JWT_SECRETdoit faire au moins 32 caractères, sinon le serveur refuse de démarrer (validation Zod danssrc/shared/config/env.ts).
Pour les tests, crée aussi un .env.test (même structure, pointant idéalement vers une base de test séparée).
Applique le schéma à ta base de données :
npx prisma migrate devCette commande :
- crée les tables selon
prisma/schema.prisma - génère le client Prisma (
@prisma/client)
Si tu modifies schema.prisma plus tard :
npx prisma migrate dev --name description_du_changementPour visualiser la base en local (optionnel) :
npx prisma studioLe projet fournit des scripts de seed pour démarrer avec un catalogue de mobilier prêt à l'emploi. L'ordre d'exécution est important — chaque script dépend des données créées par le précédent.
Nécessaire pour accéder aux routes protégées (Admin) une fois l'app lancée.
npm run seed:adminPar défaut : username=mon_admin, email=mon_admin@e-store.com, password=motdepassesecurise.
Tu peux personnaliser :
npm run seed:admin -- mon_username mon_email@example.com mon_mot_de_passeInitialise les paramètres configurables (devise, seuil de stock faible, méthodes de paiement actives, pays supportés, etc.) avec leurs valeurs par défaut.
npm run seed:settingsConsultable ensuite via
GET /settings/public(sans auth) ouGET /settings(admin).
Respecte impérativement cet ordre :
npm run seed:categories # Arbre de catégories (parent/enfant) : Salon, Chambre, Bureau...
npm run seed:products # Produits, rattachés aux catégories créées ci-dessus
npm run seed:tags # Tags (Nouveauté, Best-seller...) assignés aux produits par SKU
npm run seed:promotions # Promotions, remises et coupons sur catégories/produitsChaque script :
- est idempotent — relancer un script ne crée pas de doublons (vérifie l'existence par
slug/sku/codeavant insertion) - affiche dans la console un résumé de ce qui a été créé ou ignoré
Pour un premier démarrage complet, exécute dans l'ordre :
# Données existantes (rappel)
npm run seed:admin
npm run seed:settings
npm run seed:categories
npm run seed:products
npm run seed:warehouses # entrepôts
npm run seed:attributes # définitions d'attributs + options (couleur, matériau)
npm run seed:combinations # variantes de produits (couleurs) — dépend d'attributes + products
npm run seed:inventory # stock par produit/variante × entrepôt — dépend de warehouses + combinations
npm run seed:shipping-methods # méthodes de livraison (indépendant)
npm run seed:users # clients de test + adresses (indépendant)
npm run seed:tags
npm run seed:promotions
npm run seed:popupsnpm run devLe serveur démarre sur http://localhost:3000 (ou le PORT défini dans .env).
npm run build
npm startnpm run build compile TypeScript vers dist/, npm start lance dist/server.js.
curl http://localhost:3000/settings/publicDoit renvoyer les settings publics (devise, pays supportés, méthodes de paiement) si seed:settings a été exécuté.
curl http://localhost:3000/productDoit renvoyer la liste des produits — vide tant que les produits ne sont pas passés en statut ACTIVE (ils naissent en DRAFT, voir §7 ci-dessous).
npm test # tous les tests
npm run test:unit # tests unitaires uniquement
npm run test:integration # tests d'intégration uniquement (nécessite .env.test configuré)
npm run test:watch # mode watchLes produits créés par seed:products naissent en statut DRAFT (comportement volontaire de l'API — voir product.service.ts). Pour les rendre visibles publiquement, un admin doit les passer en ACTIVE :
curl -X PATCH http://localhost:3000/product/1 \
-H "Authorization: Bearer <token_admin>" \
-H "Content-Type: application/json" \
-d '{"status": "ACTIVE"}'Récupère
<token_admin>viaPOST /loginavec les identifiants créés à l'étape 4.1.
- Endpoints & flux métier : voir
GUIDE_INTEGRATION_API_FRONTEND.md - Système d'événements internes : voir
src/shared/events/README.md - Module Settings (paramètres configurables à chaud) :
GET /settings(admin) pour la liste complète des clés disponibles
| Commande | Description |
|---|---|
npm run dev |
Démarre le serveur en mode développement |
npm run build |
Compile TypeScript |
npm start |
Démarre le serveur compilé (production) |
npm run seed:admin |
Crée un compte administrateur |
npm run seed:settings |
Peuple les paramètres par défaut |
npm run seed:categories |
Crée l'arbre de catégories |
npm run seed:products |
Crée les produits (nécessite les catégories) |
npm run seed:tags |
Crée les tags et les assigne aux produits |
npm run seed:promotions |
Crée promotions, remises et coupons |
npm test |
Lance tous les tests |
npm run test:unit |
Tests unitaires uniquement |
npm run test:integration |
Tests d'intégration uniquement |