Files
MIS-Contro-Tower/lib/financial/cache.ts
2026-04-22 05:04:19 +00:00

64 lines
2.0 KiB
TypeScript

import { unstable_cache } from "next/cache";
import { prisma } from "@/lib/prisma";
import { computeFinancialImpact, type FinancialImpactParams } from "@/lib/financial/impact";
export const FINANCIAL_CONFIG_TTL_SEC = 15;
export const FINANCIAL_CONFIG_SWR_SEC = 45;
export const FINANCIAL_IMPACT_TTL_SEC = 10;
export const FINANCIAL_IMPACT_SWR_SEC = 30;
async function loadFinancialConfig(orgId: string) {
const [org, locations, machines, products] = await Promise.all([
prisma.orgFinancialProfile.findUnique({ where: { orgId } }),
prisma.locationFinancialOverride.findMany({ where: { orgId }, orderBy: { location: "asc" } }),
prisma.machineFinancialOverride.findMany({ where: { orgId }, orderBy: { createdAt: "desc" } }),
prisma.productCostOverride.findMany({ where: { orgId }, orderBy: { sku: "asc" } }),
]);
return { org, locations, machines, products };
}
export type FinancialConfigPayload = Awaited<ReturnType<typeof loadFinancialConfig>>;
export async function getFinancialConfig(orgId: string, options?: { refresh?: boolean }) {
if (options?.refresh) {
return loadFinancialConfig(orgId);
}
const cached = unstable_cache(
() => loadFinancialConfig(orgId),
["financial-config", orgId],
{ revalidate: FINANCIAL_CONFIG_TTL_SEC, tags: [`financial-config:${orgId}`] }
);
return cached();
}
export async function getFinancialImpactCached(
params: FinancialImpactParams,
options?: { refresh?: boolean }
) {
if (options?.refresh) {
return computeFinancialImpact(params);
}
const keyParts = [
"financial-impact",
params.orgId,
String(params.start.getTime()),
String(params.end.getTime()),
params.machineId ?? "",
params.location ?? "",
params.sku ?? "",
params.currency ?? "",
params.includeEvents ? "1" : "0",
];
const cached = unstable_cache(
() => computeFinancialImpact(params),
keyParts,
{ revalidate: FINANCIAL_IMPACT_TTL_SEC, tags: [`financial-impact:${params.orgId}`] }
);
return cached();
}