Files
BizOne-portal/backend/src/webhooks/webhook-worker.service.ts

43 lines
1.2 KiB
TypeScript

import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import type { Job as BullJob, Worker } from 'bullmq';
import { JobsService } from '../jobs/jobs.service';
import { RedisQueueService } from '../jobs/redis-queue.service';
import { WebhooksService } from './webhooks.service';
@Injectable()
export class WebhookWorkerService implements OnModuleInit, OnModuleDestroy {
private worker: Worker | null = null;
constructor(
private readonly jobsService: JobsService,
private readonly redisQueueService: RedisQueueService,
private readonly webhooksService: WebhooksService,
) {}
onModuleInit() {
this.worker = this.redisQueueService.createWorker(
'webhooks',
async (job: BullJob<{ dbJobId?: string }>) => {
const dbJobId = job.data?.dbJobId;
if (!dbJobId) {
throw new Error('Redis webhook job missing dbJobId');
}
const claimed = await this.jobsService.markProcessing(dbJobId);
if (!claimed) {
return;
}
await this.webhooksService.processJob(dbJobId);
},
);
}
async onModuleDestroy() {
if (this.worker) {
await this.worker.close();
this.worker = null;
}
}
}