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

FileAttente

SaaS de gestion de liste d'attente. 7 Ă©tapes, dans l'ordre. Tu exĂ©cutes chaque action toi-mĂȘme, dans ton terminal.

Sommaire
01Initialiser le projet Next.js
02Base de donnĂ©es — Prisma + Supabase
03Authentification — Better Auth
04CRUD Files d'attente
05CRUD Entrées
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 forment un template valable pour n'importe quel futur SaaS de ta stack. Les Ă©tapes spĂ©cifique sont propres au modĂšle de donnĂ©es de FileAttente (Queue/Entry) — Ă  chaque nouveau projet, seule cette partie change vraiment.
📖 C'est quoi chaque techno (Next.js, 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 deux tables (Queue, Entry) 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 Queue {
      id        String   @id @default(cuid())
      name      String
      ownerId   String
      createdAt DateTime @default(now())
      entries   Entry[]
    }
    
    model Entry {
      id        String   @id @default(cuid())
      queueId   String
      queue     Queue    @relation(fields: [queueId], references: [id])
      name      String
      note      String?
      status    String   @default("WAITING")
      createdAt DateTime @default(now())
    }
  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 Queue et Entry 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

S'inscrire, se connecter, et protéger /dashboard des visiteurs non connectés.

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 FileAttente

CRUD Files d'attente

Créer, lister et supprimer une file depuis /dashboard.

Prérequis : étape 3 validée (session utilisateur disponible).

  1. Ajoute des composants shadcn/ui
    pnpm dlx shadcn@latest add button input card
    👁 Comment voir le rĂ©sultat : ls components/ui — button.tsx, input.tsx, card.tsx doivent apparaĂźtre.
  2. Écris les Server Actions
    // app/dashboard/actions.ts
    "use server";
    // createQueue(formData): valide le nom avec Zod,
    // récupÚre la session, crée la Queue avec ownerId = session.user.id
    // deleteQueue(id): vérifie que ownerId === session.user.id avant de supprimer
    La vĂ©rification ownerId === session.user.id cĂŽtĂ© serveur est obligatoire — sans elle, n'importe quel utilisateur connectĂ© pourrait supprimer les files d'un autre.
  3. Valide les entrées avec Zod
    // lib/validations/queue.ts
    import { z } from "zod";
    export const createQueueSchema = z.object({
      name: z.string().min(1).max(80),
    });
  4. Construis la page /dashboard
    Liste les files du propriétaire connecté via prisma.queue.findMany({ where: { ownerId } }), un formulaire pour en créer une nouvelle, un bouton supprimer par ligne.
    👁 Comment voir le rĂ©sultat : connectĂ© sur localhost:3000/dashboard, crĂ©e une file test via le formulaire — elle doit apparaĂźtre immĂ©diatement dans la liste, et une nouvelle ligne doit exister dans Prisma Studio (table Queue).
Vérification
05
Spécifique FileAttente

CRUD Entrées

Ajouter une personne Ă  une file, la marquer servie ou la retirer.

Prérequis : étape 4 validée.

  1. Crée la page de détail
    // app/dashboard/queues/[id]/page.tsx
    RĂ©cupĂšre la Queue et ses entries via prisma.queue.findUnique({ where: { id }, include: { entries: true } }) — vĂ©rifie que queue.ownerId === session.user.id, sinon renvoie une 404.
    👁 Comment voir le rĂ©sultat : clique sur une de tes files depuis /dashboard — tu dois arriver sur une page dĂ©diĂ©e avec son nom affichĂ©, sans erreur.
  2. Écris les actions
    addEntry(queueId, formData) — crĂ©e une Entry avec status: "WAITING". markServed(id) et removeEntry(id) — vĂ©rifient que la file appartient bien Ă  l'utilisateur avant d'agir.
  3. Affiche la liste des entrées
    Trie par createdAt croissant (premier arrivé, premier affiché). Un badge de couleur selon le status.
    👁 Comment voir le rĂ©sultat : ajoute 2-3 entrĂ©es test via le formulaire — elles doivent apparaĂźtre dans l'ordre d'ajout, avec un badge « en attente ». Clique sur « marquer servi » : le badge doit changer sans recharger la page.
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/queue.validation.test.ts qui vĂ©rifie que createQueueSchema rejette un nom vide et accepte un nom valide.
  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 → se connecte → crĂ©e une file → ajoute une entrĂ©e → la marque servie.
  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 ouvrir un rapport HTML (pnpm exec playwright show-report) qui rejoue 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 (mets l'URL Vercel finale) dans Settings → Environment Variables.
    👁 Comment voir le rĂ©sultat : pas d'effet visible immĂ©diatement — redĂ©ploie (« Redeploy ») puis teste Ă  l'Ă©tape suivante.
  5. Déploie et vérifie en ligne
    Ouvre l'URL fournie par Vercel, refais le parcours critique Ă  la main : inscription → crĂ©er une file → ajouter une entrĂ©e → marquer servie.
    👁 Comment voir le rĂ©sultat : sur l'URL *.vercel.app, le parcours complet doit fonctionner exactement comme en local — crĂ©ation de compte, file, entrĂ©e, tout doit persister en base (vĂ©rifiable dans Supabase).
Vérification