"use server"; import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { contentMutationService, createContentMutationInvocation, } from "@/features/housekeeping/domains/content/services/mutations"; import { createCorrelationId } from "@/features/housekeeping/foundation/contracts"; import { requirePermission } from "@/lib/admin/guard"; import { PERMS } from "@/lib/permissions"; function articleInput(formData: FormData) { return { title: String(formData.get("title") ?? "") .normalize("NFC") .trim(), shortStory: String(formData.get("shortStory") ?? "") .normalize("NFC") .trim(), fullStory: String(formData.get("fullStory") ?? "") .normalize("NFC") .trim(), image: String(formData.get("image") ?? "") .normalize("NFC") .trim(), slug: String(formData.get("slug") ?? "").trim(), }; } export async function createArticle(formData: FormData): Promise { const staff = await requirePermission(PERMS.NEWS_EDIT); const input = articleInput(formData); if (!input.title) return; const result = await contentMutationService.execute( createContentMutationInvocation(staff, createCorrelationId()), "article.change", { action: "create", ...input }, ); if (!result.ok) { redirect( "/admin/articles/new?error=Database error while creating article. Please try again.", ); } redirect("/admin/articles"); } export async function updateArticle(formData: FormData): Promise { const staff = await requirePermission(PERMS.NEWS_EDIT); const id = String(formData.get("id") ?? ""); const result = await contentMutationService.execute( createContentMutationInvocation(staff, createCorrelationId()), "article.change", { action: "update", id, ...articleInput(formData) }, ); if (!result.ok) redirect("/admin/articles?error=Update failed"); revalidatePath(`/admin/articles/${id}`); redirect("/admin/articles"); } export async function deleteArticle(formData: FormData): Promise { const staff = await requirePermission(PERMS.NEWS_EDIT); const id = String(formData.get("id") ?? ""); const result = await contentMutationService.execute( createContentMutationInvocation(staff, createCorrelationId()), "article.change", { action: "delete", id }, ); if (!result.ok) redirect("/admin/articles?error=Delete failed"); redirect("/admin/articles"); }