Files
var-monorepo/apps/hub-server/modules/chron.ts
2025-02-25 00:45:36 +01:00

101 lines
2.3 KiB
TypeScript

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