import { NextRequest, NextResponse } from "next/server"; import { createClient } from "@/lib/supabase/server"; export const runtime = "nodejs"; // Add a 5MB size limit const MAX_FILE_SIZE = 5 * 1024 * 1024; export async function POST(req: NextRequest) { try { const supabase = await createClient(); const { data: { user } } = await supabase.auth.getUser(); if (!user) { return NextResponse.json({ error: "Unauthorized. Please log in." }, { status: 401 }); } const formData = await req.formData(); const file = formData.get("file") as File | null; if (!file) { return NextResponse.json({ error: "No file uploaded" }, { status: 400 }); } if (file.size > MAX_FILE_SIZE) { return NextResponse.json({ error: "File exceeds 5MB size limit" }, { status: 400 }); } const name = file.name.toLowerCase(); const buffer = Buffer.from(await file.arrayBuffer()); let text = ""; // Validate MIME types alongside extension const mimeType = file.type; if ((name.endsWith(".txt") || name.endsWith(".md")) && (mimeType.includes("text/plain") || mimeType.includes("text/markdown"))) { text = new TextDecoder().decode(buffer); } else if (name.endsWith(".pdf") && mimeType === "application/pdf") { // pdf-parse v2 await import("pdf-parse/worker"); const { PDFParse } = await import("pdf-parse"); const parser = new PDFParse({ data: buffer }); const result = await parser.getText(); text = result.text; await parser.destroy(); } else if (name.endsWith(".docx")) { const mammoth = (await import("mammoth")).default; const result = await mammoth.extractRawText({ buffer }); text = result.value; } else { return NextResponse.json({ error: "Unsupported file type. Use .pdf, .docx, .txt, or .md" }, { status: 400 }); } if (!text || text.trim().length < 30) { return NextResponse.json({ error: "Could not extract enough text from this file." }, { status: 400 }); } return NextResponse.json({ text: text.trim(), filename: file.name, size: file.size }); } catch (error: any) { console.error("File parse error:", error); return NextResponse.json({ error: "Failed to parse file: " + (error.message || "Unknown error") }, { status: 500 }); } }