TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1import { NextResponse } from "next/server";2import { apiError } from "@/lib/api.ts";3import { assertSameOrigin, requireRole } from "@/lib/auth/session.ts";4import { all } from "@/lib/db/index.ts";5import { ingestCourses } from "@/lib/rag/ingest.ts";67export const maxDuration = 600;89export async function GET() {10 try {11 await requireRole("instructor");12 const runs = all("SELECT id, started_at, finished_at, triggered_by, files_scanned, files_ingested, files_skipped, chunks_created, status, report FROM ingestion_runs ORDER BY id DESC LIMIT 10");13 const documents = all(14 `SELECT id, course_code, space, filename, doc_type, title, week, status, error, visible_to_students, ingested_at, chunk_count15 FROM documents ORDER BY course_code, space, week, filename`16 );17 return NextResponse.json({ runs, documents });18 } catch (e) {19 return apiError(e);20 }21}2223export async function POST(req: Request) {24 try {25 await assertSameOrigin();26 const user = await requireRole("instructor");27 const force = new URL(req.url).searchParams.get("force") === "1";28 const result = await ingestCourses({ force, triggeredBy: `admin:${user.username}` });29 return NextResponse.json({ ok: true, ...result });30 } catch (e) {31 return apiError(e);32 }33}34