"use server"; import { revalidatePath } from "next/cache"; import { systemMutationService } from "@/features/housekeeping/domains/system/services/mutations"; import { createHousekeepingCapabilityContext } from "@/features/housekeeping/foundation/capability-context"; import { createCorrelationId } from "@/features/housekeeping/foundation/correlation"; import { requirePermission } from "@/lib/admin/guard"; import { PERMS } from "@/lib/permissions"; // 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. function mutationContext(staff: { id: number; rank: number; username: string; }) { const matches = (slug: string) => slug === PERMS.SETTINGS_EDIT; return { capability: createHousekeepingCapabilityContext(staff, { isSuperAdmin: false, has: matches, hasAny: (...slugs: string[]) => slugs.some(matches), hasAll: (...slugs: string[]) => slugs.every(matches), }), correlationId: createCorrelationId(), }; } async function requireMutation( staff: { id: number; rank: number; username: string }, operation: | "configuration.emulator-setting.update" | "configuration.emulator-text.update", input: { key: string; value: string }, ): Promise { const result = await systemMutationService.execute( mutationContext(staff), operation, input, ); if (!result.ok) throw new Error(result.error.messageKey); } export async function updateEmulatorSetting(formData: FormData): Promise { const staff = 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 requireMutation(staff, "configuration.emulator-setting.update", { key, value, }); revalidatePath("/admin/emulator"); } export async function updateEmulatorText(formData: FormData): Promise { const staff = 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 requireMutation(staff, "configuration.emulator-text.update", { key, value, }); revalidatePath("/admin/emulator"); }