FileAttente
SaaS de gestion de liste d'attente. 7 Ă©tapes, dans l'ordre. Tu exĂ©cutes chaque action toi-mĂȘme, dans ton terminal.
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.
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.
-
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 : tapepnpm -v. Un numĂ©ro de version s'affiche (ex.9.12.0) â sinon l'installation a Ă©chouĂ©. -
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 : tapels. Tu dois voir apparaĂźtreapp/,package.json,tailwind.config.tsâ la commande a rempli ton dossier de fichiers. -
Initialise shadcn/ui
pnpm dlx shadcn@latest init
Ăa crĂ©ecomponents.jsonetlib/utils.ts, et prĂ©pare Tailwind pour recevoir des composants shadcn/ui prĂȘts Ă copier.đ Comment voir le rĂ©sultat : tapels components.json lib/utils.tsâ les deux fichiers doivent exister, sans message d'erreur « No such file ». -
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 : tapels libâ les dossiersauth,db,validationsdoivent apparaĂźtre. -
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 : tapegit log --onelineâ une ligne avec ton message de commit doit s'afficher. -
Lance le serveur et vérifie
pnpm dev
Ouvrehttp://localhost:3000. Si tu as une erreur 500 mentionnant un module introuvable (ex.Can't resolve 'xxx') alors qu'il est bien danspackage.json: supprimenode_modules,pnpm-lock.yamlet.next, relancepnpm installpuispnpm dev. C'est presque toujours une installation incomplĂšte, pas un bug de code.đ Comment voir le rĂ©sultat : dans ton navigateur, ouvrelocalhost:3000. Tu dois voir la page d'accueil par dĂ©faut de Next.js. Le terminal afficheReadyet n'affiche pas d'erreur rouge.
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.
-
CrĂ©e un projet sur SupabaseVa 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).
-
RĂ©cupĂšre l'URL de connexionDans le projet Supabase : Project Settings â Database â Connection string, mode URI. Copie l'URL complĂšte (mot de passe inclus).
-
Installe Prisma
pnpm add prisma --save-dev pnpm add @prisma/client pnpm dlx prisma init
CrĂ©eprisma/schema.prismaet un fichier.envavec une variableDATABASE_URLvide.đ Comment voir le rĂ©sultat : tapels prisma/schema.prismaâ le fichier doit exister. -
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.gitignorepar dĂ©faut) â il contient un mot de passe. -
Ăcris le schĂ©maDans
prisma/schema.prisma, sous les blocsgenerator/datasourcedé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()) } -
Applique la migration et vérifie
pnpm dlx prisma migrate dev --name init pnpm dlx prisma studio
migrate devcrĂ©e les tables et gĂ©nĂšre le client Prisma typĂ©.studioouvre une interface web locale pour voir/Ă©diter les donnĂ©es Ă la main.đ Comment voir le rĂ©sultat :prisma studioouvrelocalhost:5555â les tablesQueueetEntrydoivent apparaĂźtre dans la liste de gauche.
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.
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).
-
Installe Better Auth
pnpm add better-auth
đ Comment voir le rĂ©sultat :better-authapparaĂźt danspackage.json. -
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 aussilib/db/client.tsqui exporte une instance unique dePrismaClientâ Ă©vite d'en recrĂ©er une Ă chaque appel. -
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ĂšlesUser,Session,Accountdansschema.prisma.đ Comment voir le rĂ©sultat : ouvreprisma studioâ les tablesUser,Session,Accountdoivent apparaĂźtre. -
Ajoute le secret dans
.env# .env BETTER_AUTH_SECRET="génÚre une chaßne aléatoire longue" BETTER_AUTH_URL="http://localhost:3000"
-
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 : relancepnpm devet ouvre un endpoint Better Auth (ex.localhost:3000/api/auth/ok) â tu dois obtenir une rĂ©ponse JSON, pas une erreur 404. -
Crée le client auth et les pagesUn fichier
lib/auth/client.tsaveccreateAuthClient(), puis des pages/signupet/loginqui appellentauthClient.signUp.email(...)etauthClient.signIn.email(...).đ Comment voir le rĂ©sultat : crĂ©e un compte test surlocalhost:3000/signup, puis vĂ©rifie dans Prisma Studio qu'une ligne apparaĂźt dans la tableUser. -
ProtĂšge
/dashboardUnmiddleware.tsĂ la racine qui vĂ©rifie la session sur les routes/dashboard/*et redirige vers/loginsi absente.đ Comment voir le rĂ©sultat : en navigation privĂ©e (non connectĂ©), va surlocalhost:3000/dashboardâ tu dois ĂȘtre redirigĂ© vers/login.
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.
CRUD Files d'attente
Créer, lister et supprimer une file depuis /dashboard.
Prérequis : étape 3 validée (session utilisateur disponible).
-
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.tsxdoivent apparaĂźtre. -
Ă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Ă©rificationownerId === session.user.idcĂŽtĂ© serveur est obligatoire â sans elle, n'importe quel utilisateur connectĂ© pourrait supprimer les files d'un autre. -
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), }); -
Construis la page
/dashboardListe les files du propriĂ©taire connectĂ© viaprisma.queue.findMany({ where: { ownerId } }), un formulaire pour en crĂ©er une nouvelle, un bouton supprimer par ligne.đ Comment voir le rĂ©sultat : connectĂ© surlocalhost: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 (tableQueue).
CRUD Entrées
Ajouter une personne Ă une file, la marquer servie ou la retirer.
Prérequis : étape 4 validée.
-
Crée la page de détail
// app/dashboard/queues/[id]/page.tsxRĂ©cupĂšre laQueueet sesentriesviaprisma.queue.findUnique({ where: { id }, include: { entries: true } })â vĂ©rifie quequeue.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. -
Ăcris les actions
addEntry(queueId, formData)â crĂ©e uneEntryavecstatus: "WAITING".markServed(id)etremoveEntry(id)â vĂ©rifient que la file appartient bien Ă l'utilisateur avant d'agir. -
Affiche la liste des entréesTrie par
createdAtcroissant (premier arrivĂ©, premier affichĂ©). Un badge de couleur selon lestatus.đ 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.
Tests â Vitest & Playwright
Automatiser la vérification du parcours critique.
Prérequis : étapes 4 et 5 validées.
-
Installe et configure Vitest
pnpm add -D vitest
Ăcris un test danstests/queue.validation.test.tsqui vĂ©rifie quecreateQueueSchemarejette un nom vide et accepte un nom valide. -
Installe et configure Playwright
pnpm create playwright
RĂ©pond aux questions de l'installateur (TypeScript, dossiertests-e2e). Ăcris un test qui : crĂ©e un compte â se connecte â crĂ©e une file â ajoute une entrĂ©e â la marque servie. -
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.
DĂ©ploiement â Vercel
Une URL publique et fonctionnelle.
Prérequis : étape 6 validée.
-
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. -
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. -
Importe le projet sur VercelSur 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.
-
Renseigne les variables d'environnementCopie
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. -
DĂ©ploie et vĂ©rifie en ligneOuvre 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).