feat: REST-API unter /api/v1 mit OpenAPI-Beschreibung

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.
This commit is contained in:
Florian Wilde
2026-09-01 20:24:48 +02:00
parent b25f0473fd
commit bb63827bf7
12 changed files with 847 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
import { z } from "zod";
import { readJson, withApi } from "@/lib/api";
import { createUniverse, listUniverses } from "@/lib/universes";
/** GET /api/v1/universen — eigene und geteilte Universen. */
export const GET = withApi(async (_request, user) => {
const universes = await listUniverses(user.id);
return { total: universes.length, items: universes };
});
const createSchema = z.object({
name: z.string().trim().min(1).max(120),
description: z.string().max(2000).optional(),
});
/** POST /api/v1/universen — neues Universum anlegen. */
export const POST = withApi(async (request, user) => {
const body = await readJson(request, createSchema);
const universe = await createUniverse(user.id, body.name, body.description);
return { id: universe.id, name: universe.name, slug: universe.slug };
});