Spaces:
Runtime error
Runtime error
| import { NextResponse } from "next/server"; | |
| import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; | |
| import { | |
| getPricing, | |
| getPricingWithSources, | |
| updatePricing, | |
| resetPricing, | |
| resetAllPricing, | |
| } from "@/lib/localDb"; | |
| import { updatePricingSchema } from "@/shared/validation/schemas"; | |
| import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; | |
| /** | |
| * GET /api/pricing | |
| * Get current pricing configuration (merged user + defaults) | |
| */ | |
| export async function GET(request: Request) { | |
| const authError = await requireManagementAuth(request); | |
| if (authError) return authError; | |
| try { | |
| const includeSources = new URL(request.url).searchParams.get("includeSources") === "1"; | |
| if (includeSources) { | |
| return NextResponse.json(await getPricingWithSources()); | |
| } | |
| const pricing = await getPricing(); | |
| return NextResponse.json(pricing); | |
| } catch (error) { | |
| console.error("Error fetching pricing:", error); | |
| return NextResponse.json({ error: "Failed to fetch pricing" }, { status: 500 }); | |
| } | |
| } | |
| /** | |
| * PATCH /api/pricing | |
| * Update pricing configuration | |
| * Body: { provider: { model: { input: number, output: number, cached: number, ... } } } | |
| */ | |
| export async function PATCH(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(updatePricingSchema, rawBody); | |
| if (isValidationFailure(validation)) { | |
| return NextResponse.json({ error: validation.error }, { status: 400 }); | |
| } | |
| const body = validation.data; | |
| const updatedPricing = await updatePricing(body); | |
| return NextResponse.json(updatedPricing); | |
| } catch (error) { | |
| console.error("Error updating pricing:", error); | |
| return NextResponse.json({ error: "Failed to update pricing" }, { status: 500 }); | |
| } | |
| } | |
| /** | |
| * DELETE /api/pricing | |
| * Reset pricing to defaults | |
| * Query params: ?provider=xxx&model=yyy (optional) | |
| */ | |
| export async function DELETE(request) { | |
| const authError = await requireManagementAuth(request); | |
| if (authError) return authError; | |
| try { | |
| const { searchParams } = new URL(request.url); | |
| const provider = searchParams.get("provider"); | |
| const model = searchParams.get("model"); | |
| if (provider && model) { | |
| // Reset specific model | |
| await resetPricing(provider, model); | |
| } else if (provider) { | |
| // Reset entire provider | |
| await resetPricing(provider); | |
| } else { | |
| // Reset all pricing | |
| await resetAllPricing(); | |
| } | |
| const pricing = await getPricing(); | |
| return NextResponse.json(pricing); | |
| } catch (error) { | |
| console.error("Error resetting pricing:", error); | |
| return NextResponse.json({ error: "Failed to reset pricing" }, { status: 500 }); | |
| } | |
| } | |