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 { getPrompt, listPromptNames, promptHistory, savePromptVersion } from "@/lib/prompts.ts";67export async function GET(req: Request) {8 try {9 await requireRole("instructor");10 const url = new URL(req.url);11 const name = url.searchParams.get("name");12 if (name) {13 return NextResponse.json({ name, content: getPrompt(name), history: promptHistory(name) });14 }15 return NextResponse.json({ names: listPromptNames() });16 } catch (e) {17 return apiError(e);18 }19}2021const schema = z.object({22 name: z.string().min(1).max(80).regex(/^[a-z0-9-]+$/),23 content: z.string().min(10).max(20_000),24});2526export async function POST(req: Request) {27 try {28 await assertSameOrigin();29 const user = await requireRole("admin");30 const body = await parseBody(req, schema);31 const version = savePromptVersion(body.name, body.content, user.username);32 return NextResponse.json({ ok: true, version });33 } catch (e) {34 return apiError(e);35 }36}37