Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 49 additions & 16 deletions app/api/inngest/resume/extract/route.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@

import { NextResponse } from 'next/server';
import { createReadStream } from 'fs';
import pdfParse from 'pdf-parse';
import mammoth from 'mammoth';
import fs from 'fs/promises';
import path from 'path';
import os from 'os';

export async function POST(request) {
let tempFilePath = null;

try {
const data = await request.formData();
const file = data.get('file');
Expand All @@ -15,32 +16,64 @@ export async function POST(request) {
return NextResponse.json({ error: 'No file provided' }, { status: 400 });
}

// Save file temporarily
// Get file type
const fileType = file.name.split('.').pop().toLowerCase();
if (!['pdf', 'docx'].includes(fileType)) {
return NextResponse.json({ error: `Unsupported file format: ${fileType}` }, { status: 400 });
}

// Convert file to buffer
const bytes = await file.arrayBuffer();
const buffer = Buffer.from(bytes);
const tempFilePath = path.join('/tmp', file.name);
await fs.writeFile(tempFilePath, buffer);

// Extract text based on file type
let extractedText = '';
const fileType = file.name.split('.').pop().toLowerCase();

if (fileType === 'pdf') {
const pdfData = await pdfParse(buffer);
extractedText = pdfData.text;
try {
const pdfData = await pdfParse(buffer);
extractedText = pdfData.text;
} catch (pdfError) {
console.error('PDF parsing error:', pdfError);
return NextResponse.json({
error: 'Failed to parse PDF',
details: pdfError.message
}, { status: 422 });
}
} else if (fileType === 'docx') {
const result = await mammoth.extractRawText({ path: tempFilePath });
extractedText = result.value;
} else {
return NextResponse.json({ error: 'Unsupported file format' }, { status: 400 });
// Save file temporarily using os.tmpdir() for cross-platform compatibility
tempFilePath = path.join(os.tmpdir(), `tmp-${Date.now()}-${file.name}`);
await fs.writeFile(tempFilePath, buffer);

try {
const result = await mammoth.extractRawText({ path: tempFilePath });
extractedText = result.value;
} catch (docxError) {
console.error('DOCX parsing error:', docxError);
return NextResponse.json({
error: 'Failed to parse DOCX',
details: docxError.message
}, { status: 422 });
}
}

// Delete temp file
await fs.unlink(tempFilePath);

return NextResponse.json({ text: extractedText });

} catch (error) {
console.error('Error extracting text:', error);
return NextResponse.json({ error: 'Failed to extract text' }, { status: 500 });
return NextResponse.json({
error: 'Failed to extract text',
details: error.message,
code: error.code
}, { status: 500 });
} finally {
// Clean up temp file if it exists
if (tempFilePath) {
try {
await fs.unlink(tempFilePath);
} catch (cleanupError) {
console.error('Failed to clean up temp file:', cleanupError);
}
}
}
}
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"postinstall":"prisma generate"
"postinstall": "prisma generate"
},
"dependencies": {
"@clerk/nextjs": "^6.11.3",
Expand Down