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( 'resume-parsing', async (job: Job) => { 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); });