56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { requireSessionAuth } from "@/lib/auth";
|
|
import { upsertContentByKey } from "@/lib/content";
|
|
|
|
export async function GET(request: NextRequest) {
|
|
const isAdminRequest = request.headers.get("x-admin-request") === "true";
|
|
if (!isAdminRequest) return NextResponse.json({ error: "Admin access required" }, { status: 403 });
|
|
const authError = requireSessionAuth(request);
|
|
if (authError) return authError;
|
|
|
|
const pages = await prisma.contentPage.findMany({
|
|
orderBy: { key: "asc" },
|
|
include: {
|
|
translations: {
|
|
select: { locale: true, updatedAt: true, title: true, slug: true },
|
|
},
|
|
},
|
|
});
|
|
|
|
return NextResponse.json({ pages });
|
|
}
|
|
|
|
export async function POST(request: NextRequest) {
|
|
const isAdminRequest = request.headers.get("x-admin-request") === "true";
|
|
if (!isAdminRequest) return NextResponse.json({ error: "Admin access required" }, { status: 403 });
|
|
const authError = requireSessionAuth(request);
|
|
if (authError) return authError;
|
|
|
|
const body = await request.json();
|
|
const { key, locale, title, slug, content, metaDescription, keywords } = body as Record<string, unknown>;
|
|
|
|
if (!key || typeof key !== "string") {
|
|
return NextResponse.json({ error: "key is required" }, { status: 400 });
|
|
}
|
|
if (!locale || typeof locale !== "string") {
|
|
return NextResponse.json({ error: "locale is required" }, { status: 400 });
|
|
}
|
|
if (!content || typeof content !== "object") {
|
|
return NextResponse.json({ error: "content (JSON) is required" }, { status: 400 });
|
|
}
|
|
|
|
const saved = await upsertContentByKey({
|
|
key,
|
|
locale,
|
|
title: typeof title === "string" ? title : null,
|
|
slug: typeof slug === "string" ? slug : null,
|
|
content,
|
|
metaDescription: typeof metaDescription === "string" ? metaDescription : null,
|
|
keywords: typeof keywords === "string" ? keywords : null,
|
|
});
|
|
|
|
return NextResponse.json({ saved });
|
|
}
|
|
|