Admins legen eigene Profile als YAML an; geprüft wird beim Tippen gegen dasselbe Schema wie der Katalog, dazu eine Vorschau des erzeugten Skripts. Katalogprofile bleiben schreibgeschützt und lassen sich als Kopie bearbeiten. Ein Profil, das ein anderes voraussetzt, lässt sich nicht löschen. Closes #011 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 lines
1.4 KiB
TypeScript
32 lines
1.4 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { aufruferAdresse } from "@/lib/adressen";
|
|
import { z } from "@/lib/validierung";
|
|
import { api, jsonLesen } from "@/server/api";
|
|
import { rechtErforderlich } from "@/server/auth/zugang";
|
|
import { profilAktivSetzen, profilLoeschen, profilSpeichern } from "@/server/services/katalog";
|
|
|
|
type Kontext = { params: Promise<{ id: string }> };
|
|
|
|
export const PATCH = api(async (anfrage: Request, { params }: Kontext) => {
|
|
const aufrufer = await rechtErforderlich(anfrage, "katalogVerwalten");
|
|
const { aktiv } = z.object({ aktiv: z.boolean() }).parse(await jsonLesen(anfrage));
|
|
await profilAktivSetzen((await params).id, aktiv, aufrufer, aufruferAdresse(anfrage.headers));
|
|
return NextResponse.json({ ok: true });
|
|
});
|
|
|
|
export const PUT = api(async (anfrage: Request, { params }: Kontext) => {
|
|
const aufrufer = await rechtErforderlich(anfrage, "katalogVerwalten");
|
|
const { quelltext } = z
|
|
.object({ quelltext: z.string().min(1).max(200_000) })
|
|
.parse(await jsonLesen(anfrage));
|
|
return NextResponse.json(
|
|
await profilSpeichern(quelltext, aufrufer, aufruferAdresse(anfrage.headers), (await params).id),
|
|
);
|
|
});
|
|
|
|
export const DELETE = api(async (anfrage: Request, { params }: Kontext) => {
|
|
const aufrufer = await rechtErforderlich(anfrage, "katalogVerwalten");
|
|
await profilLoeschen((await params).id, aufrufer, aufruferAdresse(anfrage.headers));
|
|
return new NextResponse(null, { status: 204 });
|
|
});
|