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.
30 lines
861 B
TypeScript
30 lines
861 B
TypeScript
import { withApi } from "@/lib/api";
|
|
import { getUpcomingEpisodes } from "@/lib/stats";
|
|
|
|
/**
|
|
* GET /api/v1/kalender?von=2026-09-01&bis=2026-09-30
|
|
*
|
|
* Kommende Episoden der getrackten Serien. Ohne Angabe: die nächsten 30 Tage.
|
|
*/
|
|
export const GET = withApi(async (request, user) => {
|
|
const url = new URL(request.url);
|
|
|
|
const parse = (value: string | null, fallback: Date) => {
|
|
if (!value) return fallback;
|
|
const date = new Date(value);
|
|
return Number.isNaN(date.getTime()) ? fallback : date;
|
|
};
|
|
|
|
const from = parse(url.searchParams.get("von"), new Date());
|
|
const to = parse(url.searchParams.get("bis"), new Date(Date.now() + 30 * 86_400_000));
|
|
|
|
const episodes = await getUpcomingEpisodes(user.id, from, to);
|
|
|
|
return {
|
|
from: from.toISOString(),
|
|
to: to.toISOString(),
|
|
total: episodes.length,
|
|
items: episodes,
|
|
};
|
|
});
|