Mode d'emploi — de zĂ©ro Ă  dĂ©ployĂ©

E-commerce

Une boutique en ligne simple : catalogue, panier, paiement réel via Stripe.

Sommaire
01Initialiser le projet Next.js
02Base de donnĂ©es — Prisma + Supabase
03Authentification — Better Auth
04Paiement — Stripe
05Catalogue, panier & commandes
06Tests — Vitest & Playwright
07DĂ©ploiement — Vercel
RĂšgle du jeu : tu tapes chaque commande toi-mĂȘme dans ton terminal, dans l'ordre. Tu ne passes Ă  l'Ă©tape suivante que quand la case « vĂ©rification » est cochĂ©e. Si une commande plante, copie-colle l'erreur exacte — on corrige ensemble, tu ne devines pas.

RĂ©utilisable vs spĂ©cifique : les Ă©tapes rĂ©utilisable sont valables pour n'importe quel projet de ta stack. Les Ă©tapes spĂ©cifique sont propres Ă  cette boutique — adapte le catalogue Ă  tes propres produits.
📖 C'est quoi chaque techno (Stripe, Prisma, Better Auth...) ? Le lexique complet est sur la page d'accueil →
01
Réutilisable

Initialiser le projet Next.js

Un projet Next.js qui dĂ©marre en local, avec Tailwind et shadcn/ui prĂȘts Ă  l'emploi.

Prérequis : Node.js installé. Terminal ouvert dans le dossier du projet.

  1. Installe pnpm si besoin
    npm install -g pnpm
    pnpm est le gestionnaire de paquets choisi pour ce projet — plus rapide et plus Ă©conome en espace disque que npm.
    👁 Comment voir le rĂ©sultat : tape pnpm -v. Un numĂ©ro de version s'affiche (ex. 9.12.0) — sinon l'installation a Ă©chouĂ©.
  2. Crée le projet Next.js
    pnpm create next-app@latest . --typescript --tailwind --eslint --app --src-dir=false --import-alias "@/*"
    Le nom du dossier ne doit pas contenir de majuscules (contrainte npm). S'il en contient, crée le projet dans un dossier temporaire au nom valide puis déplace tout son contenu dans ton dossier de travail.
    👁 Comment voir le rĂ©sultat : tape ls. Tu dois voir apparaĂźtre app/, package.json, tailwind.config.ts — la commande a rempli ton dossier de fichiers.
  3. Initialise shadcn/ui
    pnpm dlx shadcn@latest init
    Ça crĂ©e components.json et lib/utils.ts, et prĂ©pare Tailwind pour recevoir des composants shadcn/ui prĂȘts Ă  copier.
    👁 Comment voir le rĂ©sultat : tape ls components.json lib/utils.ts — les deux fichiers doivent exister, sans message d'erreur « No such file ».
  4. Crée l'arborescence du projet
    mkdir -p lib/auth lib/db lib/validations prisma tests
    On sĂ©pare dĂšs le dĂ©part : authentification, accĂšs base de donnĂ©es, schĂ©mas de validation. Ça Ă©vite le fichier fourre-tout de 2000 lignes plus tard.
    👁 Comment voir le rĂ©sultat : tape ls lib — les dossiers auth, db, validations doivent apparaĂźtre.
  5. Initialise Git et fais le premier commit
    git init
    git add -A
    git commit -m "chore: init projet Next.js"
    👁 Comment voir le rĂ©sultat : tape git log --oneline — une ligne avec ton message de commit doit s'afficher.
  6. Lance le serveur et vérifie
    pnpm dev
    Ouvre http://localhost:3000. Si tu as une erreur 500 mentionnant un module introuvable (ex. Can't resolve 'xxx') alors qu'il est bien dans package.json : supprime node_modules, pnpm-lock.yaml et .next, relance pnpm install puis pnpm dev. C'est presque toujours une installation incomplĂšte, pas un bug de code.
    👁 Comment voir le rĂ©sultat : dans ton navigateur, ouvre localhost:3000. Tu dois voir la page d'accueil par dĂ©faut de Next.js. Le terminal affiche Ready et n'affiche pas d'erreur rouge.
Vérification
02
Réutilisable

Base de donnĂ©es — Prisma + Supabase

Une base PostgreSQL en ligne, avec les tables Produit, Commande et LigneCommande créées via Prisma.

