Add developer API, Prometheus metrics, and community links

This commit is contained in:
2026-10-12 19:59:37 +05:00
parent 3cc3136762
commit 018be5049e
50 changed files with 4087 additions and 31 deletions

View File

@@ -0,0 +1,8 @@
import { developerKeys } from "@/lib/developer-key-management";
export const runtime = "nodejs";
export const dynamic = "force-dynamic";
export const GET = developerKeys;
export const POST = developerKeys;
export const DELETE = developerKeys;
export const PUT = developerKeys;
export const PATCH = developerKeys;

View File

@@ -0,0 +1,10 @@
import { developerOpenApi } from "@/shared/developer-openapi";
export const dynamic = "force-static";
export function GET() {
return Response.json(developerOpenApi, {
headers: {
"Cache-Control": "public, max-age=3600",
"X-Content-Type-Options": "nosniff",
},
});
}

3
app/api/dev/route.ts Normal file
View File

@@ -0,0 +1,3 @@
export function GET(request: Request) {
return Response.redirect(new URL("/dev/api", request.url), 307);
}

View File

@@ -0,0 +1,17 @@
import { developerApi } from "@/lib/developer-api";
export const runtime = "nodejs";
export const dynamic = "force-dynamic";
export const maxDuration = 30;
async function handle(
request: Request,
{ params }: { params: Promise<{ path: string[] }> },
) {
return developerApi(request, (await params).path);
}
export {
handle as GET,
handle as POST,
handle as PATCH,
handle as PUT,
handle as DELETE,
};

16
app/api/metrics/route.ts Normal file
View File

@@ -0,0 +1,16 @@
import { admin, required } from "@/lib/supabase";
import { metricsResponse } from "@/lib/prometheus-response";
export const runtime = "nodejs";
export const dynamic = "force-dynamic";
export const maxDuration = 30;
export function GET(request: Request) {
return metricsResponse(request, async (tokenHash) => {
const result = await admin().rpc("read_prometheus_metrics", {
p_token_hash: tokenHash,
});
// NULL is an invalid or disabled credential, not a missing database record.
if (result.error) required(result);
return result.data;
});
}