Files
MineGeo/lib/prometheus-api.ts

39 lines
1.3 KiB
TypeScript

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<unknown>,
) {
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 });
}