Prérequis : étape 1 validée.

  1. Crée un projet sur Supabase
    Va sur supabase.com → New project. Choisis un nom, une rĂ©gion proche, et un mot de passe de base de donnĂ©es — note-le quelque part.
    👁 Comment voir le rĂ©sultat : le tableau de bord Supabase affiche ton projet avec un statut « Active » (aprĂšs ~1-2 minutes).
  2. RécupÚre l'URL de connexion
    Dans le projet Supabase : Project Settings → Database → Connection string, mode URI. Copie l'URL complùte (mot de passe inclus).
  3. Installe Prisma
    pnpm add prisma --save-dev
    pnpm add @prisma/client
    pnpm dlx prisma init
    Crée prisma/schema.prisma et un fichier .env avec une variable DATABASE_URL vide.
    👁 Comment voir le rĂ©sultat : tape ls prisma/schema.prisma — le fichier doit exister.
  4. Colle l'URL dans .env
    # .env
    DATABASE_URL="postgresql://postgres:[MOT-DE-PASSE]@[HOST]:5432/postgres"
    Ce fichier ne doit jamais ĂȘtre commit (dĂ©jĂ  dans .gitignore par dĂ©faut) — il contient un mot de passe.
  5. Écris le schĂ©ma
    Dans prisma/schema.prisma, sous les blocs generator/datasource déjà présents, ajoute :
    model Produit {
      id        String   @id @default(cuid())
      nom       String
      prix      Int      // en centimes, pour éviter les erreurs d'arrondi
      stock     Int      @default(0)
      createdAt DateTime @default(now())
    }
    
    model Commande {
      id        String   @id @default(cuid())
      clientId  String
      statut    String   @default("EN_ATTENTE")
      total     Int
      createdAt DateTime @default(now())
      lignes    LigneCommande[]
    }
    
    model LigneCommande {
      id           String   @id @default(cuid())
      commandeId   String
      commande     Commande @relation(fields: [commandeId], references: [id])
      produitId    String
      quantite     Int
      prixUnitaire Int
    }
    Les prix sont stockĂ©s en centimes (entiers) plutĂŽt qu'en euros dĂ©cimaux — Ă©vite les erreurs d'arrondi classiques avec les nombres flottants.
  6. Applique la migration et vérifie
    pnpm dlx prisma migrate dev --name init
    pnpm dlx prisma studio
    migrate dev crée les tables et génÚre le client Prisma typé. studio ouvre une interface web locale pour voir/éditer les données à la main.
    👁 Comment voir le rĂ©sultat : prisma studio ouvre localhost:5555 — les tables Produit, Commande et LigneCommande doivent apparaĂźtre dans la liste de gauche.
Vérification

PiĂšge frĂ©quent : connexion refusĂ©e → vĂ©rifie qu'aucun caractĂšre spĂ©cial du mot de passe (@, #...) n'est mal encodĂ© dans l'URL. Supabase propose un bouton pour copier l'URL dĂ©jĂ  encodĂ©e.

03
Réutilisable

Authentification — Better Auth

Des comptes clients — historique de commandes, adresse — et une zone /dashboard protĂ©gĂ©e pour l'admin.

