import { InjectQueue } from '@nestjs/bullmq'; import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { Queue } from 'bullmq'; import EventBus from '@server/utils/event-bus'; import { ObjectType, VisitType } from '@nice/common'; import { QueueJobType, updatePostStateJobData, updateVisitCountJobData, } from '@server/queue/types'; @Injectable() export class PostQueueService implements OnModuleInit { private readonly logger = new Logger(PostQueueService.name); constructor(@InjectQueue('general') private generalQueue: Queue) {} onModuleInit() { EventBus.on('updateVisitCount', ({ id, objectType, visitType }) => { if (objectType === ObjectType.POST) { this.addUpdateVisitCountJob({ id, type: visitType }); } }); EventBus.on('updatePostState', ({ id }) => { this.addUpdatePostState({ id }); }); EventBus.on('updatePostState', ({ id }) => { this.addUpdatePostState({ id }); }); EventBus.on('updateTotalCourseViewCount', ({ visitType }) => { this.addUpdateTotalCourseViewCount({ visitType }); }); } async addUpdateVisitCountJob(data: updateVisitCountJobData) { this.logger.log(`update post view count ${data.id}`); await this.generalQueue.add(QueueJobType.UPDATE_POST_VISIT_COUNT, data, { debounce: { id: `${QueueJobType.UPDATE_POST_VISIT_COUNT}_${data.type}_${data.id}`, }, }); } async addUpdatePostState(data: updatePostStateJobData) { this.logger.log(`update post state ${data.id}`); await this.generalQueue.add(QueueJobType.UPDATE_POST_STATE, data, { debounce: { id: `${QueueJobType.UPDATE_POST_STATE}_${data.id}` }, }); } async addUpdateTotalCourseViewCount({ visitType }) { this.logger.log(`update post state ${visitType}`); await this.generalQueue.add( QueueJobType.UPDATE_TOTAL_COURSE_VIEW_COUNT, { type: visitType }, { debounce: { id: `${QueueJobType.UPDATE_POST_STATE}_${visitType}` }, }, ); } }