Aller au contenu principal

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 :

  1. Lit la session JWT via auth() (NextAuth v5)
  2. Lève "Non authentifié" si pas de session valide
  3. Retourne le userId pour 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

ModuleFichier
Comptes & snapshotssrc/app/actions/accounts.ts
Budgetsrc/app/actions/budget.ts
Analyticssrc/app/actions/analytics.ts
Import CSVsrc/app/actions/import.ts
Dashboardsrc/app/actions/dashboard.ts
Paramètressrc/app/actions/settings.ts

Voir aussi