55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { ContentPageType } from "@prisma/client";
|
|
import { requireAdminApiUser } from "@/lib/auth/admin";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { buildAppUrl } from "@/lib/http/url";
|
|
|
|
function redirectTo(request: Request, status: string) {
|
|
return NextResponse.redirect(buildAppUrl(request, "/admin", { status }));
|
|
}
|
|
|
|
function asString(formData: FormData, key: string) {
|
|
const value = formData.get(key);
|
|
return typeof value === "string" ? value.trim() : "";
|
|
}
|
|
|
|
export async function POST(request: Request) {
|
|
const adminUser = await requireAdminApiUser();
|
|
|
|
if (!adminUser) {
|
|
return redirectTo(request, "admin_error");
|
|
}
|
|
|
|
const formData = await request.formData();
|
|
|
|
const id = asString(formData, "id");
|
|
const typeValue = asString(formData, "type");
|
|
const slug = asString(formData, "slug");
|
|
const title = asString(formData, "title");
|
|
const content = asString(formData, "content");
|
|
const sortOrder = Number.parseInt(asString(formData, "sortOrder") || "0", 10);
|
|
const isPublished = formData.get("isPublished") === "on";
|
|
|
|
if (!id || !slug || !title || !content || (typeValue !== ContentPageType.FAQ && typeValue !== ContentPageType.MANUAL)) {
|
|
return redirectTo(request, "admin_error");
|
|
}
|
|
|
|
try {
|
|
await prisma.contentPage.update({
|
|
where: { id },
|
|
data: {
|
|
type: typeValue as ContentPageType,
|
|
slug,
|
|
title,
|
|
content,
|
|
sortOrder: Number.isNaN(sortOrder) ? 0 : sortOrder,
|
|
isPublished,
|
|
},
|
|
});
|
|
|
|
return redirectTo(request, "content_updated");
|
|
} catch {
|
|
return redirectTo(request, "admin_error");
|
|
}
|
|
}
|