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 { getSetting, setSetting } from "@/lib/db/index.ts"; import { DEFAULT_BUDGETS, getBudgets } from "@/lib/usage.ts"; export async function GET() { try { await requireRole("instructor"); return NextResponse.json({ budgets: getBudgets(), defaultBudgets: DEFAULT_BUDGETS, integrityPolicy: getSetting("integrity_policy", { enabled: true, examLockdown: false }), crossCourseEnabled: getSetting("cross_course_enabled", false), sharingEnabled: getSetting("sharing_enabled", true), }); } catch (e) { return apiError(e); } } const schema = z.object({ budgets: z.object({ dailyPerUserUSD: z.number().min(0).max(1000), monthlyPerUserUSD: z.number().min(0).max(10_000), monthlyGlobalUSD: z.number().min(0).max(100_000), dailyRequestsPerUser: z.number().int().min(1).max(10_000), }).optional(), integrityPolicy: z.object({ enabled: z.boolean(), examLockdown: z.boolean(), }).optional(), crossCourseEnabled: z.boolean().optional(), sharingEnabled: z.boolean().optional(), }); export async function POST(req: Request) { try { await assertSameOrigin(); await requireRole("admin"); const body = await parseBody(req, schema); if (body.budgets) setSetting("budgets", body.budgets); if (body.integrityPolicy) setSetting("integrity_policy", body.integrityPolicy); if (body.crossCourseEnabled !== undefined) setSetting("cross_course_enabled", body.crossCourseEnabled); if (body.sharingEnabled !== undefined) setSetting("sharing_enabled", body.sharingEnabled); return NextResponse.json({ ok: true }); } catch (e) { return apiError(e); } }