From c01e618a561f5939ee6bdcd2e31a64e922f1addc Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Mon, 10 Mar 2025 18:11:28 -0700 Subject: [PATCH] CHanged Event admin layout --- apps/hub-server/.env.example | 6 +- apps/hub-server/modules/chron.ts | 27 +- apps/hub-server/modules/event.ts | 15 +- .../mail-templates/CourseCompleted.tsx | 21 + apps/hub-server/modules/mail.ts | 59 ++ apps/hub-server/package.json | 6 +- apps/hub-server/tsconfig.json | 19 +- .../event/_components/AppointmentModal.tsx | 199 +++---- .../(app)/admin/event/_components/Form.tsx | 72 ++- .../event/_components/ParticipantModal.tsx | 66 +++ .../app/(app)/events/_components/modalBtn.tsx | 9 +- apps/hub/app/_components/PaginatedTable.tsx | 28 +- apps/hub/app/api/user/route.ts | 7 +- apps/hub/package.json | 1 + docker-compose.dev.yml | 13 + package-lock.json | 538 +++++++++++++++++- packages/database/prisma/schema/event.prisma | 2 +- 17 files changed, 918 insertions(+), 170 deletions(-) create mode 100644 apps/hub-server/modules/mail-templates/CourseCompleted.tsx create mode 100644 apps/hub-server/modules/mail.ts create mode 100644 apps/hub/app/(app)/admin/event/_components/ParticipantModal.tsx diff --git a/apps/hub-server/.env.example b/apps/hub-server/.env.example index 67a41c4e..7780c708 100644 --- a/apps/hub-server/.env.example +++ b/apps/hub-server/.env.example @@ -1,2 +1,6 @@ MOODLE_TOKEN= -MOODLE_URL= \ No newline at end of file +MOODLE_URL= +MAIL_SERVER= +MAIL_USER= +MAIL_PASSWORD= +MAIL_PORT= \ No newline at end of file diff --git a/apps/hub-server/modules/chron.ts b/apps/hub-server/modules/chron.ts index 52350462..e07208c4 100644 --- a/apps/hub-server/modules/chron.ts +++ b/apps/hub-server/modules/chron.ts @@ -2,6 +2,8 @@ import { getMoodleCourseCompletionStatus, getMoodleUserById } from "./moodle"; import { CronJob } from "cron"; import { prisma } from "@repo/db"; import { eventCompleted } from "@repo/ui/helper"; +import { sendCourseCompletedEmail } from "modules/mail"; +import { handleParticipantFinished } from "modules/event"; const syncMoodleIds = async () => { try { @@ -57,7 +59,7 @@ const updateParticipantMoodleResults = async () => { ); if (quizzResult?.completionstatus?.completed === true) { - await prisma.participant.update({ + return prisma.participant.update({ where: { id: p.id, }, @@ -65,7 +67,7 @@ const updateParticipantMoodleResults = async () => { finisherMoodleCurseCompleted: true, statusLog: { push: { - event: "Finisher course completed", + event: "Moodle-Kurs abgeschlossen", timestamp: new Date(), user: "system", }, @@ -77,33 +79,40 @@ const updateParticipantMoodleResults = async () => { ); }; -export const checkedFinishedParticipants = async () => { +export const checkFinishedParticipants = async () => { + console.log("Checking finished participants"); const participantsPending = await prisma.participant.findMany({ where: { - finished: false, + completetionWorkflowFinished: false, }, include: { Event: true, User: true, }, }); - participantsPending.forEach(async (p) => { if (!p.User) return; - if (!p.User.moodleId) return; - const completed = eventCompleted(p.Event, p); + + if (!completed) return; + handleParticipantFinished(p.Event, p, p.User); }); }; CronJob.from({ cronTime: "0 * * * *", onTick: syncMoodleIds, start: true }); CronJob.from({ - cronTime: "*/5 * * * *", + cronTime: "*/1 * * * *", onTick: async () => { console.log("Updating participant moodle results"); await updateParticipantMoodleResults(); + await checkFinishedParticipants(); }, start: true, }); -updateParticipantMoodleResults(); +const debug = async () => { + await updateParticipantMoodleResults(); + await checkFinishedParticipants(); +}; + +debug(); diff --git a/apps/hub-server/modules/event.ts b/apps/hub-server/modules/event.ts index 53c6a16b..94b100fe 100644 --- a/apps/hub-server/modules/event.ts +++ b/apps/hub-server/modules/event.ts @@ -1,4 +1,5 @@ import { Event, Participant, prisma, User } from "@repo/db"; +import { sendCourseCompletedEmail } from "modules/mail"; export const handleParticipantFinished = async ( event: Event, @@ -11,9 +12,6 @@ export const handleParticipantFinished = async ( }, }); - //TODO: Send Discord Message - //TODO: Send Email - await prisma.user.update({ where: { id: user.id, @@ -22,19 +20,24 @@ export const handleParticipantFinished = async ( badges: { push: event.finishedBadges, }, - permissions: event.finishedPermissions, + permissions: { + push: event.finishedPermissions, + }, }, }); + //TODO: Send Discord Message + await sendCourseCompletedEmail(user.email, user, event); + await prisma.participant.update({ where: { id: participant.id, }, data: { - finished: true, + completetionWorkflowFinished: true, statusLog: { push: { - event: "Event finished", + event: "Berechtigungen und Badges vergeben", timestamp: new Date(), user: "system", }, diff --git a/apps/hub-server/modules/mail-templates/CourseCompleted.tsx b/apps/hub-server/modules/mail-templates/CourseCompleted.tsx new file mode 100644 index 00000000..0e4bd22f --- /dev/null +++ b/apps/hub-server/modules/mail-templates/CourseCompleted.tsx @@ -0,0 +1,21 @@ +import * as React from "react"; +import { Event, User } from "@repo/db"; + +import { Html, Button, render } from "@react-email/components"; + +const Template = ({ event, user }: { user: User; event: Event }) => ( + +

You completed the Course {event.name}

+

Congratulation

+ +); + +export function renderCourseCompleted({ + user, + event, +}: { + user: User; + event: Event; +}) { + return render(