43 lines
1.2 KiB
TypeScript
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;
|
|
}
|
|
}
|
|
}
|