Vollstaendige Next.js/Prisma-E-Commerce-Anwendung fuer eine Imkerei: Shop, Warenkorb, Stripe-Checkout, Kundenkonto mit 2FA, Admin-Bereich (Produkte, Ernten, Chargen, Bestellungen, Gutscheine, admin-editierbare Website-Inhalte), i18n (DE/EN), Rate-Limiting/CSP/Audit-Log-Haertung, PostgreSQL- und MySQL-Unterstuetzung ueber austauschbare Prisma- Treiber-Adapter, Unit-/Komponenten-/E2E-Tests.
51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
import { prisma } from "@/lib/prisma";
|
|
import { CONTENT_REGISTRY, getContentFieldDef, type ContentFieldDef } from "@/lib/content-registry";
|
|
import type { Locale } from "@/i18n/config";
|
|
|
|
/**
|
|
* Liefert den aktuell wirksamen Text fuer einen Registry-Schluessel — den
|
|
* Admin-Override aus SiteContent, falls gepflegt, sonst den urspruenglichen
|
|
* Dictionary-/site-config-Text. Nie leer/undefined, solange der Schluessel in
|
|
* der Registry existiert.
|
|
*/
|
|
export async function getContentValue(key: string, locale: Locale): Promise<string> {
|
|
const def = getContentFieldDef(key);
|
|
if (!def) return "";
|
|
|
|
const row = await prisma.siteContent.findUnique({ where: { key } });
|
|
if (row) {
|
|
const value = def.localized ? (locale === "de" ? row.valueDe : (row.valueEn ?? row.valueDe)) : row.valueDe;
|
|
if (value.trim() !== "") return value;
|
|
}
|
|
return def.getDefault(locale);
|
|
}
|
|
|
|
/** Batch-Variante fuer Seiten, die mehrere Schluessel auf einmal brauchen (ein DB-Roundtrip statt vieler). */
|
|
export async function getContentValues(keys: string[], locale: Locale): Promise<Record<string, string>> {
|
|
const rows = await prisma.siteContent.findMany({ where: { key: { in: keys } } });
|
|
const rowsByKey = new Map(rows.map((r) => [r.key, r]));
|
|
|
|
const result: Record<string, string> = {};
|
|
for (const key of keys) {
|
|
const def = getContentFieldDef(key);
|
|
if (!def) {
|
|
result[key] = "";
|
|
continue;
|
|
}
|
|
const row = rowsByKey.get(key);
|
|
const overridden = row
|
|
? def.localized
|
|
? locale === "de"
|
|
? row.valueDe
|
|
: (row.valueEn ?? row.valueDe)
|
|
: row.valueDe
|
|
: "";
|
|
result[key] = overridden.trim() !== "" ? overridden : def.getDefault(locale);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
export { parseListSimple, parseListTitled, parseListNumbered, parseSections } from "@/lib/content-parsers";
|
|
export { CONTENT_REGISTRY };
|
|
export type { ContentFieldDef };
|