export async function waitForAllModerationCompletions()

in projects/deliberation_at_scale/packages/orchestrator/src/lib/graphileWorker.ts [67:120]


export async function waitForAllModerationCompletions(options: AllCompletionsWaitOptions) {
    const { jobs, timeoutMs } = options;

    return Promise.allSettled(jobs.map((job) => {
        const jobId = job.id;

        return new Promise<ModerationCompletionTuple>((resolve, reject) => {
            waitForSingleJobCompletion({
                job,
                timeoutMs,
            }).then((job) => {
                const { key: jobKey, run_at: runAt } = job ?? {};
                const jobRunnedAt = dayjs(runAt).toISOString();

                if (!job || !jobKey || !runAt) {
                    reject(`No job key or run at found for job ${jobId}`);
                    return;
                }

                supabaseClient.from("moderations")
                    .select()
                    .eq('active', true)
                    .eq("job_key", jobKey)
                    .gt("completed_at", jobRunnedAt)
                    .order("created_at", { ascending: false })
                    .limit(1)
                    .then((result) => {
                        const { data: moderations, error } = result;
                        const moderation = moderations?.[0];
                        const isValidModeration = !!moderation;

                        // guard: check for error
                        if (error) {
                            reject(error);
                            return;
                        }

                        // guard: check if a moderation was found
                        if (!isValidModeration) {
                            reject(`No completed moderation found for job key ${jobKey}`);
                            return;
                        }

                        resolve({
                            job,
                            moderation,
                        });
                    });
            }).catch((error) => {
                reject(error);
            });
        });
    }));
}