Skip to content

Commit

Permalink
start controller refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
ngoerlitz committed Aug 30, 2023
1 parent 916643f commit 0ec83d7
Show file tree
Hide file tree
Showing 13 changed files with 473 additions and 173 deletions.
14 changes: 14 additions & 0 deletions misc/Permissions.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
############
## COURSE ##
############
COURSE.CREATE
COURSE.UPDATE

##########
## Tech ##
##########
TECH.SYSLOG.VIEW
TECH.PERMISSIONS.VIEW
TECH.ROLES.VIEW
...

22 changes: 12 additions & 10 deletions src/Router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import UserInformationAdminController from "./controllers/user/UserInformationAd
import UserNoteAdminController from "./controllers/user/UserNoteAdminController";
import UserController from "./controllers/user/UserAdminController";
import TrainingRequestAdminController from "./controllers/training-request/TrainingRequestAdminController";
import CourseAdministrationController from "./controllers/course/CourseAdminController";
import CourseAdminController from "./controllers/course/CourseAdminController";
import CourseInformationAdministrationController from "./controllers/course/CourseInformationAdminController";
import SkillTemplateAdministrationController from "./controllers/skill-template/SkillTemplateAdminController";
import TrainingTypeAdministrationController from "./controllers/training-type/TrainingTypeAdminController";
Expand All @@ -30,6 +30,7 @@ import TrainingSessionController from "./controllers/training-session/TrainingSe
import UserCourseAdminController from "./controllers/user/UserCourseAdminController";
import SessionController from "./controllers/login/SessionController";
import UserSettingsController from "./controllers/user/UserSettingsController";
import CourseAdministrationController from "./controllers/course/CourseAdministrationController";

