36 lines
1.3 KiB
JavaScript
36 lines
1.3 KiB
JavaScript
import { Notes, PollVotes } from "../../models/index.js";
|
|
import { createNotification } from "../../services/create-notification.js";
|
|
import { deliverQuestionUpdate } from "../../services/note/polls/update.js";
|
|
import { createQueue } from "./index.js";
|
|
async function process(job) {
|
|
if (job.data == null || Object.keys(job.data).length === 0) {
|
|
job.opts.removeOnComplete = true;
|
|
return "skip: corrupt job";
|
|
}
|
|
const note = await Notes.findOneBy({
|
|
id: job.data.noteId
|
|
});
|
|
if (note == null || !note.hasPoll) {
|
|
return "skip: note not found";
|
|
}
|
|
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", {
|
|
note: note,
|
|
noteId: note.id
|
|
});
|
|
}
|
|
// Broadcast the poll result once it ends
|
|
if (!note.localOnly) await deliverQuestionUpdate(note.id);
|
|
return "complete";
|
|
}
|
|
export const [endedPollNotificationQueue, endedPollNotificationInit] = createQueue("endedPollNotification", process);
|