File size: 1,341 Bytes
54aa9f3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import { Worker, Job } from 'bullmq';
import { redisClient } from '../server';
import { config } from '../config';
interface ParseJobData {
candidateId: string;
s3Url: string;
fileName: string;
orgId: string;
}
export const resumeWorker = new Worker<ParseJobData>(
'resume-parsing',
async (job: Job<ParseJobData>) => {
const { candidateId, s3Url } = job.data;
console.log(`[Worker] Parsing resume for candidate ${candidateId}: ${s3Url}`);
// Call AI service
const response = await fetch(`${config.AI_SERVICE_URL}/screen`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Internal-Key': config.AI_SERVICE_KEY,
},
body: JSON.stringify({ resume_url: s3Url, candidate_id: candidateId }),
});
if (!response.ok) {
throw new Error(`AI service error: ${response.status}`);
}
const result = await response.json();
console.log(`[Worker] Parsed resume:`, result);
// TODO: update candidate.parsed_data and candidate.embedding in DB
return result;
},
{
connection: redisClient.duplicate(),
concurrency: 5,
}
);
resumeWorker.on('completed', (job) => {
console.log(`[Worker] Job ${job.id} completed`);
});
resumeWorker.on('failed', (job, err) => {
console.error(`[Worker] Job ${job?.id} failed:`, err);
});
|