const routerGroup = (callback: (router: Router) => void) => {
const router = Router();
Expand Down Expand Up @@ -175,25 +176,27 @@ router.use(
r.use(
"/course",
routerGroup((r: Router) => {
r.get("/", CourseAdministrationController.getAll);
r.put("/", CourseAdministrationController.create);
r.post("/", CourseAdministrationController.createCourse);
r.patch("/", CourseAdministrationController.updateCourse);

r.get("/mentorable", CourseAdministrationController.getMentorable);
r.get("/editable", CourseAdministrationController.getEditable);
// TODO: REFACTOR THIS INTO THE COURSEADMINISTRATIONCONTROLLER!
r.get("/", CourseAdminController.getAll);

r.get("/info/", CourseInformationAdministrationController.getByUUID);
r.get("/mentorable", CourseAdminController.getMentorable);
r.get("/editable", CourseAdminController.getEditable);

r.get("/info", CourseInformationAdministrationController.getByUUID);
r.get("/info/mentor-group", CourseInformationAdministrationController.getMentorGroups);

r.get("/info/user", CourseInformationAdministrationController.getUsers);
r.patch("/info/update", CourseInformationAdministrationController.update);
r.delete("/info/user", CourseInformationAdministrationController.deleteUser);
r.put("/info/mentor-group", CourseInformationAdministrationController.addMentorGroup);
r.delete("/info/mentor-group", CourseInformationAdministrationController.deleteMentorGroup);
})
);

r.use(
"/course-skill-template",
"/skill-template",
routerGroup((r: Router) => {
r.get("/", SkillTemplateAdministrationController.getAll);
})
Expand Down Expand Up @@ -234,11 +237,10 @@ router.use(
r.use(
"/mentor-group",
routerGroup((r: Router) => {
r.get("/", MentorGroupAdministrationController.getAll);
r.post("/", MentorGroupAdministrationController.create);
r.patch("/", MentorGroupAdministrationController.update);

r.get("/", MentorGroupAdministrationController.getAll);

r.get("/admin", MentorGroupAdministrationController.getAllAdmin);
r.get("/members", MentorGroupAdministrationController.getMembers);
r.put("/member", MentorGroupAdministrationController.addMember);
Expand Down
37 changes: 21 additions & 16 deletions src/controllers/course/CourseAdminController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import CourseAdminValidator from "../_validators/CourseAdminValidator";
import { ValidatorType } from "../_validators/ValidatorType";
import { HttpStatusCode } from "axios";
import { TrainingType } from "../../models/TrainingType";
import _CourseInformationAdminValidator from "./_CourseInformationAdmin.validator";

// DEPRECATED
// TODO REMOVE THIS CONTROLLER --> CourseAdministrationController

/**
* Gets all courses
Expand Down Expand Up @@ -69,38 +73,39 @@ async function getEditable(request: Request, response: Response) {
* Creates a new course
*/
async function create(request: Request, response: Response) {
const data = request.body.data as {
const user = request.body.user;
const data = request.body as {
course_uuid: string;
name_de: string;
name_en: string;
description_de: string;
description_en: string;
active: string;
self_enrol: string;
training_id: string;
active: boolean;
self_enrol_enabled: boolean;
training_type_id: string;
skill_template_id: string;
mentor_group_id: string;
};

const validation: ValidatorType = CourseAdminValidator.validateCreateRequest(data);

if (validation.invalid) {
response.status(HttpStatusCode.BadRequest).send({
validation: validation.message,
validation_failed: true,
});
return;
}
// const validation: ValidatorType = _CourseInformationAdminValidator.validateUpdateOrCreateRequest(data);
//
// if (validation.invalid) {
// response.status(HttpStatusCode.BadRequest).send({
// validation: validation.message,
// validation_failed: true,
// });
// return;
// }

const course: Course = await Course.create({
uuid: data.course_uuid,
name: data.name_de,
name_en: data.name_en,
description: data.description_de,
description_en: data.description_en,
is_active: Number(data.active) == 1,
self_enrollment_enabled: Number(data.self_enrol) == 1,
initial_training_type: Number(data.training_id),
is_active: data.active,
self_enrollment_enabled: data.self_enrol_enabled,
initial_training_type: Number(data.training_type_id),
skill_template_id: Number(data.skill_template_id) == 0 || isNaN(Number(data.skill_template_id)) ? null : Number(data.skill_template_id),
});
if (course == null) {
Expand Down
114 changes: 114 additions & 0 deletions src/controllers/course/CourseAdministrationController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import { Request, Response } from "express";
import { User } from "../../models/User";
import _CourseAdministrationValidator from "./_CourseAdministration.validator";
import ValidationHelper from "../../utility/helper/ValidationHelper";
import { Course } from "../../models/Course";
import { MentorGroupsBelongsToCourses } from "../../models/through/MentorGroupsBelongsToCourses";
import { HttpStatusCode } from "axios";

// TODO: Move all course related things into this controller

/**
* The ICourseBody Interface is the type which all requests that wish to create or update a course must satisfy
*/
interface ICourseBody {
course_uuid: string;
name_de: string;
name_en: string;
description_de: string;
description_en: string;
active: boolean;
self_enrol_enabled: boolean;
training_type_id: string;
mentor_group_id: string;
skill_template_id?: string;
}

/**
* Validates and creates a new course based on the request
* @param request
* @param response
*/
async function createCourse(request: Request, response: Response) {
const user: User = request.body.user;
const body: ICourseBody = request.body as ICourseBody;

const validation = _CourseAdministrationValidator.validateUpdateOrCreateRequest(body);
if (validation.invalid) {
ValidationHelper.sendValidationErrorResponse(response, validation);
return;
}

if (!user.hasPermission("course.create") || !(await user.canManageCourseInMentorGroup(Number(body.mentor_group_id)))) {
response.sendStatus(HttpStatusCode.Forbidden);
return;
}

const skillTemplateID = isNaN(Number(body.skill_template_id)) || body.skill_template_id == "-1" ? null : Number(body.skill_template_id);
const course = await Course.create({
uuid: body.course_uuid,
name: body.name_de,
name_en: body.name_en,
description: body.description_de,
description_en: body.description_en,
is_active: body.active,
self_enrollment_enabled: body.self_enrol_enabled,
initial_training_type: Number(body.training_type_id),
skill_template_id: skillTemplateID,
});

await MentorGroupsBelongsToCourses.create({
mentor_group_id: Number(body.mentor_group_id),
course_id: course.id,
can_edit_course: true,
});

response.status(HttpStatusCode.Created).send({ uuid: course.uuid });
}

/**
* Validates and updates a course based on the request
* @param request
* @param response
*/
async function updateCourse(request: Request, response: Response) {
const user: User = request.body.user;
const body: ICourseBody = request.body as ICourseBody;

const validation = _CourseAdministrationValidator.validateUpdateOrCreateRequest(body);
if (validation.invalid) {
ValidationHelper.sendValidationErrorResponse(response, validation);
return;
}

if (!(await user.canEditCourse(body.course_uuid))) {
response.sendStatus(HttpStatusCode.Forbidden);
return;
}

const skillTemplateID = isNaN(Number(body.skill_template_id)) || body.skill_template_id == "-1" ? null : Number(body.skill_template_id);
await Course.update(
{
name: body.name_de,
name_en: body.name_en,
description: body.description_de,
description_en: body.description_en,
is_active: body.active,
self_enrollment_enabled: body.self_enrol_enabled,
initial_training_type: Number(body.training_type_id),
skill_template_id: skillTemplateID,
},
{
where: {
uuid: body.course_uuid,
},
}
);

response.sendStatus(HttpStatusCode.NoContent);
}

export default {
createCourse,
updateCourse,
};
Loading

0 comments on commit 0ec83d7

Please sign in to comment.