| import { NextRequest, NextResponse } from "next/server"; |
| import { z } from "zod"; |
| import { isAuthenticated } from "@/shared/utils/apiAuth"; |
| import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; |
| import { |
| syncModelsDev, |
| getModelsDevPricing, |
| getSyncedCapabilities, |
| getSyncStatus, |
| startPeriodicSync, |
| stopPeriodicSync, |
| } from "@/lib/modelsDevSync"; |
|
|
| const modelsDevActionSchema = z.object({ |
| action: z.enum(["sync", "start", "stop"]), |
| dryRun: z.boolean().optional(), |
| syncCapabilities: z.boolean().optional(), |
| }); |
|
|
| export async function GET(request: NextRequest) { |
| if (!(await isAuthenticated(request))) { |
| return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); |
| } |
|
|
| const { searchParams } = new URL(request.url); |
| const action = searchParams.get("action"); |
|
|
| if (action === "status") { |
| const status = getSyncStatus(); |
| const pricing = getModelsDevPricing(); |
| const caps = getSyncedCapabilities(); |
|
|
| const providerCount = Object.keys(pricing).length; |
| const modelCount = Object.values(pricing).reduce( |
| (sum, models) => sum + Object.keys(models).length, |
| 0 |
| ); |
| const capabilityCount = Object.values(caps).reduce( |
| (sum, models) => sum + Object.keys(models).length, |
| 0 |
| ); |
|
|
| return NextResponse.json({ |
| ...status, |
| providerCount, |
| modelCount, |
| capabilityCount, |
| }); |
| } |
|
|
| return NextResponse.json({ error: "Unknown action" }, { status: 400 }); |
| } |
|
|
| export async function POST(request: NextRequest) { |
| if (!(await isAuthenticated(request))) { |
| return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); |
| } |
|
|
| let rawBody: unknown; |
| try { |
| rawBody = await request.json(); |
| } catch { |
| return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 }); |
| } |
|
|
| const validation = validateBody(modelsDevActionSchema, rawBody); |
| if (isValidationFailure(validation)) { |
| return validation.response; |
| } |
|
|
| const { action, dryRun, syncCapabilities } = validation.data; |
|
|
| if (action === "sync") { |
| const result = await syncModelsDev({ |
| dryRun: dryRun ?? false, |
| syncCapabilities: syncCapabilities !== false, |
| }); |
| return NextResponse.json(result); |
| } |
|
|
| if (action === "start") { |
| startPeriodicSync(); |
| return NextResponse.json({ success: true, message: "Periodic sync started" }); |
| } |
|
|
| if (action === "stop") { |
| stopPeriodicSync(); |
| return NextResponse.json({ success: true, message: "Periodic sync stopped" }); |
| } |
|
|
| return NextResponse.json({ error: "Unknown action" }, { status: 400 }); |
| } |
|
|