Dieselben Endpunkte bedienen Skripte und das eigene Frontend: erst wird ein Bearer-Token geprüft, sonst das Sitzungscookie. Sichtungsaktionen geben immer watchIds zurück — damit lässt sich genau diese Aktion über DELETE zurücknehmen, ohne raten zu müssen, was dazugehörte. Die OpenAPI-Beschreibung ist handgeschrieben statt aus Zod erzeugt: die Schnittstelle ist überschaubar, und ein Generator brächte eine weitere Abhängigkeit für einen Nutzen, den ein Dutzend Zeilen JSON auch hergeben.
28 lines
1.0 KiB
TypeScript
28 lines
1.0 KiB
TypeScript
import { z } from "zod";
|
|
import { apiError, readJson, withApi } from "@/lib/api";
|
|
import { addTitle, getUniverse } from "@/lib/universes";
|
|
|
|
/** GET /api/v1/universen/{id}?reihenfolge=… — Inhalt und Fortschritt. */
|
|
export const GET = withApi(async (request, user, context) => {
|
|
const { id } = await context.params;
|
|
if (!id) return apiError("Es fehlt die Kennung des Universums.", 400);
|
|
|
|
const url = new URL(request.url);
|
|
const universe = await getUniverse(user.id, id, url.searchParams.get("reihenfolge") ?? undefined);
|
|
if (!universe) return apiError("Dieses Universum gibt es nicht.", 404);
|
|
|
|
return universe;
|
|
});
|
|
|
|
const addSchema = z.object({ titleId: z.string().min(1) });
|
|
|
|
/** POST /api/v1/universen/{id} — Titel aufnehmen. */
|
|
export const POST = withApi(async (request, user, context) => {
|
|
const { id } = await context.params;
|
|
if (!id) return apiError("Es fehlt die Kennung des Universums.", 400);
|
|
|
|
const body = await readJson(request, addSchema);
|
|
await addTitle(user.id, id, body.titleId);
|
|
return { ok: true };
|
|
});
|