import { getMoodleCourseCompletionStatus, getMoodleUserById } from "./moodle"; import { CronJob } from "cron"; import { prisma } from "@repo/db"; const syncMoodleIds = async () => { try { const user = await prisma.user.findMany({ where: { moodleId: null, }, }); await Promise.all( user.map(async (u) => { const moodleUser = await getMoodleUserById(u.id.toString()); const moodleId = moodleUser?.id.toString(); if (u.moodleId === parseInt(moodleId)) return; await prisma.user.update({ where: { id: u.id, }, data: { moodleId: parseInt(moodleId), }, }); }), ); } catch (error) { console.error(error); } }; const updateParticipantMoodleResults = (usage: "starter" | "finisher") => async () => { const participantsMoodlePending = await prisma.participant.findMany({ where: { [usage === "starter" ? "starterMoodleCourseCompleted" : "finisherMoodleCourseCompleted"]: false, Event: { [usage === "starter" ? "starterMoodleCourseId" : "finisherMoodleCourseId"]: { not: null, }, }, }, select: { id: true, Event: true, User: true, }, }); await Promise.all( participantsMoodlePending.map(async (p) => { if (!p.User) return; if (!p.User.moodleId) return; const quizzResult = await getMoodleCourseCompletionStatus( p.User.moodleId.toString(), p.Event[ usage === "starter" ? "starterMoodleCourseId" : "finisherMoodleCourseId" ]!, ); p.Event.finisherMoodleCourseId; if (quizzResult?.completionstatus?.completed === true) { await prisma.participant.update({ where: { id: p.id, }, data: { [usage === "starter" ? "starterMoodleCurseCompleted" : "finisherMoodleCurseCompleted"]: true, statusLog: { push: { event: "Starter course completed", timestamp: new Date(), user: "system", }, }, }, }); } }), ); }; CronJob.from({ cronTime: "0 * * * *", onTick: syncMoodleIds, start: true }); CronJob.from({ cronTime: "*/5 * * * *", onTick: async () => { await updateParticipantMoodleResults("starter"); await updateParticipantMoodleResults("finisher"); }, start: true, });