Add developer API, Prometheus metrics, and community links
This commit is contained in:
38
lib/prometheus-api.ts
Normal file
38
lib/prometheus-api.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
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 });
|
||||
}
|
||||
Reference in New Issue
Block a user