import { NextResponse } from "next/server"; import { validateApiKey, getModelAliases, setModelAlias, isCloudEnabled } from "@/models"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; import { cloudModelAliasUpdateSchema } from "@/shared/validation/schemas"; import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // PUT /api/cloud/models/alias - Set model alias (for cloud/CLI) export async function PUT(request: Request) { 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 authHeader = request.headers.get("authorization"); const apiKey = authHeader?.replace("Bearer ", ""); if (!apiKey) { return NextResponse.json({ error: "Missing API key" }, { status: 401 }); } const isValid = await validateApiKey(apiKey); if (!isValid) { return NextResponse.json({ error: "Invalid API key" }, { status: 401 }); } const validation = validateBody(cloudModelAliasUpdateSchema, rawBody); if (isValidationFailure(validation)) { return NextResponse.json({ error: validation.error }, { status: 400 }); } const { model, alias } = validation.data; // Check if alias already exists for different model const aliases = await getModelAliases(); const existingModel = aliases[alias]; if (existingModel && existingModel !== model) { return NextResponse.json( { error: `Alias '${alias}' already in use for model '${existingModel}'`, }, { status: 400 } ); } // Update alias await setModelAlias(alias, model); // Auto sync to Cloud if enabled await syncToCloudIfEnabled(); return NextResponse.json({ success: true, model, alias, message: `Alias '${alias}' set for model '${model}'`, }); } catch (error) { console.log("Error updating alias:", error); return NextResponse.json({ error: "Failed to update alias" }, { status: 500 }); } } /** * Sync to Cloud if enabled */ async function syncToCloudIfEnabled() { try { const cloudEnabled = await isCloudEnabled(); if (!cloudEnabled) return; const machineId = await getConsistentMachineId(); await syncToCloud(machineId); } catch (error) { console.log("Error syncing aliases to cloud:", error); } } // GET /api/cloud/models/alias - Get all aliases export async function GET(request) { try { const authHeader = request.headers.get("authorization"); const apiKey = authHeader?.replace("Bearer ", ""); if (!apiKey) { return NextResponse.json({ error: "Missing API key" }, { status: 401 }); } const isValid = await validateApiKey(apiKey); if (!isValid) { return NextResponse.json({ error: "Invalid API key" }, { status: 401 }); } const aliases = await getModelAliases(); return NextResponse.json({ aliases }); } catch (error) { console.log("Error fetching aliases:", error); return NextResponse.json({ error: "Failed to fetch aliases" }, { status: 500 }); } }