diff --git a/backend/src/controllers/study-plan.js b/backend/src/controllers/study-plan.js index 50d1187e73e634f2b1ea480cbe7ea82efe53453e..9a7d7148d4b348beae6b6b96d636f4b46c1884b4 100644 --- a/backend/src/controllers/study-plan.js +++ b/backend/src/controllers/study-plan.js @@ -8,8 +8,6 @@ const { const { createStudyPlan, - countTotalCredits, - checkClassAvailability, getStudyPlan, updateStudyPlan, } = require('../util/db/study-plan'); @@ -60,15 +58,10 @@ exports.createStudyPlanData = async (req, res) => { notes, }; - let creditsTotal = 0; if (studyPlanCourses) { - await checkClassAvailability(semester, startYear, studyPlanCourses); - creditsTotal = await countTotalCredits(studyPlanCourses); newStudyPlan['studyPlanCourses'] = studyPlanCourses; } - newStudyPlan['creditsTotal'] = creditsTotal; - const studyPlans = await createStudyPlan(newStudyPlan); res.json(studyPlans); } catch (error) { diff --git a/backend/src/hooks/study-plan.js b/backend/src/hooks/study-plan.js index 0baefb5c141372ca1e1b8bc079ed254320346573..ec9f38d467baaaf81bd296789260fe1d66889b47 100644 --- a/backend/src/hooks/study-plan.js +++ b/backend/src/hooks/study-plan.js @@ -5,6 +5,7 @@ const { StudyPlanStatusEnum } = require('../enums/index'); const { calculateTotalCredits, deleteCurrentMeetingAttendances, + checkClassAvailability, } = require('../util/hook'); const { generateCourseClassMeetingAttendances } = require('../util/common'); @@ -20,6 +21,10 @@ StudyPlan.beforeUpdate(async (studyPlan) => { ); }); +StudyPlan.afterValidate(async (studyPlan) => { + await checkClassAvailability(studyPlan.semester, studyPlan.startYear, studyPlan.studyPlanCourses); +}); + StudyPlan.afterCreate(async (studyPlan) => { if (studyPlan.status === StudyPlanStatusEnum.FINAL) { await generateCourseClassMeetingAttendances(studyPlan); diff --git a/backend/src/middleware/study-plan.js b/backend/src/middleware/study-plan.js index 07427e6677b366eb054256a4cc17f061dfa0e333..a2e6962d34187edcaa7dd617b1446b99c833ee51 100644 --- a/backend/src/middleware/study-plan.js +++ b/backend/src/middleware/study-plan.js @@ -10,6 +10,9 @@ const { RequiredParameterUndefinedError, NotExistError, } = require('../util/error'); +const { + checkClassAvailability +} = require('../util/hook'); const getStudyPlanMiddleware = async (req, res, next) => { const { @@ -94,6 +97,7 @@ const updateStudyPlanMiddleware = async (req, res, next) => { } if (studyPlanCourses) { + await checkClassAvailability(studyPlan.semester, studyPlan.startYear, studyPlanCourses); changeset.studyPlanCourses = studyPlanCourses; } @@ -104,7 +108,10 @@ const updateStudyPlanMiddleware = async (req, res, next) => { } catch (error) { if (error instanceof NotExistError) { handleRequestWithResourceItemNotFound(res, error); - } else if (error instanceof RequiredParameterUndefinedError) { + } else if ( + error instanceof RequiredParameterUndefinedError || + error instanceof ClassUnavailableError + ) { handleRequestWithInvalidRequestBody(res, error); } else { handleRequestWithInternalServerError(res, error); diff --git a/backend/src/test/studyplan.controller.test.js b/backend/src/test/studyplan.controller.test.js index 06d5cfc8863ebca9573c29e31f5d869726260274..ea5c6980db3bef717733f386a99ca77d0eca957b 100644 --- a/backend/src/test/studyplan.controller.test.js +++ b/backend/src/test/studyplan.controller.test.js @@ -50,6 +50,7 @@ const SEMESTER_UNDEFINED_ERROR = 'Undefined semester'; describe('Study Plan Test', () => { let availableCourseClass, + availableCourseClassEven, unavailableCourseClass, student, studyPlan, @@ -90,6 +91,14 @@ describe('Study Plan Test', () => { lecturerId: lecturer.id, }); + availableCourseClassEven = await CourseClass.create({ + startYear: START_YEAR, + status: CourseClassStatusEnum.OPEN, + semester: SemesterEnum.EVEN, + courseId: course.id, + lecturerId: lecturer.id, + }); + unavailableCourseClass = await CourseClass.create({ startYear: START_YEAR, status: CourseClassStatusEnum.CLOSED, @@ -107,7 +116,7 @@ describe('Study Plan Test', () => { studyPlanCourse = await StudyPlanCourse.create({ studyPlanId: studyPlan.id, - courseClassId: availableCourseClass.id, + courseClassId: availableCourseClassEven.id, }); }); diff --git a/backend/src/util/db/study-plan.js b/backend/src/util/db/study-plan.js index 3999622a52fa2311a73832acd3a15d01cf44a5f1..ad671bcc79f01af118c118105ae46e1684bb6d47 100644 --- a/backend/src/util/db/study-plan.js +++ b/backend/src/util/db/study-plan.js @@ -6,11 +6,8 @@ const { CourseClass, } = require('../../models/index'); -const { CourseClassStatusEnum } = require('../../enums/index'); - const { NotExistError, - ClassUnavailableError, StudyPlanExistError, } = require('../error'); @@ -59,23 +56,6 @@ const countTotalCredits = async (courses) => { return total; }; -const checkClassAvailability = async (semester, startYear, courses) => { - for (const studyPlanCourse of courses) { - const courseClass = await CourseClass.findOne({ - where: { id: studyPlanCourse.courseClassId }, - }); - - if (!courseClass) throw new ClassUnavailableError(); - - if ( - semester !== courseClass.semester || - startYear !== courseClass.startYear || - courseClass.status === CourseClassStatusEnum.CLOSED - ) - throw new ClassUnavailableError(); - } -}; - const updateStudyPlan = async (studyPlan, changeset) => { const { studyPlanCourses } = changeset; @@ -136,7 +116,6 @@ module.exports = { getStudyPlan, createStudyPlan, countTotalCredits, - checkClassAvailability, updateStudyPlan, getStudyPlanCourse, updateStudyPlanCourse, diff --git a/backend/src/util/hook.js b/backend/src/util/hook.js index 9660ce13ef3de5d339ada1b46dae603080a8c809..b46aaeb0cd56b5eeb80fe13b5251986290d1a5d1 100644 --- a/backend/src/util/hook.js +++ b/backend/src/util/hook.js @@ -8,6 +8,12 @@ const { CourseClassMeetingAttendance, } = require('../models/index'); +const { CourseClassStatusEnum } = require('../enums/index'); + +const { + ClassUnavailableError, +} = require('./error'); + const calculateTotalCredits = async (studyPlanCourses) => { let totalCredits = 0; @@ -59,8 +65,28 @@ const deleteCurrentMeetingAttendances = async (studyPlan) => { } }; +const checkClassAvailability = async (semester, startYear, courses) => { + if (courses) { + for (const studyPlanCourse of courses) { + const courseClass = await CourseClass.findOne({ + where: { id: studyPlanCourse.courseClassId }, + }); + + if (!courseClass) throw new ClassUnavailableError(); + + if ( + semester !== courseClass.semester || + startYear !== courseClass.startYear || + courseClass.status === CourseClassStatusEnum.CLOSED + ) + throw new ClassUnavailableError(); + } + } +}; + module.exports = { calculateTotalCredits, deleteCurrentMeetings, deleteCurrentMeetingAttendances, + checkClassAvailability };