import "server-only"; import { randomBytes, createHash } from "node:crypto"; import { NextRequest, NextResponse } from "next/server"; import { admin, required } from "./supabase"; import { requestOrigin } from "./request-origin"; import { prometheusAction } from "@/shared/prometheus"; export async function prometheusApi( request: NextRequest, reviewer: string, jsonBody: (request: NextRequest) => Promise, ) { const client = admin(); const endpoint = `${requestOrigin(request, process.env.MINEGEO_URL)}/api/metrics`; if (request.method === "GET") { const status = required( await client.rpc("prometheus_status", { p_reviewer: reviewer }), ); return NextResponse.json({ ...(status as object), endpoint }); } if (request.method === "POST") { const { action } = prometheusAction.parse(await jsonBody(request)); const token = action === "rotate" ? `mg_metrics_${randomBytes(32).toString("hex")}` : null; const status = required( await client.rpc("configure_prometheus", { p_reviewer: reviewer, p_token_hash: token ? createHash("sha256").update(token).digest("hex") : null, }), ); return NextResponse.json({ ...(status as object), endpoint, token }); } return NextResponse.json({ error: "Not found" }, { status: 404 }); }