"use server"; import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { requireStaff } from "@/lib/admin/guard"; import { prisma } from "@/lib/prisma"; import { logStaffActivity } from "@/lib/services/staff-activity"; import { formPositiveBigInt } from "@/lib/form-data"; // CRUD for help-center FAQ entries (website_help_center_categories). Each entry // is a titled content block with an optional image and call-to-action button. function parsePosition(value: FormDataEntryValue | null): number { const n = Number(value); return Number.isFinite(n) && n > 0 ? Math.floor(n) : 1; } export async function createHelpQuestion(formData: FormData): Promise { const staff = await requireStaff(); const name = String(formData.get("name") ?? "") .trim() .slice(0, 255); const content = String(formData.get("content") ?? "").trim(); if (!name || !content) return; const imageUrl = String(formData.get("imageUrl") ?? "") .trim() .slice(0, 255); const buttonText = String(formData.get("buttonText") ?? "") .trim() .slice(0, 255); const buttonUrl = String(formData.get("buttonUrl") ?? "") .trim() .slice(0, 255); const buttonColor = String(formData.get("buttonColor") ?? "") .trim() .slice(0, 16) || "#eeb425"; const buttonBorderColor = String(formData.get("buttonBorderColor") ?? "") .trim() .slice(0, 16) || "#facc15"; try { const entry = await prisma.websiteHelpCenterCategories.create({ data: { name, content, position: parsePosition(formData.get("position")), imageUrl: imageUrl || null, buttonText: buttonText || null, buttonUrl: buttonUrl || null, buttonColor, buttonBorderColor, smallBox: formData.get("smallBox") != null, }, }); await logStaffActivity({ staffId: staff.id, action: "help_create", description: `Created help-center entry #${entry.id} (${name})`, targetType: "help_center_category", targetId: Number(entry.id), }); } catch { // Unique name collision or DB error — re-render unchanged with error. revalidatePath("/admin/help-questions"); redirect("/admin/help-questions/new?error=Unique name collision or database error. Please try again."); } revalidatePath("/admin/help-questions"); redirect("/admin/help-questions"); } export async function updateHelpQuestion(formData: FormData): Promise { const staff = await requireStaff(); const id = formPositiveBigInt(formData, "id"); if (!id) return; const name = String(formData.get("name") ?? "") .trim() .slice(0, 255); const content = String(formData.get("content") ?? "").trim(); if (!name || !content) return; const imageUrl = String(formData.get("imageUrl") ?? "") .trim() .slice(0, 255); const buttonText = String(formData.get("buttonText") ?? "") .trim() .slice(0, 255); const buttonUrl = String(formData.get("buttonUrl") ?? "") .trim() .slice(0, 255); const buttonColor = String(formData.get("buttonColor") ?? "") .trim() .slice(0, 16) || "#eeb425"; const buttonBorderColor = String(formData.get("buttonBorderColor") ?? "") .trim() .slice(0, 16) || "#facc15"; try { await prisma.websiteHelpCenterCategories.update({ where: { id }, data: { name, content, position: parsePosition(formData.get("position")), imageUrl: imageUrl || null, buttonText: buttonText || null, buttonUrl: buttonUrl || null, buttonColor, buttonBorderColor, smallBox: formData.get("smallBox") != null, }, }); await logStaffActivity({ staffId: staff.id, action: "help_update", description: `Updated help-center entry #${id} (${name})`, targetType: "help_center_category", targetId: Number(id), }); } catch { // Not found, unique collision, or DB error — ignore. revalidatePath(`/admin/help-questions/${id}`); return; } redirect("/admin/help-questions"); } export async function deleteHelpQuestion(formData: FormData): Promise { const staff = await requireStaff(); const id = formPositiveBigInt(formData, "id"); if (!id) return; try { await prisma.websiteHelpCenterCategories.delete({ where: { id } }); await logStaffActivity({ staffId: staff.id, action: "help_delete", description: `Deleted help-center entry #${id}`, targetType: "help_center_category", targetId: Number(id), }); } catch { // Not found or DB error — ignore. } redirect("/admin/help-questions"); }