import { NextResponse } from "next/server"; import { getAllAliases, getCustomAliases, getBuiltInAliases, setCustomAliases, addCustomAlias, removeCustomAlias, } from "@omniroute/open-sse/services/modelDeprecation.ts"; import { getSettings, updateSettings } from "@/lib/db/settings"; import { addModelAliasSchema, removeModelAliasSchema, updateModelAliasesSchema, } from "@/shared/validation/schemas"; import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; /** * GET /api/settings/model-aliases * Returns the full alias map, separated into built-in and custom. */ export async function GET(request: Request) { const authError = await requireManagementAuth(request); if (authError) return authError; try { return NextResponse.json({ builtIn: getBuiltInAliases(), custom: getCustomAliases(), all: getAllAliases(), }); } catch (error) { console.error("[API ERROR] /api/settings/model-aliases GET:", error); return NextResponse.json({ error: "Failed to get model aliases" }, { status: 500 }); } } /** * PUT /api/settings/model-aliases * Update the custom aliases map. * Body: { aliases: { "old-model": "new-model", ... } } */ export async function PUT(request: Request) { const authError = await requireManagementAuth(request); if (authError) return authError; let rawBody; try { rawBody = await request.json(); } catch { return NextResponse.json( { error: { message: "Invalid request", details: [{ field: "body", message: "Invalid JSON body" }], }, }, { status: 400 } ); } try { const validation = validateBody(updateModelAliasesSchema, rawBody); if (isValidationFailure(validation)) { return NextResponse.json({ error: validation.error }, { status: 400 }); } const { aliases } = validation.data; setCustomAliases(aliases); await updateSettings({ modelAliases: aliases }); return NextResponse.json({ success: true, custom: getCustomAliases() }); } catch (error) { console.error("[API ERROR] /api/settings/model-aliases PUT:", error); return NextResponse.json({ error: "Failed to update model aliases" }, { status: 500 }); } } /** * POST /api/settings/model-aliases * Add a single custom alias. * Body: { from: "old-model", to: "new-model" } */ export async function POST(request: Request) { const authError = await requireManagementAuth(request); if (authError) return authError; let rawBody; try { rawBody = await request.json(); } catch { return NextResponse.json( { error: { message: "Invalid request", details: [{ field: "body", message: "Invalid JSON body" }], }, }, { status: 400 } ); } try { const validation = validateBody(addModelAliasSchema, rawBody); if (isValidationFailure(validation)) { return NextResponse.json({ error: validation.error }, { status: 400 }); } const { from, to } = validation.data; addCustomAlias(from, to); await updateSettings({ modelAliases: getCustomAliases() }); return NextResponse.json({ success: true, custom: getCustomAliases() }); } catch (error) { console.error("[API ERROR] /api/settings/model-aliases POST:", error); return NextResponse.json({ error: "Failed to add alias" }, { status: 500 }); } } /** * DELETE /api/settings/model-aliases * Remove a custom alias. * Body: { from: "old-model" } */ export async function DELETE(request: Request) { const authError = await requireManagementAuth(request); if (authError) return authError; let rawBody; try { rawBody = await request.json(); } catch { return NextResponse.json( { error: { message: "Invalid request", details: [{ field: "body", message: "Invalid JSON body" }], }, }, { status: 400 } ); } try { const validation = validateBody(removeModelAliasSchema, rawBody); if (isValidationFailure(validation)) { return NextResponse.json({ error: validation.error }, { status: 400 }); } const { from } = validation.data; const removed = removeCustomAlias(from); if (!removed) { return NextResponse.json({ error: "Alias not found" }, { status: 404 }); } await updateSettings({ modelAliases: getCustomAliases() }); return NextResponse.json({ success: true, custom: getCustomAliases() }); } catch (error) { console.error("[API ERROR] /api/settings/model-aliases DELETE:", error); return NextResponse.json({ error: "Failed to remove alias" }, { status: 500 }); } }