"use server"; import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { slugify } from "@/lib/format"; import { requireStaff } from "@/lib/admin/guard"; import { prisma } from "@/lib/prisma"; import { formPositiveBigInt } from "@/lib/form-data"; async function uniqueSlug(title: string): Promise { const base = slugify(title); let slug = base; let n = 2; while (await prisma.websiteArticles.findUnique({ where: { slug }, select: { id: true } })) { slug = `${base}-${n++}`; } return slug; } export async function createArticle(formData: FormData): Promise { const staff = await requireStaff(); const title = String(formData.get("title") ?? "").trim(); const shortStory = String(formData.get("shortStory") ?? "").trim(); const fullStory = String(formData.get("fullStory") ?? "").trim(); const image = String(formData.get("image") ?? "").trim(); if (!title) return; try { const now = new Date(); await prisma.websiteArticles.create({ data: { slug: await uniqueSlug(title), title: title.slice(0, 255), shortStory: shortStory.slice(0, 255), fullStory, image: image.slice(0, 255), userId: staff.id, createdAt: now, updatedAt: now, }, }); } catch { // Database error — re-render unchanged with error. redirect("/admin/articles/new?error=Database error while creating article. Please try again."); } redirect("/admin/articles"); } export async function updateArticle(formData: FormData): Promise { await requireStaff(); const id = BigInt(String(formData.get("id"))); try { await prisma.websiteArticles.update({ where: { id }, data: { title: String(formData.get("title") ?? "").trim().slice(0, 255), shortStory: String(formData.get("shortStory") ?? "").trim().slice(0, 255), fullStory: String(formData.get("fullStory") ?? "").trim(), image: String(formData.get("image") ?? "").trim().slice(0, 255), updatedAt: new Date(), }, }); } catch { redirect("/admin/articles?error=Update failed"); } revalidatePath(`/admin/articles/${id}`); redirect("/admin/articles"); } export async function deleteArticle(formData: FormData): Promise { await requireStaff(); const id = BigInt(String(formData.get("id"))); try { await prisma.$transaction([ prisma.websiteArticleReactions.deleteMany({ where: { articleId: id } }), prisma.websiteArticleComments.deleteMany({ where: { articleId: id } }), prisma.websiteArticles.delete({ where: { id } }), ]); } catch { redirect("/admin/articles?error=Delete failed"); } redirect("/admin/articles"); }