From 828913efd2f94314bdae18dcc8cc1e2aa98c76f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20G=C3=B6rlitz?= Date: Sat, 19 Aug 2023 12:50:34 +0200 Subject: [PATCH] mentor: delete planned training session --- src/Router.ts | 1 + .../TrainingSessionAdminController.ts | 63 +++++++++++++++++-- src/core/Config.ts | 3 + 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/Router.ts b/src/Router.ts index 0ab1c3d..45ba157 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -157,6 +157,7 @@ router.use( "/training-session", routerGroup((r: Router) => { r.put("/training", TrainingSessionAdminController.createTrainingSession); + r.delete("/training", TrainingSessionAdminController.deleteTrainingSession); // TODO r.put("/lesson"); }) ); diff --git a/src/controllers/training-session/TrainingSessionAdminController.ts b/src/controllers/training-session/TrainingSessionAdminController.ts index 043ebe3..da876f1 100644 --- a/src/controllers/training-session/TrainingSessionAdminController.ts +++ b/src/controllers/training-session/TrainingSessionAdminController.ts @@ -7,6 +7,9 @@ import { generateUUID } from "../../utility/UUID"; import dayjs from "dayjs"; import { TrainingRequest } from "../../models/TrainingRequest"; import { TrainingSessionBelongsToUsers } from "../../models/through/TrainingSessionBelongsToUsers"; +import { HttpStatusCode } from "axios"; +import NotificationLibrary from "../../libraries/notification/NotificationLibrary"; +import { Config } from "../../core/Config"; /** * Creates a new training session with one user and one mentor @@ -28,7 +31,7 @@ async function createTrainingSession(request: Request, response: Response) { } // 1. Find out which of these users is actually enrolled in the course. To do this, query the course and it's members, and check against the array of user_ids. Create a new actual array with only those people - // that are actually enroled in this course. + // that are actually enrolled in this course. let courseParticipants: number[] = []; const course = await Course.findOne({ where: { @@ -38,7 +41,7 @@ async function createTrainingSession(request: Request, response: Response) { }); if (course == null) { - response.sendStatus(500); + response.sendStatus(HttpStatusCode.BadRequest); return; } @@ -50,7 +53,7 @@ async function createTrainingSession(request: Request, response: Response) { }); if (courseParticipants.length == 0) { - response.status(400).send({ error: "No specified user was a member of this course." }); + response.status(HttpStatusCode.BadRequest).send({ error: "No specified user was a member of this course." }); return; } @@ -65,7 +68,7 @@ async function createTrainingSession(request: Request, response: Response) { }); if (trainingSession == null) { - response.sendStatus(500); + response.sendStatus(HttpStatusCode.InternalServerError); return; } @@ -103,9 +106,59 @@ async function createTrainingSession(request: Request, response: Response) { }); } - response.send(data.user_ids); + response.send(trainingSession); +} + +/** + * Deletes a training session by a mentor + * All users that are participants of this course are placed back in the queue + */ +async function deleteTrainingSession(request: Request, response: Response) { + const user: User = request.body.user; + const data = request.body as {training_session_id: number}; + + const session = await TrainingSession.findOne({ + where: { + id: data.training_session_id, + mentor_id: user.id, + }, + include: [TrainingSession.associations.users, TrainingSession.associations.course] + }); + + if (session == null) { + response.sendStatus(HttpStatusCode.BadRequest); + return; + } + + session.users?.forEach((participant) => { + NotificationLibrary.sendUserNotification({ + user_id: participant.id, + author_id: user.id, + message_de: `Deine Session im Kurs ${session.course?.name} am ${dayjs.utc(session.date).format(Config.DATE_FORMAT)} wurde gelöscht. Dein Request wurde wieder in der Warteliste plaziert.`, + message_en: `Your Session in the course ${session.course?.name} on ${dayjs.utc(session.date).format(Config.DATE_FORMAT)} was deleted. Your Request was placed in the waiting list.`, + severity: "danger", + icon: "alert-triangle" + }); + }); + + // Update training requests to reflect the now non-existent session + await TrainingRequest.update({ + status: "requested", + training_session_id: null + }, { + where: { + training_session_id: session.id + } + }); + + // Destroying the session also destroys the related training_session_belongs_to_users + // entries with this course, due to their foreign relationships + await session.destroy(); + + response.sendStatus(HttpStatusCode.NoContent); } export default { createTrainingSession, + deleteTrainingSession }; diff --git a/src/core/Config.ts b/src/core/Config.ts index ef49de9..b015afb 100644 --- a/src/core/Config.ts +++ b/src/core/Config.ts @@ -81,6 +81,9 @@ export const Config = { HOST: process.env.DB_HOST, PORT: Number(process.env.DB_PORT), }, + + DATE_FORMAT: "DD.MM.YYYY", + DATETIME_FORMAT: "DD.MM.YYYY HH:mm", }; export const SequelizeConfig: Options = {