import { NextResponse } from "next/server"; import { env } from "@/lib/env"; import { getSessionUser } from "@/lib/auth"; import { runSync } from "@/lib/sync"; export const dynamic = "force-dynamic"; export const maxDuration = 300; /** * Abgleich von außen anstoßen. * * curl -X POST -H "Authorization: Bearer $CRON_SECRET" \ * https://flimmer.example/api/cron/sync * * Zugelassen ist entweder das Cron-Geheimnis oder eine angemeldete * Administration — Letzteres für den Knopf im Verwaltungsbereich. */ async function authorize(request: Request): Promise { const header = request.headers.get("authorization"); if (env.scheduler.cronSecret && header === `Bearer ${env.scheduler.cronSecret}`) return true; const user = await getSessionUser(); return user?.role === "ADMIN"; } export async function POST(request: Request) { if (!(await authorize(request))) { return NextResponse.json({ error: "Nicht berechtigt." }, { status: 401 }); } const stats = await runSync(); return NextResponse.json({ ok: stats.errors.length === 0, ...stats }); } /** GET erlaubt einfache Uptime-Cron-Dienste, die kein POST können. */ export async function GET(request: Request) { return POST(request); }