import { z } from "zod"; import { withUser, parseBody, json, ApiError } from "@/lib/api"; import { validateConnection, getDecryptedKey, listConnections } from "@/lib/providers/keys"; import { syncProvider } from "@/lib/ai/registry"; import { isProviderId } from "@/lib/ai/core/types"; import { LIMITS } from "@/lib/rate-limit"; export const dynamic = "force-dynamic"; /** * POST /api/providers/test `{ provider }` — re-validate the stored (encrypted) key against the provider. * → `{ ok, latencyMs, modelsAvailable, error?, errorCode?, connections }`. The key never leaves the server. */ export const POST = withUser( async ({ req, user }) => { const body = await parseBody(req, z.object({ provider: z.string().max(40) })); if (!isProviderId(body.provider) || body.provider === "custom") throw new ApiError(400, "Unknown provider", "BAD_REQUEST"); const res = await validateConnection(user.id, body.provider); if (res.ok) { const key = await getDecryptedKey(user.id, body.provider); if (key) void syncProvider(body.provider, key, "user").catch(() => {}); } return json({ ok: res.ok, latencyMs: res.latencyMs, modelsAvailable: res.modelsAvailable ?? null, error: res.error?.message, errorCode: res.error?.code, connections: await listConnections(user.id) }); }, { limit: { ...LIMITS.keyValidate, key: "provider-test" } }, );