Local Build and Deploy / deploy (push) Successful in 54s
Gate pages and mutations on module PERMS instead of dashboard-only staff checks, add radio view/edit slugs with migration 0015, and expand the operations contract tests. Co-authored-by: Cursor <[email protected]>
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
"use server";
|
|
|
|
import { revalidatePath } from "next/cache";
|
|
import { requirePermission } from "@/lib/admin/guard";
|
|
import { PERMS } from "@/lib/permissions";
|
|
import { prisma } from "@/lib/prisma";
|
|
|
|
// emulator_settings: PK is the string column `key`, payload is `value` (VarChar 512).
|
|
// emulator_texts: PK is the string column `key`, payload is `value` (VarChar 4096).
|
|
// Both tables are emulator-owned; we only ever read/update existing rows or add new
|
|
// keys via upsert. We never migrate or drop them.
|
|
|
|
export async function updateEmulatorSetting(formData: FormData): Promise<void> {
|
|
await requirePermission(PERMS.SETTINGS_EDIT);
|
|
const key = String(formData.get("key") ?? "")
|
|
.normalize("NFC")
|
|
.trim()
|
|
.slice(0, 100);
|
|
const value = String(formData.get("value") ?? "")
|
|
.normalize("NFC")
|
|
.slice(0, 512);
|
|
if (!key) return;
|
|
await prisma.emulatorSettings.upsert({
|
|
where: { key },
|
|
update: { value },
|
|
create: { key, value },
|
|
});
|
|
revalidatePath("/admin/emulator");
|
|
}
|
|
|
|
export async function updateEmulatorText(formData: FormData): Promise<void> {
|
|
await requirePermission(PERMS.SETTINGS_EDIT);
|
|
const key = String(formData.get("key") ?? "")
|
|
.normalize("NFC")
|
|
.trim()
|
|
.slice(0, 100);
|
|
const value = String(formData.get("value") ?? "")
|
|
.normalize("NFC")
|
|
.slice(0, 4096);
|
|
if (!key) return;
|
|
await prisma.emulatorTexts.upsert({
|
|
where: { key },
|
|
update: { value },
|
|
create: { key, value },
|
|
});
|
|
revalidatePath("/admin/emulator");
|
|
}
|