Prérequis : étape 2 validée (schéma Prisma en place).

  1. Installe Better Auth
    pnpm add better-auth
    👁 Comment voir le rĂ©sultat : better-auth apparaĂźt dans package.json.
  2. Crée la config serveur
    // lib/auth/auth.ts
    import { betterAuth } from "better-auth";
    import { prismaAdapter } from "better-auth/adapters/prisma";
    import { prisma } from "@/lib/db/client";
    
    export const auth = betterAuth({
      database: prismaAdapter(prisma, { provider: "postgresql" }),
      emailAndPassword: { enabled: true },
    });
    CrĂ©e aussi lib/db/client.ts qui exporte une instance unique de PrismaClient — Ă©vite d'en recrĂ©er une Ă  chaque appel.
  3. Ajoute les tables auth au schéma
    pnpm dlx @better-auth/cli generate
    pnpm dlx prisma migrate dev --name add_auth
    Better Auth génÚre automatiquement les modÚles User, Session, Account dans schema.prisma.
    👁 Comment voir le rĂ©sultat : ouvre prisma studio — les tables User, Session, Account doivent apparaĂźtre.
  4. Ajoute le secret dans .env
    # .env
    BETTER_AUTH_SECRET="génÚre une chaßne aléatoire longue"
    BETTER_AUTH_URL="http://localhost:3000"
  5. Crée la route API
    // app/api/auth/[...all]/route.ts
    import { auth } from "@/lib/auth/auth";
    import { toNextJsHandler } from "better-auth/next-js";
    
    export const { GET, POST } = toNextJsHandler(auth);
    👁 Comment voir le rĂ©sultat : relance pnpm dev et ouvre un endpoint Better Auth (ex. localhost:3000/api/auth/ok) — tu dois obtenir une rĂ©ponse JSON, pas une erreur 404.
  6. Crée le client auth et les pages
    Un fichier lib/auth/client.ts avec createAuthClient(), puis des pages /signup et /login qui appellent authClient.signUp.email(...) et authClient.signIn.email(...).
    👁 Comment voir le rĂ©sultat : crĂ©e un compte test sur localhost:3000/signup, puis vĂ©rifie dans Prisma Studio qu'une ligne apparaĂźt dans la table User.
  7. ProtĂšge /dashboard
    Un middleware.ts à la racine qui vérifie la session sur les routes /dashboard/* et redirige vers /login si absente.
    👁 Comment voir le rĂ©sultat : en navigation privĂ©e (non connectĂ©), va sur localhost:3000/dashboard — tu dois ĂȘtre redirigĂ© vers /login.
Vérification

PiĂšge frĂ©quent : si la doc officielle de Better Auth diffĂšre de ce qui est Ă©crit ici, suis la doc — c'est une librairie qui Ă©volue vite. Dis-le moi si un nom de fonction a changĂ©, on ajuste.

04
Spécifique e-commerce

Paiement — Stripe

Encaisser un vrai paiement carte, en toute sécurité.

Prérequis : étape 3 validée.

  1. Crée un compte Stripe (mode test)
    Sur stripe.com — le mode test permet de simuler des paiements sans vraie carte bancaire, avec le numĂ©ro 4242 4242 4242 4242.
  2. Installe le SDK
    pnpm add stripe
    👁 Comment voir le rĂ©sultat : stripe apparaĂźt dans package.json.
  3. Ajoute les clés dans .env
    # .env
    STRIPE_SECRET_KEY="sk_test_..."
    STRIPE_WEBHOOK_SECRET="whsec_..."
    Les deux se trouvent dans le tableau de bord Stripe, section Développeurs.
  4. Crée une session de paiement
    // lib/stripe/checkout.ts
    "use server";
    import Stripe from "stripe";
    const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
    
    export async function createCheckoutSession(items) {
      const session = await stripe.checkout.sessions.create({
        mode: "payment",
        line_items: items.map((i) => ({
          price_data: {
            currency: "eur",
            product_data: { name: i.nom },
            unit_amount: i.prix,
          },
          quantity: i.quantite,
        })),
        success_url: `${process.env.BETTER_AUTH_URL}/commande/succes`,
        cancel_url: `${process.env.BETTER_AUTH_URL}/panier`,
      });
      return session.url;
    }
    👁 Comment voir le rĂ©sultat : se testera concrĂštement une fois la page panier branchĂ©e Ă  l'Ă©tape 5 — pour l'instant, vĂ©rifie juste que le fichier ne contient pas d'erreur TypeScript dans ton Ă©diteur.
  5. Crée la route webhook
    // app/api/stripe/webhook/route.ts
    // Vérifie la signature avec STRIPE_WEBHOOK_SECRET,
    // puis à l'événement "checkout.session.completed",
    // passe la Commande correspondante en statut PAYEE.
    Ne marque jamais une commande payĂ©e depuis le navigateur (cĂŽtĂ© client) — seul le webhook, signĂ© par Stripe, fait foi. Sinon n'importe qui peut appeler ton API et se dĂ©clarer « payĂ© » sans payer.
    👁 Comment voir le rĂ©sultat : lance stripe listen --forward-to localhost:3000/api/stripe/webhook dans un terminal sĂ©parĂ© — il doit afficher Ready! Your webhook signing secret is whsec_.... Fais un paiement test (carte 4242 4242 4242 4242) : ce terminal doit logguer l'Ă©vĂ©nement checkout.session.completed.
Vérification

PiĂšge frĂ©quent : en local, Stripe ne peut pas atteindre localhost pour envoyer le webhook — utilise stripe listen --forward-to localhost:3000/api/stripe/webhook (CLI Stripe) pendant le dĂ©veloppement.

05
Spécifique e-commerce

Catalogue, panier & commandes

Parcourir les produits, les mettre au panier, passer commande.

Prérequis : étape 4 validée.

  1. Page catalogue
    app/produits/page.tsx — liste les produits via prisma.produit.findMany(), une carte par produit (shadcn/ui Card).
    👁 Comment voir le rĂ©sultat : ouvre localhost:3000/produits — les produits que tu as ajoutĂ©s dans Prisma Studio doivent s'afficher, un par carte.
  2. Panier cÎté client
    pnpm add zustand
    Le panier vit dans le navigateur avant le paiement — pas besoin de base de donnĂ©es pour ça. Zustand garde l'Ă©tat du panier accessible depuis n'importe quel composant, sans tout faire remonter via les props.
  3. Page panier
    app/panier/page.tsx — rĂ©capitule les articles ajoutĂ©s, calcule le total, bouton « Payer » qui appelle createCheckoutSession.
    👁 Comment voir le rĂ©sultat : depuis le catalogue, ajoute 2-3 produits au panier puis ouvre localhost:3000/panier — ils doivent y ĂȘtre listĂ©s avec le bon total (calcule-le Ă  la main pour vĂ©rifier).
  4. Crée la commande avant le paiement
    CrĂ©e la Commande en base avec statut EN_ATTENTE juste avant de rediriger vers Stripe — le webhook n'aura plus qu'Ă  la faire passer Ă  PAYEE.
    👁 Comment voir le rĂ©sultat : clique sur « Payer » depuis le panier — juste avant la redirection vers Stripe, une nouvelle ligne EN_ATTENTE doit apparaĂźtre dans la table Commande (Prisma Studio).
Vérification
06
Réutilisable

Tests — Vitest & Playwright

Automatiser la vérification du parcours critique.

Prérequis : étapes 4 et 5 validées.

  1. Installe et configure Vitest
    pnpm add -D vitest
    Écris un test dans tests/panier.validation.test.ts qui vĂ©rifie que calculTotalPanier calcule correctement le total du panier avec plusieurs articles.
  2. Installe et configure Playwright
    pnpm create playwright
    RĂ©pond aux questions de l'installateur (TypeScript, dossier tests-e2e). Écris un test qui : crĂ©e un compte → ajoute un produit au panier → paie avec une carte de test Stripe → vĂ©rifie que la commande apparaĂźt en base.
  3. Lance les tests
    pnpm exec vitest run
    pnpm exec playwright test
    👁 Comment voir le rĂ©sultat : le terminal affiche un rĂ©sumĂ© avec un nombre de tests « passed » en vert. Playwright peut aussi ouvrir un rapport HTML (pnpm exec playwright show-report) qui montre le parcours Ă©tape par Ă©tape, avec captures d'Ă©cran si un test Ă©choue.
Vérification
07
Réutilisable

DĂ©ploiement — Vercel

Une URL publique et fonctionnelle.

Prérequis : étape 6 validée.

  1. Ajoute la génération Prisma au build
    // package.json
    "scripts": { "postinstall": "prisma generate" }
    Sans ça, le build Vercel plante — le client Prisma doit ĂȘtre rĂ©gĂ©nĂ©rĂ© aprĂšs chaque install en production.
  2. Pousse le code sur GitHub
    git remote add origin URL-DE-TON-DEPOT
    git push -u origin master
    👁 Comment voir le rĂ©sultat : rafraĂźchis la page du dĂ©pĂŽt sur GitHub — tes fichiers doivent y apparaĂźtre.
  3. Importe le projet sur Vercel
    Sur vercel.com → Add New → Project → sĂ©lectionne le dĂ©pĂŽt GitHub.
    👁 Comment voir le rĂ©sultat : le tableau de bord Vercel passe de « Building » Ă  « Ready », avec un lien de prĂ©visualisation cliquable.
  4. Renseigne les variables d'environnement
    Copie DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL (URL Vercel finale), STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET dans Settings → Environment Variables.
    👁 Comment voir le rĂ©sultat : pas d'effet visible immĂ©diatement — redĂ©ploie (« Redeploy ») puis teste Ă  l'Ă©tape suivante.
  5. Configure le webhook Stripe en production
    Dans le tableau de bord Stripe : ajoute un endpoint pointant vers https://tondomaine.vercel.app/api/stripe/webhook — l'URL locale utilisĂ©e avec la CLI ne fonctionne plus une fois dĂ©ployĂ©.
    👁 Comment voir le rĂ©sultat : dans le tableau de bord Stripe, section Webhooks, l'endpoint doit afficher un statut vert « Enabled ».
  6. Déploie et vérifie en ligne
    Ouvre l'URL fournie par Vercel, refais le parcours critique Ă  la main : crĂ©er un compte → ajouter un produit au panier → payer avec une carte de test → vĂ©rifier la commande.
    👁 Comment voir le rĂ©sultat : sur l'URL *.vercel.app, un paiement test complet doit faire passer la commande en PAYEE — vĂ©rifiable dans Prisma Studio ou directement dans Supabase.
Vérification