72 lines
2.3 KiB
TypeScript
72 lines
2.3 KiB
TypeScript
"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<void> {
|
|
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<void> {
|
|
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<void> {
|
|
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");
|
|
}
|