37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
|
|
import { SCHEDULED_TASKS, type ScheduledTaskName } from "@/lib/scheduled";
|
|
|
|
export const runtime = "nodejs";
|
|
export const dynamic = "force-dynamic";
|
|
|
|
function authorized(req: Request): boolean {
|
|
const secret = (process.env.CRON_TOKEN ?? "").trim();
|
|
if (!secret) return false;
|
|
const header = req.headers.get("authorization") ?? "";
|
|
const token = header.startsWith("Bearer ") ? header.slice(7) : "";
|
|
return token === secret;
|
|
}
|
|
|
|
export async function POST(req: Request, ctx: { params: Promise<{ task: string }> }) {
|
|
if (!authorized(req)) {
|
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
const { task } = await ctx.params;
|
|
const fn = SCHEDULED_TASKS[task as ScheduledTaskName];
|
|
if (!fn) {
|
|
return NextResponse.json(
|
|
{ error: `Unknown task. Available: ${Object.keys(SCHEDULED_TASKS).join(", ")}` },
|
|
{ status: 404 },
|
|
);
|
|
}
|
|
try {
|
|
const result = await fn();
|
|
return NextResponse.json({ ok: true, task, result });
|
|
} catch (e) {
|
|
return NextResponse.json(
|
|
{ error: e instanceof Error ? e.message : String(e) },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|