Files
portfolio/app/api/projects/[id]/translation/route.ts
2026-01-12 14:36:10 +00:00

72 lines
2.1 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireSessionAuth } from "@/lib/auth";
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> },
) {
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 { id: idParam } = await params;
const id = parseInt(idParam, 10);
if (!Number.isFinite(id)) return NextResponse.json({ error: "Invalid project id" }, { status: 400 });
const { searchParams } = new URL(request.url);
const locale = searchParams.get("locale") || "en";
const translation = await prisma.projectTranslation.findFirst({
where: { projectId: id, locale },
});
return NextResponse.json({ translation });
}
export async function PUT(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> },
) {
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 { id: idParam } = await params;
const id = parseInt(idParam, 10);
if (!Number.isFinite(id)) return NextResponse.json({ error: "Invalid project id" }, { status: 400 });
const body = (await request.json()) as {
locale?: string;
title?: string;
description?: string;
};
const locale = body.locale || "en";
const title = body.title?.trim();
const description = body.description?.trim();
if (!title || !description) {
return NextResponse.json({ error: "title and description are required" }, { status: 400 });
}
const saved = await prisma.projectTranslation.upsert({
where: { projectId_locale: { projectId: id, locale } },
create: {
projectId: id,
locale,
title,
description,
},
update: {
title,
description,
},
});
return NextResponse.json({ translation: saved });
}