Revisione/server/api/courses/[id]/upload.post.ts

52 lines
1.6 KiB
TypeScript

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 };
});