diff --git a/src/Router.ts b/src/Router.ts index c0c43f9..8df614b 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -70,6 +70,8 @@ router.use( r.get("/info", CourseInformationController.getInformationByUUID); r.get("/info/my", CourseInformationController.getUserCourseInformationByUUID); r.get("/info/training", CourseInformationController.getCourseTrainingInformationByUUID); + r.get("/info/requirements", CourseInformationController.getCourseRequirements); + r.get("/info/requirements/validate", CourseInformationController.validateCourseRequirements); }) ); diff --git a/src/controllers/course/CourseAdminController.ts b/src/controllers/course/CourseAdminController.ts index 94cc477..934eba3 100644 --- a/src/controllers/course/CourseAdminController.ts +++ b/src/controllers/course/CourseAdminController.ts @@ -10,7 +10,7 @@ import { ValidatorType } from "../_validators/ValidatorType"; * Gets all courses */ async function getAll(request: Request, response: Response) { - const courses = await Course.findAll(); + const courses: Course[] = await Course.findAll(); response.send(courses); } diff --git a/src/controllers/course/CourseInformationController.ts b/src/controllers/course/CourseInformationController.ts index 724d35e..0b7a88c 100644 --- a/src/controllers/course/CourseInformationController.ts +++ b/src/controllers/course/CourseInformationController.ts @@ -2,6 +2,7 @@ import { Request, Response } from "express"; import { Course } from "../../models/Course"; import { User } from "../../models/User"; import { TrainingSession } from "../../models/TrainingSession"; +import { ActionRequirement } from "../../models/ActionRequirement"; /** * Returns course information based on the provided uuid (request.query.uuid) @@ -133,8 +134,83 @@ async function getCourseTrainingInformationByUUID(request: Request, response: Re response.send(data?.training_sessions ?? []); } +/** + * Returns the requested course's requirements as an array of strings + * @param request + * @param response + */ +async function getCourseRequirements(request: Request, response: Response) { + const query = request.query as {course_uuid: string}; + const requirements = await _getRequirementsFromCourse(query.course_uuid); + if (requirements == null) { + response.status(404).send(); + return; + } + + response.send(requirements); +} + +async function validateCourseRequirements(request: Request, response: Response) { + const query = request.query as {course_uuid: string}; + const requirements = await _getRequirementsFromCourse(query.course_uuid); + if (requirements == null) { + response.status(404).send(); + return; + } + + let req_ids_satisfied = new Map; + for (const req of requirements) { + // do logic... + + // if yes: + if (!req_ids_satisfied.has(req.req_id) || req_ids_satisfied.get(req.req_id)) { + req_ids_satisfied.set(req.req_id, true); + } + + // if no: + //req_ids_satisfied.set(req.req_id, false); + } + + let ids: number[] = []; + req_ids_satisfied.forEach((value, key) => { + if (value) { + ids.push(key); + } + }); + + response.send(ids); +} + +async function _getRequirementsFromCourse(courseUUID: string) { + const course = await Course.findOne({ + where: { + uuid: courseUUID + }, + include: [{ + association: Course.associations.action_requirements + }] + }); + + if (course == null) { + return null; + } + + const actionRequirements = course.action_requirements?.filter((actionRequirement: ActionRequirement) => actionRequirement.type == "requirement"); + let actions: { action: string, req_id: number }[] = []; + + actionRequirements?.forEach((actionRequirement: ActionRequirement) => { + actionRequirement.action.forEach((s) => { + actions.push({action: s, req_id: actionRequirement.id}); + }) + }); + + return actions; +} + export default { getInformationByUUID, getUserCourseInformationByUUID, getCourseTrainingInformationByUUID, + getCourseRequirements, + validateCourseRequirements };