From ebd85732994da55858e5472a3ffafd2a71905363 Mon Sep 17 00:00:00 2001 From: Froidefond Julien Date: Wed, 25 Feb 2026 13:31:08 +0100 Subject: [PATCH] perf: suppression des $queryRaw redondants et cache sur getTemplates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getEvaluation/getTemplates: retire les $queryRaw qui dupliquaient les données déjà chargées via Prisma include (2 requêtes DB → 1) - getTemplates: wrappé avec cache() React pour dédupliquer les appels dans le même render tree - Supprime l'import Prisma devenu inutile Co-Authored-By: Claude Sonnet 4.6 --- src/lib/server-data.ts | 48 ++++-------------------------------------- 1 file changed, 4 insertions(+), 44 deletions(-) diff --git a/src/lib/server-data.ts b/src/lib/server-data.ts index 08d46e5..9097dea 100644 --- a/src/lib/server-data.ts +++ b/src/lib/server-data.ts @@ -1,4 +1,4 @@ -import { Prisma } from "@prisma/client"; +import { cache } from "react"; import { auth } from "@/auth"; import { prisma } from "@/lib/db"; import { canAccessEvaluation } from "@/lib/evaluation-access"; @@ -62,60 +62,20 @@ export async function getEvaluation(id: string) { ); if (!hasAccess) return null; - const templateId = evaluation.templateId; - const dimsRaw = evaluation.template - ? ((await prisma.$queryRaw( - Prisma.sql`SELECT id, slug, title, rubric, "orderIndex", "suggestedQuestions" FROM "TemplateDimension" WHERE "templateId" = ${templateId} ORDER BY "orderIndex" ASC` - )) as { id: string; slug: string; title: string; rubric: string; orderIndex: number; suggestedQuestions: string | null }[]) - : []; - - const dimMap = new Map(dimsRaw.map((d) => [d.id, d])); - return { ...evaluation, evaluationDate: evaluation.evaluationDate.toISOString(), - template: evaluation.template - ? { - ...evaluation.template, - dimensions: evaluation.template.dimensions.map((d) => { - const raw = dimMap.get(d.id); - return { - ...d, - suggestedQuestions: raw?.suggestedQuestions ?? d.suggestedQuestions, - }; - }), - } - : null, - dimensionScores: evaluation.dimensionScores.map((ds) => ({ - ...ds, - dimension: ds.dimension - ? { - ...ds.dimension, - suggestedQuestions: dimMap.get(ds.dimension.id)?.suggestedQuestions ?? ds.dimension.suggestedQuestions, - } - : null, - })), }; } -export async function getTemplates() { +export const getTemplates = cache(async () => { const templates = await prisma.template.findMany({ include: { dimensions: { orderBy: { orderIndex: "asc" } }, }, }); - const dimsRaw = (await prisma.$queryRaw( - Prisma.sql`SELECT id, "templateId", slug, title, rubric, "orderIndex", "suggestedQuestions" FROM "TemplateDimension" ORDER BY "templateId", "orderIndex"` - )) as { id: string; templateId: string; slug: string; title: string; rubric: string; orderIndex: number; suggestedQuestions: string | null }[]; - const dimMap = new Map(dimsRaw.map((d) => [d.id, d])); - return templates.map((t) => ({ - ...t, - dimensions: t.dimensions.map((d) => ({ - ...d, - suggestedQuestions: dimMap.get(d.id)?.suggestedQuestions ?? d.suggestedQuestions, - })), - })); -} + return templates; +}); export async function getUsers() { const session = await auth();