TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1import { NextResponse } from "next/server";2import { z } from "zod";3import { apiError, parseBody } from "@/lib/api.ts";4import { assertSameOrigin, requireRole } from "@/lib/auth/session.ts";5import { getSetting, setSetting } from "@/lib/db/index.ts";6import { DEFAULT_BUDGETS, getBudgets } from "@/lib/usage.ts";78export async function GET() {9 try {10 await requireRole("instructor");11 return NextResponse.json({12 budgets: getBudgets(),13 defaultBudgets: DEFAULT_BUDGETS,14 integrityPolicy: getSetting("integrity_policy", { enabled: true, examLockdown: false }),15 crossCourseEnabled: getSetting("cross_course_enabled", false),16 sharingEnabled: getSetting("sharing_enabled", true),17 });18 } catch (e) {19 return apiError(e);20 }21}2223const schema = z.object({24 budgets: z.object({25 dailyPerUserUSD: z.number().min(0).max(1000),26 monthlyPerUserUSD: z.number().min(0).max(10_000),27 monthlyGlobalUSD: z.number().min(0).max(100_000),28 dailyRequestsPerUser: z.number().int().min(1).max(10_000),29 }).optional(),30 integrityPolicy: z.object({31 enabled: z.boolean(),32 examLockdown: z.boolean(),33 }).optional(),34 crossCourseEnabled: z.boolean().optional(),35 sharingEnabled: z.boolean().optional(),36});3738export async function POST(req: Request) {39 try {40 await assertSameOrigin();41 await requireRole("admin");42 const body = await parseBody(req, schema);43 if (body.budgets) setSetting("budgets", body.budgets);44 if (body.integrityPolicy) setSetting("integrity_policy", body.integrityPolicy);45 if (body.crossCourseEnabled !== undefined) setSetting("cross_course_enabled", body.crossCourseEnabled);46 if (body.sharingEnabled !== undefined) setSetting("sharing_enabled", body.sharingEnabled);47 return NextResponse.json({ ok: true });48 } catch (e) {49 return apiError(e);50 }51}52