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);
