import { NextRequest, NextResponse } from 'next/server' import { PrismaClient } from '@prisma/client' import { requireAdmin } from '@/lib/require-admin' import { SITE_MEDIA, SITE_PAGES, isSafeMediaUrl } from '@/lib/site-pages' import { readSitePages } from '@/lib/site-pages.server' // Prisma client instance const prisma = new PrismaClient() // GET /api/site-pages - liefert die Inhalte der rechtlichen Seiten export async function GET() { try { return NextResponse.json(await readSitePages()) } catch (error) { console.error('Error fetching site pages:', error) return NextResponse.json( { error: 'Fehler beim Abrufen der Seiteninhalte' }, { status: 500 } ) } } // PUT /api/site-pages - speichert die Inhalte der rechtlichen Seiten (Admin) export async function PUT(request: NextRequest) { try { const denied = await requireAdmin() if (denied) return denied const data = await request.json() // Nur die bekannten Seiten übernehmen, jeweils getrimmt. Ein leerer Text // ist zulässig und bedeutet: Seite nicht veröffentlichen. const values = Object.fromEntries( [...SITE_PAGES, ...SITE_MEDIA].map((key) => [ key, String(data[key] ?? '').trim(), ]) ) // Medienadressen landen in einem src-Attribut. Nur eigener Server oder // https – alles andere wird abgewiesen, statt still gespeichert zu werden. const ungueltig = SITE_MEDIA.filter((key) => !isSafeMediaUrl(values[key])) if (ungueltig.length > 0) { return NextResponse.json( { error: 'Ungültige Adresse', details: ungueltig.map( (key) => `${key}: nur eine Adresse auf diesem Server (beginnt mit /) oder https ist zulässig` ), }, { status: 400 } ) } const saved = await prisma.sitePages.upsert({ where: { id: 1 }, update: values, create: { id: 1, ...values }, }) return NextResponse.json(saved) } catch (error) { console.error('Error updating site pages:', error) return NextResponse.json( { error: 'Fehler beim Speichern der Seiteninhalte' }, { status: 500 } ) } }