summaryrefslogtreecommitdiff
path: root/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts')
-rw-r--r--packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts56
1 files changed, 56 insertions, 0 deletions
diff --git a/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts b/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts
new file mode 100644
index 0000000000..b90c7be629
--- /dev/null
+++ b/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts
@@ -0,0 +1,56 @@
+import { Inject, Injectable } from '@nestjs/common';
+import { MoreThan } from 'typeorm';
+import { DI } from '@/di-symbols.js';
+import { PollVotesRepository, NotesRepository } from '@/models/index.js';
+import { Config } from '@/config.js';
+import type Logger from '@/logger.js';
+import { CreateNotificationService } from '@/core/CreateNotificationService.js';
+import { QueueLoggerService } from '../QueueLoggerService.js';
+import type Bull from 'bull';
+import type { EndedPollNotificationJobData } from '../types.js';
+
+@Injectable()
+export class EndedPollNotificationProcessorService {
+ #logger: Logger;
+
+ constructor(
+ @Inject(DI.config)
+ private config: Config,
+
+ @Inject(DI.notesRepository)
+ private notesRepository: NotesRepository,
+
+ @Inject(DI.pollVotesRepository)
+ private pollVotesRepository: PollVotesRepository,
+
+ private createNotificationService: CreateNotificationService,
+ private queueLoggerService: QueueLoggerService,
+ ) {
+ this.#logger = this.queueLoggerService.logger.createSubLogger('ended-poll-notification');
+ }
+
+ public async process(job: Bull.Job<EndedPollNotificationJobData>, done: () => void): Promise<void> {
+ const note = await this.notesRepository.findOneBy({ id: job.data.noteId });
+ if (note == null || !note.hasPoll) {
+ done();
+ return;
+ }
+
+ const votes = await this.pollVotesRepository.createQueryBuilder('vote')
+ .select('vote.userId')
+ .where('vote.noteId = :noteId', { noteId: note.id })
+ .innerJoinAndSelect('vote.user', 'user')
+ .andWhere('user.host IS NULL')
+ .getMany();
+
+ const userIds = [...new Set([note.userId, ...votes.map(v => v.userId)])];
+
+ for (const userId of userIds) {
+ this.createNotificationService.createNotification(userId, 'pollEnded', {
+ noteId: note.id,
+ });
+ }
+
+ done();
+ }
+}