import { z } from "zod"; import { withUser, parseBody, json } from "@/lib/api"; import { listEndpoints, createEndpoint, probeEndpoint, ENDPOINT_INPUT_SCHEMA } from "@/lib/endpoints/service"; import { privateEndpointsAllowed } from "@/lib/endpoints/ssrf"; import { LIMITS } from "@/lib/rate-limit"; export const dynamic = "force-dynamic"; /** GET /api/endpoints → `{ endpoints: PublicEndpoint[], allowPrivate: boolean }` */ export const GET = withUser(async ({ user }) => json({ endpoints: await listEndpoints(user.id), allowPrivate: privateEndpointsAllowed() })); const createSchema = ENDPOINT_INPUT_SCHEMA.extend({ validate: z.boolean().optional() }); /** * POST /api/endpoints — body `EndpointInput & { validate?: boolean }` (default true). * → 201 `{ endpoint: PublicEndpoint, test?: { ok, latencyMs, modelsAvailable, error? } }` */ export const POST = withUser( async ({ req, user, ip }) => { const { validate, ...input } = await parseBody(req, createSchema, 64_000); let endpoint = await createEndpoint(user.id, input, ip); let test: { ok: boolean; latencyMs: number; modelsAvailable: number; error?: string } | undefined; if (validate !== false) { const r = await probeEndpoint(user.id, endpoint.id); test = { ok: r.ok, latencyMs: r.latencyMs, modelsAvailable: r.modelsAvailable, error: r.error }; endpoint = (await listEndpoints(user.id)).find((e) => e.id === endpoint.id) ?? endpoint; } return json({ endpoint, test }, { status: 201 }); }, { limit: { ...LIMITS.keySave, key: "endpoint-save" } }, );