Server Actions — Introduction
Qu'est-ce qu'une Server Action ?
Une Server Action Next.js est une fonction TypeScript marquée "use server" qui s'exécute exclusivement côté serveur, appelable depuis un Client ou Server Component sans appel HTTP explicite. Next.js génère automatiquement un endpoint RPC interne.
"use server";
// Le reste du fichier est du code serveur pur
Pattern commun
Toutes les Server Actions de Patrimo suivent ce squelette :
"use server";
async function requireUserId(): Promise<string> {
const session = await auth();
if (!session?.user?.id) throw new Error("Non authentifié");
return session.user.id;
}
export async function monAction(params: MonType): Promise<ActionResult> {
const userId = await requireUserId(); // 1. Auth guard
const owned = await prisma.model.findFirst({ // 2. Ownership check
where: { id: params.id, userId },
});
if (!owned) return { success: false, error: "Ressource introuvable" };
// 3. Logique métier
await prisma.model.update({ ... });
revalidatePath("/route"); // 4. Revalidation cache
return { success: true };
}
Auth guard
Chaque action commence par requireUserId() qui :
- Lit la session JWT via
auth()(NextAuth v5) - Lève
"Non authentifié"si pas de session valide - Retourne le
userIdpour les requêtes Prisma suivantes
Les actions de lecture sur des pages protégées par middleware.ts peuvent supposer la session valide — mais les Server Actions vérifient toujours elles-mêmes.
Ownership check
Avant toute mutation, la ressource est rechargée avec { where: { id, userId } }. Si elle n'appartient pas à l'utilisateur courant, l'action retourne "<Ressource> introuvable" — jamais une 403 (pas de leak d'existence).
Format de retour
Mutations
type ActionResult = { success: true } | { success: false; error: string }
type UpsertResult = { success: true; id: string } | { success: false; error: string }
Lectures
Retournent directement la donnée (tableau, objet ou null). Les erreurs d'auth lèvent une exception (capturée par les error.tsx Next.js).
Revalidation
Après chaque mutation réussie, les chemins concernés sont revalidés :
revalidatePath("/accounts");
revalidatePath(`/accounts/${accountId}`);
revalidatePath("/dashboard");
Les Server Components qui lisent ces routes seront re-rendus au prochain accès.
Fichiers sources
| Module | Fichier |
|---|---|
| Comptes & snapshots | src/app/actions/accounts.ts |
| Budget | src/app/actions/budget.ts |
| Analytics | src/app/actions/analytics.ts |
| Import CSV | src/app/actions/import.ts |
| Dashboard | src/app/actions/dashboard.ts |
| Paramètres | src/app/actions/settings.ts |