Skip to content

Commit

Permalink
mentor: delete planned training session
Browse files Browse the repository at this point in the history
  • Loading branch information
ngoerlitz committed Aug 19, 2023
1 parent 29413f1 commit 828913e
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/Router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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");
})
);
Expand Down
63 changes: 58 additions & 5 deletions src/controllers/training-session/TrainingSessionAdminController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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: {
Expand All @@ -38,7 +41,7 @@ async function createTrainingSession(request: Request, response: Response) {
});

if (course == null) {
response.sendStatus(500);
response.sendStatus(HttpStatusCode.BadRequest);
return;
}

Expand All @@ -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;
}

Expand All @@ -65,7 +68,7 @@ async function createTrainingSession(request: Request, response: Response) {
});

if (trainingSession == null) {
response.sendStatus(500);
response.sendStatus(HttpStatusCode.InternalServerError);
return;
}

Expand Down Expand Up @@ -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
};
3 changes: 3 additions & 0 deletions src/core/Config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down

0 comments on commit 828913e

Please sign in to comment.