Repository Public
1import { NextResponse } from "next/server";2import { sql } from "@/lib/db";3import { mailConfigured } from "@/lib/env";45/** Liveness for the dispatcher and monitoring: database reachable, worker heartbeat age. No personal data. */6export async function GET() {7 try {8 const [hb] = await sql<{ age: number | null }[]>`SELECT (SELECT extract(epoch FROM now() - beat_at)::int FROM worker_heartbeat WHERE name = 'worker') AS age`;9 const workerOk = hb.age !== null && hb.age < 120;10 return NextResponse.json({ ok: true, db: true, worker: { ok: workerOk, ageSec: hb.age }, mail: { configured: mailConfigured().ok } }, { headers: { "Cache-Control": "no-store" } });11 } catch {12 return NextResponse.json({ ok: false, db: false }, { status: 503, headers: { "Cache-Control": "no-store" } });13 }14}15