SPB Git forge

spb/immbot-ai

Public
1commits 1branches 0releases
1.5 MBsize
maindefault branch
20 days agolast push
TypeScript 98.3% CSS 0.9% Shell 0.7%
1.8 KB · 52 lines typescript
Raw Blame History
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