import 'core-js/features/promise/with-resolvers'; // Polyfill for Promise.withResolvers import { NextResponse } from "next/server"; import fs from "fs"; import path from "path"; import * as pdfjsLib from 'pdfjs-dist'; import '../../../public/utils/pdf.worker.mjs'; import { v4 as uuidv4 } from 'uuid'; import { fileTypeFromBuffer } from 'file-type'; const uploadDir = path.join(process.cwd(), "uploads", "cv"); // Ensure the upload directory exists if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } async function extractTextFromPdf(pdfPath: string): Promise { console.log("Starting extractTextFromPdf for path:", pdfPath); try { console.log("Reading PDF file:", pdfPath); const data = new Uint8Array(fs.readFileSync(pdfPath)); console.log("PDF file read successfully. Starting loading document..."); const loadingTask = pdfjsLib.getDocument({ data }); console.log("Loading task initiated. Waiting for promise..."); const pdf = await loadingTask.promise; // Await the PDF loading console.log("PDF document loaded successfully. Number of pages:", pdf.numPages); let fullText = ""; const processPages = async () => { for (let i = 1; i <= pdf.numPages; i++) { console.log("Processing page:", i); const page = await pdf.getPage(i); console.log("Page", i, "loaded. Getting text content..."); const textContent = await page.getTextContent(); console.log("Text content for page", i, "obtained. Processing items..."); fullText += textContent.items.map((item: any) => item.str ? item.str : '').join(" "); console.log("Text from page", i, "added to fullText."); } console.log("Text extraction completed successfully."); console.log("Parsed PDF Text before return:", fullText); // Added log here return fullText; }; return await processPages(); // Await the page processing } catch (error) { console.error("Error extracting text from PDF:", error); throw new Error("Error extracting text from PDF"); } finally { console.log("Finished extractTextFromPdf for path:", pdfPath); } } export async function POST(req: Request) { console.log("Received request for CV file upload"); try { const formData = await req.formData(); const file: File | null = formData.get('cv') as unknown as File | null; if (!file) { console.warn("No file uploaded."); return NextResponse.json({ message: "No file uploaded." }, { status: 400 }); } const originalFilename = file.name; const uniqueFilename = `${uuidv4()}-${originalFilename}`; const newFilePath = path.join(uploadDir, uniqueFilename); console.log(`Saving file to: ${newFilePath}`); const fileBuffer = await file.arrayBuffer(); const type = await fileTypeFromBuffer(Buffer.from(fileBuffer)); console.log("Detected file type:", type); if (!type || type.mime !== 'application/pdf') { return NextResponse.json({ message: "Unsupported file type detected. Only PDF files are allowed." }, { status: 400 }); } await fs.promises.writeFile(newFilePath, Buffer.from(fileBuffer)); console.log("File uploaded and saved successfully!"); console.log("Before PDF parsing"); const extractedText = await extractTextFromPdf(newFilePath); console.log("After PDF parsing"); console.log("Before generating summary"); const command = `python3 utils/resume_analysis.py "${extractedText}"`; console.log("Executing python command:", command); console.log("Extracted Text being passed to python script:", extractedText); console.log("Length of extractedText:", extractedText.length); // Log length const executionResult: { stdout: string, stderr: string } = await new Promise((resolve, reject) => { require('child_process').exec(command, (error: any, stdout: string, stderr: string) => { if (error) { console.error("Python script execution error:", error); console.error("Python script stderr:", stderr); reject({ error, stdout, stderr }); } else { console.log("Python script executed successfully"); console.log("Python script stdout:", stdout); resolve({ stdout, stderr }); } }); }); const { stdout, stderr } = executionResult; if (stderr) { console.error("Error from python script (stderr):", stderr); } const summary: string = stdout.trim(); console.log("After generating summary"); return NextResponse.json({ summary: summary }, { status: 200 }); } catch (error: any) { console.error("Error during file processing:", error); return NextResponse.json({ message: "Error processing file: " + error.message }, { status: 500 }); } }