mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-23 15:08:12 +02:00
feat: implement server-side data loader for product grid rows with caching and aggregation logic
This commit is contained in:
1 parent
7e4b370267
commit
557e3ed8e0
1 file changed
+4
-22
@@ -16,7 +16,6 @@ import {
|
|||||||
import { db } from "@/db";
|
import { db } from "@/db";
|
||||||
import { sessionSnapshots } from "@/db/schema";
|
import { sessionSnapshots } from "@/db/schema";
|
||||||
import { eq, desc } from "drizzle-orm";
|
import { eq, desc } from "drizzle-orm";
|
||||||
import { unstable_cache } from "next/cache";
|
|
||||||
|
|
||||||
// ─── Tag de cache par fournisseur ─────────────────────────────────────────────
|
// ─── Tag de cache par fournisseur ─────────────────────────────────────────────
|
||||||
// Permet d'invalider précisément le cache d'un seul fournisseur lors d'une sauvegarde.
|
// Permet d'invalider précisément le cache d'un seul fournisseur lors d'une sauvegarde.
|
||||||
@@ -315,31 +314,14 @@ async function _fetchAllProductRows(codeFournisseur: string): Promise<ProductRow
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Fonction publique (Option B : cache pur, pas de pagination) ─────────────
|
// ─── Fonction publique ─────────────
|
||||||
/**
|
/**
|
||||||
* Point d'entrée unique pour la grille.
|
* Point d'entrée unique pour la grille.
|
||||||
* - Met en cache le résultat complet par fournisseur (5 min, tag invalidable)
|
|
||||||
* - Retourne toutes les lignes (filtrage/tri restent côté client)
|
* - Retourne toutes les lignes (filtrage/tri restent côté client)
|
||||||
*
|
|
||||||
* La première requête pour un fournisseur donné est lente (6 SQL + agrégation).
|
|
||||||
* Toutes les requêtes suivantes dans la fenêtre de 5 min sont instantanées.
|
|
||||||
*/
|
*/
|
||||||
export async function getProductRows(input: GetProductRowsInput): Promise<ProductRow[]> {
|
export async function getProductRows(input: GetProductRowsInput): Promise<ProductRow[]> {
|
||||||
const { codeFournisseur } = input;
|
const { codeFournisseur } = input;
|
||||||
|
|
||||||
// Créer dynamiquement la fonction cachée avec le tag spécifique au fournisseur.
|
// Appel direct sans l'enveloppe dynamique de unstable_cache qui cause un freeze/timeout
|
||||||
// unstable_cache mémoïse par le tableau de clés [`grid-rows-${codeFournisseur}`].
|
return _fetchAllProductRows(codeFournisseur);
|
||||||
const cachedFn = unstable_cache(
|
|
||||||
async () => _fetchAllProductRows(codeFournisseur),
|
|
||||||
[`grid-rows-${codeFournisseur}`],
|
|
||||||
{ revalidate: 300, tags: [`grid-rows-${codeFournisseur}`] }
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
|
||||||
return await cachedFn();
|
|
||||||
} catch (e) {
|
|
||||||
console.error(`[getProductRows] Cache error for ${codeFournisseur}:`, e);
|
|
||||||
// Fallback sans cache si unstable_cache échoue
|
|
||||||
return _fetchAllProductRows(codeFournisseur);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user