import { NextResponse } from "next/server"; import { z } from "zod"; import { apiError, parseBody } from "@/lib/api.ts"; import { assertSameOrigin, requireRole } from "@/lib/auth/session.ts"; import { run, setSetting } from "@/lib/db/index.ts"; import { listModels, invalidateModelCache, getPresets, DEFAULT_PRESETS } from "@/lib/openrouter/registry.ts"; export async function GET() { try { await requireRole("instructor"); const models = await listModels({ includeDisabled: true }); return NextResponse.json({ models, presets: getPresets(), defaultPresets: DEFAULT_PRESETS }); } catch (e) { return apiError(e); } } const toggleSchema = z.object({ action: z.literal("override"), modelId: z.string().min(1).max(200), enabled: z.boolean().optional(), favorite: z.boolean().optional(), note: z.string().max(300).optional(), }); const presetSchema = z.object({ action: z.literal("presets"), presets: z.record(z.string(), z.object({ label: z.string().max(60), models: z.array(z.string()).max(10), description: z.string().max(200) })), }); export async function POST(req: Request) { try { await assertSameOrigin(); await requireRole("admin"); const body = await parseBody(req, z.discriminatedUnion("action", [toggleSchema, presetSchema])); if (body.action === "override") { run( `INSERT INTO model_overrides (model_id, enabled, favorite, note) VALUES (?, ?, ?, ?) ON CONFLICT(model_id) DO UPDATE SET enabled = COALESCE(?, enabled), favorite = COALESCE(?, favorite), note = COALESCE(?, note)`, body.modelId, body.enabled === undefined ? 1 : body.enabled ? 1 : 0, body.favorite === undefined ? 0 : body.favorite ? 1 : 0, body.note ?? "", body.enabled === undefined ? null : body.enabled ? 1 : 0, body.favorite === undefined ? null : body.favorite ? 1 : 0, body.note ?? null ); } else { setSetting("model_presets", body.presets); } invalidateModelCache(); return NextResponse.json({ ok: true }); } catch (e) { return apiError(e); } }