37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { emailService } from "@/lib/email/send";
|
|
import { runCron } from "@/lib/cron-runner";
|
|
|
|
export const runtime = "nodejs";
|
|
export const dynamic = "force-dynamic";
|
|
|
|
/**
|
|
* Cron — proses retry queue email (jobs status PENDING/FAILED dengan
|
|
* attempts<5 dan scheduledAt sudah lewat).
|
|
*
|
|
* Trigger setiap 5 menit via system crontab — lihat docs/CRON_SETUP.md.
|
|
* Header wajib: `Authorization: Bearer ${CRON_SECRET}`.
|
|
*/
|
|
export async function GET(req: NextRequest) {
|
|
const secret = process.env.CRON_SECRET;
|
|
if (!secret) {
|
|
return NextResponse.json(
|
|
{ error: "Server misconfigured (CRON_SECRET)" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
const authHeader = req.headers.get("authorization");
|
|
if (authHeader !== `Bearer ${secret}`) {
|
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
const outcome = await runCron("process-email-jobs", async () => {
|
|
return emailService.processQueue(50);
|
|
});
|
|
|
|
if (!outcome.ok) {
|
|
return NextResponse.json({ error: outcome.error }, { status: 500 });
|
|
}
|
|
return NextResponse.json({ ok: true, ...outcome.payload });
|
|
}
|