TypeScript 97.4%
SQL 1%
JavaScript 0.9%
CSS 0.6%
1import { z } from "zod";2import { withUser, parseBody, json } from "@/lib/api";3import { listEndpoints, createEndpoint, probeEndpoint, ENDPOINT_INPUT_SCHEMA } from "@/lib/endpoints/service";4import { privateEndpointsAllowed } from "@/lib/endpoints/ssrf";5import { LIMITS } from "@/lib/rate-limit";67export const dynamic = "force-dynamic";89/** GET /api/endpoints → `{ endpoints: PublicEndpoint[], allowPrivate: boolean }` */10export const GET = withUser(async ({ user }) => json({ endpoints: await listEndpoints(user.id), allowPrivate: privateEndpointsAllowed() }));1112const createSchema = ENDPOINT_INPUT_SCHEMA.extend({ validate: z.boolean().optional() });1314/**15 * POST /api/endpoints — body `EndpointInput & { validate?: boolean }` (default true).16 * → 201 `{ endpoint: PublicEndpoint, test?: { ok, latencyMs, modelsAvailable, error? } }`17 */18export const POST = withUser(19 async ({ req, user, ip }) => {20 const { validate, ...input } = await parseBody(req, createSchema, 64_000);21 let endpoint = await createEndpoint(user.id, input, ip);22 let test: { ok: boolean; latencyMs: number; modelsAvailable: number; error?: string } | undefined;23 if (validate !== false) {24 const r = await probeEndpoint(user.id, endpoint.id);25 test = { ok: r.ok, latencyMs: r.latencyMs, modelsAvailable: r.modelsAvailable, error: r.error };26 endpoint = (await listEndpoints(user.id)).find((e) => e.id === endpoint.id) ?? endpoint;27 }28 return json({ endpoint, test }, { status: 201 });29 },30 { limit: { ...LIMITS.keySave, key: "endpoint-save" } },31);32