summaryrefslogtreecommitdiff
path: root/packages/backend/src/queue
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-03-06 16:06:27 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-03-06 16:06:27 +0900
commit2442592ef1a51cad901cf5e7fe30cdc85d7568cc (patch)
tree668e11d1d94b023a3fcd49a5daba8c0d96b7fd71 /packages/backend/src/queue
parentUpdate CHANGELOG.md (diff)
downloadsharkey-2442592ef1a51cad901cf5e7fe30cdc85d7568cc.tar.gz
sharkey-2442592ef1a51cad901cf5e7fe30cdc85d7568cc.tar.bz2
sharkey-2442592ef1a51cad901cf5e7fe30cdc85d7568cc.zip
feat: アンケート終了通知
Resolve #4664
Diffstat (limited to 'packages/backend/src/queue')
-rw-r--r--packages/backend/src/queue/index.ts4
-rw-r--r--packages/backend/src/queue/processors/ended-poll-notification.ts33
-rw-r--r--packages/backend/src/queue/queues.ts3
-rw-r--r--packages/backend/src/queue/types.ts5
4 files changed, 43 insertions, 2 deletions
diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts
index 1b1c21c4f0..50bcccbb7f 100644
--- a/packages/backend/src/queue/index.ts
+++ b/packages/backend/src/queue/index.ts
@@ -8,10 +8,11 @@ import processInbox from './processors/inbox.js';
import processDb from './processors/db/index.js';
import processObjectStorage from './processors/object-storage/index.js';
import processSystemQueue from './processors/system/index.js';
+import { endedPollNotification } from './processors/ended-poll-notification.js';
import { queueLogger } from './logger.js';
import { DriveFile } from '@/models/entities/drive-file.js';
import { getJobInfo } from './get-job-info.js';
-import { systemQueue, dbQueue, deliverQueue, inboxQueue, objectStorageQueue } from './queues.js';
+import { systemQueue, dbQueue, deliverQueue, inboxQueue, objectStorageQueue, endedPollNotificationQueue } from './queues.js';
import { ThinUser } from './types.js';
import { IActivity } from '@/remote/activitypub/type.js';
@@ -255,6 +256,7 @@ export default function() {
deliverQueue.process(config.deliverJobConcurrency || 128, processDeliver);
inboxQueue.process(config.inboxJobConcurrency || 16, processInbox);
+ endedPollNotificationQueue.process(endedPollNotification);
processDb(dbQueue);
processObjectStorage(objectStorageQueue);
diff --git a/packages/backend/src/queue/processors/ended-poll-notification.ts b/packages/backend/src/queue/processors/ended-poll-notification.ts
new file mode 100644
index 0000000000..afac27921f
--- /dev/null
+++ b/packages/backend/src/queue/processors/ended-poll-notification.ts
@@ -0,0 +1,33 @@
+import Bull from 'bull';
+import { In } from 'typeorm';
+import { Notes, Polls, PollVotes } from '@/models/index.js';
+import { queueLogger } from '../logger.js';
+import { EndedPollNotificationJobData } from '@/queue/types.js';
+import { createNotification } from '@/services/create-notification.js';
+
+const logger = queueLogger.createSubLogger('ended-poll-notification');
+
+export async function endedPollNotification(job: Bull.Job<EndedPollNotificationJobData>, done: any): Promise<void> {
+ const note = await Notes.findOne(job.data.noteId);
+ if (note == null || !note.hasPoll) {
+ done();
+ return;
+ }
+
+ const votes = await PollVotes.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) {
+ createNotification(userId, 'pollEnded', {
+ noteId: note.id,
+ });
+ }
+
+ done();
+}
diff --git a/packages/backend/src/queue/queues.ts b/packages/backend/src/queue/queues.ts
index 6ac4ec69cf..02df587365 100644
--- a/packages/backend/src/queue/queues.ts
+++ b/packages/backend/src/queue/queues.ts
@@ -1,8 +1,9 @@
import config from '@/config/index.js';
import { initialize as initializeQueue } from './initialize.js';
-import { DeliverJobData, InboxJobData, DbJobData, ObjectStorageJobData } from './types.js';
+import { DeliverJobData, InboxJobData, DbJobData, ObjectStorageJobData, EndedPollNotificationJobData } from './types.js';
export const systemQueue = initializeQueue<Record<string, unknown>>('system');
+export const endedPollNotificationQueue = initializeQueue<EndedPollNotificationJobData>('endedPollNotification');
export const deliverQueue = initializeQueue<DeliverJobData>('deliver', config.deliverJobPerSec || 128);
export const inboxQueue = initializeQueue<InboxJobData>('inbox', config.inboxJobPerSec || 16);
export const dbQueue = initializeQueue<DbJobData>('db');
diff --git a/packages/backend/src/queue/types.ts b/packages/backend/src/queue/types.ts
index de5f5d1396..5191caea4c 100644
--- a/packages/backend/src/queue/types.ts
+++ b/packages/backend/src/queue/types.ts
@@ -1,4 +1,5 @@
import { DriveFile } from '@/models/entities/drive-file.js';
+import { Note } from '@/models/entities/note';
import { User } from '@/models/entities/user.js';
import { IActivity } from '@/remote/activitypub/type.js';
import httpSignature from 'http-signature';
@@ -41,6 +42,10 @@ export type ObjectStorageFileJobData = {
key: string;
};
+export type EndedPollNotificationJobData = {
+ noteId: Note['id'];
+};
+
export type ThinUser = {
id: User['id'];
};