| 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}`); |
|
|
| |
| 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); |
|
|
| |
|
|
| 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); |
| }); |
|
|