import { db } from "../../../db/index"; import { uploads, courses } from "../../../db/schema"; import { eq } from "drizzle-orm"; import { randomUUID } from "crypto"; import { writeFile, mkdir } from "fs/promises"; import { resolve } from "path"; import { parsePdf } from "../../../utils/parsePdf"; import { detectUploadType } from "../../../utils/detectUploadType"; export default defineEventHandler(async (event) => { const id = getRouterParam(event, "id")!; const course = await db.query.courses.findFirst({ where: eq(courses.id, id) }); if (!course) throw createError({ statusCode: 404, message: "Course not found" }); const formData = await readFormData(event); const file = formData.get("file") as File | null; if (!file) { throw createError({ statusCode: 400, message: "file is required" }); } const uploadDir = resolve(process.cwd(), "uploads", id); await mkdir(uploadDir, { recursive: true }); const uploadId = randomUUID(); const safeFilename = `${uploadId}-${file.name.replace(/[^a-zA-Z0-9._-]/g, "_")}`; const storedPath = resolve(uploadDir, safeFilename); const buffer = Buffer.from(await file.arrayBuffer()); await writeFile(storedPath, buffer); let extractedText: string | null = null; try { extractedText = await parsePdf(buffer); } catch { // non-fatal } const detectedType = await detectUploadType(file.name, extractedText ?? ""); await db.insert(uploads).values({ id: uploadId, courseId: id, filename: file.name, type: detectedType, storedPath, extractedText, }); return { uploadId, filename: file.name, type: detectedType }; });