diff --git a/backend/.prettierrc.yaml b/backend/.prettierrc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..36c20b0550ab7b8b79351b1aaae4e776828572f7 --- /dev/null +++ b/backend/.prettierrc.yaml @@ -0,0 +1,4 @@ +trailingComma: "all" +tabWidth: 2 +semi: true +singleQuote: true diff --git a/backend/package.json b/backend/package.json index 4d5dabb51e35166cacd7da6c366113d7bda187f8..dc680381c61e6d41337fa5eeffc47610284f0937 100644 --- a/backend/package.json +++ b/backend/package.json @@ -6,7 +6,8 @@ "scripts": { "linux-test": "NODE_ENV=test && ./node_modules/mocha/bin/mocha src/test", "linux-start": "NODE_ENV=development && node src/index.js", - "windows-start": "set NODE_ENV=development && node src/index.js" + "windows-start": "set NODE_ENV=development && node src/index.js", + "prettify": "npx prettier --write \"**/*.js\"" }, "author": "Group B", "license": "MIT", diff --git a/backend/src/controllers/auth.js b/backend/src/controllers/auth.js index c4e9e04e039f9823ba3a3decf20461852d52b1d1..7b0216e0e08ac4529534902f7fe861df12c9fcbe 100644 --- a/backend/src/controllers/auth.js +++ b/backend/src/controllers/auth.js @@ -4,7 +4,6 @@ const saltRounds = require(__dirname + '/../config/hash.json')['saltRounds']; const https = require('https'); const parseString = require('xml2js').parseString; - const User = require('../models/index')['User']; const Lecturer = require('../models/index')['Lecturer']; const Student = require('../models/index')['Student']; @@ -12,7 +11,7 @@ const Student = require('../models/index')['Student']; const { getJWTToken } = require('../util/jwt'); const { getUser } = require('../util/db'); -const hashPassword = async function(req){ +const hashPassword = async function (req) { return new Promise((resolve) => { bcrypt.genSalt(saltRounds, (err, salt) => { bcrypt.hash(req.body.password, salt, (err2, hash) => { @@ -26,64 +25,65 @@ const hashPassword = async function(req){ }); }; -exports.register = async function(req, res) { +exports.register = async function (req, res) { let roles = ['student', 'lecturer']; let newPass = await hashPassword(req); - if (roles.includes(req.body.role)){ + if (roles.includes(req.body.role)) { const [user, created] = await User.findOrCreate({ - where: {email: req.body.email}, - defaults: {hashed_password: newPass.hashed, salt: newPass.salt}, + where: { email: req.body.email }, + defaults: { hashed_password: newPass.hashed, salt: newPass.salt }, }); - if (!created){ + if (!created) { console.log(user.id); - if (req.body.role.toString() === 'student'){ - const [student, studentCreated] = await Student.findOrCreate({where: {userId: user.id}}); + if (req.body.role.toString() === 'student') { + const [student, studentCreated] = await Student.findOrCreate({ + where: { userId: user.id }, + }); if (!studentCreated) { console.log('Student with id:' + student.id + ' exist'); res.status(400); - res.json({status: 400, message: 'Student exist'}); + res.json({ status: 400, message: 'Student exist' }); } else { console.log('Student registered.'); - res.json({status: 200, message: 'Register student successful.'}); + res.json({ status: 200, message: 'Register student successful.' }); } } else { - const [lecturer, lecturerCreated] = await Lecturer.findOrCreate({where: {userId: user.id}}); + const [lecturer, lecturerCreated] = await Lecturer.findOrCreate({ + where: { userId: user.id }, + }); if (!lecturerCreated) { console.log('Lecturer with id:' + lecturer.id + ' exist'); res.status(400); - res.json({status: 400, message: 'Lecturer exist'}); + res.json({ status: 400, message: 'Lecturer exist' }); } else { console.log('Lecturer registered.'); - res.json({status: 200, message: 'Register lecturer successful.'}); + res.json({ status: 200, message: 'Register lecturer successful.' }); } } - } else { - if (req.body.role.toString() === 'student') { - const student = await Student.create({userId: user.id}); + const student = await Student.create({ userId: user.id }); if (student) { console.log('Student registered.'); - res.json({status: 200, message: 'Register student successful.'}); + res.json({ status: 200, message: 'Register student successful.' }); } else { console.log('Student creation failed.'); res.status(500); - res.json({status: 500, message: 'Register student failed.'}); + res.json({ status: 500, message: 'Register student failed.' }); } } else { - const lecturer = await Lecturer.create({userId: user.id}); + const lecturer = await Lecturer.create({ userId: user.id }); if (lecturer) { console.log('Lecturer registered.'); - res.json({status: 200, message: 'Register lecturer successful.'}); + res.json({ status: 200, message: 'Register lecturer successful.' }); } else { console.log('Lecturer creation failed.'); res.status(500); - res.json({status: 500, message: 'Register lecturer failed.'}); + res.json({ status: 500, message: 'Register lecturer failed.' }); } } } - } else { res.status(400); res.json({ @@ -93,19 +93,12 @@ exports.register = async function(req, res) { } }; -exports.verifyUser = async(req, res) => { - const { - email, - password, - } = req.body; +exports.verifyUser = async (req, res) => { + const { email, password } = req.body; try { const user = await getUser(email, password); - const { - id, - email: userEmail, - role, - } = user; + const { id, email: userEmail, role } = user; const tokenElement = { id, @@ -134,44 +127,51 @@ exports.verifyUser = async(req, res) => { } }; -exports.casSSO = async(req, res) => { +exports.casSSO = async (req, res) => { if (req.query.ticket) { - https.get('https://login.itb.ac.id/cas/serviceValidate?ticket=' + req.query.ticket + '&service=' + req.query.service, (resp) => { - let data = ''; - - resp.on('data', (chunk) => { - parseString(chunk, function (err, result) { - data = JSON.parse(JSON.stringify(result).replace(/cas:/g, '')); - }); + https + .get( + 'https://login.itb.ac.id/cas/serviceValidate?ticket=' + + req.query.ticket + + '&service=' + + req.query.service, + (resp) => { + let data = ''; + + resp.on('data', (chunk) => { + parseString(chunk, function (err, result) { + data = JSON.parse(JSON.stringify(result).replace(/cas:/g, '')); + }); + }); + + resp.on('end', () => { + let processedData = {}; + + if (data.serviceResponse.authenticationSuccess) { + let successData = data.serviceResponse.authenticationSuccess[0]; + + processedData = { + username: successData.user[0], + email: successData.attributes[0].mail[0], + nim: successData.attributes[0].itbNIM[0], + prodi: successData.attributes[0].ou[0], + fullName: successData.attributes[0].cn[0], + status: successData.attributes[0].itbStatus[0], + }; + } else { + processedData = { + username: null, + }; + } + + res.json(processedData); + }); + }, + ) + .on('error', (err) => { + console.log('Error: ' + err.message); }); - - resp.on('end', () => { - let processedData = {}; - - if (data.serviceResponse.authenticationSuccess) { - let successData = data.serviceResponse.authenticationSuccess[0]; - - processedData = { - username: successData.user[0], - email: successData.attributes[0].mail[0], - nim: successData.attributes[0].itbNIM[0], - prodi: successData.attributes[0].ou[0], - fullName: successData.attributes[0].cn[0], - status: successData.attributes[0].itbStatus[0] - }; - } else { - processedData = { - username: null - }; - } - - res.json(processedData); - }); - - }).on("error", (err) => { - console.log("Error: " + err.message); - }); } else { - res.json("Invalid ticket"); + res.json('Invalid ticket'); } -}; \ No newline at end of file +}; diff --git a/backend/src/controllers/course-class-meeting.js b/backend/src/controllers/course-class-meeting.js index 731e16ea8675ab208e5534ec62bb25d08e1b5d86..7377f4ab4907a599caafb74700d8e2d3cf0f72d5 100644 --- a/backend/src/controllers/course-class-meeting.js +++ b/backend/src/controllers/course-class-meeting.js @@ -1,59 +1,51 @@ 'use strict'; const { - handleRequestWithInternalServerError, - handleRequestWithResourceItemNotFound, + handleRequestWithInternalServerError, + handleRequestWithResourceItemNotFound, } = require('../util/common'); const { - getCourseClassMeetingById, - getCourseClassMeetingByStudentId, - getCourseClassMeetingByLecturerId, - updateCourseClassMeeting + getCourseClassMeetingById, + getCourseClassMeetingByStudentId, + getCourseClassMeetingByLecturerId, + updateCourseClassMeeting, } = require('../util/db/course-class-meeting'); -const { - NotExistError, -} = require('../util/error'); +const { NotExistError } = require('../util/error'); exports.getCourseClassMeeting = async (req, res) => { - const { - opts, - } = req.body; - - const { - courseClassMeetingId, - studentId, - lecturerId - } = req.query; - - try { - let response; - if (courseClassMeetingId) { - response = await getCourseClassMeetingById(opts); - } else if (studentId) { - response = await getCourseClassMeetingByStudentId(opts); - } else if (lecturerId) { - response = await getCourseClassMeetingByLecturerId(opts); - } - - res.json(response); - } catch (error) { - if (error instanceof NotExistError) { - handleRequestWithResourceItemNotFound(res, error); - } else { - handleRequestWithInternalServerError(res, error); - } + const { opts } = req.body; + + const { courseClassMeetingId, studentId, lecturerId } = req.query; + + try { + let response; + if (courseClassMeetingId) { + response = await getCourseClassMeetingById(opts); + } else if (studentId) { + response = await getCourseClassMeetingByStudentId(opts); + } else if (lecturerId) { + response = await getCourseClassMeetingByLecturerId(opts); + } + + res.json(response); + } catch (error) { + if (error instanceof NotExistError) { + handleRequestWithResourceItemNotFound(res, error); + } else { + handleRequestWithInternalServerError(res, error); } + } }; exports.updateCourseClassMeeting = async (req, res) => { try { - const { - courseClassMeeting, - changeset - } = req.body; + const { courseClassMeeting, changeset } = req.body; - const updatedCourseClassMeeting = await updateCourseClassMeeting(courseClassMeeting, changeset); + const updatedCourseClassMeeting = await updateCourseClassMeeting( + courseClassMeeting, + changeset, + ); res.json(updatedCourseClassMeeting); } catch (error) { handleRequestWithInternalServerError(res, error); diff --git a/backend/src/controllers/course.js b/backend/src/controllers/course.js index 31cdf3b6bf5c15b9366ea740406b7bf82ac187a4..21f85a859066fa1c7b541b2c81e48c8bc6edd956 100644 --- a/backend/src/controllers/course.js +++ b/backend/src/controllers/course.js @@ -1,41 +1,35 @@ -const { - Course, - Major, - Faculty -} = require('../models/index'); +const { Course, Major, Faculty } = require('../models/index'); const { - handleRequestWithInvalidRequestBody, - handleRequestWithResourceItemNotFound + handleRequestWithInvalidRequestBody, + handleRequestWithResourceItemNotFound, } = require('../util/common'); -const { - NotExistError -} = require('../util/error'); +const { NotExistError } = require('../util/error'); -exports.getAllCourseData = async(req, res) => { - let courses = await Course.findAll(); - res.json(courses); +exports.getAllCourseData = async (req, res) => { + let courses = await Course.findAll(); + res.json(courses); }; -exports.getCourseData = async(req, res) => { - const foundCourse = await Course.findOne({ - where: { - id: req.params.id, - }, - include: [ - { - model: Major, - include: Faculty, - }, - ], - }).catch(err => { - handleRequestWithInvalidRequestBody(res, err); - }); +exports.getCourseData = async (req, res) => { + const foundCourse = await Course.findOne({ + where: { + id: req.params.id, + }, + include: [ + { + model: Major, + include: Faculty, + }, + ], + }).catch((err) => { + handleRequestWithInvalidRequestBody(res, err); + }); - if (foundCourse){ - res.json(foundCourse); - } else { - handleRequestWithResourceItemNotFound(res, new NotExistError()); - } + if (foundCourse) { + res.json(foundCourse); + } else { + handleRequestWithResourceItemNotFound(res, new NotExistError()); + } }; diff --git a/backend/src/controllers/courseclass.js b/backend/src/controllers/courseclass.js index 74cdba2055076adcccdc58a69a3534b4e529be4a..ce36df6c05a4e739ec60e355b4e585402f59dbbf 100644 --- a/backend/src/controllers/courseclass.js +++ b/backend/src/controllers/courseclass.js @@ -1,43 +1,41 @@ 'use strict'; const { - handleRequestWithInvalidRequestBody, - handleRequestWithInternalServerError, - handleRequestWithResourceItemNotFound, -} = require("../util/common"); + handleRequestWithInvalidRequestBody, + handleRequestWithInternalServerError, + handleRequestWithResourceItemNotFound, +} = require('../util/common'); const { getCourseClass, createCourseClass, - updateCourseClass + updateCourseClass, } = require('../util/db/course-class'); -const { - NotExistError, -} = require("../util/error"); +const { NotExistError } = require('../util/error'); -exports.getCourseClassData = async(req, res) => { - let getMany = true; +exports.getCourseClassData = async (req, res) => { + let getMany = true; - if (req.params.id) { - getMany = false; - } + if (req.params.id) { + getMany = false; + } - try { - const courseClasses = await getCourseClass(req, getMany); - res.json(courseClasses); - } catch (error){ - console.error(error); + try { + const courseClasses = await getCourseClass(req, getMany); + res.json(courseClasses); + } catch (error) { + console.error(error); - if (error instanceof NotExistError) { - handleRequestWithResourceItemNotFound(res, error); - } else { - handleRequestWithInternalServerError(res, error); - } + if (error instanceof NotExistError) { + handleRequestWithResourceItemNotFound(res, error); + } else { + handleRequestWithInternalServerError(res, error); } + } }; -exports.createCourseClassData = async(req, res) => { +exports.createCourseClassData = async (req, res) => { const { courseId, lecturerId, @@ -46,7 +44,7 @@ exports.createCourseClassData = async(req, res) => { participantCount, semester, status, - courseClassDefaultSchedules + courseClassDefaultSchedules, } = req.body; const newCourseClass = { @@ -57,7 +55,7 @@ exports.createCourseClassData = async(req, res) => { participantCount, semester, status, - courseClassDefaultSchedules + courseClassDefaultSchedules, }; try { @@ -70,15 +68,12 @@ exports.createCourseClassData = async(req, res) => { }; exports.updateCourseClass = async (req, res) => { - try { - const { - courseClass, - changeset - } = req.body; + try { + const { courseClass, changeset } = req.body; - const updatedStudyPlan = await updateCourseClass(courseClass, changeset); - res.json(updatedStudyPlan); - } catch (error) { - handleRequestWithInternalServerError(res, error); - } -}; \ No newline at end of file + const updatedStudyPlan = await updateCourseClass(courseClass, changeset); + res.json(updatedStudyPlan); + } catch (error) { + handleRequestWithInternalServerError(res, error); + } +}; diff --git a/backend/src/controllers/faculty.js b/backend/src/controllers/faculty.js index f2d69a609c6869a3defd89cf870267c8b65c5228..61961e2434a9a596187a36e24df83e5056410181 100644 --- a/backend/src/controllers/faculty.js +++ b/backend/src/controllers/faculty.js @@ -1,6 +1,6 @@ const Faculty = require('../models/index')['Faculty']; -exports.getAllFacultyData = async(req, res) => { +exports.getAllFacultyData = async (req, res) => { let faculties = await Faculty.findAll(); res.json(faculties); }; diff --git a/backend/src/controllers/lecturer.js b/backend/src/controllers/lecturer.js index 3da38e3e7a5363c6dcbdd4e25af7fd41f9dfe1c1..ad788b3e44a4bb4a6c49c903f9abba7791067ce8 100644 --- a/backend/src/controllers/lecturer.js +++ b/backend/src/controllers/lecturer.js @@ -1,17 +1,12 @@ -const { - Lecturer, - SkillGroup, - Student, - Major, -} = require('../models/index'); +const { Lecturer, SkillGroup, Student, Major } = require('../models/index'); const { getAllLecturers } = require('../util/db/lecturer'); const { LecturerNotFoundError } = require('../util/error'); const { handleRequestWithResourceItemNotFound, - handleRequestWithInternalServerError + handleRequestWithInternalServerError, } = require('../util/common'); -exports.getAllLecturer = async(req, res) => { +exports.getAllLecturer = async (req, res) => { const { opts } = req.body; try { @@ -27,7 +22,7 @@ exports.getAllLecturer = async(req, res) => { } }; -exports.getLecturerData = async(req, res) => { +exports.getLecturerData = async (req, res) => { const foundLecturer = await Lecturer.findOne({ where: { userId: req.params.id, @@ -39,32 +34,31 @@ exports.getLecturerData = async(req, res) => { }, { model: Student, - as: 'advisedStudents' - } + as: 'advisedStudents', + }, ], - }).catch(err => { + }).catch((err) => { handleRequestWithInternalServerError(res, err); }); - if (foundLecturer){ + if (foundLecturer) { res.json(foundLecturer); } else { - handleRequestWithResourceItemNotFound(res, new LecturerNotFoundError()) + handleRequestWithResourceItemNotFound(res, new LecturerNotFoundError()); } }; -exports.updateLecturerData = async(req, res) => { +exports.updateLecturerData = async (req, res) => { const foundLecturer = await Lecturer.update(req.body, { where: { userId: req.params.id, }, returning: true, - }).catch(err => { - res.status(400) - .json({ - status: 400, - message: 'Something wrong with your payload.', - }); + }).catch((err) => { + res.status(400).json({ + status: 400, + message: 'Something wrong with your payload.', + }); }); if (!foundLecturer.includes(0)) { @@ -73,10 +67,9 @@ exports.updateLecturerData = async(req, res) => { message: 'Lecturer data updated.', }); } else { - res.status(400) - .json({ - status: 400, - message: 'Lecturer doesn\'t exist.', - }); + res.status(400).json({ + status: 400, + message: "Lecturer doesn't exist.", + }); } }; diff --git a/backend/src/controllers/major.js b/backend/src/controllers/major.js index 72ddca4024ae393bdd1167bf3dc87bbc3048f99b..6dcaa9dc2f7c433797edbfe91673bb3f96a12c00 100644 --- a/backend/src/controllers/major.js +++ b/backend/src/controllers/major.js @@ -1,9 +1,9 @@ const Major = require('../models/index')['Major']; -exports.getAllMajorData = async(req, res) => { +exports.getAllMajorData = async (req, res) => { let majors; - if (req.query.facultyId){ + if (req.query.facultyId) { majors = await Major.findAll({ where: { facultyId: req.query.facultyId, diff --git a/backend/src/controllers/skillgroup.js b/backend/src/controllers/skillgroup.js index a4dedc720240fc9b7aa74826f9519be52c2b5da9..01493a513df67ad5d6c30d334154a076dedc50af 100644 --- a/backend/src/controllers/skillgroup.js +++ b/backend/src/controllers/skillgroup.js @@ -1,9 +1,9 @@ const SkillGroup = require('../models/index')['SkillGroup']; -exports.getAllSkillGroupData = async(req, res) => { +exports.getAllSkillGroupData = async (req, res) => { let skillGroups; - if (req.query.majorId){ + if (req.query.majorId) { skillGroups = await SkillGroup.findAll({ where: { majorId: req.query.majorId, diff --git a/backend/src/controllers/student.js b/backend/src/controllers/student.js index aa726ac7ba8f9a758ac64a0d03fd0263f98d8af5..5ae3603d88e00b04fcec8eb1cab9fa37f226d794 100644 --- a/backend/src/controllers/student.js +++ b/backend/src/controllers/student.js @@ -1,16 +1,12 @@ 'use strict'; -const { - Student, -} = require('../models/index'); +const { Student } = require('../models/index'); const { updateStudyPlanCourse } = require('../util/db/study-plan'); -const { - NotExistError -} = require('../util/error'); +const { NotExistError } = require('../util/error'); const { handleRequestWithInternalServerError, - handleRequestWithResourceItemNotFound + handleRequestWithResourceItemNotFound, } = require('../util/common'); const { @@ -19,31 +15,31 @@ const { getHistoricalTranscript, getStudentIP, getStudentIPK, - getStudentNR + getStudentNR, } = require('../util/db/student'); -exports.getStudentData = async(req, res) => { +exports.getStudentData = async (req, res) => { const { opts } = req; try { const student = await getStudent(opts); - if (req.includeTranscript.toLowerCase() === "true"){ + if (req.includeTranscript.toLowerCase() === 'true') { student.dataValues.studyPlans = await getHistoricalTranscript(student.id); } - if (req.includeScore.toLowerCase() === "true"){ + if (req.includeScore.toLowerCase() === 'true') { const nr = await getStudentNR(student); const ip = await getStudentIP(student); const ipk = await getStudentIPK(student); student.dataValues.score = { nr, ip, - ipk + ipk, }; } - if (req.includeCredits.toLowerCase() === "true"){ + if (req.includeCredits.toLowerCase() === 'true') { student.dataValues.creditsTotal = await getCreditsTotal(student); } @@ -57,18 +53,17 @@ exports.getStudentData = async(req, res) => { } }; -exports.updateStudentData = async(req, res) => { +exports.updateStudentData = async (req, res) => { const foundStudent = await Student.update(req.body, { where: { userId: req.params.id, }, returning: true, - }).catch(err => { - res.status(400) - .json({ - status: 400, - message: 'Something wrong with your payload.', - }); + }).catch((err) => { + res.status(400).json({ + status: 400, + message: 'Something wrong with your payload.', + }); }); if (!foundStudent.includes(0)) { @@ -77,11 +72,10 @@ exports.updateStudentData = async(req, res) => { message: 'Student data updated.', }); } else { - res.status(400) - .json({ - status: 400, - message: 'Student doesn\'t exist.', - }); + res.status(400).json({ + status: 400, + message: "Student doesn't exist.", + }); } }; @@ -91,7 +85,7 @@ exports.updateStudentScore = async (req, res) => { const updatedStudyPlanCourse = await updateStudyPlanCourse( studyPlanCourse, - changeset + changeset, ); res.json(updatedStudyPlanCourse); } catch (error) { diff --git a/backend/src/controllers/study-plan.js b/backend/src/controllers/study-plan.js index 3df226e6d22bec08085947f4942dd39ca2d84495..50d1187e73e634f2b1ea480cbe7ea82efe53453e 100644 --- a/backend/src/controllers/study-plan.js +++ b/backend/src/controllers/study-plan.js @@ -3,7 +3,7 @@ const { handleRequestWithInvalidRequestBody, handleRequestWithInternalServerError, handleRequestWithResourceItemNotFound, - checkRequiredParameter + checkRequiredParameter, } = require('../util/common'); const { @@ -18,7 +18,7 @@ const { NotExistError, StudyPlanExistError, ClassUnavailableError, - RequiredParameterUndefinedError + RequiredParameterUndefinedError, } = require('../util/error'); exports.getStudyPlan = async (req, res) => { @@ -37,7 +37,7 @@ exports.getStudyPlan = async (req, res) => { } }; -exports.createStudyPlanData = async(req, res) => { +exports.createStudyPlanData = async (req, res) => { let newStudyPlan; try { @@ -47,21 +47,21 @@ exports.createStudyPlanData = async(req, res) => { semester, status, notes, - studyPlanCourses + studyPlanCourses, } = req.body; - checkRequiredParameter({studentId, startYear, semester}); + checkRequiredParameter({ studentId, startYear, semester }); newStudyPlan = { studentId, startYear, semester, status, - notes + notes, }; let creditsTotal = 0; - if (studyPlanCourses){ + if (studyPlanCourses) { await checkClassAvailability(semester, startYear, studyPlanCourses); creditsTotal = await countTotalCredits(studyPlanCourses); newStudyPlan['studyPlanCourses'] = studyPlanCourses; @@ -71,27 +71,24 @@ exports.createStudyPlanData = async(req, res) => { const studyPlans = await createStudyPlan(newStudyPlan); res.json(studyPlans); - } catch (error) { - if (error instanceof NotExistError){ + if (error instanceof NotExistError) { handleRequestWithResourceItemNotFound(res, error); - } else if (error instanceof StudyPlanExistError || - error instanceof ClassUnavailableError || - error instanceof RequiredParameterUndefinedError) { + } else if ( + error instanceof StudyPlanExistError || + error instanceof ClassUnavailableError || + error instanceof RequiredParameterUndefinedError + ) { handleRequestWithInvalidRequestBody(res, error); } else { handleRequestWithInternalServerError(res, error); } } - -} +}; exports.updateStudyPlan = async (req, res) => { try { - const { - studyPlan, - changeset - } = req.body; + const { studyPlan, changeset } = req.body; const updatedStudyPlan = await updateStudyPlan(studyPlan, changeset); res.json(updatedStudyPlan); diff --git a/backend/src/enums/attendance-status.js b/backend/src/enums/attendance-status.js index f4ba6aa3b1dcd0a23e2b0c509e54f9eaf5507d24..13fb8332a2829aaa4653c34110374a88c48af709 100644 --- a/backend/src/enums/attendance-status.js +++ b/backend/src/enums/attendance-status.js @@ -1,11 +1,11 @@ const AttendanceStatusEnum = Object.freeze({ - name: 'AttendanceStatusEnum', - enums: { - PRESENT: 'PRESENT', - ABSENT: 'ABSENT', - SICK: 'SICK', - PERMITTED: 'PERMITTED', - } -}) + name: 'AttendanceStatusEnum', + enums: { + PRESENT: 'PRESENT', + ABSENT: 'ABSENT', + SICK: 'SICK', + PERMITTED: 'PERMITTED', + }, +}); module.exports = AttendanceStatusEnum; diff --git a/backend/src/enums/course-type.js b/backend/src/enums/course-type.js index 1552fcc7c4cbcccd2c33c92ff8732b26bf8357b7..612292ecae277cdb4f83b24679f72c0ec5f39dea 100644 --- a/backend/src/enums/course-type.js +++ b/backend/src/enums/course-type.js @@ -1,9 +1,9 @@ const CourseTypeEnum = Object.freeze({ - name: 'CourseTypeEnum', - enums: { - MANDATORY: 'WAJIB', - OPTIONAL: 'PILIHAN', - } -}) + name: 'CourseTypeEnum', + enums: { + MANDATORY: 'WAJIB', + OPTIONAL: 'PILIHAN', + }, +}); module.exports = CourseTypeEnum; diff --git a/backend/src/enums/courseclass-status.js b/backend/src/enums/courseclass-status.js index f69e38ca07bcb87164d5b403a05d0086cf8d2ffd..0667fcfa5db5a3bc7bee271247db77169524690c 100644 --- a/backend/src/enums/courseclass-status.js +++ b/backend/src/enums/courseclass-status.js @@ -1,8 +1,8 @@ const CourseClassStatusEnum = Object.freeze({ - name: 'CourseClassStatusEnum', - enums: { - OPEN: 'OPEN', - CLOSED: 'CLOSED', - } -}) -module.exports = CourseClassStatusEnum; \ No newline at end of file + name: 'CourseClassStatusEnum', + enums: { + OPEN: 'OPEN', + CLOSED: 'CLOSED', + }, +}); +module.exports = CourseClassStatusEnum; diff --git a/backend/src/enums/day.js b/backend/src/enums/day.js index 0fe3e52d32208ef45aa0e542f476f539e6520679..6f307a0f621726a57aa786f78bc4f412ce1f1b37 100644 --- a/backend/src/enums/day.js +++ b/backend/src/enums/day.js @@ -1,13 +1,13 @@ const DayEnum = Object.freeze({ - name: 'DayEnum', - enums: { - SUNDAY: {value: 0, name: 'SUNDAY'}, - MONDAY: {value: 1, name: 'MONDAY'}, - TUESDAY: {value: 2, name: 'TUESDAY'}, - WEDNESDAY: {value: 3, name: 'WEDNESDAY'}, - THURSDAY: {value: 4, name: 'THURSDAY'}, - FRIDAY: {value: 5, name: 'FRIDAY'}, - SATURDAY: {value: 6, name: 'SATURDAY'}, - } -}) + name: 'DayEnum', + enums: { + SUNDAY: { value: 0, name: 'SUNDAY' }, + MONDAY: { value: 1, name: 'MONDAY' }, + TUESDAY: { value: 2, name: 'TUESDAY' }, + WEDNESDAY: { value: 3, name: 'WEDNESDAY' }, + THURSDAY: { value: 4, name: 'THURSDAY' }, + FRIDAY: { value: 5, name: 'FRIDAY' }, + SATURDAY: { value: 6, name: 'SATURDAY' }, + }, +}); module.exports = DayEnum; diff --git a/backend/src/enums/endpoint.js b/backend/src/enums/endpoint.js index 8c26c5d753a845bcbc5b3c3160250c38211d22f9..ea0943cb4ef5b440fcfda69f0167dd1086599ed0 100644 --- a/backend/src/enums/endpoint.js +++ b/backend/src/enums/endpoint.js @@ -1,17 +1,17 @@ const EndpointEnum = Object.freeze({ - name: "EndpointEnum", + name: 'EndpointEnum', enums: { - AUTH: "/auth", - LECTURER: "/lecturer", - STUDENT: "/student", - FACULTY: "/faculty", - MAJOR: "/major", - SKILL_GROUP: "/skillgroup", - COURSE_CLASS: "/course-class", - COURSE: "/course", - STUDY_PLAN: "/study-plan", - COURSE_CLASS_MEETING: "/course-class-meeting", - SCORE: "/score", + AUTH: '/auth', + LECTURER: '/lecturer', + STUDENT: '/student', + FACULTY: '/faculty', + MAJOR: '/major', + SKILL_GROUP: '/skillgroup', + COURSE_CLASS: '/course-class', + COURSE: '/course', + STUDY_PLAN: '/study-plan', + COURSE_CLASS_MEETING: '/course-class-meeting', + SCORE: '/score', }, }); diff --git a/backend/src/enums/gender.js b/backend/src/enums/gender.js index 659f7cc87c458202d96089bdbe0e9a7d5e66a887..e75748e7f38199ee9f00a9bd2476f9632d259711 100644 --- a/backend/src/enums/gender.js +++ b/backend/src/enums/gender.js @@ -1,8 +1,8 @@ const GenderEnum = Object.freeze({ - name: 'GenderEnum', - enums: { - MALE: {short: 'M', name: 'MALE'}, - FEMALE: {short: 'F', name: 'FEMALE'}, - } -}) -module.exports = GenderEnum; \ No newline at end of file + name: 'GenderEnum', + enums: { + MALE: { short: 'M', name: 'MALE' }, + FEMALE: { short: 'F', name: 'FEMALE' }, + }, +}); +module.exports = GenderEnum; diff --git a/backend/src/enums/index.js b/backend/src/enums/index.js index 45af34c1938960db17e311b860660823f7f1bb3e..42fca910349a9273d998616797530abedca8a5ef 100644 --- a/backend/src/enums/index.js +++ b/backend/src/enums/index.js @@ -5,15 +5,15 @@ const path = require('path'); const basename = path.basename(__filename); const enums = {}; -fs - .readdirSync(__dirname) - .filter(file => { - return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); - }) - .forEach(file => { - const enumFile = require(path.join(__dirname, file)); - enums[enumFile.name] = enumFile.enums; - }); +fs.readdirSync(__dirname) + .filter((file) => { + return ( + file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js' + ); + }) + .forEach((file) => { + const enumFile = require(path.join(__dirname, file)); + enums[enumFile.name] = enumFile.enums; + }); module.exports = enums; - diff --git a/backend/src/enums/lecturer-role.js b/backend/src/enums/lecturer-role.js index 510823a883eb70fb6127839bcade86052ab94c86..119a4427eb28a036bf2ee13bbcb6e292d051bd61 100644 --- a/backend/src/enums/lecturer-role.js +++ b/backend/src/enums/lecturer-role.js @@ -1,11 +1,11 @@ const LecturerRoleEnum = Object.freeze({ - name: 'LecturerRoleEnum', - enums: { - LECTURER: 'DOSEN', - MAJOR_HEAD: 'KAPRODI', - DEAN: 'DEKAN', - RECTOR: 'REKTOR', - } -}) + name: 'LecturerRoleEnum', + enums: { + LECTURER: 'DOSEN', + MAJOR_HEAD: 'KAPRODI', + DEAN: 'DEKAN', + RECTOR: 'REKTOR', + }, +}); module.exports = LecturerRoleEnum; diff --git a/backend/src/enums/score.js b/backend/src/enums/score.js index 3a22a712dda668fcec6f7515e891607314c02204..5ed2a30897abaec76ac53ab4cd2f32d5a211837d 100644 --- a/backend/src/enums/score.js +++ b/backend/src/enums/score.js @@ -1,14 +1,14 @@ const ScoreEnum = Object.freeze({ - name: 'ScoreEnum', - enums: { - A: {value: 4.0, name: 'A'}, - AB: {value: 3.5, name: 'AB'}, - B: {value: 3.0, name: 'B'}, - BC: {value: 2.5, name: 'BC'}, - C: {value: 2.0, name: 'C'}, - D: {value: 1.0, name: 'D'}, - E: {value: 0.0, name: 'E'}, - T: {value: null, name: 'T'}, - } -}) + name: 'ScoreEnum', + enums: { + A: { value: 4.0, name: 'A' }, + AB: { value: 3.5, name: 'AB' }, + B: { value: 3.0, name: 'B' }, + BC: { value: 2.5, name: 'BC' }, + C: { value: 2.0, name: 'C' }, + D: { value: 1.0, name: 'D' }, + E: { value: 0.0, name: 'E' }, + T: { value: null, name: 'T' }, + }, +}); module.exports = ScoreEnum; diff --git a/backend/src/enums/semester.js b/backend/src/enums/semester.js index b1cf2340e64611df9f67860ba2ab3d15dfa123f4..ee0755d122959a2d53b3da6d20e0c0b89b51422f 100644 --- a/backend/src/enums/semester.js +++ b/backend/src/enums/semester.js @@ -1,9 +1,9 @@ const SemesterEnum = Object.freeze({ - name: 'SemesterEnum', - enums: { - ODD: '1', - EVEN: '2' - } -}) + name: 'SemesterEnum', + enums: { + ODD: '1', + EVEN: '2', + }, +}); module.exports = SemesterEnum; diff --git a/backend/src/enums/study-plan-course-status.js b/backend/src/enums/study-plan-course-status.js index 03a541415325dfc354b3661cfcfccac2ceae11f9..2603c02887b5bb7814b9340e9f519eb63ced8dbe 100644 --- a/backend/src/enums/study-plan-course-status.js +++ b/backend/src/enums/study-plan-course-status.js @@ -1,9 +1,9 @@ const StudyPlanCourseStatusEnum = Object.freeze({ - name: 'StudyPlanCourseStatusEnum', - enums: { - APPROVED: 'APPROVED', - UNAPPROVED: 'UNAPPROVED', - } -}) + name: 'StudyPlanCourseStatusEnum', + enums: { + APPROVED: 'APPROVED', + UNAPPROVED: 'UNAPPROVED', + }, +}); module.exports = StudyPlanCourseStatusEnum; diff --git a/backend/src/enums/studyplan-status.js b/backend/src/enums/studyplan-status.js index 1d953b90c70f318bf6095594adc192b4b63fb077..234e78261a186af9dd416c6ee2ed20b1f6fdb2ef 100644 --- a/backend/src/enums/studyplan-status.js +++ b/backend/src/enums/studyplan-status.js @@ -1,11 +1,11 @@ const StudyPlanStatusEnum = Object.freeze({ - name: 'StudyPlanStatusEnum', - enums: { - DRAFT: 'DRAFT', - SUBMITTED: 'SUBMITTED', - APPROVED: 'APPROVED', - FINAL: 'FINAL', - } -}) + name: 'StudyPlanStatusEnum', + enums: { + DRAFT: 'DRAFT', + SUBMITTED: 'SUBMITTED', + APPROVED: 'APPROVED', + FINAL: 'FINAL', + }, +}); module.exports = StudyPlanStatusEnum; diff --git a/backend/src/enums/user-role.js b/backend/src/enums/user-role.js index e0a4c851ecb5dcbd8127c0a1c9386b65df777b70..206da3c95029bd2d7e7eb7071aeb92e702fed2a8 100644 --- a/backend/src/enums/user-role.js +++ b/backend/src/enums/user-role.js @@ -1,9 +1,9 @@ const UserRoleEnum = Object.freeze({ - name: 'UserRoleEnum', - enums: { - ADMIN: 'ADMIN', - DEFAULT_USER: 'DEFAULT_USER', - } -}) + name: 'UserRoleEnum', + enums: { + ADMIN: 'ADMIN', + DEFAULT_USER: 'DEFAULT_USER', + }, +}); module.exports = UserRoleEnum; diff --git a/backend/src/hooks/course-class.js b/backend/src/hooks/course-class.js index 632744ab82738b02e9297f487882b654f2e5c068..f68595db9ea00f2bc5df7a47c57f2c6faeab2383 100644 --- a/backend/src/hooks/course-class.js +++ b/backend/src/hooks/course-class.js @@ -1,18 +1,14 @@ -const { - CourseClass, -} = require('../models/index'); +const { CourseClass } = require('../models/index'); -const { - deleteCurrentMeetings -} = require('../util/hook'); +const { deleteCurrentMeetings } = require('../util/hook'); const { generateCourseClassMeetings } = require('../util/common'); -CourseClass.afterCreate(async courseClass => { +CourseClass.afterCreate(async (courseClass) => { await generateCourseClassMeetings(courseClass); }); -CourseClass.afterUpdate(async courseClass => { +CourseClass.afterUpdate(async (courseClass) => { await deleteCurrentMeetings(courseClass); await generateCourseClassMeetings(courseClass); }); diff --git a/backend/src/hooks/study-plan.js b/backend/src/hooks/study-plan.js index 417ce3159dc9750fbcf5b7d3035794d2360b276b..0baefb5c141372ca1e1b8bc079ed254320346573 100644 --- a/backend/src/hooks/study-plan.js +++ b/backend/src/hooks/study-plan.js @@ -1,32 +1,32 @@ -const { - StudyPlan, -} = require('../models/index'); +const { StudyPlan } = require('../models/index'); -const { - StudyPlanStatusEnum, -} = require('../enums/index'); +const { StudyPlanStatusEnum } = require('../enums/index'); const { calculateTotalCredits, - deleteCurrentMeetingAttendances + deleteCurrentMeetingAttendances, } = require('../util/hook'); const { generateCourseClassMeetingAttendances } = require('../util/common'); -StudyPlan.beforeCreate(async studyPlan => { - studyPlan.creditsTotal = await calculateTotalCredits(studyPlan.studyPlanCourses); +StudyPlan.beforeCreate(async (studyPlan) => { + studyPlan.creditsTotal = await calculateTotalCredits( + studyPlan.studyPlanCourses, + ); }); -StudyPlan.beforeUpdate(async studyPlan => { - studyPlan.creditsTotal = await calculateTotalCredits(studyPlan.studyPlanCourses); +StudyPlan.beforeUpdate(async (studyPlan) => { + studyPlan.creditsTotal = await calculateTotalCredits( + studyPlan.studyPlanCourses, + ); }); -StudyPlan.afterCreate(async studyPlan => { - if (studyPlan.status === StudyPlanStatusEnum.FINAL){ +StudyPlan.afterCreate(async (studyPlan) => { + if (studyPlan.status === StudyPlanStatusEnum.FINAL) { await generateCourseClassMeetingAttendances(studyPlan); } }); -StudyPlan.afterUpdate(async studyPlan => { +StudyPlan.afterUpdate(async (studyPlan) => { if (studyPlan.status === StudyPlanStatusEnum.FINAL) { await deleteCurrentMeetingAttendances(studyPlan); await generateCourseClassMeetingAttendances(studyPlan); diff --git a/backend/src/index.js b/backend/src/index.js index a459582072e7e481c21300ac6efa9ee8fb98439e..de605a0633297618d2a30ae31ab285087391a732 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -37,6 +37,8 @@ app.use(EndpointEnum.STUDY_PLAN, studyPlanRouter); app.use(EndpointEnum.COURSE_CLASS_MEETING, courseClassMeetingRouter); app.use(EndpointEnum.SCORE, scoreRouter); -let appServer = app.listen(port, host, () => console.log(`SIX backend service listening at http://${host}:${port}`)); +let appServer = app.listen(port, host, () => + console.log(`SIX backend service listening at http://${host}:${port}`), +); module.exports = appServer; // for testing diff --git a/backend/src/middleware/course-class-meeting.js b/backend/src/middleware/course-class-meeting.js index 007ebfa4265f54779316a9a5836239fa2a0cb466..c40543c476413c6e49ab8f3b8cc4ea3d2e698277 100644 --- a/backend/src/middleware/course-class-meeting.js +++ b/backend/src/middleware/course-class-meeting.js @@ -1,93 +1,96 @@ 'use strict'; const { - handleRequestWithInvalidRequestBody, - checkRequiredParameter, - handleRequestWithInternalServerError, - handleRequestWithResourceItemNotFound, -} = require("../util/common"); + handleRequestWithInvalidRequestBody, + checkRequiredParameter, + handleRequestWithInternalServerError, + handleRequestWithResourceItemNotFound, +} = require('../util/common'); -const { - CourseClassMeetingAttendance, - Student -} = require("../models/index"); +const { CourseClassMeetingAttendance, Student } = require('../models/index'); const { - RequiredParameterUndefinedError, - NotExistError, -} = require("../util/error"); -const { getCourseClassMeetingById } = require("../util/db/course-class-meeting"); + RequiredParameterUndefinedError, + NotExistError, +} = require('../util/error'); +const { + getCourseClassMeetingById, +} = require('../util/db/course-class-meeting'); + +const getCourseClassMeetingMiddleware = async (req, res, next) => { + const { + courseClassMeetingId, + studentId, + lecturerId, + startYear, + semester, + shouldIncludeAttendances = 'false', + } = req.query; -const getCourseClassMeetingMiddleware = async(req, res, next) => { - const { + try { + const opts = { + where: {}, + }; + + checkRequiredParameter({ + oneOf: { courseClassMeetingId, studentId, lecturerId, + }, + }); + + if (courseClassMeetingId) { + opts.where.id = courseClassMeetingId; + if (shouldIncludeAttendances.toLowerCase() === 'true') { + opts.include = [ + { + model: CourseClassMeetingAttendance, + as: 'courseClassMeetingAttendances', + attributes: ['status'], + include: Student, + }, + ]; + } + } else if (studentId) { + checkRequiredParameter({ + semester, startYear, + }); + + opts.where = { + studentId, semester, - shouldIncludeAttendances = "false", - } = req.query; - - try { - const opts = { - where: {} - }; - - checkRequiredParameter({ - oneOf: { - courseClassMeetingId, - studentId, - lecturerId - } - }); - - if (courseClassMeetingId) { - opts.where.id = courseClassMeetingId; - if (shouldIncludeAttendances.toLowerCase() === "true") { - opts.include = [ - { - model: CourseClassMeetingAttendance, - as: "courseClassMeetingAttendances", - attributes: ["status"], - include: Student - } - ] - } - } else if (studentId) { - checkRequiredParameter({ - semester, - startYear, - }); - - opts.where = { - studentId, - semester, - startYear, - }; - opts.include = "studyPlanCourses" - - } else if (lecturerId) { - checkRequiredParameter({ - semester, - startYear, - }); - - opts.where = { - lecturerId, - semester, - startYear, - }; - } - - req.body.opts = opts; - - next(); - } catch (error) { - if (error instanceof RequiredParameterUndefinedError) handleRequestWithInvalidRequestBody(res, error); - else handleRequestWithInternalServerError(res, error); + startYear, + }; + opts.include = 'studyPlanCourses'; + } else if (lecturerId) { + checkRequiredParameter({ + semester, + startYear, + }); + + opts.where = { + lecturerId, + semester, + startYear, + }; } + + req.body.opts = opts; + + next(); + } catch (error) { + if (error instanceof RequiredParameterUndefinedError) + handleRequestWithInvalidRequestBody(res, error); + else handleRequestWithInternalServerError(res, error); + } }; -const updateCourseClassMeetingBodyCheckerMiddleware = async (req, res, next) => { +const updateCourseClassMeetingBodyCheckerMiddleware = async ( + req, + res, + next, +) => { try { const { startClass, diff --git a/backend/src/middleware/course-class.js b/backend/src/middleware/course-class.js index b84e242b95cc188e915f189fe572827980fea644..1c142baef02de7650d7f8a31538850b22bd32e28 100644 --- a/backend/src/middleware/course-class.js +++ b/backend/src/middleware/course-class.js @@ -1,173 +1,167 @@ 'use strict'; const { - Course, - Major, - Faculty, - Lecturer, - CourseClassDefaultSchedule -} = require("../models/index"); + Course, + Major, + Faculty, + Lecturer, + CourseClassDefaultSchedule, +} = require('../models/index'); const { - handleRequestWithInvalidRequestBody, - checkRequiredParameter, - handleRequestWithInternalServerError, - handleRequestWithResourceItemNotFound -} = require("../util/common"); -const { getCourseClass } = require("../util/db/course-class"); + handleRequestWithInvalidRequestBody, + checkRequiredParameter, + handleRequestWithInternalServerError, + handleRequestWithResourceItemNotFound, +} = require('../util/common'); +const { getCourseClass } = require('../util/db/course-class'); const { - RequiredParameterUndefinedError, - NotExistError -} = require("../util/error"); + RequiredParameterUndefinedError, + NotExistError, +} = require('../util/error'); +const getCourseClassMiddleware = async (req, res, next) => { + const { status, semester, startYear, include } = req.query; -const getCourseClassMiddleware = async(req, res, next) => { + const { id } = req.params; + + let opts = {}; + + if (id) { + opts.where = { id }; + } else { + opts.where = {}; + if (status) { + opts.where.status = status; + } + + if (semester) { + opts.where.semester = semester; + } + + if (startYear) { + opts.where.startYear = startYear; + } + } + + opts.include = [ + { + model: CourseClassDefaultSchedule, + as: 'courseClassDefaultSchedules', + }, + ]; + + if (include) { + if (include.includes('Course')) { + opts.include.push({ + model: Course, + include: [ + { + model: Major, + include: Faculty, + }, + ], + }); + } + + if (include.includes('Lecturer')) { + opts.include.push({ + model: Lecturer, + }); + } + + if (include.includes('Students')) { + req.body.includeStudent = true; + } + } + + req.body.opts = opts; + + next(); +}; + +const updateCourseClassMiddleware = async (req, res, next) => { + const { id } = req.params; + + try { const { + status, + startYear, + semester, + capacity, + lecturerId, + courseClassDefaultSchedules, + } = req.body; + + checkRequiredParameter({ + oneOf: { status, - semester, startYear, - include - } = req.query; + semester, + capacity, + lecturerId, + courseClassDefaultSchedules, + }, + }); + + const courseClass = await getCourseClass({ + body: { + opts: { + where: { + id, + }, + include: [ + { + model: CourseClassDefaultSchedule, + as: 'courseClassDefaultSchedules', + }, + ], + }, + }, + }); + + const changeset = {}; + + if (status) { + changeset.status = status; + } - const { - id - } = req.params; + if (lecturerId) { + changeset.lecturerId = lecturerId; + } + + if (startYear) { + changeset.startYear = startYear; + } - let opts = {}; + if (semester) { + changeset.semester = semester; + } - if (id) { - opts.where = {id}; - } else { - opts.where = {}; - if (status) { - opts.where.status = status; - } - - if (semester) { - opts.where.semester = semester; - } - - if (startYear) { - opts.where.startYear = startYear; - } + if (capacity) { + changeset.capacity = capacity; } - opts.include = [{ - model: CourseClassDefaultSchedule, - as: "courseClassDefaultSchedules" - }]; - - if (include){ - if (include.includes('Course')){ - opts.include.push({ - model: Course, - include: [ - { - model: Major, - include: Faculty - } - ] - }); - } - - if (include.includes('Lecturer')){ - opts.include.push({ - model: Lecturer, - }); - } - - if (include.includes('Students')){ - req.body.includeStudent = true; - } + if (courseClassDefaultSchedules) { + changeset.courseClassDefaultSchedules = courseClassDefaultSchedules; } - req.body.opts = opts; + req.body.courseClass = courseClass; + req.body.changeset = changeset; next(); -}; - -const updateCourseClassMiddleware = async (req, res, next) => { - const { id } = req.params; - - try { - const { - status, - startYear, - semester, - capacity, - lecturerId, - courseClassDefaultSchedules - } = req.body; - - checkRequiredParameter({ - oneOf: { - status, - startYear, - semester, - capacity, - lecturerId, - courseClassDefaultSchedules - } - }); - - const courseClass = await getCourseClass({ - body: { - opts: { - where: { - id - }, - include: [{ - model: CourseClassDefaultSchedule, - as: "courseClassDefaultSchedules" - }] - } - } - }); - - const changeset = {}; - - if (status) { - changeset.status = status; - } - - if (lecturerId) { - changeset.lecturerId = lecturerId; - } - - if (startYear) { - changeset.startYear = startYear; - } - - if (semester) { - changeset.semester = semester; - } - - if (capacity) { - changeset.capacity = capacity; - } - - if (courseClassDefaultSchedules) { - changeset.courseClassDefaultSchedules = courseClassDefaultSchedules; - } - - req.body.courseClass = courseClass; - req.body.changeset = changeset; - - next(); - } catch (error) { - if (error instanceof NotExistError) { - handleRequestWithResourceItemNotFound(res, error); - } - else if (error instanceof RequiredParameterUndefinedError) { - handleRequestWithInvalidRequestBody(res, error); - } - else { - handleRequestWithInternalServerError(res, error); - } + } catch (error) { + if (error instanceof NotExistError) { + handleRequestWithResourceItemNotFound(res, error); + } else if (error instanceof RequiredParameterUndefinedError) { + handleRequestWithInvalidRequestBody(res, error); + } else { + handleRequestWithInternalServerError(res, error); } + } }; module.exports = { - getCourseClassMiddleware, - updateCourseClassMiddleware -} \ No newline at end of file + getCourseClassMiddleware, + updateCourseClassMiddleware, +}; diff --git a/backend/src/middleware/lecturer.js b/backend/src/middleware/lecturer.js index c9e778f0df9015e17d7f2caeb3add66fd9783690..b2e2f16fbac1a2b9d6d0154d3556f464cad1b43b 100644 --- a/backend/src/middleware/lecturer.js +++ b/backend/src/middleware/lecturer.js @@ -1,8 +1,8 @@ 'use strict'; -const { Op } = require("sequelize"); -const { handleRequestWithInvalidRequestBody } = require("../util/common"); +const { Op } = require('sequelize'); +const { handleRequestWithInvalidRequestBody } = require('../util/common'); -const getAllLecturerMiddleware = async(req, res, next) => { +const getAllLecturerMiddleware = async (req, res, next) => { const { skillGroups = [] } = req.query; try { @@ -11,20 +11,20 @@ const getAllLecturerMiddleware = async(req, res, next) => { parsedSkillGroups = [skillGroups]; } - const skillGroupIds = parsedSkillGroups.map(skillGroupId => { + const skillGroupIds = parsedSkillGroups.map((skillGroupId) => { return { - skillGroupId - } + skillGroupId, + }; }); const opts = { - where: {} + where: {}, }; if (skillGroupIds.length) { opts.where = { - [Op.or]: skillGroupIds - } + [Op.or]: skillGroupIds, + }; } req.body.opts = opts; @@ -37,5 +37,4 @@ const getAllLecturerMiddleware = async(req, res, next) => { module.exports = { getAllLecturerMiddleware, -} - +}; diff --git a/backend/src/middleware/score.js b/backend/src/middleware/score.js index 52e5d36062202f5c4416c4852d4cb92239da9933..5c2425f9ae4c631678a02fbf8a1f90f34bf8b43d 100644 --- a/backend/src/middleware/score.js +++ b/backend/src/middleware/score.js @@ -1,16 +1,16 @@ -"use strict"; +'use strict'; const { handleRequestWithInvalidRequestBody, checkRequiredParameter, handleRequestWithInternalServerError, handleRequestWithResourceItemNotFound, -} = require("../util/common"); -const { getStudyPlanCourse } = require("../util/db/study-plan"); +} = require('../util/common'); +const { getStudyPlanCourse } = require('../util/db/study-plan'); const { RequiredParameterUndefinedError, NotExistError, -} = require("../util/error"); -const { StudyPlan } = require("../models/index"); +} = require('../util/error'); +const { StudyPlan } = require('../models/index'); const updateScoreMiddleware = async (req, res, next) => { try { diff --git a/backend/src/middleware/student.js b/backend/src/middleware/student.js index 5beaf21500da99caa517cc075acedb022f69681e..888050f894702ae9598b3b431bd94dfca2fae294 100644 --- a/backend/src/middleware/student.js +++ b/backend/src/middleware/student.js @@ -1,25 +1,18 @@ +const { Lecturer, Major, Faculty } = require('../models/index'); -const { - Lecturer, - Major, - Faculty -} = require('../models/index'); - -const getStudentMiddleware = async(req, res, next) => { +const getStudentMiddleware = async (req, res, next) => { const { - includeTranscript = "false", - includeScore = "false", - includeCredits = "false" + includeTranscript = 'false', + includeScore = 'false', + includeCredits = 'false', } = req.query; - const { - id - } = req.params; + const { id } = req.params; req.opts = { where: { - userId: id - } + userId: id, + }, }; req.opts.include = [ @@ -41,5 +34,5 @@ const getStudentMiddleware = async(req, res, next) => { }; module.exports = { - getStudentMiddleware -}; \ No newline at end of file + getStudentMiddleware, +}; diff --git a/backend/src/middleware/study-plan.js b/backend/src/middleware/study-plan.js index 0c0fd71d0025839229cd99b6f413018466aae2c9..07427e6677b366eb054256a4cc17f061dfa0e333 100644 --- a/backend/src/middleware/study-plan.js +++ b/backend/src/middleware/study-plan.js @@ -3,33 +3,33 @@ const { handleRequestWithInvalidRequestBody, checkRequiredParameter, handleRequestWithInternalServerError, - handleRequestWithResourceItemNotFound -} = require("../util/common"); -const { getStudyPlan } = require("../util/db/study-plan"); + handleRequestWithResourceItemNotFound, +} = require('../util/common'); +const { getStudyPlan } = require('../util/db/study-plan'); const { RequiredParameterUndefinedError, - NotExistError -} = require("../util/error"); + NotExistError, +} = require('../util/error'); -const getStudyPlanMiddleware = async(req, res, next) => { +const getStudyPlanMiddleware = async (req, res, next) => { const { studyPlanId, studentId, semester, startYear, - shouldIncludeCourses = "true", + shouldIncludeCourses = 'true', } = req.query; try { const opts = { - where: {} + where: {}, }; checkRequiredParameter({ oneOf: { studentId, studyPlanId, - } + }, }); if (studyPlanId) { @@ -48,15 +48,16 @@ const getStudyPlanMiddleware = async(req, res, next) => { }; } - if (shouldIncludeCourses.toLowerCase() === "true") { - opts.include = "studyPlanCourses" + if (shouldIncludeCourses.toLowerCase() === 'true') { + opts.include = 'studyPlanCourses'; } req.body.opts = opts; next(); } catch (error) { - if (error instanceof RequiredParameterUndefinedError) handleRequestWithInvalidRequestBody(res, error); + if (error instanceof RequiredParameterUndefinedError) + handleRequestWithInvalidRequestBody(res, error); else handleRequestWithInternalServerError(res, error); } }; @@ -65,25 +66,21 @@ const updateStudyPlanMiddleware = async (req, res, next) => { const { id } = req.params; try { - const { - status, - notes, - studyPlanCourses - } = req.body; + const { status, notes, studyPlanCourses } = req.body; checkRequiredParameter({ oneOf: { status, notes, - studyPlanCourses - } + studyPlanCourses, + }, }); const studyPlan = await getStudyPlan({ where: { - id + id, }, - include: "studyPlanCourses" + include: 'studyPlanCourses', }); const changeset = {}; @@ -107,11 +104,9 @@ 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) { handleRequestWithInvalidRequestBody(res, error); - } - else { + } else { handleRequestWithInternalServerError(res, error); } } @@ -119,6 +114,5 @@ const updateStudyPlanMiddleware = async (req, res, next) => { module.exports = { getStudyPlanMiddleware, - updateStudyPlanMiddleware -} - + updateStudyPlanMiddleware, +}; diff --git a/backend/src/migrations/20210213121858-create-user.js b/backend/src/migrations/20210213121858-create-user.js index 150b7b19fbaa981fbcf5a6e0b2240d2d914f91b7..cb50038c56407cbdef93fa1ed998bf2ca5713bce 100644 --- a/backend/src/migrations/20210213121858-create-user.js +++ b/backend/src/migrations/20210213121858-create-user.js @@ -1,11 +1,9 @@ const { getEnumValues } = require('../util/enum'); -const { - UserRoleEnum, -} = require('../enums/index'); +const { UserRoleEnum } = require('../enums/index'); -'use strict'; +('use strict'); module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { let userRoles = getEnumValues(UserRoleEnum); await queryInterface.createTable('Users', { @@ -37,7 +35,7 @@ module.exports = { }, }); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Users'); }, }; diff --git a/backend/src/migrations/20210214102405-create-faculty.js b/backend/src/migrations/20210214102405-create-faculty.js index 3b974b705129b0245c5c7cbb540c9bea45720994..a16ce1d66f05f6d2ef3d72b267b1323741eedd14 100644 --- a/backend/src/migrations/20210214102405-create-faculty.js +++ b/backend/src/migrations/20210214102405-create-faculty.js @@ -1,6 +1,6 @@ 'use strict'; module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { await queryInterface.createTable('Faculties', { id: { allowNull: false, @@ -23,7 +23,7 @@ module.exports = { }, }); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Faculties'); }, }; diff --git a/backend/src/migrations/20210214102501-create-major.js b/backend/src/migrations/20210214102501-create-major.js index ec43d37318489a8b0965e5c46c3dfbfc77c563c3..2090fd8d3f4db66135695e4ba92b8e40db1f670d 100644 --- a/backend/src/migrations/20210214102501-create-major.js +++ b/backend/src/migrations/20210214102501-create-major.js @@ -1,6 +1,6 @@ 'use strict'; module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { await queryInterface.createTable('Majors', { id: { allowNull: false, @@ -32,7 +32,7 @@ module.exports = { }, }); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Majors'); }, }; diff --git a/backend/src/migrations/20210214104627-create-skill-groups.js b/backend/src/migrations/20210214104627-create-skill-groups.js index 3aa98aa25db4095813af2261977a428e943223d0..32299e1f68bc05dcdd125cc603f94776a1144e92 100644 --- a/backend/src/migrations/20210214104627-create-skill-groups.js +++ b/backend/src/migrations/20210214104627-create-skill-groups.js @@ -1,6 +1,6 @@ 'use strict'; module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { await queryInterface.createTable('SkillGroups', { id: { allowNull: false, @@ -29,7 +29,7 @@ module.exports = { }, }); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('SkillGroups'); }, }; diff --git a/backend/src/migrations/20210214104807-create-lecturer.js b/backend/src/migrations/20210214104807-create-lecturer.js index bdd17ae5a6e76b2f0c994acfea609a4b915cf536..0459eba3ed1ce8d4383d54646272bfc5fa891f42 100644 --- a/backend/src/migrations/20210214104807-create-lecturer.js +++ b/backend/src/migrations/20210214104807-create-lecturer.js @@ -1,12 +1,9 @@ const { getEnumValues } = require('../util/enum'); -const { - GenderEnum, - LecturerRoleEnum -} = require('../enums/index'); +const { GenderEnum, LecturerRoleEnum } = require('../enums/index'); -'use strict'; +('use strict'); module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { let genders = getEnumValues(GenderEnum, 'short'); let lecturerRoles = getEnumValues(LecturerRoleEnum); @@ -66,7 +63,7 @@ module.exports = { }, }); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Lecturers'); }, }; diff --git a/backend/src/migrations/20210214105230-create-students.js b/backend/src/migrations/20210214105230-create-students.js index a95f6e6cb4b0c5962eb2902c21d28971cf1634f1..040c57b6aeb1480613cec8a0c56bc20edf016ec6 100644 --- a/backend/src/migrations/20210214105230-create-students.js +++ b/backend/src/migrations/20210214105230-create-students.js @@ -1,11 +1,9 @@ const { getEnumValues } = require('../util/enum'); -const { - GenderEnum, -} = require('../enums/index'); +const { GenderEnum } = require('../enums/index'); -'use strict'; +('use strict'); module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { let genders = getEnumValues(GenderEnum, 'short'); await queryInterface.createTable('Students', { @@ -72,7 +70,7 @@ module.exports = { }, }); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Students'); }, }; diff --git a/backend/src/migrations/20210224040244-create-course.js b/backend/src/migrations/20210224040244-create-course.js index 5913108533a9ea5753a2858a58d62864dea72d43..a0df6eef97e2785c75392ead60017293d8ea52a0 100644 --- a/backend/src/migrations/20210224040244-create-course.js +++ b/backend/src/migrations/20210224040244-create-course.js @@ -1,9 +1,7 @@ const { getEnumValues } = require('../util/enum'); -const { - CourseTypeEnum, -} = require('../enums/index'); +const { CourseTypeEnum } = require('../enums/index'); -'use strict'; +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { let courseTypes = getEnumValues(CourseTypeEnum); @@ -15,29 +13,29 @@ module.exports = { type: Sequelize.UUID, }, code: { - type: Sequelize.STRING + type: Sequelize.STRING, }, name: { - type: Sequelize.STRING + type: Sequelize.STRING, }, type: { defaultValue: 'WAJIB', type: Sequelize.ENUM(courseTypes), }, credits: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, defaultSemester: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, shortSyllabus: { - type: Sequelize.TEXT + type: Sequelize.TEXT, }, completeSyllabus: { - type: Sequelize.TEXT + type: Sequelize.TEXT, }, outcomes: { - type: Sequelize.TEXT + type: Sequelize.TEXT, }, majorId: { type: Sequelize.UUID, @@ -49,19 +47,19 @@ module.exports = { onDelete: 'CASCADE', }, curriculumYear: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Courses'); - } -}; \ No newline at end of file + }, +}; diff --git a/backend/src/migrations/20210224071753-create-option.js b/backend/src/migrations/20210224071753-create-option.js index 6d5618218eb3759b57e95d8c3cfd4142a807701c..47271bf95da9afdf87b8a01af0868d32676b7838 100644 --- a/backend/src/migrations/20210224071753-create-option.js +++ b/backend/src/migrations/20210224071753-create-option.js @@ -8,7 +8,7 @@ module.exports = { type: Sequelize.UUID, }, name: { - type: Sequelize.STRING + type: Sequelize.STRING, }, majorId: { type: Sequelize.UUID, @@ -21,15 +21,15 @@ module.exports = { }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Options'); - } -}; \ No newline at end of file + }, +}; diff --git a/backend/src/migrations/20210224122310-create-course-s2.js b/backend/src/migrations/20210224122310-create-course-s2.js index d3dd73d23dfff4e8ca0a0f6b1328dea97c7b6c96..6dbb905c23351b804e100e9dd697a7cb6e6333ea 100644 --- a/backend/src/migrations/20210224122310-create-course-s2.js +++ b/backend/src/migrations/20210224122310-create-course-s2.js @@ -27,15 +27,15 @@ module.exports = { }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('CourseS2s'); - } -}; \ No newline at end of file + }, +}; diff --git a/backend/src/migrations/20210224134733-create-course-class.js b/backend/src/migrations/20210224134733-create-course-class.js index 01f98f23dc7b9b14d9e876c19ff738b8b8a018d9..8a27c27a1187186dd5643e987135c538fe19925d 100644 --- a/backend/src/migrations/20210224134733-create-course-class.js +++ b/backend/src/migrations/20210224134733-create-course-class.js @@ -1,10 +1,7 @@ const { getEnumValues } = require('../util/enum'); -const { - SemesterEnum, - CourseClassStatusEnum -} = require('../enums/index'); +const { SemesterEnum, CourseClassStatusEnum } = require('../enums/index'); -'use strict'; +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { let semesters = getEnumValues(SemesterEnum); @@ -17,13 +14,13 @@ module.exports = { type: Sequelize.UUID, }, startYear: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, capacity: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, participantCount: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, semester: { defaultValue: '1', @@ -53,15 +50,15 @@ module.exports = { }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('CourseClasses'); - } -}; \ No newline at end of file + }, +}; diff --git a/backend/src/migrations/20210225071829-create-student-s2.js b/backend/src/migrations/20210225071829-create-student-s2.js index 9993606da88314e7f2c20624a32050db4c27364e..a684336c6aa9ef79aabb7ed2ac1791babe71ccc3 100644 --- a/backend/src/migrations/20210225071829-create-student-s2.js +++ b/backend/src/migrations/20210225071829-create-student-s2.js @@ -27,15 +27,15 @@ module.exports = { }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('StudentS2s'); - } -}; \ No newline at end of file + }, +}; diff --git a/backend/src/migrations/20210225102403-create-study-plan.js b/backend/src/migrations/20210225102403-create-study-plan.js index 0a11f81145ff5964d27fcdb3506db295e55123ae..4d33b41c335cab3c083511cae67ff191955e1f3a 100644 --- a/backend/src/migrations/20210225102403-create-study-plan.js +++ b/backend/src/migrations/20210225102403-create-study-plan.js @@ -1,10 +1,7 @@ const { getEnumValues } = require('../util/enum'); -const { - SemesterEnum, - StudyPlanStatusEnum -} = require('../enums/index'); +const { SemesterEnum, StudyPlanStatusEnum } = require('../enums/index'); -'use strict'; +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { let semesters = getEnumValues(SemesterEnum); @@ -26,11 +23,11 @@ module.exports = { onDelete: 'CASCADE', }, startYear: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, creditsTotal: { defaultValue: 0, - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, semester: { defaultValue: SemesterEnum.ODD, @@ -41,19 +38,19 @@ module.exports = { type: Sequelize.ENUM(studyPlanStatus), }, notes: { - type: Sequelize.TEXT + type: Sequelize.TEXT, }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('StudyPlans'); - } + }, }; diff --git a/backend/src/migrations/20210225103218-create-study-plan-course.js b/backend/src/migrations/20210225103218-create-study-plan-course.js index 28a3d17ed1d5d3496c6f623dd01a4cf02d0ea994..26573c414a2989e53a0bb603872d179b5b567819 100644 --- a/backend/src/migrations/20210225103218-create-study-plan-course.js +++ b/backend/src/migrations/20210225103218-create-study-plan-course.js @@ -1,11 +1,7 @@ const { getEnumValues } = require('../util/enum'); -const { - ScoreEnum, - StudyPlanCourseStatusEnum -} = require('../enums/index'); +const { ScoreEnum, StudyPlanCourseStatusEnum } = require('../enums/index'); - -'use strict'; +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { let scores = getEnumValues(ScoreEnum, 'name'); @@ -19,7 +15,7 @@ module.exports = { }, attendancePercentage: { defaultValue: 0, - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, studyPlanId: { type: Sequelize.UUID, @@ -49,15 +45,15 @@ module.exports = { }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('StudyPlanCourses'); - } + }, }; diff --git a/backend/src/migrations/20210318132120-create-course-class-default-schedule.js b/backend/src/migrations/20210318132120-create-course-class-default-schedule.js index 5e5ac4fc36ea07f8de9834fcb417cdc59cec1865..8edbf503deb7ea31e7faf25a34ee892b9c96b2fa 100644 --- a/backend/src/migrations/20210318132120-create-course-class-default-schedule.js +++ b/backend/src/migrations/20210318132120-create-course-class-default-schedule.js @@ -1,13 +1,11 @@ 'use strict'; const { getEnumValues } = require('../util/enum'); -const { - DayEnum, -} = require('../enums/index'); +const { DayEnum } = require('../enums/index'); module.exports = { up: async (queryInterface, Sequelize) => { - let days = getEnumValues(DayEnum, "name"); + let days = getEnumValues(DayEnum, 'name'); await queryInterface.createTable('CourseClassDefaultSchedules', { id: { @@ -17,13 +15,13 @@ module.exports = { }, day: { allowNull: false, - type: Sequelize.ENUM(days) + type: Sequelize.ENUM(days), }, start: { - type: Sequelize.TIME + type: Sequelize.TIME, }, end: { - type: Sequelize.TIME + type: Sequelize.TIME, }, courseClassId: { type: Sequelize.UUID, @@ -36,15 +34,15 @@ module.exports = { }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('CourseClassDefaultSchedules'); - } + }, }; diff --git a/backend/src/migrations/20210318133621-create-course-class-meeting.js b/backend/src/migrations/20210318133621-create-course-class-meeting.js index a421fb601028ec13e113853da5160e71beab8eac..62d78948fe07a9f1347e8af6422752d0ba43ece5 100644 --- a/backend/src/migrations/20210318133621-create-course-class-meeting.js +++ b/backend/src/migrations/20210318133621-create-course-class-meeting.js @@ -8,25 +8,25 @@ module.exports = { type: Sequelize.UUID, }, startTime: { - type: Sequelize.DATE + type: Sequelize.DATE, }, endTime: { - type: Sequelize.DATE + type: Sequelize.DATE, }, openAttendanceTime: { - type: Sequelize.DATE + type: Sequelize.DATE, }, closeAttendanceTime: { - type: Sequelize.DATE + type: Sequelize.DATE, }, link: { - type: Sequelize.STRING + type: Sequelize.STRING, }, topic: { - type: Sequelize.TEXT + type: Sequelize.TEXT, }, notes: { - type: Sequelize.TEXT + type: Sequelize.TEXT, }, courseClassId: { type: Sequelize.UUID, @@ -39,15 +39,15 @@ module.exports = { }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('CourseClassMeetings'); - } + }, }; diff --git a/backend/src/migrations/20210318145338-create-course-class-meeting-attendance.js b/backend/src/migrations/20210318145338-create-course-class-meeting-attendance.js index 99632283721eab47877769a4331946bb80a7a3ff..507fea2f1579ae8076bca7bd9644b346df693d15 100644 --- a/backend/src/migrations/20210318145338-create-course-class-meeting-attendance.js +++ b/backend/src/migrations/20210318145338-create-course-class-meeting-attendance.js @@ -1,8 +1,6 @@ 'use strict'; const { getEnumValues } = require('../util/enum'); -const { - AttendanceStatusEnum, -} = require('../enums/index'); +const { AttendanceStatusEnum } = require('../enums/index'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -34,19 +32,19 @@ module.exports = { }, status: { default: AttendanceStatusEnum.ABSENT, - type: Sequelize.ENUM(attendanceStatuses) + type: Sequelize.ENUM(attendanceStatuses), }, createdAt: { allowNull: false, - type: Sequelize.DATE + type: Sequelize.DATE, }, updatedAt: { allowNull: false, - type: Sequelize.DATE - } + type: Sequelize.DATE, + }, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('CourseClassMeetingAttendances'); - } + }, }; diff --git a/backend/src/models/course.js b/backend/src/models/course.js index c16b73c72b99fa6c19faaa70a5d47485035ca4a7..b075c966082661db9283239d436c0349e92be5e5 100644 --- a/backend/src/models/course.js +++ b/backend/src/models/course.js @@ -1,8 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Course extends Model { /** @@ -12,24 +10,30 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { this.belongsTo(models['Major'], { foreignKey: 'majorId' }); - this.hasMany(models['CourseClass'], { foreignKey: 'courseId', as: 'classes' }); + this.hasMany(models['CourseClass'], { + foreignKey: 'courseId', + as: 'classes', + }); } } - Course.init({ - code: DataTypes.STRING, - name: DataTypes.STRING, - type: DataTypes.ENUM(['WAJIB', 'PILIHAN']), - credits: DataTypes.INTEGER, - defaultSemester: DataTypes.INTEGER, - shortSyllabus: DataTypes.TEXT, - completeSyllabus: DataTypes.TEXT, - outcomes: DataTypes.TEXT, - curriculumYear: DataTypes.INTEGER - }, { - sequelize, - modelName: 'Course', - }); + Course.init( + { + code: DataTypes.STRING, + name: DataTypes.STRING, + type: DataTypes.ENUM(['WAJIB', 'PILIHAN']), + credits: DataTypes.INTEGER, + defaultSemester: DataTypes.INTEGER, + shortSyllabus: DataTypes.TEXT, + completeSyllabus: DataTypes.TEXT, + outcomes: DataTypes.TEXT, + curriculumYear: DataTypes.INTEGER, + }, + { + sequelize, + modelName: 'Course', + }, + ); - Course.beforeCreate(course => course.id = uuid_v4()); + Course.beforeCreate((course) => (course.id = uuid_v4())); return Course; -}; \ No newline at end of file +}; diff --git a/backend/src/models/courseclass.js b/backend/src/models/courseclass.js index 75a57c6368e587c6e0ae54d6fc41907777c14676..0c889df6fe5c96113810ad28374e38ac334e1049 100644 --- a/backend/src/models/courseclass.js +++ b/backend/src/models/courseclass.js @@ -1,9 +1,7 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class CourseClass extends Model { /** @@ -14,22 +12,34 @@ module.exports = (sequelize, DataTypes) => { static associate(models) { this.belongsTo(models['Course'], { foreignKey: 'courseId' }); this.belongsTo(models['Lecturer'], { foreignKey: 'lecturerId' }); - this.hasMany(models['StudyPlanCourse'], { foreignKey: 'courseClassId', as: 'studyPlanCourses' }); - this.hasMany(models['CourseClassDefaultSchedule'], { foreignKey: 'courseClassId', as: 'courseClassDefaultSchedules' }); - this.hasMany(models['CourseClassMeeting'], { foreignKey: 'courseClassId', as: 'courseClassMeetings' }); + this.hasMany(models['StudyPlanCourse'], { + foreignKey: 'courseClassId', + as: 'studyPlanCourses', + }); + this.hasMany(models['CourseClassDefaultSchedule'], { + foreignKey: 'courseClassId', + as: 'courseClassDefaultSchedules', + }); + this.hasMany(models['CourseClassMeeting'], { + foreignKey: 'courseClassId', + as: 'courseClassMeetings', + }); } } - CourseClass.init({ - startYear: DataTypes.INTEGER, - capacity: DataTypes.INTEGER, - participantCount: DataTypes.INTEGER, - semester: DataTypes.ENUM(['1', '2']), - status: DataTypes.ENUM(['OPEN', 'CLOSED']), - }, { - sequelize, - modelName: 'CourseClass', - }); + CourseClass.init( + { + startYear: DataTypes.INTEGER, + capacity: DataTypes.INTEGER, + participantCount: DataTypes.INTEGER, + semester: DataTypes.ENUM(['1', '2']), + status: DataTypes.ENUM(['OPEN', 'CLOSED']), + }, + { + sequelize, + modelName: 'CourseClass', + }, + ); - CourseClass.beforeCreate(courseClass => courseClass.id = uuid_v4()); + CourseClass.beforeCreate((courseClass) => (courseClass.id = uuid_v4())); return CourseClass; }; diff --git a/backend/src/models/courseclassdefaultschedule.js b/backend/src/models/courseclassdefaultschedule.js index a745d434d356de2b5624006ef9c2b4c171593178..72a258ee75fc2b5542f886e860a8595669a62bec 100644 --- a/backend/src/models/courseclassdefaultschedule.js +++ b/backend/src/models/courseclassdefaultschedule.js @@ -1,16 +1,12 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); const { getEnumValues } = require('../util/enum'); -const { - DayEnum, -} = require('../enums/index'); +const { DayEnum } = require('../enums/index'); module.exports = (sequelize, DataTypes) => { - let days = getEnumValues(DayEnum, "name"); + let days = getEnumValues(DayEnum, 'name'); class CourseClassDefaultSchedule extends Model { /** @@ -22,15 +18,20 @@ module.exports = (sequelize, DataTypes) => { this.belongsTo(models['CourseClass'], { foreignKey: 'courseClassId' }); } } - CourseClassDefaultSchedule.init({ - day: DataTypes.ENUM(days), - start: DataTypes.TIME, - end: DataTypes.TIME - }, { - sequelize, - modelName: 'CourseClassDefaultSchedule', - }); + CourseClassDefaultSchedule.init( + { + day: DataTypes.ENUM(days), + start: DataTypes.TIME, + end: DataTypes.TIME, + }, + { + sequelize, + modelName: 'CourseClassDefaultSchedule', + }, + ); - CourseClassDefaultSchedule.beforeCreate(courseClassDefaultSchedule => courseClassDefaultSchedule.id = uuid_v4()); + CourseClassDefaultSchedule.beforeCreate( + (courseClassDefaultSchedule) => (courseClassDefaultSchedule.id = uuid_v4()), + ); return CourseClassDefaultSchedule; }; diff --git a/backend/src/models/courseclassmeeting.js b/backend/src/models/courseclassmeeting.js index 0f3afe182c259652b7f9eec6dfc1418f3338a2c2..1405940ae518390c62acd6f704bd57fca25db5e2 100644 --- a/backend/src/models/courseclassmeeting.js +++ b/backend/src/models/courseclassmeeting.js @@ -1,9 +1,7 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class CourseClassMeeting extends Model { /** @@ -13,22 +11,30 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { this.belongsTo(models['CourseClass'], { foreignKey: 'courseClassId' }); - this.hasMany(models['CourseClassMeetingAttendance'], { foreignKey: 'courseClassMeetingId', as: 'courseClassMeetingAttendances' }); + this.hasMany(models['CourseClassMeetingAttendance'], { + foreignKey: 'courseClassMeetingId', + as: 'courseClassMeetingAttendances', + }); } } - CourseClassMeeting.init({ - startTime: DataTypes.DATE, - endTime: DataTypes.DATE, - openAttendanceTime: DataTypes.DATE, - closeAttendanceTime: DataTypes.DATE, - link: DataTypes.STRING, - topic: DataTypes.TEXT, - notes: DataTypes.TEXT - }, { - sequelize, - modelName: 'CourseClassMeeting', - }); + CourseClassMeeting.init( + { + startTime: DataTypes.DATE, + endTime: DataTypes.DATE, + openAttendanceTime: DataTypes.DATE, + closeAttendanceTime: DataTypes.DATE, + link: DataTypes.STRING, + topic: DataTypes.TEXT, + notes: DataTypes.TEXT, + }, + { + sequelize, + modelName: 'CourseClassMeeting', + }, + ); - CourseClassMeeting.beforeCreate(courseClassMeeting => courseClassMeeting.id = uuid_v4()); + CourseClassMeeting.beforeCreate( + (courseClassMeeting) => (courseClassMeeting.id = uuid_v4()), + ); return CourseClassMeeting; }; diff --git a/backend/src/models/courseclassmeetingattendance.js b/backend/src/models/courseclassmeetingattendance.js index 9f51b497492d3b82410e92f1dcac7a870948dbf7..f4d9f79be88a2baa5aa41290e1c7ed49d8c4ec4a 100644 --- a/backend/src/models/courseclassmeetingattendance.js +++ b/backend/src/models/courseclassmeetingattendance.js @@ -1,14 +1,10 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); const { getEnumValues } = require('../util/enum'); -const { - AttendanceStatusEnum, -} = require('../enums/index'); +const { AttendanceStatusEnum } = require('../enums/index'); module.exports = (sequelize, DataTypes) => { let attendanceStatuses = getEnumValues(AttendanceStatusEnum); @@ -20,17 +16,25 @@ module.exports = (sequelize, DataTypes) => { * The `models/index` file will call this method automatically. */ static associate(models) { - this.belongsTo(models['CourseClassMeeting'], { foreignKey: 'courseClassMeetingId' }); + this.belongsTo(models['CourseClassMeeting'], { + foreignKey: 'courseClassMeetingId', + }); this.belongsTo(models['Student'], { foreignKey: 'studentId' }); } } - CourseClassMeetingAttendance.init({ - status: DataTypes.ENUM(attendanceStatuses) - }, { - sequelize, - modelName: 'CourseClassMeetingAttendance', - }); + CourseClassMeetingAttendance.init( + { + status: DataTypes.ENUM(attendanceStatuses), + }, + { + sequelize, + modelName: 'CourseClassMeetingAttendance', + }, + ); - CourseClassMeetingAttendance.beforeCreate(courseClassMeetingAttendance => courseClassMeetingAttendance.id = uuid_v4()); + CourseClassMeetingAttendance.beforeCreate( + (courseClassMeetingAttendance) => + (courseClassMeetingAttendance.id = uuid_v4()), + ); return CourseClassMeetingAttendance; }; diff --git a/backend/src/models/courses2.js b/backend/src/models/courses2.js index 53ed954b1807826dddac31fe05b99f8d2afb26e4..5bca35f2a0b2218ca3a04e5472deb475d89a5b3d 100644 --- a/backend/src/models/courses2.js +++ b/backend/src/models/courses2.js @@ -1,8 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class CourseS2 extends Model { /** @@ -15,12 +13,15 @@ module.exports = (sequelize, DataTypes) => { this.belongsTo(models['Course'], { foreignKey: 'courseId' }); } } - CourseS2.init({}, { - sequelize, - modelName: 'CourseS2', - }); + CourseS2.init( + {}, + { + sequelize, + modelName: 'CourseS2', + }, + ); - CourseS2.beforeCreate(courseS2 => courseS2.id = uuid_v4()); + CourseS2.beforeCreate((courseS2) => (courseS2.id = uuid_v4())); return CourseS2; -}; \ No newline at end of file +}; diff --git a/backend/src/models/faculty.js b/backend/src/models/faculty.js index 9e1a21721b66f1239367edc035845f3d28416b7d..ff2e7e0aa7c9533f5771fb3c948139aacbc81a8c 100644 --- a/backend/src/models/faculty.js +++ b/backend/src/models/faculty.js @@ -1,9 +1,7 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model, -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Faculty extends Model { /** @@ -15,14 +13,17 @@ module.exports = (sequelize, DataTypes) => { this.hasMany(models['Major'], { foreignKey: 'facultyId', as: 'majors' }); } } - Faculty.init({ - shortName: DataTypes.STRING, - fullName: DataTypes.STRING, - }, { - sequelize, - modelName: 'Faculty', - }); + Faculty.init( + { + shortName: DataTypes.STRING, + fullName: DataTypes.STRING, + }, + { + sequelize, + modelName: 'Faculty', + }, + ); - Faculty.beforeCreate(faculty => faculty.id = uuid_v4()); + Faculty.beforeCreate((faculty) => (faculty.id = uuid_v4())); return Faculty; }; diff --git a/backend/src/models/index.js b/backend/src/models/index.js index 93bd054e43ac788970c2ca485b9c745c7bab470a..4331ecb8c7212584949f60caf2eeb31f251e9945 100644 --- a/backend/src/models/index.js +++ b/backend/src/models/index.js @@ -12,26 +12,35 @@ let sequelize; if (config.use_env_variable) { sequelize = new Sequelize(process.env[config.use_env_variable], config); } else { - sequelize = new Sequelize(config.database, config.username, config.password, config); + sequelize = new Sequelize( + config.database, + config.username, + config.password, + config, + ); } -fs - .readdirSync(__dirname) - .filter(file => { - return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); +fs.readdirSync(__dirname) + .filter((file) => { + return ( + file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js' + ); }) - .forEach(file => { - const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); + .forEach((file) => { + const model = require(path.join(__dirname, file))( + sequelize, + Sequelize.DataTypes, + ); db[model.name] = model; }); -Object.keys(db).forEach(modelName => { +Object.keys(db).forEach((modelName) => { if (db[modelName].associate) { db[modelName].associate(db); } }); -const checkDatabaseConnection = async() => { +const checkDatabaseConnection = async () => { try { await sequelize.authenticate(); console.log('Connection has been established successfully.'); diff --git a/backend/src/models/lecturer.js b/backend/src/models/lecturer.js index 63cf3afb65931361c0f60c5128bbca06d107f28a..e5b79a2a8799618a482cf549ec5ed676a2c1c4e4 100644 --- a/backend/src/models/lecturer.js +++ b/backend/src/models/lecturer.js @@ -1,14 +1,9 @@ const { v4: uuid_v4 } = require('uuid'); const { getEnumValues } = require('../util/enum'); -const { - LecturerRoleEnum, - GenderEnum -} = require('../enums/index'); +const { LecturerRoleEnum, GenderEnum } = require('../enums/index'); -'use strict'; -const { - Model, -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { let genders = getEnumValues(GenderEnum, 'short'); let lecturerRoles = getEnumValues(LecturerRoleEnum); @@ -22,23 +17,32 @@ module.exports = (sequelize, DataTypes) => { static associate(models) { this.belongsTo(models['SkillGroup'], { foreignKey: 'skillGroupId' }); this.belongsTo(models['User'], { foreignKey: 'userId' }); - this.hasMany(models['Student'], { foreignKey: 'advisorId', as: 'advisedStudents' }); - this.hasMany(models['CourseClass'], { foreignKey: 'lecturerId', as: 'classes' }); + this.hasMany(models['Student'], { + foreignKey: 'advisorId', + as: 'advisedStudents', + }); + this.hasMany(models['CourseClass'], { + foreignKey: 'lecturerId', + as: 'classes', + }); } } - Lecturer.init({ - userName: DataTypes.STRING, - fullName: DataTypes.STRING, - gender: DataTypes.ENUM(genders), - nip: DataTypes.STRING, - nik: DataTypes.STRING, - phone: DataTypes.STRING, - academicRole: DataTypes.ENUM(lecturerRoles), - }, { - sequelize, - modelName: 'Lecturer', - }); + Lecturer.init( + { + userName: DataTypes.STRING, + fullName: DataTypes.STRING, + gender: DataTypes.ENUM(genders), + nip: DataTypes.STRING, + nik: DataTypes.STRING, + phone: DataTypes.STRING, + academicRole: DataTypes.ENUM(lecturerRoles), + }, + { + sequelize, + modelName: 'Lecturer', + }, + ); - Lecturer.beforeCreate(lecturer => lecturer.id = uuid_v4()); + Lecturer.beforeCreate((lecturer) => (lecturer.id = uuid_v4())); return Lecturer; }; diff --git a/backend/src/models/major.js b/backend/src/models/major.js index dd14ec26406609e1433699721811fe875b549314..a12f4cb4269f91500466c73a955c0a9fb0e235d0 100644 --- a/backend/src/models/major.js +++ b/backend/src/models/major.js @@ -1,9 +1,7 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model, -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Major extends Model { /** @@ -13,20 +11,29 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { this.belongsTo(models['Faculty'], { foreignKey: 'facultyId' }); - this.hasMany(models['SkillGroup'], { foreignKey: 'majorId', as: 'skillGroups' }); - this.hasMany(models['Student'], { foreignKey: 'majorId', as: 'students' }); + this.hasMany(models['SkillGroup'], { + foreignKey: 'majorId', + as: 'skillGroups', + }); + this.hasMany(models['Student'], { + foreignKey: 'majorId', + as: 'students', + }); this.hasMany(models['Course'], { foreignKey: 'majorId', as: 'courses' }); this.hasMany(models['Option'], { foreignKey: 'majorId', as: 'options' }); } } - Major.init({ - numberCode: DataTypes.INTEGER, - name: DataTypes.STRING, - }, { - sequelize, - modelName: 'Major', - }); + Major.init( + { + numberCode: DataTypes.INTEGER, + name: DataTypes.STRING, + }, + { + sequelize, + modelName: 'Major', + }, + ); - Major.beforeCreate(major => major.id = uuid_v4()); + Major.beforeCreate((major) => (major.id = uuid_v4())); return Major; }; diff --git a/backend/src/models/option.js b/backend/src/models/option.js index b1757a35f64f413fade7e0c8a61108b034aee455..b626883d5d6854d6e078ae233af1528916c15437 100644 --- a/backend/src/models/option.js +++ b/backend/src/models/option.js @@ -1,8 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Option extends Model { /** @@ -12,17 +10,26 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { this.belongsTo(models['Major'], { foreignKey: 'majorId' }); - this.hasMany(models['CourseS2'], { foreignKey: 'optionId', as: 'courses' }); - this.hasMany(models['StudentS2'], { foreignKey: 'optionId', as: 'students' }); + this.hasMany(models['CourseS2'], { + foreignKey: 'optionId', + as: 'courses', + }); + this.hasMany(models['StudentS2'], { + foreignKey: 'optionId', + as: 'students', + }); } } - Option.init({ - name: DataTypes.STRING - }, { - sequelize, - modelName: 'Option', - }); + Option.init( + { + name: DataTypes.STRING, + }, + { + sequelize, + modelName: 'Option', + }, + ); - Option.beforeCreate(option => option.id = uuid_v4()); + Option.beforeCreate((option) => (option.id = uuid_v4())); return Option; -}; \ No newline at end of file +}; diff --git a/backend/src/models/skillgroup.js b/backend/src/models/skillgroup.js index 93d0907762b13cbbd8f1f9cfc590c2ebc988ce53..894a57350f5565cb9cf88a66e6130241840d34b1 100644 --- a/backend/src/models/skillgroup.js +++ b/backend/src/models/skillgroup.js @@ -1,8 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model, -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class SkillGroup extends Model { /** @@ -12,16 +10,22 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { this.belongsTo(models['Major'], { foreignKey: 'majorId' }); - this.hasMany(models['Lecturer'], { foreignKey: 'skillGroupId', as: 'lecturers' }); + this.hasMany(models['Lecturer'], { + foreignKey: 'skillGroupId', + as: 'lecturers', + }); } } - SkillGroup.init({ - name: DataTypes.STRING, - }, { - sequelize, - modelName: 'SkillGroup', - }); + SkillGroup.init( + { + name: DataTypes.STRING, + }, + { + sequelize, + modelName: 'SkillGroup', + }, + ); - SkillGroup.beforeCreate(skillGroup => skillGroup.id = uuid_v4()); + SkillGroup.beforeCreate((skillGroup) => (skillGroup.id = uuid_v4())); return SkillGroup; }; diff --git a/backend/src/models/student.js b/backend/src/models/student.js index a84a21d533d0ee51173f0d05fdcfa4135f6c0fc5..ad27d51209e8c1099df0332cb249859f34fd9e45 100644 --- a/backend/src/models/student.js +++ b/backend/src/models/student.js @@ -1,8 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model, -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Student extends Model { /** @@ -11,26 +9,38 @@ module.exports = (sequelize, DataTypes) => { * The `models/index` file will call this method automatically. */ static associate(models) { - this.belongsTo(models['Lecturer'], {foreignKey: 'advisorId', as: 'Advisor'}); + this.belongsTo(models['Lecturer'], { + foreignKey: 'advisorId', + as: 'Advisor', + }); this.belongsTo(models['Major'], { foreignKey: 'majorId' }); this.belongsTo(models['User'], { foreignKey: 'userId' }); - this.hasMany(models['StudyPlan'], { foreignKey: 'studentId', as: 'studyPlans' }); - this.hasMany(models['CourseClassMeetingAttendance'], { foreignKey: 'studentId', as: 'studentAttendances' }); + this.hasMany(models['StudyPlan'], { + foreignKey: 'studentId', + as: 'studyPlans', + }); + this.hasMany(models['CourseClassMeetingAttendance'], { + foreignKey: 'studentId', + as: 'studentAttendances', + }); } } - Student.init({ - userName: DataTypes.STRING, - fullName: DataTypes.STRING, - gender: DataTypes.ENUM('M', 'F'), - nim: DataTypes.STRING, - nik: DataTypes.STRING, - phone: DataTypes.STRING, - year: DataTypes.INTEGER, - }, { - sequelize, - modelName: 'Student', - }); + Student.init( + { + userName: DataTypes.STRING, + fullName: DataTypes.STRING, + gender: DataTypes.ENUM('M', 'F'), + nim: DataTypes.STRING, + nik: DataTypes.STRING, + phone: DataTypes.STRING, + year: DataTypes.INTEGER, + }, + { + sequelize, + modelName: 'Student', + }, + ); - Student.beforeCreate(student => student.id = uuid_v4()); + Student.beforeCreate((student) => (student.id = uuid_v4())); return Student; }; diff --git a/backend/src/models/students2.js b/backend/src/models/students2.js index 566ece1aca5a43b40f383567929faf39b97365fd..94152f13d60ff9e48d638132bdd441ff4661d913 100644 --- a/backend/src/models/students2.js +++ b/backend/src/models/students2.js @@ -1,9 +1,7 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class StudentS2 extends Model { /** @@ -15,12 +13,15 @@ module.exports = (sequelize, DataTypes) => { this.belongsTo(models['Option'], { foreignKey: 'optionId' }); this.belongsTo(models['Student'], { foreignKey: 'studentId' }); } - }; - StudentS2.init({}, { - sequelize, - modelName: 'StudentS2', - }); + } + StudentS2.init( + {}, + { + sequelize, + modelName: 'StudentS2', + }, + ); - StudentS2.beforeCreate(studentS2 => studentS2.id = uuid_v4()); + StudentS2.beforeCreate((studentS2) => (studentS2.id = uuid_v4())); return StudentS2; -}; \ No newline at end of file +}; diff --git a/backend/src/models/studyplan.js b/backend/src/models/studyplan.js index 2e46c5570a027204144450620648f6821f62986c..17407222515e49af357b2d66ecdc9b4b3e5c408d 100644 --- a/backend/src/models/studyplan.js +++ b/backend/src/models/studyplan.js @@ -1,15 +1,10 @@ const { v4: uuid_v4 } = require('uuid'); -const { - SemesterEnum, - StudyPlanStatusEnum -} = require('../enums/index'); +const { SemesterEnum, StudyPlanStatusEnum } = require('../enums/index'); const { getEnumValues } = require('../util/enum'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { let semesters = getEnumValues(SemesterEnum); let studyPlanStatus = getEnumValues(StudyPlanStatusEnum); @@ -22,20 +17,26 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { this.belongsTo(models['Student'], { foreignKey: 'studentId' }); - this.hasMany(models['StudyPlanCourse'], { foreignKey: 'studyPlanId', as: 'studyPlanCourses' }); + this.hasMany(models['StudyPlanCourse'], { + foreignKey: 'studyPlanId', + as: 'studyPlanCourses', + }); } } - StudyPlan.init({ - startYear: DataTypes.INTEGER, - creditsTotal: DataTypes.INTEGER, - semester: DataTypes.ENUM(semesters), - status: DataTypes.ENUM(studyPlanStatus), - notes: DataTypes.TEXT - }, { - sequelize, - modelName: 'StudyPlan', - }); + StudyPlan.init( + { + startYear: DataTypes.INTEGER, + creditsTotal: DataTypes.INTEGER, + semester: DataTypes.ENUM(semesters), + status: DataTypes.ENUM(studyPlanStatus), + notes: DataTypes.TEXT, + }, + { + sequelize, + modelName: 'StudyPlan', + }, + ); - StudyPlan.beforeCreate(studyPlan => studyPlan.id = uuid_v4()); + StudyPlan.beforeCreate((studyPlan) => (studyPlan.id = uuid_v4())); return StudyPlan; }; diff --git a/backend/src/models/studyplancourse.js b/backend/src/models/studyplancourse.js index 946ba3c61c8419b495e0e1d10e8cfeb4a3473336..7721b17cbd9bd6585c9aa4cafda51324359fbda1 100644 --- a/backend/src/models/studyplancourse.js +++ b/backend/src/models/studyplancourse.js @@ -1,14 +1,9 @@ const { v4: uuid_v4 } = require('uuid'); const { getEnumValues } = require('../util/enum'); -const { - ScoreEnum, - StudyPlanCourseStatusEnum -} = require('../enums/index'); +const { ScoreEnum, StudyPlanCourseStatusEnum } = require('../enums/index'); -'use strict'; -const { - Model -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { let scores = getEnumValues(ScoreEnum, 'name'); let studyPlanCourseStatus = getEnumValues(StudyPlanCourseStatusEnum); @@ -24,15 +19,20 @@ module.exports = (sequelize, DataTypes) => { this.belongsTo(models['CourseClass'], { foreignKey: 'courseClassId' }); } } - StudyPlanCourse.init({ - attendancePercentage: DataTypes.INTEGER, - score: DataTypes.ENUM(scores), - status: DataTypes.ENUM(studyPlanCourseStatus) - }, { - sequelize, - modelName: 'StudyPlanCourse', - }); + StudyPlanCourse.init( + { + attendancePercentage: DataTypes.INTEGER, + score: DataTypes.ENUM(scores), + status: DataTypes.ENUM(studyPlanCourseStatus), + }, + { + sequelize, + modelName: 'StudyPlanCourse', + }, + ); - StudyPlanCourse.beforeCreate(studyPlanCourse => studyPlanCourse.id = uuid_v4()); + StudyPlanCourse.beforeCreate( + (studyPlanCourse) => (studyPlanCourse.id = uuid_v4()), + ); return StudyPlanCourse; }; diff --git a/backend/src/models/user.js b/backend/src/models/user.js index e4a2626348c194b49f3947c2add58e84d1de75ce..739243f645ed9d0ae941c6c876f09ceb6b950988 100644 --- a/backend/src/models/user.js +++ b/backend/src/models/user.js @@ -1,8 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; -const { - Model, -} = require('sequelize'); +('use strict'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class User extends Model { @@ -15,17 +13,20 @@ module.exports = (sequelize, DataTypes) => { // define association here } } - User.init({ - email: DataTypes.STRING, - hashed_password: DataTypes.STRING, - salt: DataTypes.STRING, - role: DataTypes.ENUM(['ADMIN', 'DEFAULT_USER']), - }, { - sequelize, - modelName: 'User', - }); + User.init( + { + email: DataTypes.STRING, + hashed_password: DataTypes.STRING, + salt: DataTypes.STRING, + role: DataTypes.ENUM(['ADMIN', 'DEFAULT_USER']), + }, + { + sequelize, + modelName: 'User', + }, + ); - User.beforeCreate(user => user.id = uuid_v4()); + User.beforeCreate((user) => (user.id = uuid_v4())); return User; }; diff --git a/backend/src/routes/course-class-meeting.js b/backend/src/routes/course-class-meeting.js index 4174c3212f004619d203c267685b93998164a848..635c631e04049a8cf02e151bd6f4c545d68b8f5f 100644 --- a/backend/src/routes/course-class-meeting.js +++ b/backend/src/routes/course-class-meeting.js @@ -3,9 +3,9 @@ const router = express.Router(); const courseClassMeeting = require('../controllers/course-class-meeting'); const { - getCourseClassMeetingMiddleware, - updateCourseClassMeetingBodyCheckerMiddleware, - updateCourseClassMeetingMiddleware + getCourseClassMeetingMiddleware, + updateCourseClassMeetingBodyCheckerMiddleware, + updateCourseClassMeetingMiddleware, } = require('../middleware/course-class-meeting'); router.get('/', getCourseClassMeetingMiddleware); diff --git a/backend/src/routes/courseclass.js b/backend/src/routes/courseclass.js index b2f14c778917a4f7c04a0ec6e21acb3de8086089..6744827c2a48ad2830527a2dff5ec4a5b2135aaf 100644 --- a/backend/src/routes/courseclass.js +++ b/backend/src/routes/courseclass.js @@ -3,8 +3,8 @@ const router = express.Router(); const courseclass = require('../controllers/courseclass'); const { - getCourseClassMiddleware, - updateCourseClassMiddleware + getCourseClassMiddleware, + updateCourseClassMiddleware, } = require('../middleware/course-class'); router.post('/', courseclass.createCourseClassData); diff --git a/backend/src/routes/score.js b/backend/src/routes/score.js index ded35811497cb152519a5863e0f5305e2e69ca81..002828f2ed001bb0358f4a63dded1feb4f09be1c 100644 --- a/backend/src/routes/score.js +++ b/backend/src/routes/score.js @@ -1,10 +1,10 @@ -const express = require("express"); +const express = require('express'); const router = express.Router(); -const { updateScoreMiddleware } = require("../middleware/score"); -const studentController = require("../controllers/student"); +const { updateScoreMiddleware } = require('../middleware/score'); +const studentController = require('../controllers/student'); -router.put("/", updateScoreMiddleware); -router.put("/", studentController.updateStudentScore); +router.put('/', updateScoreMiddleware); +router.put('/', studentController.updateStudentScore); module.exports = router; diff --git a/backend/src/routes/student.js b/backend/src/routes/student.js index 1852a2ce2679f0a46dc19e4fd07097b8c1077e7b..45b3cf82229b519049a13506e8d835bff03c3e85 100644 --- a/backend/src/routes/student.js +++ b/backend/src/routes/student.js @@ -2,9 +2,7 @@ var express = require('express'); var router = express.Router(); var studentController = require('../controllers/student'); -const { - getStudentMiddleware -} = require('../middleware/student'); +const { getStudentMiddleware } = require('../middleware/student'); // GET request to get student data router.get('/:id', getStudentMiddleware); @@ -13,5 +11,4 @@ router.get('/:id', studentController.getStudentData); // PUT request to update student data router.put('/:id', studentController.updateStudentData); - module.exports = router; diff --git a/backend/src/routes/study-plan.js b/backend/src/routes/study-plan.js index b640df629a75c8f3f6dc0cb23e7d23c8d0418e98..965c4c13a879c47e81002669cfa065eac62d2720 100644 --- a/backend/src/routes/study-plan.js +++ b/backend/src/routes/study-plan.js @@ -2,9 +2,9 @@ var express = require('express'); var router = express.Router(); var studyPlan = require('../controllers/study-plan'); -const { - getStudyPlanMiddleware, - updateStudyPlanMiddleware +const { + getStudyPlanMiddleware, + updateStudyPlanMiddleware, } = require('../middleware/study-plan'); // POST request to create study plan data diff --git a/backend/src/seeders/20210214113710-faculty-seed.js b/backend/src/seeders/20210214113710-faculty-seed.js index 38ab7cfdc91c8a2c916741f46b85d6a187f53e73..bbe487b8a2d58858b82dbcca937d096df228751d 100644 --- a/backend/src/seeders/20210214113710-faculty-seed.js +++ b/backend/src/seeders/20210214113710-faculty-seed.js @@ -1,11 +1,12 @@ const { v4: uuid_v4 } = require('uuid'); -'use strict'; +('use strict'); module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { let date = new Date(); await queryInterface.bulkInsert( - 'Faculties', [ + 'Faculties', + [ { id: uuid_v4(), shortName: 'STEI', @@ -53,7 +54,7 @@ module.exports = { ); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('Faculties', null, {}); }, }; diff --git a/backend/src/seeders/20210214115215-major-seed.js b/backend/src/seeders/20210214115215-major-seed.js index 9a9860ea65c581449ee671e7b3e17590e6e4a017..5da5e5d02178a60057bbd46eca31b0699d35cec7 100644 --- a/backend/src/seeders/20210214115215-major-seed.js +++ b/backend/src/seeders/20210214115215-major-seed.js @@ -1,10 +1,10 @@ const { v4: uuid_v4 } = require('uuid'); const Faculty = require('../models/index')['Faculty']; -'use strict'; +('use strict'); module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { let date = new Date(); const stei = await Faculty.findOne({ @@ -19,51 +19,55 @@ module.exports = { }, }); - await queryInterface.bulkInsert('Majors', [ - { - id: uuid_v4(), - numberCode: '135', - name: 'Sarjana Teknik Informatika', - facultyId: stei.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - numberCode: '182', - name: 'Sarjana Sistem Teknologi dan Informasi', - facultyId: stei.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - numberCode: '235', - name: 'Magister Teknik Informatika', - facultyId: stei.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - numberCode: '123', - name: 'Sarjana Teknik Industri', - facultyId: fti.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - numberCode: '223', - name: 'Magister Teknik Industri', - facultyId: fti.id, - createdAt: date, - updatedAt: date, - }, - ], {}); + await queryInterface.bulkInsert( + 'Majors', + [ + { + id: uuid_v4(), + numberCode: '135', + name: 'Sarjana Teknik Informatika', + facultyId: stei.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + numberCode: '182', + name: 'Sarjana Sistem Teknologi dan Informasi', + facultyId: stei.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + numberCode: '235', + name: 'Magister Teknik Informatika', + facultyId: stei.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + numberCode: '123', + name: 'Sarjana Teknik Industri', + facultyId: fti.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + numberCode: '223', + name: 'Magister Teknik Industri', + facultyId: fti.id, + createdAt: date, + updatedAt: date, + }, + ], + {}, + ); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('Majors', null, {}); }, }; diff --git a/backend/src/seeders/20210214123247-skill-groups-seed.js b/backend/src/seeders/20210214123247-skill-groups-seed.js index 41ff4c307430eb1a9ed6125b76cc65b68782ab28..cb32a0364da63c3020e5840939bbdddeed5d4996 100644 --- a/backend/src/seeders/20210214123247-skill-groups-seed.js +++ b/backend/src/seeders/20210214123247-skill-groups-seed.js @@ -1,9 +1,9 @@ const { v4: uuid_v4 } = require('uuid'); const Major = require('../models/index')['Major']; -'use strict'; +('use strict'); module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { let date = new Date(); const masterIF = await Major.findOne({ @@ -18,39 +18,43 @@ module.exports = { }, }); - await queryInterface.bulkInsert('SkillGroups', [ - { - id: uuid_v4(), - name: 'Rekayasa Perangkat Lunak', - majorId: masterIF.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - name: 'Sistem Intelijen', - majorId: masterIF.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - name: 'Sistem Informasi', - majorId: bachelorIF.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - name: 'Software Engineering', - majorId: bachelorIF.id, - createdAt: date, - updatedAt: date, - }, - ], {}); + await queryInterface.bulkInsert( + 'SkillGroups', + [ + { + id: uuid_v4(), + name: 'Rekayasa Perangkat Lunak', + majorId: masterIF.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + name: 'Sistem Intelijen', + majorId: masterIF.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + name: 'Sistem Informasi', + majorId: bachelorIF.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + name: 'Software Engineering', + majorId: bachelorIF.id, + createdAt: date, + updatedAt: date, + }, + ], + {}, + ); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('SkillGroups', null, {}); }, }; diff --git a/backend/src/seeders/20210221122040-user-student-lecturer-seed.js b/backend/src/seeders/20210221122040-user-student-lecturer-seed.js index 5a57b036d865a521ffceb46d4b7c1d049f2e9d97..cb52170f4dc41f6026a062100436eec584d6f0ec 100644 --- a/backend/src/seeders/20210221122040-user-student-lecturer-seed.js +++ b/backend/src/seeders/20210221122040-user-student-lecturer-seed.js @@ -11,7 +11,7 @@ const { const { LecturerRoleEnum } = require('../enums/index'); module.exports = { - up: async(queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { /** * Add seed commands here. * @@ -20,8 +20,10 @@ module.exports = { * name: 'John Doe', * isBetaMember: false * }], {}); - */ - const { salt, hashedPassword } = await hashPasswordWithoutSalt('ilovewaifu'); + */ + const { salt, hashedPassword } = await hashPasswordWithoutSalt( + 'ilovewaifu', + ); const user = await User.create({ email: 'ihsan@gmail.com', @@ -32,25 +34,25 @@ module.exports = { const steiMajor = await Major.findOne({ where: { numberCode: '235', - } + }, }); const skillGroup = await SkillGroup.findOne({ where: { name: 'Rekayasa Perangkat Lunak', - } + }, }); const lecturer = await Lecturer.create({ userId: user.id, skillGroupId: skillGroup.id, - academicRole: LecturerRoleEnum.MAJOR_HEAD + academicRole: LecturerRoleEnum.MAJOR_HEAD, }); const skillGroupSintel = await SkillGroup.findOne({ where: { name: 'Sistem Intelijen', - } + }, }); const lecturerSintel = await Lecturer.create({ @@ -65,7 +67,7 @@ module.exports = { }); }, - down: async(queryInterface, Sequelize) => { + down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('Users', null, {}); await queryInterface.bulkDelete('Majors', null, {}); await queryInterface.bulkDelete('SkillGroups', null, {}); diff --git a/backend/src/seeders/20210224041052-course-seed.js b/backend/src/seeders/20210224041052-course-seed.js index 82ef28611d8685f2cf2be84d9e0234a7b5a0c17e..d5a617239d755ff2cf01258f62d45e8fba42a868 100644 --- a/backend/src/seeders/20210224041052-course-seed.js +++ b/backend/src/seeders/20210224041052-course-seed.js @@ -1,8 +1,6 @@ 'use strict'; const { v4: uuid_v4 } = require('uuid'); -const { - Major -} = require('../models/index'); +const { Major } = require('../models/index'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -20,99 +18,120 @@ module.exports = { }, }); - await queryInterface.bulkInsert('Courses', [ - { - id: uuid_v4(), - code: "IF5122", - name: "Pembangunan Perangkat Lunak", - credits: 2, - type: "WAJIB", - defaultSemester: 2, - shortSyllabus: "Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review", - completeSyllabus: "Pada kuliah ini mahasiswa dibekali dengan prinsip design perangkat lunak yang “baikâ€, dan menerapkan proses pembangunan (konstruksi) perangkat lunak dalam team, sesuai dengan praktik yang diterapkan di industri dan tools yang banyak digunakan. Topik yang dicakup adalah : Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review.", - outcomes: "Mahasiswa mampu untuk menerapkan prinsip design dalam membangun perangkat lunak, dan membangun perangkat lunak sesuai praktik yang baik (studi kasus).", - majorId: masterIF.id, - curriculumYear: 2013, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - code: "IF3250", - name: "Proyek Perangkat Lunak", - credits: 4, - type: "WAJIB", - defaultSemester: 6, - shortSyllabus: "Kuliah ini memberikan gambaran kompleksitas dan pengalaman mengenai pengembangan perangkat lunak skala besar.", - completeSyllabus: "Definisi perangkat lunak skala besar; berbagai masalah dalam pengembangan perangkat lunak skala besar dan solusinya; abstraksi; SW Pattern; code generator; pengenalan berbagai platform, framework, dan tools; konfigurasi P/L (konsep, tools, practices...); dilengkapi dengan studi kasus berupa proyek pembangunan P/L skala besar dengan mempraktekkan semua teori yang telah diberikan, atau berupa reverse engineering suatu perangkat lunak skala besar untuk mendapatkan modelnya; ", - outcomes: "1. Memahami definisi P/L skala besar serta berbagai persoalan pengembangan P/L skala besar\n 2. Memahami teknik/metoda terkait dengan pembangunan P/L skala besar, seperti manajemen konfigurasi P/L", - majorId: bachelorIF.id, - curriculumYear: 2019, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - code: "IF5010", - name: "Sistem & Arsitektur Komputer A", - credits: 2, - type: "WAJIB", - defaultSemester: 1, - shortSyllabus: "Memberikan pengetahuan tentang riset dan teknologi sistem arsitektur komputer terkini.", - completeSyllabus: "Pembahasan yg lebih dalam dan lanjut tentang modern microprocessors and computer systems, akan dibahas antara lain: Hirarki memory (cache memory, virtual memory, memory management), Instruksi Pipelining.", - outcomes: "Mahasiswa diharapkan mampu memahami pengetahuan tentang riset dan teknologi sistem arsitektur komputer.", - majorId: masterIF.id, - curriculumYear: 2013, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - code: "IF6012", - name: "Arsitektur Komputer Lanjut", - credits: 3, - type: "PILIHAN", - shortSyllabus: "Membahas aspek kuantitatif dan kualitatif dari desain arsitektur komputer.", - completeSyllabus: "Dasar Desain Komputer, Instruction level parallelism, limits on ILP, multi processor dan thread level parallelism, memory hierarchy design, storage systems.", - outcomes: "1. Siswa mampu memahami prinsip dasar arsitektur komputer modern.\n 2. Memahami design tradeoff pada arsitektur komputer.", - majorId: masterIF.id, - curriculumYear: 2013, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - code: "IF6099", - name: "Tesis", - credits: 6, - type: "WAJIB", - defaultSemester: 3, - shortSyllabus: "Kuliah ini berisi representasi proyek akhir mahasiswa atau Tesis yang bertujuan mengintegrasikan materi yang sudah didapat di perkuliahan.", - completeSyllabus: "Menjelaskan dan mengaplikasikan teori, metode, teknik yang relavan pada suatu area yang dipilih, menginterpretasikan data, dan mengambil suatu konklusi/kesimpulan serta saran yang sesuai.", - outcomes: "Mahasiswa diharapkan mampu menghasilkan tesis, dan menuliskan sebuah publikasi ilmiah", - majorId: masterIF.id, - curriculumYear: 2013, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - code: "IF2036", - name: "Rekayasa Perangkat Lunak", - credits: 3, - type: "WAJIB", - defaultSemester: 4, - shortSyllabus: "Konsep dasar, daur hidup, dan tahapan rekayasa perangkat lunak (analisis, perancangan, konstruksi, pengujian, dan perawatan), berdasarkan dua metode utama: metode konvensional (terstruktur) dan metode berorientasi objek, dilengkapi studi kasus pada tahap analisis dan perancangan.", - completeSyllabus: "Materi yang diberikan meliputi tahapan rekayasa perangkat lunak yang terdiri dari analisis, pearncangan, konstruksi, pengujian, dan perawatan, dengan memberikan gambaran dua metode, yaitu metode konvensional (terstruktur) dan metode berorientasi objek, dan dilengkapi dengan studi kasus untuk memberikan pemahaman yang lebih baik terutama pada tahap analisis dan perancangan perangkat lunak.", - majorId: bachelorIF.id, - curriculumYear: 2019, - createdAt: date, - updatedAt: date, - }, - ], {}); + await queryInterface.bulkInsert( + 'Courses', + [ + { + id: uuid_v4(), + code: 'IF5122', + name: 'Pembangunan Perangkat Lunak', + credits: 2, + type: 'WAJIB', + defaultSemester: 2, + shortSyllabus: + 'Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review', + completeSyllabus: + 'Pada kuliah ini mahasiswa dibekali dengan prinsip design perangkat lunak yang “baikâ€, dan menerapkan proses pembangunan (konstruksi) perangkat lunak dalam team, sesuai dengan praktik yang diterapkan di industri dan tools yang banyak digunakan. Topik yang dicakup adalah : Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review.', + outcomes: + 'Mahasiswa mampu untuk menerapkan prinsip design dalam membangun perangkat lunak, dan membangun perangkat lunak sesuai praktik yang baik (studi kasus).', + majorId: masterIF.id, + curriculumYear: 2013, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + code: 'IF3250', + name: 'Proyek Perangkat Lunak', + credits: 4, + type: 'WAJIB', + defaultSemester: 6, + shortSyllabus: + 'Kuliah ini memberikan gambaran kompleksitas dan pengalaman mengenai pengembangan perangkat lunak skala besar.', + completeSyllabus: + 'Definisi perangkat lunak skala besar; berbagai masalah dalam pengembangan perangkat lunak skala besar dan solusinya; abstraksi; SW Pattern; code generator; pengenalan berbagai platform, framework, dan tools; konfigurasi P/L (konsep, tools, practices...); dilengkapi dengan studi kasus berupa proyek pembangunan P/L skala besar dengan mempraktekkan semua teori yang telah diberikan, atau berupa reverse engineering suatu perangkat lunak skala besar untuk mendapatkan modelnya; ', + outcomes: + '1. Memahami definisi P/L skala besar serta berbagai persoalan pengembangan P/L skala besar\n 2. Memahami teknik/metoda terkait dengan pembangunan P/L skala besar, seperti manajemen konfigurasi P/L', + majorId: bachelorIF.id, + curriculumYear: 2019, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + code: 'IF5010', + name: 'Sistem & Arsitektur Komputer A', + credits: 2, + type: 'WAJIB', + defaultSemester: 1, + shortSyllabus: + 'Memberikan pengetahuan tentang riset dan teknologi sistem arsitektur komputer terkini.', + completeSyllabus: + 'Pembahasan yg lebih dalam dan lanjut tentang modern microprocessors and computer systems, akan dibahas antara lain: Hirarki memory (cache memory, virtual memory, memory management), Instruksi Pipelining.', + outcomes: + 'Mahasiswa diharapkan mampu memahami pengetahuan tentang riset dan teknologi sistem arsitektur komputer.', + majorId: masterIF.id, + curriculumYear: 2013, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + code: 'IF6012', + name: 'Arsitektur Komputer Lanjut', + credits: 3, + type: 'PILIHAN', + shortSyllabus: + 'Membahas aspek kuantitatif dan kualitatif dari desain arsitektur komputer.', + completeSyllabus: + 'Dasar Desain Komputer, Instruction level parallelism, limits on ILP, multi processor dan thread level parallelism, memory hierarchy design, storage systems.', + outcomes: + '1. Siswa mampu memahami prinsip dasar arsitektur komputer modern.\n 2. Memahami design tradeoff pada arsitektur komputer.', + majorId: masterIF.id, + curriculumYear: 2013, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + code: 'IF6099', + name: 'Tesis', + credits: 6, + type: 'WAJIB', + defaultSemester: 3, + shortSyllabus: + 'Kuliah ini berisi representasi proyek akhir mahasiswa atau Tesis yang bertujuan mengintegrasikan materi yang sudah didapat di perkuliahan.', + completeSyllabus: + 'Menjelaskan dan mengaplikasikan teori, metode, teknik yang relavan pada suatu area yang dipilih, menginterpretasikan data, dan mengambil suatu konklusi/kesimpulan serta saran yang sesuai.', + outcomes: + 'Mahasiswa diharapkan mampu menghasilkan tesis, dan menuliskan sebuah publikasi ilmiah', + majorId: masterIF.id, + curriculumYear: 2013, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + code: 'IF2036', + name: 'Rekayasa Perangkat Lunak', + credits: 3, + type: 'WAJIB', + defaultSemester: 4, + shortSyllabus: + 'Konsep dasar, daur hidup, dan tahapan rekayasa perangkat lunak (analisis, perancangan, konstruksi, pengujian, dan perawatan), berdasarkan dua metode utama: metode konvensional (terstruktur) dan metode berorientasi objek, dilengkapi studi kasus pada tahap analisis dan perancangan.', + completeSyllabus: + 'Materi yang diberikan meliputi tahapan rekayasa perangkat lunak yang terdiri dari analisis, pearncangan, konstruksi, pengujian, dan perawatan, dengan memberikan gambaran dua metode, yaitu metode konvensional (terstruktur) dan metode berorientasi objek, dan dilengkapi dengan studi kasus untuk memberikan pemahaman yang lebih baik terutama pada tahap analisis dan perancangan perangkat lunak.', + majorId: bachelorIF.id, + curriculumYear: 2019, + createdAt: date, + updatedAt: date, + }, + ], + {}, + ); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('Courses', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210224121709-option-seed.js b/backend/src/seeders/20210224121709-option-seed.js index cf1fada4d69a07788a8727c4c8e7b2caa7b8263d..2519acfae0385d3083026491e2dfd011a5f2bb9f 100644 --- a/backend/src/seeders/20210224121709-option-seed.js +++ b/backend/src/seeders/20210224121709-option-seed.js @@ -1,6 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); const Major = require('../models/index')['Major']; -'use strict'; +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -12,39 +12,43 @@ module.exports = { }, }); - await queryInterface.bulkInsert('Options', [ - { - id: uuid_v4(), - name: 'Rekayasa Perangkat Lunak', - majorId: masterIF.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - name: 'Sistem Intelijen', - majorId: masterIF.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - name: 'Sistem Informasi', - majorId: masterIF.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - name: 'Intelijen Bisnis', - majorId: masterIF.id, - createdAt: date, - updatedAt: date, - }, - ], {}); + await queryInterface.bulkInsert( + 'Options', + [ + { + id: uuid_v4(), + name: 'Rekayasa Perangkat Lunak', + majorId: masterIF.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + name: 'Sistem Intelijen', + majorId: masterIF.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + name: 'Sistem Informasi', + majorId: masterIF.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + name: 'Intelijen Bisnis', + majorId: masterIF.id, + createdAt: date, + updatedAt: date, + }, + ], + {}, + ); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('Options', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210224123856-course-s2-seed.js b/backend/src/seeders/20210224123856-course-s2-seed.js index b35c8496d771fc1c1d654af637a8cb828b3afb0f..7e38620bc17a1aa8ad2024c525ddb9bbe413ebf5 100644 --- a/backend/src/seeders/20210224123856-course-s2-seed.js +++ b/backend/src/seeders/20210224123856-course-s2-seed.js @@ -1,9 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -const { - Course, - Option -} = require('../models/index'); -'use strict'; +const { Course, Option } = require('../models/index'); +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -35,76 +32,80 @@ module.exports = { const ppl = await Course.findOne({ where: { - code: "IF5122", + code: 'IF5122', }, }); const arsikomA = await Course.findOne({ where: { - code: "IF5010", + code: 'IF5010', }, }); const tesis = await Course.findOne({ where: { - code: "IF6099", + code: 'IF6099', }, }); - await queryInterface.bulkInsert('CourseS2s', [ - { - id: uuid_v4(), - courseId: ppl.id, - optionId: rpl.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: arsikomA.id, - optionId: rpl.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: arsikomA.id, - optionId: sintel.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: tesis.id, - optionId: rpl.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: tesis.id, - optionId: sintel.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: tesis.id, - optionId: sinfo.id, - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: tesis.id, - optionId: bi.id, - createdAt: date, - updatedAt: date, - }, - ], {}); + await queryInterface.bulkInsert( + 'CourseS2s', + [ + { + id: uuid_v4(), + courseId: ppl.id, + optionId: rpl.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: arsikomA.id, + optionId: rpl.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: arsikomA.id, + optionId: sintel.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: tesis.id, + optionId: rpl.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: tesis.id, + optionId: sintel.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: tesis.id, + optionId: sinfo.id, + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: tesis.id, + optionId: bi.id, + createdAt: date, + updatedAt: date, + }, + ], + {}, + ); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('CourseS2s', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210224135832-course-class-seed.js b/backend/src/seeders/20210224135832-course-class-seed.js index 7d1b13fef84c8e77c180a276664a3fc2455d8664..86594e0e6615a84c50adc35eda4437cef8ea8348 100644 --- a/backend/src/seeders/20210224135832-course-class-seed.js +++ b/backend/src/seeders/20210224135832-course-class-seed.js @@ -1,10 +1,6 @@ const { v4: uuid_v4 } = require('uuid'); -const { - Course, - User, - Lecturer -} = require('../models/index'); -'use strict'; +const { Course, User, Lecturer } = require('../models/index'); +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -24,81 +20,85 @@ module.exports = { const ppl = await Course.findOne({ where: { - code: "IF5122", + code: 'IF5122', }, }); const arsikomA = await Course.findOne({ where: { - code: "IF5010", + code: 'IF5010', }, }); const tesis = await Course.findOne({ where: { - code: "IF6099", + code: 'IF6099', }, }); const advancedArsikom = await Course.findOne({ where: { - code: "IF6012", + code: 'IF6012', }, }); - await queryInterface.bulkInsert('CourseClasses', [ - { - id: uuid_v4(), - courseId: ppl.id, - lecturerId: lecturer.id, - startYear: 2021, - capacity: 25, - participantCount: 0, - semester: '1', - status: 'OPEN', - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: arsikomA.id, - lecturerId: lecturer.id, - startYear: 2021, - capacity: 50, - participantCount: 5, - semester: '2', - status: 'OPEN', - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: tesis.id, - lecturerId: lecturer.id, - startYear: 2021, - capacity: 50, - participantCount: 0, - semester: '1', - status: 'OPEN', - createdAt: date, - updatedAt: date, - }, - { - id: uuid_v4(), - courseId: advancedArsikom.id, - lecturerId: lecturer.id, - startYear: 2021, - capacity: 50, - participantCount: 0, - semester: '1', - status: 'OPEN', - createdAt: date, - updatedAt: date, - }, - ], {}); + await queryInterface.bulkInsert( + 'CourseClasses', + [ + { + id: uuid_v4(), + courseId: ppl.id, + lecturerId: lecturer.id, + startYear: 2021, + capacity: 25, + participantCount: 0, + semester: '1', + status: 'OPEN', + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: arsikomA.id, + lecturerId: lecturer.id, + startYear: 2021, + capacity: 50, + participantCount: 5, + semester: '2', + status: 'OPEN', + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: tesis.id, + lecturerId: lecturer.id, + startYear: 2021, + capacity: 50, + participantCount: 0, + semester: '1', + status: 'OPEN', + createdAt: date, + updatedAt: date, + }, + { + id: uuid_v4(), + courseId: advancedArsikom.id, + lecturerId: lecturer.id, + startYear: 2021, + capacity: 50, + participantCount: 0, + semester: '1', + status: 'OPEN', + createdAt: date, + updatedAt: date, + }, + ], + {}, + ); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('CourseClasses', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210225101634-student-s2-seed.js b/backend/src/seeders/20210225101634-student-s2-seed.js index f03f2de6143bdb05a07d7c6b5cd32c1996b405aa..959a60054a585cc587ca0dd88ce363281a651a64 100644 --- a/backend/src/seeders/20210225101634-student-s2-seed.js +++ b/backend/src/seeders/20210225101634-student-s2-seed.js @@ -1,10 +1,5 @@ -const { - User, - Student, - Option, - StudentS2, -} = require('../models/index'); -'use strict'; +const { User, Student, Option, StudentS2 } = require('../models/index'); +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -28,11 +23,11 @@ module.exports = { await StudentS2.create({ studentId: student.id, - optionId: rpl.id + optionId: rpl.id, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('StudentS2s', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210225103722-study-plan-seed.js b/backend/src/seeders/20210225103722-study-plan-seed.js index 5f62307cded94b9d318ecef40544e0b82ae4e6f3..bcdfbbb38e49333ce8c6120ac2e71b0eace835e8 100644 --- a/backend/src/seeders/20210225103722-study-plan-seed.js +++ b/backend/src/seeders/20210225103722-study-plan-seed.js @@ -1,11 +1,7 @@ -const { - User, - Student, - StudyPlan, -} = require('../models/index'); +const { User, Student, StudyPlan } = require('../models/index'); const { StudyPlanStatusEnum } = require('../enums/index'); -'use strict'; +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -24,20 +20,20 @@ module.exports = { await StudyPlan.create({ studentId: student.id, startYear: 2021, - semester:'1', + semester: '1', notes: 'LGTM', - status: StudyPlanStatusEnum.FINAL + status: StudyPlanStatusEnum.FINAL, }); await StudyPlan.create({ studentId: student.id, startYear: 2021, - semester:'2', + semester: '2', notes: 'LGTM', }); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('StudyPlans', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210225103729-study-plan-course-seed.js b/backend/src/seeders/20210225103729-study-plan-course-seed.js index 4a2d70d91f366755e2defe98e2da64cf00b814d3..136fda172085805fda3125b1c75fb637fd11fb1a 100644 --- a/backend/src/seeders/20210225103729-study-plan-course-seed.js +++ b/backend/src/seeders/20210225103729-study-plan-course-seed.js @@ -1,14 +1,8 @@ const { v4: uuid_v4 } = require('uuid'); -const { - StudyPlanCourseStatusEnum -} = require('../enums/index'); +const { StudyPlanCourseStatusEnum } = require('../enums/index'); -const { - StudyPlan, - Course, - CourseClass, -} = require('../models/index'); -'use strict'; +const { StudyPlan, Course, CourseClass } = require('../models/index'); +('use strict'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -22,12 +16,12 @@ module.exports = { const ppl = await Course.findOne({ where: { - code: "IF5122", + code: 'IF5122', }, }); const advancedArsikom = await Course.findOne({ where: { - code: "IF6012", + code: 'IF6012', }, }); @@ -59,11 +53,11 @@ module.exports = { status: StudyPlanCourseStatusEnum.UNAPPROVED, createdAt: date, updatedAt: date, - } + }, ]); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('StudyPlanCourses', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210318134502-course-class-default-schedule-seed.js b/backend/src/seeders/20210318134502-course-class-default-schedule-seed.js index d888490219ade460679336ec03c8fd7586900b9c..1e0b1f51d1fe5deb84312cffafef4b267dff3911 100644 --- a/backend/src/seeders/20210318134502-course-class-default-schedule-seed.js +++ b/backend/src/seeders/20210318134502-course-class-default-schedule-seed.js @@ -1,13 +1,8 @@ const { v4: uuid_v4 } = require('uuid'); -const { - DayEnum -} = require('../enums/index'); +const { DayEnum } = require('../enums/index'); -'use strict'; -const { - Course, - CourseClass, -} = require('../models/index'); +('use strict'); +const { Course, CourseClass } = require('../models/index'); module.exports = { up: async (queryInterface, Sequelize) => { @@ -15,50 +10,50 @@ module.exports = { const ppl = await Course.findOne({ where: { - code: "IF5122", + code: 'IF5122', }, }); const advancedArsikom = await Course.findOne({ where: { - code: "IF6012", + code: 'IF6012', }, }); const arsikomA = await Course.findOne({ where: { - code: "IF5010", + code: 'IF5010', }, }); const tesis = await Course.findOne({ where: { - code: "IF6099", + code: 'IF6099', }, }); const pplClass = await CourseClass.findOne({ where: { - courseId: ppl.id - } + courseId: ppl.id, + }, }); const advancedArsikomClass = await CourseClass.findOne({ where: { - courseId: advancedArsikom.id - } + courseId: advancedArsikom.id, + }, }); const arsikomAClass = await CourseClass.findOne({ where: { - courseId: arsikomA.id - } + courseId: arsikomA.id, + }, }); const tesisClass = await CourseClass.findOne({ where: { - courseId: tesis.id - } + courseId: tesis.id, + }, }); await queryInterface.bulkInsert('CourseClassDefaultSchedules', [ @@ -66,8 +61,8 @@ module.exports = { id: uuid_v4(), courseClassId: pplClass.id, day: DayEnum.WEDNESDAY.name, - start: "13:00:00", - end: "15:00:00", + start: '13:00:00', + end: '15:00:00', createdAt: date, updatedAt: date, }, @@ -75,8 +70,8 @@ module.exports = { id: uuid_v4(), courseClassId: advancedArsikomClass.id, day: DayEnum.TUESDAY.name, - start: "09:30:00", - end: "11:30:00", + start: '09:30:00', + end: '11:30:00', createdAt: date, updatedAt: date, }, @@ -84,8 +79,8 @@ module.exports = { id: uuid_v4(), courseClassId: advancedArsikomClass.id, day: DayEnum.THURSDAY.name, - start: "13:00:00", - end: "14:00:00", + start: '13:00:00', + end: '14:00:00', createdAt: date, updatedAt: date, }, @@ -93,8 +88,8 @@ module.exports = { id: uuid_v4(), courseClassId: arsikomAClass.id, day: DayEnum.MONDAY.name, - start: "07:00:00", - end: "09:00:00", + start: '07:00:00', + end: '09:00:00', createdAt: date, updatedAt: date, }, @@ -102,15 +97,15 @@ module.exports = { id: uuid_v4(), courseClassId: tesisClass.id, day: DayEnum.THURSDAY.name, - start: "13:00:00", - end: "15:00:00", + start: '13:00:00', + end: '15:00:00', createdAt: date, updatedAt: date, - } + }, ]); }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('CourseClassDefaultSchedules', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210318140335-course-class-meeting-seed.js b/backend/src/seeders/20210318140335-course-class-meeting-seed.js index 45eb9bfd6f63ef2d0cff28182562aa5e81e1c047..7b7fdd9acfe6daa2ead4d0b7379f68c0a545bb09 100644 --- a/backend/src/seeders/20210318140335-course-class-meeting-seed.js +++ b/backend/src/seeders/20210318140335-course-class-meeting-seed.js @@ -1,25 +1,18 @@ - 'use strict'; -const { - CourseClass -} = require('../models/index'); +const { CourseClass } = require('../models/index'); -const { - generateCourseClassMeetings -} = require('../util/common'); +const { generateCourseClassMeetings } = require('../util/common'); module.exports = { up: async (queryInterface, Sequelize) => { - const courseClasses = await CourseClass.findAll(); - for (let i = 0; i < courseClasses.length; i++){ + for (let i = 0; i < courseClasses.length; i++) { await generateCourseClassMeetings(courseClasses[i]); } - }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('CourseClassMeetings', null, {}); - } + }, }; diff --git a/backend/src/seeders/20210318151622-course-class-meeting-attendance-seed.js b/backend/src/seeders/20210318151622-course-class-meeting-attendance-seed.js index 895705a640a63efd585503701e89f589d139af8b..1a8c20d1a8e99c5a1c828a0cb8cd12fa0a304044 100644 --- a/backend/src/seeders/20210318151622-course-class-meeting-attendance-seed.js +++ b/backend/src/seeders/20210318151622-course-class-meeting-attendance-seed.js @@ -1,30 +1,24 @@ 'use strict'; -const { - StudyPlan -} = require('../models/index'); +const { StudyPlan } = require('../models/index'); -const { - StudyPlanStatusEnum -} = require('../enums/index'); +const { StudyPlanStatusEnum } = require('../enums/index'); -const { - generateCourseClassMeetingAttendances, -} = require('../util/common'); +const { generateCourseClassMeetingAttendances } = require('../util/common'); module.exports = { up: async (queryInterface, Sequelize) => { const studyPlans = await StudyPlan.findAll({ where: { - status: StudyPlanStatusEnum.FINAL - } + status: StudyPlanStatusEnum.FINAL, + }, }); - for (let i = 0; i < studyPlans.length; i++){ + for (let i = 0; i < studyPlans.length; i++) { await generateCourseClassMeetingAttendances(studyPlans[i]); } }, down: async (queryInterface, Sequelize) => { await queryInterface.bulkDelete('CourseClassMeetingAttendances', null, {}); - } + }, }; diff --git a/backend/src/test/auth.controller.test.js b/backend/src/test/auth.controller.test.js index f47032de89a68937b918a07297f317c7ab703514..f72dbd4f8a752db10a6ee3a8751c466378ebd52c 100644 --- a/backend/src/test/auth.controller.test.js +++ b/backend/src/test/auth.controller.test.js @@ -18,15 +18,15 @@ let LECTURER_ROLE = 'lecturer'; let UNDEFINED_ROLE = 'undefined'; /* -* Test the /POST register -*/ + * Test the /POST register + */ describe('Auths Register', () => { let urlRegister = '/auth/register'; - beforeEach(async() => { - await Student.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await User.destroy({where: {}}); + beforeEach(async () => { + await Student.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await User.destroy({ where: {} }); }); afterEach(() => { @@ -40,13 +40,16 @@ describe('Auths Register', () => { password: PASSWORD, role: LECTURER_ROLE, }; - chai.request(server) + chai + .request(server) .post(urlRegister) .send(lecturer) .end((err, res) => { res.should.have.status(200); res.body.should.have.property('status').eql(200); - res.body.should.have.property('message').eql('Register lecturer successful.'); + res.body.should.have + .property('message') + .eql('Register lecturer successful.'); done(); }); }); @@ -57,13 +60,16 @@ describe('Auths Register', () => { password: PASSWORD, role: STUDENT_ROLE, }; - chai.request(server) + chai + .request(server) .post(urlRegister) .send(student) .end((err, res) => { res.should.have.status(200); res.body.should.have.property('status').eql(200); - res.body.should.have.property('message').eql('Register student successful.'); + res.body.should.have + .property('message') + .eql('Register student successful.'); done(); }); }); @@ -76,7 +82,8 @@ describe('Auths Register', () => { password: PASSWORD, role: UNDEFINED_ROLE, }; - chai.request(server) + chai + .request(server) .post(urlRegister) .send(userRequest) .end((err, res) => { @@ -87,8 +94,7 @@ describe('Auths Register', () => { }); }); - it('student exist', async() => { - + it('student exist', async () => { const user = await User.create({ email: EMAIL, hashed_password: PASSWORD, @@ -107,22 +113,22 @@ describe('Auths Register', () => { role: STUDENT_ROLE, }; - await chai.request(server) + await chai + .request(server) .post(urlRegister) .send(studentRequest) - .then(res => { + .then((res) => { res.should.have.status(400); res.body.should.have.property('status').eql(400); res.body.should.have.property('message').eql('Student exist'); }) - .catch(err => { + .catch((err) => { console.error(err); throw err; }); }); - it('lecturer exist', async() => { - + it('lecturer exist', async () => { const user = await User.create({ email: EMAIL, hashed_password: PASSWORD, @@ -141,15 +147,16 @@ describe('Auths Register', () => { role: LECTURER_ROLE, }; - await chai.request(server) + await chai + .request(server) .post(urlRegister) .send(lecturerRequest) - .then(res => { + .then((res) => { res.should.have.status(400); res.body.should.have.property('status').eql(400); res.body.should.have.property('message').eql('Lecturer exist'); }) - .catch(err => { + .catch((err) => { console.error(err); throw err; }); diff --git a/backend/src/test/course.controller.test.js b/backend/src/test/course.controller.test.js index c24d5052c69567deb5e4e97737b776d07d4a107f..dc8259cde7e5a658d523b18b106c09a448ab4bd2 100644 --- a/backend/src/test/course.controller.test.js +++ b/backend/src/test/course.controller.test.js @@ -8,9 +8,7 @@ let should = chai.should(); chai.use(chaiHttp); -const { - EndpointEnum, -} = require('../enums/index'); +const { EndpointEnum } = require('../enums/index'); let CODE = 'IF5122'; let NAME = 'Pembangunan Perangkat Lunak'; @@ -20,15 +18,15 @@ let INVALID_ID = '57e19842-d712-45fd-9068-04cde6bf41f'; const REQUEST_ERROR_CODE = 400; const OBJECT_NOT_EXIST_ERROR_CODE = 404; const SUCCESS_CODE = 200; -const COURSE_DOESNT_EXIST_ERROR = 'Object doesn\'t exist.'; +const COURSE_DOESNT_EXIST_ERROR = "Object doesn't exist."; const COURSE_DOESNT_EXIST_ERROR_NAME = 'Error'; -const INVALID_UUID_ERROR = 'invalid input syntax for type uuid: "' + INVALID_ID + '"'; +const INVALID_UUID_ERROR = + 'invalid input syntax for type uuid: "' + INVALID_ID + '"'; const INVALID_UUID_ERROR_NAME = 'SequelizeDatabaseError'; describe('Course Test', () => { - - beforeEach(async() => { - await Course.destroy({where: {}}); + beforeEach(async () => { + await Course.destroy({ where: {} }); }); afterEach(() => { @@ -36,8 +34,7 @@ describe('Course Test', () => { }); describe('/GET all course', () => { - - beforeEach(async() => { + beforeEach(async () => { await Course.create({ code: CODE, name: NAME, @@ -45,7 +42,8 @@ describe('Course Test', () => { }); it('should get all courses data', (done) => { - chai.request(server) + chai + .request(server) .get(EndpointEnum.COURSE) .end((err, res) => { res.should.have.status(SUCCESS_CODE); @@ -60,54 +58,61 @@ describe('Course Test', () => { describe('/GET/:id course', () => { let course; - beforeEach(async() => { - course = await Course.create({ - code: CODE, - name: NAME, - }); + beforeEach(async () => { + course = await Course.create({ + code: CODE, + name: NAME, + }); }); it('course get by id success', (done) => { - chai.request(server) - .get(EndpointEnum.COURSE+ '/' + course.id) - .end((err, res) => { - res.should.have.status(SUCCESS_CODE); - res.body.should.have.property('id'); - res.body.should.have.property('code'); - res.body.should.have.property('name'); - res.body.should.have.property('type'); - res.body.should.have.property('credits'); - res.body.should.have.property('defaultSemester'); - res.body.should.have.property('shortSyllabus'); - res.body.should.have.property('completeSyllabus'); - res.body.should.have.property('outcomes'); - res.body.should.have.property('curriculumYear'); - res.body.should.have.property('majorId'); - res.body.should.have.property('Major'); - done(); - }); + chai + .request(server) + .get(EndpointEnum.COURSE + '/' + course.id) + .end((err, res) => { + res.should.have.status(SUCCESS_CODE); + res.body.should.have.property('id'); + res.body.should.have.property('code'); + res.body.should.have.property('name'); + res.body.should.have.property('type'); + res.body.should.have.property('credits'); + res.body.should.have.property('defaultSemester'); + res.body.should.have.property('shortSyllabus'); + res.body.should.have.property('completeSyllabus'); + res.body.should.have.property('outcomes'); + res.body.should.have.property('curriculumYear'); + res.body.should.have.property('majorId'); + res.body.should.have.property('Major'); + done(); + }); }); - it('course get by id doesn\'t exist', (done) => { - chai.request(server) - .get(EndpointEnum.COURSE + '/' + DUMMY_ID) - .end((err, res) => { - res.should.have.status(OBJECT_NOT_EXIST_ERROR_CODE); - res.body.should.have.property('name').eql(COURSE_DOESNT_EXIST_ERROR_NAME); - res.body.should.have.property('message').eql(COURSE_DOESNT_EXIST_ERROR); - done(); - }); + it("course get by id doesn't exist", (done) => { + chai + .request(server) + .get(EndpointEnum.COURSE + '/' + DUMMY_ID) + .end((err, res) => { + res.should.have.status(OBJECT_NOT_EXIST_ERROR_CODE); + res.body.should.have + .property('name') + .eql(COURSE_DOESNT_EXIST_ERROR_NAME); + res.body.should.have + .property('message') + .eql(COURSE_DOESNT_EXIST_ERROR); + done(); + }); }); it('course get by id invalid uuid', (done) => { - chai.request(server) - .get(EndpointEnum.COURSE + '/' + INVALID_ID) - .end((err, res) => { - res.should.have.status(REQUEST_ERROR_CODE); - res.body.should.have.property('name').eql(INVALID_UUID_ERROR_NAME); - res.body.should.have.property('message').eql(INVALID_UUID_ERROR); - done(); - }); + chai + .request(server) + .get(EndpointEnum.COURSE + '/' + INVALID_ID) + .end((err, res) => { + res.should.have.status(REQUEST_ERROR_CODE); + res.body.should.have.property('name').eql(INVALID_UUID_ERROR_NAME); + res.body.should.have.property('message').eql(INVALID_UUID_ERROR); + done(); + }); }); }); }); diff --git a/backend/src/test/courseclass.controller.test.js b/backend/src/test/courseclass.controller.test.js index 9832e9d8e499293ccb3f4048e9a3a106190a0776..a5fec82aff35477670684c54e3ab386a5467d2a4 100644 --- a/backend/src/test/courseclass.controller.test.js +++ b/backend/src/test/courseclass.controller.test.js @@ -1,19 +1,19 @@ process.env.NODE_ENV = 'test'; const { - CourseClass, - Course, - User, - Lecturer, - Student, - StudyPlan, - StudyPlanCourse + CourseClass, + Course, + User, + Lecturer, + Student, + StudyPlan, + StudyPlanCourse, } = require('../models/index'); const { EndpointEnum, DayEnum, StudyPlanCourseStatusEnum, - SemesterEnum + SemesterEnum, } = require('../enums/index'); const chai = require('chai'); @@ -31,16 +31,16 @@ const START_YEAR = 2021; const NEW_START_YEAR = 2022; const CAPACITY = 20; const NEW_CAPACITY = 50; -const COURSE_CODE = "IF2036"; -const COURSE_NAME = "Rekayasa Perangkat Lunak"; +const COURSE_CODE = 'IF2036'; +const COURSE_NAME = 'Rekayasa Perangkat Lunak'; const DUMMY_ID = '57e19842-d712-45fd-9068-04cde6bf41f3'; const INVALID_ID = '57e19842-d712-45fd-9068-04cde6bf41f'; const START_TIME = '13:00:00'; const END_TIME = '15:00:00'; -const COURSE = "Course"; -const LECTURER = "Lecturer"; -const STUDENTS = "Students"; +const COURSE = 'Course'; +const LECTURER = 'Lecturer'; +const STUDENTS = 'Students'; const COURSE_CLASS_ENDPOINT = '/course-class'; @@ -50,32 +50,32 @@ const SUCCESS_CODE = 200; const REQUEST_ERROR_CODE = 400; const NOT_EXIST_ERROR_CODE = 404; const SERVER_ERROR_CODE = 500; -const ERROR = "Error"; +const ERROR = 'Error'; describe('Course Class Test', () => { let user, course, lecturer, student, courseClass; - beforeEach(async() => { - await CourseClass.destroy({where: {}}); - await Course.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await Student.destroy({where: {}}); - await StudyPlan.destroy({where: {}}); - await StudyPlanCourse.destroy({where: {}}); + beforeEach(async () => { + await CourseClass.destroy({ where: {} }); + await Course.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await Student.destroy({ where: {} }); + await StudyPlan.destroy({ where: {} }); + await StudyPlanCourse.destroy({ where: {} }); course = await Course.create({ - code: COURSE_CODE, - name: COURSE_NAME + code: COURSE_CODE, + name: COURSE_NAME, }); user = await User.create({ - email: EMAIL, - hashed_password: PASSWORD, - salt: SALT, + email: EMAIL, + hashed_password: PASSWORD, + salt: SALT, }); lecturer = await Lecturer.create({ - userId: user.id, + userId: user.id, }); courseClass = await CourseClass.create({ @@ -83,22 +83,21 @@ describe('Course Class Test', () => { status: STATUS, capacity: CAPACITY, courseId: course.id, - lecturerId: lecturer.id + lecturerId: lecturer.id, }); student = await Student.create({ - userId: user.id + userId: user.id, }); const studyPlan = await StudyPlan.create({ - studentId: student.id + studentId: student.id, }); await StudyPlanCourse.create({ studyPlanId: studyPlan.id, courseClassId: courseClass.id, - status: StudyPlanCourseStatusEnum.APPROVED + status: StudyPlanCourseStatusEnum.APPROVED, }); - }); afterEach(() => { @@ -106,331 +105,395 @@ describe('Course Class Test', () => { }); describe('/GET course class', () => { + it('should get filtered course classes data', (done) => { + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS}/?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`, + ) + .end((err, res) => { + res.should.have.status(200); + chai.expect(res.body).to.be.an('array'); + chai.expect(res.body[0]).to.have.property('startYear', START_YEAR); + chai.expect(res.body[0]).to.have.property('status', STATUS); + chai.expect(res.body[0]).to.have.property('capacity', CAPACITY); + chai.expect(res.body[0]).to.have.property('courseId', course.id); + chai.expect(res.body[0]).to.have.property('lecturerId', lecturer.id); + chai.expect(res.body[0]).to.have.property('Course'); + chai.expect(res.body[0]).to.have.property('Lecturer'); + done(); + }); + }); + + it('should get all course classes data include participant', (done) => { + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS}/?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${STUDENTS}`, + ) + .end((err, res) => { + res.should.have.status(200); + chai.expect(res.body).to.be.an('array'); + chai.expect(res.body[0]).to.have.property('startYear', START_YEAR); + chai.expect(res.body[0]).to.have.property('status', STATUS); + chai.expect(res.body[0]).to.have.property('capacity', CAPACITY); + chai.expect(res.body[0]).to.have.property('courseId', course.id); + chai.expect(res.body[0]).to.have.property('lecturerId', lecturer.id); + chai.expect(res.body[0]).to.have.property('students'); + chai + .expect(res.body[0].students[0]) + .to.have.property('id') + .eql(student.id); + done(); + }); + }); - it('should get filtered course classes data', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS}/?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`) - .end((err, res) => { - res.should.have.status(200); - chai.expect(res.body).to.be.an('array'); - chai.expect(res.body[0]).to.have.property('startYear', START_YEAR); - chai.expect(res.body[0]).to.have.property('status', STATUS); - chai.expect(res.body[0]).to.have.property('capacity', CAPACITY); - chai.expect(res.body[0]).to.have.property('courseId', course.id); - chai.expect(res.body[0]).to.have.property('lecturerId', lecturer.id); - chai.expect(res.body[0]).to.have.property('Course'); - chai.expect(res.body[0]).to.have.property('Lecturer'); - done(); - }); - }); - - it('should get all course classes data include participant', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS}/?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${STUDENTS}`) - .end((err, res) => { - res.should.have.status(200); - chai.expect(res.body).to.be.an('array'); - chai.expect(res.body[0]).to.have.property('startYear', START_YEAR); - chai.expect(res.body[0]).to.have.property('status', STATUS); - chai.expect(res.body[0]).to.have.property('capacity', CAPACITY); - chai.expect(res.body[0]).to.have.property('courseId', course.id); - chai.expect(res.body[0]).to.have.property('lecturerId', lecturer.id); - chai.expect(res.body[0]).to.have.property('students'); - chai.expect(res.body[0].students[0]).to.have.property('id').eql(student.id); - done(); - }); - }); - - it('course class get filter not exist', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS}/?status=${STATUS}&semester=${SemesterEnum.EVEN}&startYear=${START_YEAR}&include=${STUDENTS}`) - .end((err, res) => { - res.should.have.status(NOT_EXIST_ERROR_CODE); - res.body.should.have.property('name').eql(ERROR); - res.body.should.have.property('message').eql('Object doesn\'t exist.'); - done(); - }); - }); + it('course class get filter not exist', (done) => { + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS}/?status=${STATUS}&semester=${SemesterEnum.EVEN}&startYear=${START_YEAR}&include=${STUDENTS}`, + ) + .end((err, res) => { + res.should.have.status(NOT_EXIST_ERROR_CODE); + res.body.should.have.property('name').eql(ERROR); + res.body.should.have.property('message').eql("Object doesn't exist."); + done(); + }); + }); }); describe('/GET/:id lecturer', () => { - it('course class get by id success', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`) + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS}/${courseClass.id}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`, + ) .end((err, res) => { res.should.have.status(200); - res.body.should.have.property("id"); - res.body.should.have.property("startYear"); - res.body.should.have.property("capacity"); - res.body.should.have.property("participantCount"); - res.body.should.have.property("semester"); - res.body.should.have.property("status"); - res.body.should.have.property("createdAt"); - res.body.should.have.property("updatedAt"); - res.body.should.have.property("courseId"); - res.body.should.have.property("lecturerId"); - res.body.should.have.property("Course"); - res.body.should.have.property("Lecturer"); - res.body.should.have.property("courseClassDefaultSchedules"); + res.body.should.have.property('id'); + res.body.should.have.property('startYear'); + res.body.should.have.property('capacity'); + res.body.should.have.property('participantCount'); + res.body.should.have.property('semester'); + res.body.should.have.property('status'); + res.body.should.have.property('createdAt'); + res.body.should.have.property('updatedAt'); + res.body.should.have.property('courseId'); + res.body.should.have.property('lecturerId'); + res.body.should.have.property('Course'); + res.body.should.have.property('Lecturer'); + res.body.should.have.property('courseClassDefaultSchedules'); done(); }); }); - it('course class get by id success with participants', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${STUDENTS}`) - .end((err, res) => { - res.should.have.status(200); - res.body.should.have.property("id"); - res.body.should.have.property("startYear"); - res.body.should.have.property("capacity"); - res.body.should.have.property("participantCount"); - res.body.should.have.property("semester"); - res.body.should.have.property("status"); - res.body.should.have.property("createdAt"); - res.body.should.have.property("updatedAt"); - res.body.should.have.property("courseId"); - res.body.should.have.property("lecturerId"); - res.body.should.have.property("students"); - chai.expect(res.body.students[0]).to.have.property('id').eql(student.id); - res.body.should.have.property("courseClassDefaultSchedules"); - done(); - }); - }); + it('course class get by id success with participants', (done) => { + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS}/${courseClass.id}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${STUDENTS}`, + ) + .end((err, res) => { + res.should.have.status(200); + res.body.should.have.property('id'); + res.body.should.have.property('startYear'); + res.body.should.have.property('capacity'); + res.body.should.have.property('participantCount'); + res.body.should.have.property('semester'); + res.body.should.have.property('status'); + res.body.should.have.property('createdAt'); + res.body.should.have.property('updatedAt'); + res.body.should.have.property('courseId'); + res.body.should.have.property('lecturerId'); + res.body.should.have.property('students'); + chai + .expect(res.body.students[0]) + .to.have.property('id') + .eql(student.id); + res.body.should.have.property('courseClassDefaultSchedules'); + done(); + }); + }); it('course class get by id not exist', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS}/${DUMMY_ID}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`) + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS}/${DUMMY_ID}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`, + ) .end((err, res) => { res.should.have.status(NOT_EXIST_ERROR_CODE); res.body.should.have.property('name').eql(ERROR); - res.body.should.have.property('message').eql('Object doesn\'t exist.'); + res.body.should.have.property('message').eql("Object doesn't exist."); done(); }); }); it('course class get by id invalid request', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS}/${INVALID_ID}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`) - .end((err, res) => { - res.should.have.status(SERVER_ERROR_CODE); - res.body.should.have.property('name').eql(SEQUELIZE_DATABASE_ERROR); - res.body.should.have.property('message'); - done(); - }); + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS}/${INVALID_ID}?status=${STATUS}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}&include=${COURSE}&include=${LECTURER}`, + ) + .end((err, res) => { + res.should.have.status(SERVER_ERROR_CODE); + res.body.should.have.property('name').eql(SEQUELIZE_DATABASE_ERROR); + res.body.should.have.property('message'); + done(); + }); }); }); describe('Creating course class data', () => { it('should return course class data when request body valid', (done) => { const requestBody = { - "courseId": course.id, - "lecturerId": lecturer.id, - "capacity": CAPACITY, - "participantCount": 20, - "semester": "2", - "status": STATUS, - "startYear": START_YEAR, - "courseClassDefaultSchedules" : [ + courseId: course.id, + lecturerId: lecturer.id, + capacity: CAPACITY, + participantCount: 20, + semester: '2', + status: STATUS, + startYear: START_YEAR, + courseClassDefaultSchedules: [ { - "day": DayEnum.MONDAY.name, - "start": START_TIME, - "end": END_TIME - } - ] + day: DayEnum.MONDAY.name, + start: START_TIME, + end: END_TIME, + }, + ], }; - chai.request(server) - .post(COURSE_CLASS_ENDPOINT) - .send(requestBody) - .end((_, res) => { - res.should.have.status(200); - res.body.should.have.property('id').to.not.equal(null); - res.body.should.have.property('courseId').deep.equal(course.id); - res.body.should.have.property('lecturerId').deep.equal(lecturer.id); - res.body.should.have.property('capacity').deep.equal(requestBody.capacity); - res.body.should.have.property('participantCount').deep.equal(requestBody.participantCount); - res.body.should.have.property('semester').deep.equal(requestBody.semester); - res.body.should.have.property('status').deep.equal(requestBody.status); - res.body.should.have.property('startYear').deep.equal(requestBody.startYear); - res.body.should.have.property('courseClassDefaultSchedules').to.not.equal(null); - res.body.should.have.property('updatedAt').to.not.equal(null); - res.body.should.have.property('createdAt').to.not.equal(null); - done(); - }); + chai + .request(server) + .post(COURSE_CLASS_ENDPOINT) + .send(requestBody) + .end((_, res) => { + res.should.have.status(200); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('courseId').deep.equal(course.id); + res.body.should.have.property('lecturerId').deep.equal(lecturer.id); + res.body.should.have + .property('capacity') + .deep.equal(requestBody.capacity); + res.body.should.have + .property('participantCount') + .deep.equal(requestBody.participantCount); + res.body.should.have + .property('semester') + .deep.equal(requestBody.semester); + res.body.should.have + .property('status') + .deep.equal(requestBody.status); + res.body.should.have + .property('startYear') + .deep.equal(requestBody.startYear); + res.body.should.have + .property('courseClassDefaultSchedules') + .to.not.equal(null); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + done(); + }); }); it('should return error when request body invalid (wrong status enum)', (done) => { const requestBody = { - "courseId": course.id, - "lecturerId": lecturer.id, - "capacity": CAPACITY, - "participantCount": 20, - "semester": "2", - "status": "OPENED", - "startYear": START_YEAR + courseId: course.id, + lecturerId: lecturer.id, + capacity: CAPACITY, + participantCount: 20, + semester: '2', + status: 'OPENED', + startYear: START_YEAR, }; - chai.request(server) - .post(COURSE_CLASS_ENDPOINT) - .send(requestBody) - .end((_, res) => { - res.should.have.status(400); - res.body.should.have.property('name').to.equal(SEQUELIZE_DATABASE_ERROR); - res.body.should.have.property('message').to.equal("invalid input value for enum \"enum_CourseClasses_status\": \"OPENED\""); - done(); - }); + chai + .request(server) + .post(COURSE_CLASS_ENDPOINT) + .send(requestBody) + .end((_, res) => { + res.should.have.status(400); + res.body.should.have + .property('name') + .to.equal(SEQUELIZE_DATABASE_ERROR); + res.body.should.have + .property('message') + .to.equal( + 'invalid input value for enum "enum_CourseClasses_status": "OPENED"', + ); + done(); + }); }); it('should return error when request body invalid (invalid UUID format)', (done) => { const invalidCourseUUID = `${course.id}a`; const requestBody = { - "courseId": invalidCourseUUID, - "lecturerId": lecturer.id, - "capacity": CAPACITY, - "participantCount": 20, - "semester": "2", - "status": STATUS, - "startYear": START_YEAR + courseId: invalidCourseUUID, + lecturerId: lecturer.id, + capacity: CAPACITY, + participantCount: 20, + semester: '2', + status: STATUS, + startYear: START_YEAR, }; - chai.request(server) - .post(COURSE_CLASS_ENDPOINT) - .send(requestBody) - .end((_, res) => { - res.should.have.status(400); - res.body.should.have.property('name').to.equal(SEQUELIZE_DATABASE_ERROR); - res.body.should.have.property('message').to.equal(`invalid input syntax for type uuid: \"${invalidCourseUUID}\"`); - done(); - }); + chai + .request(server) + .post(COURSE_CLASS_ENDPOINT) + .send(requestBody) + .end((_, res) => { + res.should.have.status(400); + res.body.should.have + .property('name') + .to.equal(SEQUELIZE_DATABASE_ERROR); + res.body.should.have + .property('message') + .to.equal( + `invalid input syntax for type uuid: \"${invalidCourseUUID}\"`, + ); + done(); + }); }); it('should return error when foreign key doesnt exists', (done) => { const requestBody = { - "courseId": `${course.id.slice(0, -1)}1`, - "lecturerId": lecturer.id, - "capacity": CAPACITY, - "participantCount": 20, - "semester": "2", - "status": STATUS, - "startYear": START_YEAR + courseId: `${course.id.slice(0, -1)}1`, + lecturerId: lecturer.id, + capacity: CAPACITY, + participantCount: 20, + semester: '2', + status: STATUS, + startYear: START_YEAR, }; - chai.request(server) - .post(COURSE_CLASS_ENDPOINT) - .send(requestBody) - .end((_, res) => { - res.should.have.status(400); - res.body.should.have.property('name').to.equal(SEQUELIZE_FOREIGN_KEY_ERROR); - res.body.should.have.property('message').to.equal("insert or update on table \"CourseClasses\" violates foreign key constraint \"CourseClasses_courseId_fkey\""); - done(); - }); + chai + .request(server) + .post(COURSE_CLASS_ENDPOINT) + .send(requestBody) + .end((_, res) => { + res.should.have.status(400); + res.body.should.have + .property('name') + .to.equal(SEQUELIZE_FOREIGN_KEY_ERROR); + res.body.should.have + .property('message') + .to.equal( + 'insert or update on table "CourseClasses" violates foreign key constraint "CourseClasses_courseId_fkey"', + ); + done(); + }); }); }); - describe("Update course class", () => { - it("should return correct course class when updating capacity, startYear, semester", (done) => { - const request = { - capacity: NEW_CAPACITY, - startYear: NEW_START_YEAR, - semester: SemesterEnum.EVEN - }; + describe('Update course class', () => { + it('should return correct course class when updating capacity, startYear, semester', (done) => { + const request = { + capacity: NEW_CAPACITY, + startYear: NEW_START_YEAR, + semester: SemesterEnum.EVEN, + }; - chai - .request(server) - .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) - .send(request) - .end((_, res) => { - res.should.have.status(SUCCESS_CODE); - res.body.should.have.property('id').to.not.equal(null); - res.body.should.have.property('courseId').to.not.equal(null); - res.body.should.have.property('lecturerId').to.not.equal(null); - res.body.should.have.property('capacity').deep.equal(NEW_CAPACITY); - res.body.should.have.property('participantCount'); - res.body.should.have.property('semester').deep.equal(SemesterEnum.EVEN); - res.body.should.have.property('status').to.not.equal(null); - res.body.should.have.property('startYear').deep.equal(NEW_START_YEAR); - res.body.should.have.property('courseClassDefaultSchedules').to.not.equal(null); - res.body.should.have.property('updatedAt').to.not.equal(null); - res.body.should.have.property('createdAt').to.not.equal(null); - done(); - }); - }); - - it("should return correct course class when updating course class default schedule (empty)", (done) => { - const courseClassDefaultSchedules = []; - const request = { - courseClassDefaultSchedules - }; + chai + .request(server) + .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) + .send(request) + .end((_, res) => { + res.should.have.status(SUCCESS_CODE); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('courseId').to.not.equal(null); + res.body.should.have.property('lecturerId').to.not.equal(null); + res.body.should.have.property('capacity').deep.equal(NEW_CAPACITY); + res.body.should.have.property('participantCount'); + res.body.should.have + .property('semester') + .deep.equal(SemesterEnum.EVEN); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('startYear').deep.equal(NEW_START_YEAR); + res.body.should.have + .property('courseClassDefaultSchedules') + .to.not.equal(null); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + done(); + }); + }); - chai - .request(server) - .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) - .send(request) - .end((_, res) => { - res.should.have.status(SUCCESS_CODE); - res.body.should.have.property('id').to.not.equal(null); - res.body.should.have.property('courseId').to.not.equal(null); - res.body.should.have.property('lecturerId').to.not.equal(null); - res.body.should.have.property('capacity').to.not.equal(null); - res.body.should.have.property('participantCount'); - res.body.should.have.property('semester').to.not.equal(null); - res.body.should.have.property('status').to.not.equal(null); - res.body.should.have.property('startYear').to.not.equal(null); - res.body.should.have - .property("courseClassDefaultSchedules") - .to.deep.equal(courseClassDefaultSchedules); - done(); - }); - }); - - it("should return correct course class when updating course class default schedule", (done) => { - - const request = { - "courseClassDefaultSchedules": [ - { - "day": DayEnum.THURSDAY.name, - "start": START_TIME, - "end": END_TIME - } - ] - }; + it('should return correct course class when updating course class default schedule (empty)', (done) => { + const courseClassDefaultSchedules = []; + const request = { + courseClassDefaultSchedules, + }; - chai - .request(server) - .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) - .send(request) - .end((_, res) => { - res.should.have.status(SUCCESS_CODE); - res.body.should.have.property('id').to.not.equal(null); - res.body.should.have.property('courseId').to.not.equal(null); - res.body.should.have.property('lecturerId').to.not.equal(null); - res.body.should.have.property('capacity').to.not.equal(null); - res.body.should.have.property('participantCount'); - res.body.should.have.property('semester').to.not.equal(null); - res.body.should.have.property('status').to.not.equal(null); - res.body.should.have.property('startYear').to.not.equal(null); - res.body.should.have.property('courseClassDefaultSchedules').to.not.equal(null); - res.body.courseClassDefaultSchedules[0].should.have - .property("day") - .to.equal(DayEnum.THURSDAY.name); - done(); - }); - }); - - it("should return error when request body empty", (done) => { - const request = {}; + chai + .request(server) + .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) + .send(request) + .end((_, res) => { + res.should.have.status(SUCCESS_CODE); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('courseId').to.not.equal(null); + res.body.should.have.property('lecturerId').to.not.equal(null); + res.body.should.have.property('capacity').to.not.equal(null); + res.body.should.have.property('participantCount'); + res.body.should.have.property('semester').to.not.equal(null); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('startYear').to.not.equal(null); + res.body.should.have + .property('courseClassDefaultSchedules') + .to.deep.equal(courseClassDefaultSchedules); + done(); + }); + }); - chai - .request(server) - .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) - .send(request) - .end((_, res) => { - res.should.have.status(REQUEST_ERROR_CODE); - res.body.should.have.property('name').to.equal(ERROR); - done(); - }); - }); + it('should return correct course class when updating course class default schedule', (done) => { + const request = { + courseClassDefaultSchedules: [ + { + day: DayEnum.THURSDAY.name, + start: START_TIME, + end: END_TIME, + }, + ], + }; + + chai + .request(server) + .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) + .send(request) + .end((_, res) => { + res.should.have.status(SUCCESS_CODE); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('courseId').to.not.equal(null); + res.body.should.have.property('lecturerId').to.not.equal(null); + res.body.should.have.property('capacity').to.not.equal(null); + res.body.should.have.property('participantCount'); + res.body.should.have.property('semester').to.not.equal(null); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('startYear').to.not.equal(null); + res.body.should.have + .property('courseClassDefaultSchedules') + .to.not.equal(null); + res.body.courseClassDefaultSchedules[0].should.have + .property('day') + .to.equal(DayEnum.THURSDAY.name); + done(); + }); + }); + + it('should return error when request body empty', (done) => { + const request = {}; + + chai + .request(server) + .put(`${EndpointEnum.COURSE_CLASS}/${courseClass.id}`) + .send(request) + .end((_, res) => { + res.should.have.status(REQUEST_ERROR_CODE); + res.body.should.have.property('name').to.equal(ERROR); + done(); + }); + }); }); }); diff --git a/backend/src/test/courseclassmeeting.controller.test.js b/backend/src/test/courseclassmeeting.controller.test.js index 5fb089d28e373b40825f11c1a68014a759f8e3b5..c4f910f2efcb88d2451cf6621665edf5d019672a 100644 --- a/backend/src/test/courseclassmeeting.controller.test.js +++ b/backend/src/test/courseclassmeeting.controller.test.js @@ -1,21 +1,21 @@ process.env.NODE_ENV = 'test'; const { - CourseClass, - CourseClassMeeting, - Course, - User, - Student, - Lecturer, - StudyPlan, - StudyPlanCourse + CourseClass, + CourseClassMeeting, + Course, + User, + Student, + Lecturer, + StudyPlan, + StudyPlanCourse, } = require('../models/index'); const { - EndpointEnum, - CourseClassStatusEnum, - SemesterEnum, - StudyPlanStatusEnum, - AttendanceStatusEnum, + EndpointEnum, + CourseClassStatusEnum, + SemesterEnum, + StudyPlanStatusEnum, + AttendanceStatusEnum, } = require('../enums/index'); const { RequiredParameterUndefinedError } = require('../util/error'); @@ -32,15 +32,16 @@ const PASSWORD = 'abc123'; const SALT = 'salt'; const START_YEAR = 2021; const SEMESTER = SemesterEnum.ODD; -const COURSE_CODE = "IF2036"; -const COURSE_NAME = "Rekayasa Perangkat Lunak"; +const COURSE_CODE = 'IF2036'; +const COURSE_NAME = 'Rekayasa Perangkat Lunak'; const COURSE_CREDIT = 3; const SUCCESS_CODE = 200; const REQUEST_ERROR = 400; const ERROR = 'Error'; -const REQUIRED_PARAM_ERROR = 'Undefined one of these parameters: courseClassMeetingId, or studentId, or lecturerId'; +const REQUIRED_PARAM_ERROR = + 'Undefined one of these parameters: courseClassMeetingId, or studentId, or lecturerId'; const SAMPLE_LINK = 'www.steamcommunity.com/id/icancan'; const SAMPLE_TOPIC = 'Code Review'; @@ -51,26 +52,26 @@ const SAMPLE_TIME_END = '2021-08-17T14:55:00.000Z'; describe('Course Class Meeting Test', () => { let courseClass, courseClassMeeting, student, studyPlan; - beforeEach(async() => { - await CourseClass.destroy({where: {}}); - await CourseClassMeeting.destroy({where: {}}); - await Course.destroy({where: {}}); - await User.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await Student.destroy({where: {}}); - await StudyPlan.destroy({where: {}}); - await StudyPlanCourse.destroy({where: {}}); + beforeEach(async () => { + await CourseClass.destroy({ where: {} }); + await CourseClassMeeting.destroy({ where: {} }); + await Course.destroy({ where: {} }); + await User.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await Student.destroy({ where: {} }); + await StudyPlan.destroy({ where: {} }); + await StudyPlanCourse.destroy({ where: {} }); const course = await Course.create({ - code: COURSE_CODE, - name: COURSE_NAME, - credits: COURSE_CREDIT + code: COURSE_CODE, + name: COURSE_NAME, + credits: COURSE_CREDIT, }); let user = await User.create({ - email: EMAIL, - hashed_password: PASSWORD, - salt: SALT, + email: EMAIL, + hashed_password: PASSWORD, + salt: SALT, }); student = await Student.create({ @@ -78,31 +79,31 @@ describe('Course Class Meeting Test', () => { }); const lecturer = await Lecturer.create({ - userId: user.id, + userId: user.id, }); courseClass = await CourseClass.create({ - startYear: START_YEAR, - status: CourseClassStatusEnum.OPEN, - semester: SEMESTER, - courseId: course.id, - lecturerId: lecturer.id + startYear: START_YEAR, + status: CourseClassStatusEnum.OPEN, + semester: SEMESTER, + courseId: course.id, + lecturerId: lecturer.id, }); courseClassMeeting = await CourseClassMeeting.create({ - courseClassId: courseClass.id + courseClassId: courseClass.id, }); studyPlan = await StudyPlan.create({ studentId: student.id, startYear: START_YEAR, semester: SemesterEnum.ODD, - status: StudyPlanStatusEnum.FINAL + status: StudyPlanStatusEnum.FINAL, }); await StudyPlanCourse.create({ - studyPlanId: studyPlan.id, - courseClassId: courseClass.id + studyPlanId: studyPlan.id, + courseClassId: courseClass.id, }); }); @@ -112,38 +113,47 @@ describe('Course Class Meeting Test', () => { describe('GET course class meeting', () => { it('should return course class meeting when studentId, semester, and year valid', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS_MEETING}/?studentId=${studyPlan.studentId}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}`) + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS_MEETING}/?studentId=${studyPlan.studentId}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}`, + ) .end((_, res) => { res.should.have.status(SUCCESS_CODE); chai.expect(res.body).to.be.an('array'); - chai.expect(res.body[0]).to.have.property("startTime"); - chai.expect(res.body[0]).to.have.property("endTime"); - chai.expect(res.body[0]).to.have.property("openAttendanceTime"); - chai.expect(res.body[0]).to.have.property("closeAttendanceTime"); - chai.expect(res.body[0]).to.have.property("CourseClass"); + chai.expect(res.body[0]).to.have.property('startTime'); + chai.expect(res.body[0]).to.have.property('endTime'); + chai.expect(res.body[0]).to.have.property('openAttendanceTime'); + chai.expect(res.body[0]).to.have.property('closeAttendanceTime'); + chai.expect(res.body[0]).to.have.property('CourseClass'); done(); }); }); it('should return course class meeting when lecturerId, semester, and year valid', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS_MEETING}/?lecturerId=${courseClass.lecturerId}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}`) - .end((_, res) => { - res.should.have.status(SUCCESS_CODE); - chai.expect(res.body).to.be.an('array'); - chai.expect(res.body[0]).to.have.property("startTime"); - chai.expect(res.body[0]).to.have.property("endTime"); - chai.expect(res.body[0]).to.have.property("openAttendanceTime"); - chai.expect(res.body[0]).to.have.property("closeAttendanceTime"); - chai.expect(res.body[0]).to.have.property("CourseClass"); - done(); - }); + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS_MEETING}/?lecturerId=${courseClass.lecturerId}&semester=${SemesterEnum.ODD}&startYear=${START_YEAR}`, + ) + .end((_, res) => { + res.should.have.status(SUCCESS_CODE); + chai.expect(res.body).to.be.an('array'); + chai.expect(res.body[0]).to.have.property('startTime'); + chai.expect(res.body[0]).to.have.property('endTime'); + chai.expect(res.body[0]).to.have.property('openAttendanceTime'); + chai.expect(res.body[0]).to.have.property('closeAttendanceTime'); + chai.expect(res.body[0]).to.have.property('CourseClass'); + done(); + }); }); it('should return course class meeting when courseClassMeetingId valid', (done) => { - chai.request(server) - .get(`${EndpointEnum.COURSE_CLASS_MEETING}/?courseClassMeetingId=${courseClassMeeting.id}&shouldIncludeAttendances=true`) + chai + .request(server) + .get( + `${EndpointEnum.COURSE_CLASS_MEETING}/?courseClassMeetingId=${courseClassMeeting.id}&shouldIncludeAttendances=true`, + ) .end((_, res) => { res.should.have.status(SUCCESS_CODE); res.body.should.have.property('id'); @@ -154,30 +164,34 @@ describe('Course Class Meeting Test', () => { res.body.should.have.property('link'); res.body.should.have.property('topic'); res.body.should.have.property('notes'); - res.body.should.have.property('courseClassId').deep.equal(courseClass.id); - chai.expect(res.body['courseClassMeetingAttendances']).to.be.an('array'); + res.body.should.have + .property('courseClassId') + .deep.equal(courseClass.id); + chai + .expect(res.body['courseClassMeetingAttendances']) + .to.be.an('array'); done(); }); }); - it("should throw error when no params passed", (done) => { + it('should throw error when no params passed', (done) => { chai .request(server) .get(`${EndpointEnum.COURSE_CLASS_MEETING}`) .end((_, res) => { res.should.have.status(REQUEST_ERROR); - res.body.should.have.property("name").to.equal(ERROR); + res.body.should.have.property('name').to.equal(ERROR); res.body.should.have - .property("message") + .property('message') .to.equal(REQUIRED_PARAM_ERROR); done(); }); }); }); - describe("Update course class meeting", () => { - describe("Correct path", () => { - it("should return correct course class meeting when link valid", (done) => { + describe('Update course class meeting', () => { + describe('Correct path', () => { + it('should return correct course class meeting when link valid', (done) => { const request = { link: SAMPLE_LINK, }; @@ -188,12 +202,12 @@ describe('Course Class Meeting Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("link").to.equal(request.link); + res.body.should.have.property('link').to.equal(request.link); done(); }); }); - it("should return correct course class meeting when topic valid", (done) => { + it('should return correct course class meeting when topic valid', (done) => { const request = { topic: SAMPLE_TOPIC, }; @@ -204,12 +218,12 @@ describe('Course Class Meeting Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("topic").to.equal(request.topic); + res.body.should.have.property('topic').to.equal(request.topic); done(); }); }); - it("should return correct course class meeting when notes valid", (done) => { + it('should return correct course class meeting when notes valid', (done) => { const request = { notes: SAMPLE_NOTES, }; @@ -220,12 +234,12 @@ describe('Course Class Meeting Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("notes").to.equal(request.notes); + res.body.should.have.property('notes').to.equal(request.notes); done(); }); }); - it("should return correct course class meeting when class time valid", (done) => { + it('should return correct course class meeting when class time valid', (done) => { const request = { startClass: SAMPLE_TIME_START, endClass: SAMPLE_TIME_END, @@ -238,14 +252,14 @@ describe('Course Class Meeting Test', () => { .end((_, res) => { res.should.have.status(SUCCESS_CODE); res.body.should.have - .property("startTime") + .property('startTime') .to.equal(request.startClass); - res.body.should.have.property("endTime").to.equal(request.endClass); + res.body.should.have.property('endTime').to.equal(request.endClass); done(); }); }); - it("should return correct course class meeting when attendance time valid", (done) => { + it('should return correct course class meeting when attendance time valid', (done) => { const request = { startAttendance: SAMPLE_TIME_START, endAttendance: SAMPLE_TIME_END, @@ -258,16 +272,16 @@ describe('Course Class Meeting Test', () => { .end((_, res) => { res.should.have.status(SUCCESS_CODE); res.body.should.have - .property("openAttendanceTime") + .property('openAttendanceTime') .to.equal(request.startAttendance); res.body.should.have - .property("closeAttendanceTime") + .property('closeAttendanceTime') .to.equal(request.endAttendance); done(); }); }); - it("should return correct course class meeting when attendance valid", (done) => { + it('should return correct course class meeting when attendance valid', (done) => { const studentTemp = { studentId: student.id, status: AttendanceStatusEnum.SICK, @@ -282,23 +296,23 @@ describe('Course Class Meeting Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("courseClassMeetingAttendances"); + res.body.should.have.property('courseClassMeetingAttendances'); res.body.courseClassMeetingAttendances[0].should.have.property( - "Student" + 'Student', ); res.body.courseClassMeetingAttendances[0].Student.should.have - .property("id") + .property('id') .to.equal(studentTemp.studentId); res.body.courseClassMeetingAttendances[0].should.have - .property("status") + .property('status') .to.equal(studentTemp.status); done(); }); }); }); - describe("Error path", () => { - it("should return error when attendance invalid", (done) => { + describe('Error path', () => { + it('should return error when attendance invalid', (done) => { const studentTemp = { studentId: `${student.id.slice(0, -1)}1`, status: AttendanceStatusEnum.SICK, @@ -313,14 +327,14 @@ describe('Course Class Meeting Test', () => { .send(request) .end((_, res) => { res.should.have.status(REQUEST_ERROR); - res.body.should.have.property("name").to.not.equal(null); - res.body.should.have.property("message").to.not.equal(null); + res.body.should.have.property('name').to.not.equal(null); + res.body.should.have.property('message').to.not.equal(null); done(); }); }); }); - it("should return RequiredParameterUndefinedError when no valid parameter passed", (done) => { + it('should return RequiredParameterUndefinedError when no valid parameter passed', (done) => { const request = {}; chai @@ -329,8 +343,10 @@ describe('Course Class Meeting Test', () => { .send(request) .end((_, res) => { res.should.have.status(REQUEST_ERROR); - res.body.should.have.property("name").to.equal(new RequiredParameterUndefinedError().name); - res.body.should.have.property("message").to.not.equal(null); + res.body.should.have + .property('name') + .to.equal(new RequiredParameterUndefinedError().name); + res.body.should.have.property('message').to.not.equal(null); done(); }); }); diff --git a/backend/src/test/db.user.test.js b/backend/src/test/db.user.test.js index 080032535bbb9c6bb0061f33c2f8cb487a95aeed..bceb8d356119d530ea9e07b526bd237dd49ca5aa 100644 --- a/backend/src/test/db.user.test.js +++ b/backend/src/test/db.user.test.js @@ -1,9 +1,9 @@ 'use strict'; const chai = require('chai'); const User = require('../models/index')['User']; -const { - EmailNotFoundError, - PasswordDoesntMatchError +const { + EmailNotFoundError, + PasswordDoesntMatchError, } = require('../util/error'); const { getUser } = require('../util/db'); const { hashPasswordWithoutSalt } = require('../util/salt'); @@ -16,21 +16,16 @@ const getUserTemplate = async () => { password: 'i love waifu', }; - const { - salt, - hashedPassword - } = await hashPasswordWithoutSalt(user.password); + const { salt, hashedPassword } = await hashPasswordWithoutSalt(user.password); return { ...user, salt, - hashed_password: hashedPassword + hashed_password: hashedPassword, }; }; - const userTest = async () => { - let user = null; before(async () => { @@ -68,19 +63,23 @@ const userTest = async () => { it('should return proper error when email not found', async () => { const gettingUnknownUser = async () => { await getUser('some random mail', 'some random password'); - } + }; - await chai.expect(gettingUnknownUser()).to.be.rejectedWith(EmailNotFoundError); + await chai + .expect(gettingUnknownUser()) + .to.be.rejectedWith(EmailNotFoundError); }); it('should return proper error when password doesnt match', async () => { const gettingKnownUserWithWrongPassword = async () => { await getUser(user.email, 'some random password'); - } + }; - await chai.expect(gettingKnownUserWithWrongPassword()).to.be.rejectedWith(PasswordDoesntMatchError); + await chai + .expect(gettingKnownUserWithWrongPassword()) + .to.be.rejectedWith(PasswordDoesntMatchError); }); }); }; -describe('User util test', userTest); \ No newline at end of file +describe('User util test', userTest); diff --git a/backend/src/test/faculty.controller.test.js b/backend/src/test/faculty.controller.test.js index 7dab8c81172bd66f9b22b53c22ff141ef4d9f4f6..6a28a1a1efc135cea7a69048748816abfc056e7d 100644 --- a/backend/src/test/faculty.controller.test.js +++ b/backend/src/test/faculty.controller.test.js @@ -12,9 +12,8 @@ let SHORT_NAME = 'FSRD'; let FULL_NAME = 'Fakultas Seni Rupa dan Desain'; describe('Faculty Test', () => { - - beforeEach(async() => { - await Faculty.destroy({where: {}}); + beforeEach(async () => { + await Faculty.destroy({ where: {} }); }); afterEach(() => { @@ -22,8 +21,7 @@ describe('Faculty Test', () => { }); describe('/GET faculty', () => { - - beforeEach(async() => { + beforeEach(async () => { let faculty = await Faculty.create({ shortName: SHORT_NAME, fullName: FULL_NAME, @@ -31,7 +29,8 @@ describe('Faculty Test', () => { }); it('should get all faculties data', (done) => { - chai.request(server) + chai + .request(server) .get('/faculty') .end((err, res) => { res.should.have.status(200); @@ -41,6 +40,5 @@ describe('Faculty Test', () => { done(); }); }); - }); }); diff --git a/backend/src/test/lecturer.controller.test.js b/backend/src/test/lecturer.controller.test.js index 956f4b47132dd2fea6896bba655926cf654a9fbc..4f8e8671e9fa18d5a71b08b2b34d21bcbd888d4b 100644 --- a/backend/src/test/lecturer.controller.test.js +++ b/backend/src/test/lecturer.controller.test.js @@ -29,11 +29,10 @@ const LECTURER_ENDPOINT = '/lecturer'; const { LecturerNotFoundError } = require('../util/error'); describe('Lecturer Test', () => { - - beforeEach(async() => { - await User.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await SkillGroup.destroy({where: {}}); + beforeEach(async () => { + await User.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await SkillGroup.destroy({ where: {} }); }); afterEach(() => { @@ -43,7 +42,7 @@ describe('Lecturer Test', () => { describe('/GET/:id lecturer', () => { let user; - beforeEach(async() => { + beforeEach(async () => { user = await User.create({ email: EMAIL, hashed_password: PASSWORD, @@ -56,7 +55,8 @@ describe('Lecturer Test', () => { }); it('lecturer get by user id success', (done) => { - chai.request(server) + chai + .request(server) .get('/lecturer/' + user.id) .end((err, res) => { res.should.have.status(200); @@ -78,30 +78,34 @@ describe('Lecturer Test', () => { }); it('lecturer get by user id not exist', (done) => { - chai.request(server) + chai + .request(server) .get('/lecturer/' + DUMMY_ID) .end((err, res) => { res.should.have.status(404); - res.body.should.have.property('message').eql('Object doesn\'t exist.'); + res.body.should.have.property('message').eql("Object doesn't exist."); done(); }); }); it('lecturer get by user id invalid uuid', (done) => { - chai.request(server) - .get('/lecturer/' + INVALID_ID) - .end((err, res) => { - res.should.have.status(500); - res.body.should.have.property('message').eql(`invalid input syntax for type uuid: "${INVALID_ID}"`); - done(); - }); + chai + .request(server) + .get('/lecturer/' + INVALID_ID) + .end((err, res) => { + res.should.have.status(500); + res.body.should.have + .property('message') + .eql(`invalid input syntax for type uuid: "${INVALID_ID}"`); + done(); + }); }); }); describe('/PUT/:id lecturer', () => { let user, skillGroup; - beforeEach(async() => { + beforeEach(async () => { user = await User.create({ email: EMAIL, hashed_password: PASSWORD, @@ -129,23 +133,27 @@ describe('Lecturer Test', () => { skillGroupId: skillGroup.id, }; - chai.request(server) + chai + .request(server) .put('/lecturer/' + user.id) .send(lecturer) .end((err, res) => { res.should.have.status(200); res.body.should.have.property('status').eql(200); - res.body.should.have.property('message').eql('Lecturer data updated.'); + res.body.should.have + .property('message') + .eql('Lecturer data updated.'); done(); }); }); it('lecturer update by user id not exist', (done) => { - chai.request(server) + chai + .request(server) .get('/lecturer/' + DUMMY_ID) .end((err, res) => { res.should.have.status(404); - res.body.should.have.property('message').eql('Object doesn\'t exist.'); + res.body.should.have.property('message').eql("Object doesn't exist."); done(); }); }); @@ -162,13 +170,16 @@ describe('Lecturer Test', () => { skillGroupId: DUMMY_ID, }; - chai.request(server) + chai + .request(server) .put('/lecturer/' + user.id) .send(lecturer) .end((err, res) => { res.should.have.status(400); res.body.should.have.property('status').eql(400); - res.body.should.have.property('message').eql('Something wrong with your payload.'); + res.body.should.have + .property('message') + .eql('Something wrong with your payload.'); done(); }); }); @@ -177,10 +188,10 @@ describe('Lecturer Test', () => { describe('Get all lecturer', () => { let user, lecturerRPL, lecturerSintel, skillGroupRPL, skillGroupSintel; - beforeEach(async() => { - await User.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await SkillGroup.destroy({where: {}}); + beforeEach(async () => { + await User.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await SkillGroup.destroy({ where: {} }); user = await User.create({ email: EMAIL, @@ -198,25 +209,26 @@ describe('Lecturer Test', () => { lecturerRPL = await Lecturer.create({ userId: user.id, - skillGroupId: skillGroupRPL.id + skillGroupId: skillGroupRPL.id, }); lecturerSintel = await Lecturer.create({ userId: user.id, - skillGroupId: skillGroupSintel.id + skillGroupId: skillGroupSintel.id, }); }); - afterEach(async() => { - await User.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await SkillGroup.destroy({where: {}}); + afterEach(async () => { + await User.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await SkillGroup.destroy({ where: {} }); server.close(); }); it('should return all lecturer when passing no query', (done) => { - chai.request(server) + chai + .request(server) .get(LECTURER_ENDPOINT) .end((_, res) => { res.should.have.status(200); @@ -227,7 +239,8 @@ describe('Lecturer Test', () => { }); it('should return lecturer when passing 1 valid skill group', (done) => { - chai.request(server) + chai + .request(server) .get(`${LECTURER_ENDPOINT}/?skillGroups=${skillGroupRPL.id}`) .end((_, res) => { res.should.have.status(200); @@ -239,7 +252,8 @@ describe('Lecturer Test', () => { }); it('should return lecturer when passing (another) 1 valid skill group', (done) => { - chai.request(server) + chai + .request(server) .get(`${LECTURER_ENDPOINT}/?skillGroups=${skillGroupSintel.id}`) .end((_, res) => { res.should.have.status(200); @@ -251,8 +265,11 @@ describe('Lecturer Test', () => { }); it('should return all lecturer when passing more than 1 valid skill group', (done) => { - chai.request(server) - .get(`${LECTURER_ENDPOINT}/?skillGroups=${skillGroupSintel.id}&skillGroups=${skillGroupRPL.id}`) + chai + .request(server) + .get( + `${LECTURER_ENDPOINT}/?skillGroups=${skillGroupSintel.id}&skillGroups=${skillGroupRPL.id}`, + ) .end((_, res) => { res.should.have.status(200); res.body.should.be.an('array'); @@ -266,7 +283,8 @@ describe('Lecturer Test', () => { it('should throw error when no lecturer found', (done) => { const error = new LecturerNotFoundError(); - chai.request(server) + chai + .request(server) .get(`${LECTURER_ENDPOINT}/?skillGroups=${DUMMY_ID}`) .end((_, res) => { res.should.have.status(404); diff --git a/backend/src/test/major.controller.test.js b/backend/src/test/major.controller.test.js index b58f87eb44f2a98eb201370bd5f074644bd3df1c..0949264e6bcbfa51ef08b9b3a9e09ae9ee13a4f4 100644 --- a/backend/src/test/major.controller.test.js +++ b/backend/src/test/major.controller.test.js @@ -15,10 +15,9 @@ let NUMBER_CODE = 235; let NAME = 'Magister Informatika'; describe('Major Test', () => { - - beforeEach(async() => { - await Faculty.destroy({where: {}}); - await Major.destroy({where: {}}); + beforeEach(async () => { + await Faculty.destroy({ where: {} }); + await Major.destroy({ where: {} }); }); afterEach(() => { @@ -28,7 +27,7 @@ describe('Major Test', () => { describe('/GET major', () => { let faculty; - beforeEach(async() => { + beforeEach(async () => { faculty = await Faculty.create({ shortName: SHORT_NAME, fullName: FULL_NAME, @@ -42,7 +41,8 @@ describe('Major Test', () => { }); it('should get all majors data', (done) => { - chai.request(server) + chai + .request(server) .get('/major') .end((err, res) => { res.should.have.status(200); @@ -54,9 +54,10 @@ describe('Major Test', () => { }); it('should get all majors data with faculty id', (done) => { - chai.request(server) + chai + .request(server) .get('/major') - .query({facultyId: faculty.id}) + .query({ facultyId: faculty.id }) .end((err, res) => { res.should.have.status(200); chai.expect(res.body).to.be.an('array'); diff --git a/backend/src/test/skillgroup.controller.test.js b/backend/src/test/skillgroup.controller.test.js index 3d1f3d045a3a7ffbb92381049bd23b5b07db2dc7..94900d0621a9eec7d6143324e51166dd6acc9d5a 100644 --- a/backend/src/test/skillgroup.controller.test.js +++ b/backend/src/test/skillgroup.controller.test.js @@ -14,10 +14,9 @@ let MAJOR_NAME = 'Magister Informatika'; let SKILL_GROUP_NAME = 'Rekayasa Perangkat Lunak'; describe('Skill Group Test', () => { - - beforeEach(async() => { - await Major.destroy({where: {}}); - await SkillGroup.destroy({where: {}}); + beforeEach(async () => { + await Major.destroy({ where: {} }); + await SkillGroup.destroy({ where: {} }); }); afterEach(() => { @@ -27,7 +26,7 @@ describe('Skill Group Test', () => { describe('/GET skill group', () => { let major; - beforeEach(async() => { + beforeEach(async () => { major = await Major.create({ numberCode: NUMBER_CODE, name: MAJOR_NAME, @@ -40,7 +39,8 @@ describe('Skill Group Test', () => { }); it('should get all skill groups data', (done) => { - chai.request(server) + chai + .request(server) .get('/skillgroup') .end((err, res) => { res.should.have.status(200); @@ -51,9 +51,10 @@ describe('Skill Group Test', () => { }); it('should get all skill groups data with major id', (done) => { - chai.request(server) + chai + .request(server) .get('/skillgroup') - .query({majorId: major.id}) + .query({ majorId: major.id }) .end((err, res) => { res.should.have.status(200); chai.expect(res.body).to.be.an('array'); diff --git a/backend/src/test/student.controller.test.js b/backend/src/test/student.controller.test.js index ef79774ad2c5179b82c40a689a1b0fca335cdb69..0c4b0dfa3550f359529737714e5e9766d11e80f5 100644 --- a/backend/src/test/student.controller.test.js +++ b/backend/src/test/student.controller.test.js @@ -43,12 +43,12 @@ const YEAR = 2020; const SUCCESS_CODE = 200; const SERVER_ERROR_CODE = 500; const NOT_EXIST_ERROR_CODE = 404; -const ERROR = "Error"; +const ERROR = 'Error'; const START_YEAR = 2021; const SEMESTER = SemesterEnum.ODD; -const COURSE_CODE = "IF2036"; -const COURSE_NAME = "Rekayasa Perangkat Lunak"; +const COURSE_CODE = 'IF2036'; +const COURSE_NAME = 'Rekayasa Perangkat Lunak'; const COURSE_CREDIT = 3; const NOTES = 'LGTM'; @@ -56,27 +56,32 @@ const SUCCESS_CODE = 200; const REQUEST_ERROR = 400; describe('Student Test', () => { - let user, availableCourseClass, unavailableCourseClass, student, studyPlan, studyPlanCourse; - - beforeEach(async() => { - await User.destroy({where: {}}); - await Student.destroy({where: {}}); - await CourseClass.destroy({where: {}}); - await Course.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await Student.destroy({where: {}}); - await StudyPlan.destroy({where: {}}); + let user, + availableCourseClass, + unavailableCourseClass, + student, + studyPlan, + studyPlanCourse; + + beforeEach(async () => { + await User.destroy({ where: {} }); + await Student.destroy({ where: {} }); + await CourseClass.destroy({ where: {} }); + await Course.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await Student.destroy({ where: {} }); + await StudyPlan.destroy({ where: {} }); const course = await Course.create({ - code: COURSE_CODE, - name: COURSE_NAME, - credits: COURSE_CREDIT + code: COURSE_CODE, + name: COURSE_NAME, + credits: COURSE_CREDIT, }); user = await User.create({ - email: EMAIL, - hashed_password: PASSWORD, - salt: SALT, + email: EMAIL, + hashed_password: PASSWORD, + salt: SALT, }); student = await Student.create({ @@ -84,15 +89,15 @@ describe('Student Test', () => { }); const lecturer = await Lecturer.create({ - userId: user.id, + userId: user.id, }); availableCourseClass = await CourseClass.create({ - startYear: START_YEAR, - status: CourseClassStatusEnum.OPEN, - semester: SEMESTER, - courseId: course.id, - lecturerId: lecturer.id + startYear: START_YEAR, + status: CourseClassStatusEnum.OPEN, + semester: SEMESTER, + courseId: course.id, + lecturerId: lecturer.id, }); unavailableCourseClass = await CourseClass.create({ @@ -100,14 +105,14 @@ describe('Student Test', () => { status: CourseClassStatusEnum.CLOSED, semester: SEMESTER, courseId: course.id, - lecturerId: lecturer.id + lecturerId: lecturer.id, }); studyPlan = await StudyPlan.create({ studentId: student.id, startYear: START_YEAR, semester: SemesterEnum.EVEN, - notes: NOTES + notes: NOTES, }); studyPlanCourse = await StudyPlanCourse.create({ @@ -122,7 +127,8 @@ describe('Student Test', () => { describe('/GET/:id student', () => { it('student get by user id success', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDENT}/${user.id}`) .end((err, res) => { res.should.have.status(SUCCESS_CODE); @@ -143,29 +149,32 @@ describe('Student Test', () => { }); it('student get by user id not exist', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDENT}/${DUMMY_ID}`) .end((err, res) => { res.should.have.status(NOT_EXIST_ERROR_CODE); res.body.should.have.property('name').eql(ERROR); - res.body.should.have.property('message').eql('Object doesn\'t exist.'); + res.body.should.have.property('message').eql("Object doesn't exist."); done(); }); }); it('student get by user id invalid uuid', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDENT}/${INVALID_ID}`) .end((err, res) => { - res.should.have.status(SERVER_ERROR_CODE); - res.body.should.have.property('name').to.not.eql(null); - res.body.should.have.property('message').to.not.eql(null); - done(); + res.should.have.status(SERVER_ERROR_CODE); + res.body.should.have.property('name').to.not.eql(null); + res.body.should.have.property('message').to.not.eql(null); + done(); }); }); it('should get by user id success include historical transcript', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDENT}/${user.id}?includeTranscript=true`) .end((err, res) => { res.should.have.status(SUCCESS_CODE); @@ -187,7 +196,8 @@ describe('Student Test', () => { }); it('should get by user id success include cumulative score', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDENT}/${user.id}?includeScore=true`) .end((err, res) => { res.should.have.status(SUCCESS_CODE); @@ -212,7 +222,8 @@ describe('Student Test', () => { }); it('should get by user id success include credits total', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDENT}/${user.id}?includeCredits=true`) .end((err, res) => { res.should.have.status(SUCCESS_CODE); @@ -237,7 +248,7 @@ describe('Student Test', () => { describe('/PUT/:id student', () => { let user, lecturer, major; - beforeEach(async() => { + beforeEach(async () => { user = await User.create({ email: EMAIL, hashed_password: PASSWORD, @@ -270,7 +281,8 @@ describe('Student Test', () => { majorId: major.id, }; - chai.request(server) + chai + .request(server) .put(`${EndpointEnum.STUDENT}/${user.id}`) .send(student) .end((err, res) => { @@ -282,12 +294,13 @@ describe('Student Test', () => { }); it('student update by user id not exist', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDENT}/${DUMMY_ID}`) .end((err, res) => { res.should.have.status(NOT_EXIST_ERROR_CODE); res.body.should.have.property('name').eql(ERROR); - res.body.should.have.property('message').eql('Object doesn\'t exist.'); + res.body.should.have.property('message').eql("Object doesn't exist."); done(); }); }); @@ -305,19 +318,22 @@ describe('Student Test', () => { majorId: DUMMY_ID, }; - chai.request(server) + chai + .request(server) .put(`${EndpointEnum.STUDENT}/${user.id}`) .send(student) .end((err, res) => { res.should.have.status(400); res.body.should.have.property('status').eql(400); - res.body.should.have.property('message').eql('Something wrong with your payload.'); + res.body.should.have + .property('message') + .eql('Something wrong with your payload.'); done(); }); }); }); - describe("Update student score", () => { + describe('Update student score', () => { let error, request; beforeEach(() => { @@ -329,61 +345,70 @@ describe('Student Test', () => { }; }); - describe("Correct path", () => { - it("should return correct student data when studentId, courseClassId, and score valid", (done) => { + describe('Correct path', () => { + it('should return correct student data when studentId, courseClassId, and score valid', (done) => { chai .request(server) - .put(`${EndpointEnum.SCORE}/?studentId=${request.studentId}&courseClassId=${request.courseClassId}`) + .put( + `${EndpointEnum.SCORE}/?studentId=${request.studentId}&courseClassId=${request.courseClassId}`, + ) .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("id").to.not.equal(null); - res.body.should.have.property("attendancePercentage").to.not.equal(null); - res.body.should.have.property("score").to.not.equal(null); - res.body.should.have.property("score").to.equal(request.score); - res.body.should.have.property("status").to.not.equal(null); - res.body.should.have.property("courseClassId").to.not.equal(null); - res.body.should.have.property("studyPlanId").to.not.equal(null); - res.body.should.have.property("StudyPlan").to.not.equal(null); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have + .property('attendancePercentage') + .to.not.equal(null); + res.body.should.have.property('score').to.not.equal(null); + res.body.should.have.property('score').to.equal(request.score); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('courseClassId').to.not.equal(null); + res.body.should.have.property('studyPlanId').to.not.equal(null); + res.body.should.have.property('StudyPlan').to.not.equal(null); done(); }); }); }); - describe("Error path", () => { + describe('Error path', () => { it('should throw error when no studentId passed', (done) => { - chai.request(server) + chai + .request(server) .put(`${EndpointEnum.SCORE}/?courseClassId=${request.courseClassId}`) .send(request) .end((_, res) => { res.should.have.status(REQUEST_ERROR); - res.body.should.have.property("name").to.equal(error.name); + res.body.should.have.property('name').to.equal(error.name); res.body.should.have.property('message'); done(); }); }); - + it('should throw error when no courseClassId passed', (done) => { - chai.request(server) + chai + .request(server) .put(`${EndpointEnum.SCORE}/?studentId=${request.studentId}`) .send(request) .end((_, res) => { res.should.have.status(REQUEST_ERROR); - res.body.should.have.property("name").to.equal(error.name); + res.body.should.have.property('name').to.equal(error.name); res.body.should.have.property('message'); done(); }); }); - + it('should throw error when no score passed', (done) => { const { score, ...clonedRequest } = request; - - chai.request(server) - .put(`${EndpointEnum.SCORE}/?studentId=${request.studentId}&courseClassId=${request.courseClassId}`) + + chai + .request(server) + .put( + `${EndpointEnum.SCORE}/?studentId=${request.studentId}&courseClassId=${request.courseClassId}`, + ) .send(clonedRequest) .end((_, res) => { res.should.have.status(REQUEST_ERROR); - res.body.should.have.property("name").to.equal(error.name); + res.body.should.have.property('name').to.equal(error.name); res.body.should.have.property('message'); done(); }); diff --git a/backend/src/test/studyplan.controller.test.js b/backend/src/test/studyplan.controller.test.js index 356c34953cd80b5b9f3c9d8a889cdc4c75eb155c..f3d9a8e91c20ad878c2a2efc0a881cce4ddf4a9c 100644 --- a/backend/src/test/studyplan.controller.test.js +++ b/backend/src/test/studyplan.controller.test.js @@ -1,20 +1,20 @@ process.env.NODE_ENV = 'test'; const { - CourseClass, - Course, - User, - Student, - Lecturer, - StudyPlan, - StudyPlanCourse, + CourseClass, + Course, + User, + Student, + Lecturer, + StudyPlan, + StudyPlanCourse, } = require('../models/index'); const { - EndpointEnum, - CourseClassStatusEnum, - SemesterEnum, - StudyPlanStatusEnum, - StudyPlanCourseStatusEnum, + EndpointEnum, + CourseClassStatusEnum, + SemesterEnum, + StudyPlanStatusEnum, + StudyPlanCourseStatusEnum, } = require('../enums/index'); let chai = require('chai'); @@ -30,8 +30,8 @@ const SALT = 'salt'; const START_YEAR = 2021; const SEMESTER = SemesterEnum.ODD; const STUDY_PLAN_STATUS = StudyPlanStatusEnum.DRAFT; -const COURSE_CODE = "IF2036"; -const COURSE_NAME = "Rekayasa Perangkat Lunak"; +const COURSE_CODE = 'IF2036'; +const COURSE_NAME = 'Rekayasa Perangkat Lunak'; const COURSE_CREDIT = 3; const INVALID_ID = '57e19842-d712-45fd-9068-04cde6bf41f'; const SCORE = 'T'; @@ -42,32 +42,37 @@ const REQUEST_ERROR = 400; const INTERNAL_SERVER_ERROR = 500; const SEQUELIZE_DATABASE_ERROR = 'SequelizeDatabaseError'; -const INVALID_UUID_ERROR = 'invalid input syntax for type uuid: "' + INVALID_ID + '"'; +const INVALID_UUID_ERROR = + 'invalid input syntax for type uuid: "' + INVALID_ID + '"'; const ERROR = 'Error'; const CLASS_UNAVAILABLE_ERROR = 'Some of course classes are unavailable.'; -const STUDY_PLAN_EXIST_ERROR = 'Study plan\'s already exist'; +const STUDY_PLAN_EXIST_ERROR = "Study plan's already exist"; const SEMESTER_UNDEFINED_ERROR = 'Undefined semester'; describe('Study Plan Test', () => { - let availableCourseClass, unavailableCourseClass, student, studyPlan, studyPlanCourse; - - beforeEach(async() => { - await CourseClass.destroy({where: {}}); - await Course.destroy({where: {}}); - await Lecturer.destroy({where: {}}); - await Student.destroy({where: {}}); - await StudyPlan.destroy({where: {}}); + let availableCourseClass, + unavailableCourseClass, + student, + studyPlan, + studyPlanCourse; + + beforeEach(async () => { + await CourseClass.destroy({ where: {} }); + await Course.destroy({ where: {} }); + await Lecturer.destroy({ where: {} }); + await Student.destroy({ where: {} }); + await StudyPlan.destroy({ where: {} }); const course = await Course.create({ - code: COURSE_CODE, - name: COURSE_NAME, - credits: COURSE_CREDIT + code: COURSE_CODE, + name: COURSE_NAME, + credits: COURSE_CREDIT, }); let user = await User.create({ - email: EMAIL, - hashed_password: PASSWORD, - salt: SALT, + email: EMAIL, + hashed_password: PASSWORD, + salt: SALT, }); student = await Student.create({ @@ -75,15 +80,15 @@ describe('Study Plan Test', () => { }); const lecturer = await Lecturer.create({ - userId: user.id, + userId: user.id, }); availableCourseClass = await CourseClass.create({ - startYear: START_YEAR, - status: CourseClassStatusEnum.OPEN, - semester: SEMESTER, - courseId: course.id, - lecturerId: lecturer.id + startYear: START_YEAR, + status: CourseClassStatusEnum.OPEN, + semester: SEMESTER, + courseId: course.id, + lecturerId: lecturer.id, }); unavailableCourseClass = await CourseClass.create({ @@ -91,14 +96,14 @@ describe('Study Plan Test', () => { status: CourseClassStatusEnum.CLOSED, semester: SEMESTER, courseId: course.id, - lecturerId: lecturer.id + lecturerId: lecturer.id, }); studyPlan = await StudyPlan.create({ studentId: student.id, startYear: START_YEAR, semester: SemesterEnum.EVEN, - notes: NOTES + notes: NOTES, }); studyPlanCourse = await StudyPlanCourse.create({ @@ -119,32 +124,41 @@ describe('Study Plan Test', () => { semester: SEMESTER, status: STUDY_PLAN_STATUS, notes: NOTES, - studyPlanCourses : [ + studyPlanCourses: [ { courseClassId: availableCourseClass.id, - score : SCORE, - attendancePercentage : 0 - } - ] + score: SCORE, + attendancePercentage: 0, + }, + ], }; - chai.request(server) - .post(EndpointEnum.STUDY_PLAN) - .send(requestBody) - .end((_, res) => { - res.should.have.status(SUCCESS_CODE); - res.body.should.have.property('id').to.not.equal(null); - res.body.should.have.property('studentId').deep.equal(student.id); - res.body.should.have.property('creditsTotal').deep.equal(COURSE_CREDIT); - res.body.should.have.property('semester').deep.equal(requestBody.semester); - res.body.should.have.property('status').deep.equal(requestBody.status); - res.body.should.have.property('startYear').deep.equal(requestBody.startYear); - res.body.should.have.property('notes').deep.equal(NOTES); - res.body.should.have.property('studyPlanCourses').to.not.equal(null); - res.body.should.have.property('updatedAt').to.not.equal(null); - res.body.should.have.property('createdAt').to.not.equal(null); - done(); - }); + chai + .request(server) + .post(EndpointEnum.STUDY_PLAN) + .send(requestBody) + .end((_, res) => { + res.should.have.status(SUCCESS_CODE); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('studentId').deep.equal(student.id); + res.body.should.have + .property('creditsTotal') + .deep.equal(COURSE_CREDIT); + res.body.should.have + .property('semester') + .deep.equal(requestBody.semester); + res.body.should.have + .property('status') + .deep.equal(requestBody.status); + res.body.should.have + .property('startYear') + .deep.equal(requestBody.startYear); + res.body.should.have.property('notes').deep.equal(NOTES); + res.body.should.have.property('studyPlanCourses').to.not.equal(null); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + done(); + }); }); it('should return error when uuid is invalid', (done) => { @@ -153,24 +167,25 @@ describe('Study Plan Test', () => { startYear: START_YEAR, semester: SEMESTER, status: STUDY_PLAN_STATUS, - studyPlanCourses : [ + studyPlanCourses: [ { courseClassId: availableCourseClass.id, - score : SCORE, - attendancePercentage : 0 - } - ] + score: SCORE, + attendancePercentage: 0, + }, + ], }; - chai.request(server) - .post(EndpointEnum.STUDY_PLAN) - .send(requestBody) - .end((_, res) => { - res.should.have.status(INTERNAL_SERVER_ERROR); - res.body.should.have.property('name').eql(SEQUELIZE_DATABASE_ERROR); - res.body.should.have.property('message').eql(INVALID_UUID_ERROR); - done(); - }); + chai + .request(server) + .post(EndpointEnum.STUDY_PLAN) + .send(requestBody) + .end((_, res) => { + res.should.have.status(INTERNAL_SERVER_ERROR); + res.body.should.have.property('name').eql(SEQUELIZE_DATABASE_ERROR); + res.body.should.have.property('message').eql(INVALID_UUID_ERROR); + done(); + }); }); it('should return error when class is unavailable', (done) => { @@ -179,24 +194,25 @@ describe('Study Plan Test', () => { startYear: START_YEAR, semester: SEMESTER, status: STUDY_PLAN_STATUS, - studyPlanCourses : [ + studyPlanCourses: [ { courseClassId: unavailableCourseClass.id, - score : SCORE, - attendancePercentage : 0 - } - ] + score: SCORE, + attendancePercentage: 0, + }, + ], }; - chai.request(server) - .post(EndpointEnum.STUDY_PLAN) - .send(requestBody) - .end((_, res) => { - res.should.have.status(REQUEST_ERROR); - res.body.should.have.property('name').eql(ERROR); - res.body.should.have.property('message').eql(CLASS_UNAVAILABLE_ERROR); - done(); - }); + chai + .request(server) + .post(EndpointEnum.STUDY_PLAN) + .send(requestBody) + .end((_, res) => { + res.should.have.status(REQUEST_ERROR); + res.body.should.have.property('name').eql(ERROR); + res.body.should.have.property('message').eql(CLASS_UNAVAILABLE_ERROR); + done(); + }); }); it('should return error when study plan is already exist', (done) => { @@ -206,7 +222,8 @@ describe('Study Plan Test', () => { semester: SemesterEnum.EVEN, }; - chai.request(server) + chai + .request(server) .post(EndpointEnum.STUDY_PLAN) .send(requestBody) .end((_, res) => { @@ -220,16 +237,19 @@ describe('Study Plan Test', () => { it('should return error when required parameter is undefined', (done) => { const requestBody = { studentId: student.id, - startYear: START_YEAR + startYear: START_YEAR, }; - chai.request(server) + chai + .request(server) .post(EndpointEnum.STUDY_PLAN) .send(requestBody) .end((_, res) => { res.should.have.status(REQUEST_ERROR); res.body.should.have.property('name').eql(ERROR); - res.body.should.have.property('message').eql(SEMESTER_UNDEFINED_ERROR); + res.body.should.have + .property('message') + .eql(SEMESTER_UNDEFINED_ERROR); done(); }); }); @@ -237,32 +257,42 @@ describe('Study Plan Test', () => { describe('Getting study plan', () => { it('should return study plan when studentId, semester, and year valid', (done) => { - chai.request(server) - .get(`${EndpointEnum.STUDY_PLAN}/?studentId=${studyPlan.studentId}&semester=${SemesterEnum.EVEN}&startYear=${START_YEAR}`) + chai + .request(server) + .get( + `${EndpointEnum.STUDY_PLAN}/?studentId=${studyPlan.studentId}&semester=${SemesterEnum.EVEN}&startYear=${START_YEAR}`, + ) .end((_, res) => { res.should.have.status(SUCCESS_CODE); res.body.should.have.property('id').to.not.equal(null); res.body.should.have.property('startYear').deep.equal(START_YEAR); res.body.should.have.property('creditsTotal').deep.equal(0); - res.body.should.have.property('semester').deep.equal(SemesterEnum.EVEN); + res.body.should.have + .property('semester') + .deep.equal(SemesterEnum.EVEN); res.body.should.have.property('status').deep.equal(STUDY_PLAN_STATUS); res.body.should.have.property('notes').deep.equal(NOTES); res.body.should.have.property('updatedAt').to.not.equal(null); res.body.should.have.property('createdAt').to.not.equal(null); - res.body.should.have.property('studentId').deep.equal(studyPlan.studentId); + res.body.should.have + .property('studentId') + .deep.equal(studyPlan.studentId); done(); }); }); it('should return study plan when studyPlanId valid', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDY_PLAN}/?studyPlanId=${studyPlan.id}`) .end((_, res) => { res.should.have.status(SUCCESS_CODE); res.body.should.have.property('id').deep.equal(studyPlan.id); res.body.should.have.property('startYear').deep.equal(START_YEAR); res.body.should.have.property('creditsTotal').deep.equal(0); - res.body.should.have.property('semester').deep.equal(SemesterEnum.EVEN); + res.body.should.have + .property('semester') + .deep.equal(SemesterEnum.EVEN); res.body.should.have.property('status').deep.equal(STUDY_PLAN_STATUS); res.body.should.have.property('notes').deep.equal(NOTES); res.body.should.have.property('updatedAt').to.not.equal(null); @@ -273,20 +303,25 @@ describe('Study Plan Test', () => { }); it('should throw error when no params passed', (done) => { - chai.request(server) + chai + .request(server) .get(`${EndpointEnum.STUDY_PLAN}`) .end((_, res) => { res.should.have.status(REQUEST_ERROR); res.body.should.have.property('name').to.equal(ERROR); - res.body.should.have.property('message').to.equal("Undefined one of these parameters: studentId, or studyPlanId"); + res.body.should.have + .property('message') + .to.equal( + 'Undefined one of these parameters: studentId, or studyPlanId', + ); done(); }); }); }); - describe("Update study plan", () => { - it("should return correct study plan when updating notes", (done) => { - const newNotes = "So far so good, Dimas said"; + describe('Update study plan', () => { + it('should return correct study plan when updating notes', (done) => { + const newNotes = 'So far so good, Dimas said'; const request = { notes: newNotes, }; @@ -297,23 +332,23 @@ describe('Study Plan Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("id").to.not.equal(null); - res.body.should.have.property("startYear").to.not.equal(null); - res.body.should.have.property("creditsTotal").to.not.equal(null); - res.body.should.have.property("semester").to.not.equal(null); - res.body.should.have.property("status").to.not.equal(null); - res.body.should.have.property("notes").to.not.equal(null); - res.body.should.have.property("notes").to.not.equal(NOTES); - res.body.should.have.property("notes").to.equal(newNotes); - res.body.should.have.property("updatedAt").to.not.equal(null); - res.body.should.have.property("createdAt").to.not.equal(null); - res.body.should.have.property("studentId").to.not.equal(null); - res.body.should.have.property("studyPlanCourses").to.not.equal(null); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('startYear').to.not.equal(null); + res.body.should.have.property('creditsTotal').to.not.equal(null); + res.body.should.have.property('semester').to.not.equal(null); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('notes').to.not.equal(null); + res.body.should.have.property('notes').to.not.equal(NOTES); + res.body.should.have.property('notes').to.equal(newNotes); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + res.body.should.have.property('studentId').to.not.equal(null); + res.body.should.have.property('studyPlanCourses').to.not.equal(null); done(); }); }); - it("should return correct study plan when updating status", (done) => { + it('should return correct study plan when updating status', (done) => { const newStatus = StudyPlanStatusEnum.FINAL; const request = { status: newStatus, @@ -325,25 +360,25 @@ describe('Study Plan Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("id").to.not.equal(null); - res.body.should.have.property("startYear").to.not.equal(null); - res.body.should.have.property("creditsTotal").to.not.equal(null); - res.body.should.have.property("semester").to.not.equal(null); - res.body.should.have.property("status").to.not.equal(null); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('startYear').to.not.equal(null); + res.body.should.have.property('creditsTotal').to.not.equal(null); + res.body.should.have.property('semester').to.not.equal(null); + res.body.should.have.property('status').to.not.equal(null); res.body.should.have - .property("status") + .property('status') .to.not.equal(STUDY_PLAN_STATUS); - res.body.should.have.property("status").to.equal(newStatus); - res.body.should.have.property("notes").to.not.equal(null); - res.body.should.have.property("updatedAt").to.not.equal(null); - res.body.should.have.property("createdAt").to.not.equal(null); - res.body.should.have.property("studentId").to.not.equal(null); - res.body.should.have.property("studyPlanCourses").to.not.equal(null); + res.body.should.have.property('status').to.equal(newStatus); + res.body.should.have.property('notes').to.not.equal(null); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + res.body.should.have.property('studentId').to.not.equal(null); + res.body.should.have.property('studyPlanCourses').to.not.equal(null); done(); }); }); - it("should return correct study plan when updating study plan courses (empty)", (done) => { + it('should return correct study plan when updating study plan courses (empty)', (done) => { const studyPlanCourses = []; const request = { studyPlanCourses, @@ -355,24 +390,24 @@ describe('Study Plan Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("id").to.not.equal(null); - res.body.should.have.property("startYear").to.not.equal(null); - res.body.should.have.property("creditsTotal").to.not.equal(null); - res.body.should.have.property("semester").to.not.equal(null); - res.body.should.have.property("status").to.not.equal(null); - res.body.should.have.property("notes").to.not.equal(null); - res.body.should.have.property("updatedAt").to.not.equal(null); - res.body.should.have.property("createdAt").to.not.equal(null); - res.body.should.have.property("studentId").to.not.equal(null); - res.body.should.have.property("studyPlanCourses").to.not.equal(null); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('startYear').to.not.equal(null); + res.body.should.have.property('creditsTotal').to.not.equal(null); + res.body.should.have.property('semester').to.not.equal(null); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('notes').to.not.equal(null); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + res.body.should.have.property('studentId').to.not.equal(null); + res.body.should.have.property('studyPlanCourses').to.not.equal(null); res.body.should.have - .property("studyPlanCourses") + .property('studyPlanCourses') .to.deep.equal(studyPlanCourses); done(); }); }); - it("should return correct study plan when updating study plan courses (set APPROVED)", (done) => { + it('should return correct study plan when updating study plan courses (set APPROVED)', (done) => { studyPlanCourse.status = StudyPlanCourseStatusEnum.APPROVED; const studyPlanCourses = [studyPlanCourse]; @@ -387,27 +422,27 @@ describe('Study Plan Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("id").to.not.equal(null); - res.body.should.have.property("startYear").to.not.equal(null); - res.body.should.have.property("creditsTotal").to.not.equal(null); - res.body.should.have.property("semester").to.not.equal(null); - res.body.should.have.property("status").to.not.equal(null); - res.body.should.have.property("notes").to.not.equal(null); - res.body.should.have.property("updatedAt").to.not.equal(null); - res.body.should.have.property("createdAt").to.not.equal(null); - res.body.should.have.property("studentId").to.not.equal(null); - res.body.should.have.property("studyPlanCourses").to.not.equal(null); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('startYear').to.not.equal(null); + res.body.should.have.property('creditsTotal').to.not.equal(null); + res.body.should.have.property('semester').to.not.equal(null); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('notes').to.not.equal(null); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + res.body.should.have.property('studentId').to.not.equal(null); + res.body.should.have.property('studyPlanCourses').to.not.equal(null); res.body.studyPlanCourses[0].should.have - .property("id") + .property('id') .to.equal(studyPlanCourse.id); res.body.studyPlanCourses[0].should.have - .property("status") + .property('status') .to.equal(StudyPlanCourseStatusEnum.APPROVED); done(); }); }); - it("should return correct study plan when updating study plan courses (set UNAPPROVED)", (done) => { + it('should return correct study plan when updating study plan courses (set UNAPPROVED)', (done) => { studyPlanCourse.status = StudyPlanCourseStatusEnum.UNAPPROVED; const studyPlanCourses = [studyPlanCourse]; @@ -422,21 +457,21 @@ describe('Study Plan Test', () => { .send(request) .end((_, res) => { res.should.have.status(SUCCESS_CODE); - res.body.should.have.property("id").to.not.equal(null); - res.body.should.have.property("startYear").to.not.equal(null); - res.body.should.have.property("creditsTotal").to.not.equal(null); - res.body.should.have.property("semester").to.not.equal(null); - res.body.should.have.property("status").to.not.equal(null); - res.body.should.have.property("notes").to.not.equal(null); - res.body.should.have.property("updatedAt").to.not.equal(null); - res.body.should.have.property("createdAt").to.not.equal(null); - res.body.should.have.property("studentId").to.not.equal(null); - res.body.should.have.property("studyPlanCourses").to.not.equal(null); + res.body.should.have.property('id').to.not.equal(null); + res.body.should.have.property('startYear').to.not.equal(null); + res.body.should.have.property('creditsTotal').to.not.equal(null); + res.body.should.have.property('semester').to.not.equal(null); + res.body.should.have.property('status').to.not.equal(null); + res.body.should.have.property('notes').to.not.equal(null); + res.body.should.have.property('updatedAt').to.not.equal(null); + res.body.should.have.property('createdAt').to.not.equal(null); + res.body.should.have.property('studentId').to.not.equal(null); + res.body.should.have.property('studyPlanCourses').to.not.equal(null); res.body.studyPlanCourses[0].should.have - .property("id") + .property('id') .to.equal(studyPlanCourse.id); res.body.studyPlanCourses[0].should.have - .property("status") + .property('status') .to.equal(StudyPlanCourseStatusEnum.UNAPPROVED); done(); }); diff --git a/backend/src/util/common.js b/backend/src/util/common.js index f218df5a53811c806c96fcce50ca147db4e924ed..213f0d68fddfa6007751701fa55997c3ebe43bf5 100644 --- a/backend/src/util/common.js +++ b/backend/src/util/common.js @@ -3,7 +3,7 @@ const { CourseClassMeeting, StudyPlanCourse, CourseClassMeetingAttendance, - CourseClassDefaultSchedule + CourseClassDefaultSchedule, } = require('../models/index'); const { @@ -16,15 +16,12 @@ const { const { RequiredParameterUndefinedError } = require('./error'); const handleRequestWithInvalidRequestBody = (res, error) => { - const { - name, - message, - } = error; + const { name, message } = error; console.error(error); res.status(400).json({ name, - message + message, }); }; @@ -42,71 +39,77 @@ const checkRequiredParameter = (requiredReq) => { } if (!requirementFulfilled) { - const message = `one of these parameters: ${Object.keys(oneOf).join(', or ')}`; + const message = `one of these parameters: ${Object.keys(oneOf).join( + ', or ', + )}`; throw new RequiredParameterUndefinedError(message); } } else { let error = []; - for (const param in requiredReq){ + for (const param in requiredReq) { if (!requiredReq[param]) error.push(param); } - if (error.length !== 0) throw new RequiredParameterUndefinedError(error.join(',')); + if (error.length !== 0) + throw new RequiredParameterUndefinedError(error.join(',')); } -} ; +}; const handleRequestWithInternalServerError = (res, error) => { - const { - name, - message, - } = error; + const { name, message } = error; console.error(error); res.status(500).json({ name, - message + message, }); }; const handleRequestWithResourceItemNotFound = (res, error) => { - const { - name, - message, - } = error; + const { name, message } = error; console.error(error); res.status(404).json({ name, - message + message, }); }; const generateCourseClassMeetings = async (courseClass) => { - if (courseClass.status !== CourseClassStatusEnum.OPEN){ + if (courseClass.status !== CourseClassStatusEnum.OPEN) { return; } let startDate, endDate; - if (courseClass.semester === SemesterEnum.ODD){ + if (courseClass.semester === SemesterEnum.ODD) { startDate = new Date(`${courseClass.startYear}-08-15T00:00:00.000+07:00`); endDate = new Date(`${courseClass.startYear}-12-15T00:00:00.000+07:00`); } else { - startDate = new Date(`${courseClass.startYear+1}-01-15T00:00:00.000+07:00`); - endDate = new Date(`${courseClass.startYear+1}-05-15T00:00:00.000+07:00`); + startDate = new Date( + `${courseClass.startYear + 1}-01-15T00:00:00.000+07:00`, + ); + endDate = new Date(`${courseClass.startYear + 1}-05-15T00:00:00.000+07:00`); } const courseClassDefaultSchedules = await CourseClassDefaultSchedule.findAll({ where: { - courseClassId: courseClass.id - } + courseClassId: courseClass.id, + }, }); - for (let i = 0; i < courseClassDefaultSchedules.length; i++){ - for (let d = new Date(startDate.getTime()); d <= endDate; d.setDate(d.getDate() + 1)) { - if (d.getDay() === DayEnum[courseClassDefaultSchedules[i].day].value){ - - const startTimeParts = courseClassDefaultSchedules[i].start.match(/(\d+):(\d+):(\d+)/); - const endTimeParts = courseClassDefaultSchedules[i].end.match(/(\d+):(\d+):(\d+)/); + for (let i = 0; i < courseClassDefaultSchedules.length; i++) { + for ( + let d = new Date(startDate.getTime()); + d <= endDate; + d.setDate(d.getDate() + 1) + ) { + if (d.getDay() === DayEnum[courseClassDefaultSchedules[i].day].value) { + const startTimeParts = courseClassDefaultSchedules[i].start.match( + /(\d+):(\d+):(\d+)/, + ); + const endTimeParts = courseClassDefaultSchedules[i].end.match( + /(\d+):(\d+):(\d+)/, + ); let start = new Date(d.getTime()); start.setHours(parseInt(startTimeParts[1], 10)); @@ -132,29 +135,28 @@ const generateCourseClassMeetings = async (courseClass) => { //Used when studyPlan.status is updated to FINAL const generateCourseClassMeetingAttendances = async (studyPlan) => { - const studyPlanCourses = await StudyPlanCourse.findAll({ where: { - studyPlanId: studyPlan.id - } + studyPlanId: studyPlan.id, + }, }); - for (let i = 0; i < studyPlanCourses.length; i++){ + for (let i = 0; i < studyPlanCourses.length; i++) { const meetings = await CourseClassMeeting.findAll({ where: { - courseClassId: studyPlanCourses[i].courseClassId - } + courseClassId: studyPlanCourses[i].courseClassId, + }, }); - for (let j = 0; j < meetings.length; j++) { + for (let j = 0; j < meetings.length; j++) { await CourseClassMeetingAttendance.create({ courseClassMeetingId: meetings[j].dataValues.id, studentId: studyPlan.studentId, - status: AttendanceStatusEnum.ABSENT + status: AttendanceStatusEnum.ABSENT, }); } } -} +}; module.exports = { handleRequestWithInvalidRequestBody, @@ -162,5 +164,5 @@ module.exports = { handleRequestWithResourceItemNotFound, checkRequiredParameter, generateCourseClassMeetings, - generateCourseClassMeetingAttendances + generateCourseClassMeetingAttendances, }; diff --git a/backend/src/util/db.js b/backend/src/util/db.js index 22dddca0c47e5c850f76fa1570f7bae607495fe7..8c5e6c1c7e4ae97a1b53c08011f29f2f929700f0 100644 --- a/backend/src/util/db.js +++ b/backend/src/util/db.js @@ -1,7 +1,5 @@ 'use strict'; -const { - User, -} = require('../models/index'); +const { User } = require('../models/index'); const { PasswordDoesntMatchError, @@ -9,17 +7,18 @@ const { } = require('../util/error'); const { hashPasswordGivenSalt } = require('../util/salt'); -const getUser = async(email, password) => { +const getUser = async (email, password) => { const foundUser = await User.findOne({ where: { email, }, }); - if (!foundUser) throw new EmailNotFoundError; + if (!foundUser) throw new EmailNotFoundError(); const hashedPassword = await hashPasswordGivenSalt(password, foundUser.salt); - if (foundUser.hashed_password !== hashedPassword) throw new PasswordDoesntMatchError; + if (foundUser.hashed_password !== hashedPassword) + throw new PasswordDoesntMatchError(); return foundUser; }; diff --git a/backend/src/util/db/course-class-meeting.js b/backend/src/util/db/course-class-meeting.js index 80d55821b4864b46a5dcdb9a7788c4e6726b0e53..7b324dc490d933b2a395fe1b8c4dedada5dc5bd3 100644 --- a/backend/src/util/db/course-class-meeting.js +++ b/backend/src/util/db/course-class-meeting.js @@ -1,19 +1,17 @@ 'use strict'; -const { Op } = require("sequelize"); +const { Op } = require('sequelize'); const { - CourseClassMeeting, - CourseClass, - Course, - CourseClassMeetingAttendance, - Student, + CourseClassMeeting, + CourseClass, + Course, + CourseClassMeetingAttendance, + Student, } = require('../../models/index'); -const { getStudyPlan } = require("./study-plan"); -const { getCourseClass } = require("./course-class"); +const { getStudyPlan } = require('./study-plan'); +const { getCourseClass } = require('./course-class'); -const { - NotExistError, -} = require('../error'); +const { NotExistError } = require('../error'); const getCourseClassMeetingById = async (opts = {}) => { const { shouldIncludeAttendances } = opts; @@ -22,8 +20,8 @@ const getCourseClassMeetingById = async (opts = {}) => { opts.include = [ { model: CourseClassMeetingAttendance, - as: "courseClassMeetingAttendances", - attributes: ["status"], + as: 'courseClassMeetingAttendances', + attributes: ['status'], include: Student, }, ]; @@ -37,62 +35,73 @@ const getCourseClassMeetingById = async (opts = {}) => { }; const getCourseClassMeetingByStudentId = async (opts = {}) => { - const studyPlan = await getStudyPlan(opts); + const studyPlan = await getStudyPlan(opts); - const { studyPlanCourses } = studyPlan; + const { studyPlanCourses } = studyPlan; - const courseClassIds = studyPlanCourses.map(studyPlanCourse => studyPlanCourse.courseClassId); + const courseClassIds = studyPlanCourses.map( + (studyPlanCourse) => studyPlanCourse.courseClassId, + ); - return await getCourseClassMeetingByCourseClassIds(courseClassIds); + return await getCourseClassMeetingByCourseClassIds(courseClassIds); }; const getCourseClassMeetingByLecturerId = async (opts = {}) => { - const courseClasses = await getCourseClass({body: opts.where}, true); + const courseClasses = await getCourseClass({ body: opts.where }, true); - const courseClassIds = courseClasses.map(courseClass => courseClass.id); + const courseClassIds = courseClasses.map((courseClass) => courseClass.id); - return await getCourseClassMeetingByCourseClassIds(courseClassIds); -} + return await getCourseClassMeetingByCourseClassIds(courseClassIds); +}; const getCourseClassMeetingByCourseClassIds = async (courseClassIds) => { - if (!courseClassIds.length) return []; - try { - const courseClassMeetings = await CourseClassMeeting.findAll({ - where : { - courseClassId: { - [Op.or]: courseClassIds - } + if (!courseClassIds.length) return []; + try { + const courseClassMeetings = await CourseClassMeeting.findAll({ + where: { + courseClassId: { + [Op.or]: courseClassIds, + }, + }, + attributes: [ + 'id', + 'startTime', + 'endTime', + 'openAttendanceTime', + 'closeAttendanceTime', + ], + include: [ + { + model: CourseClass, + attributes: ['courseId'], + include: [ + { + model: Course, + attributes: ['code', 'name'], }, - attributes: ["id", "startTime", "endTime", "openAttendanceTime", "closeAttendanceTime"], - include: [ - { - model: CourseClass, - attributes: ["courseId"], - include: [ - { - model: Course, - attributes: ["code", "name"], - } - ] - } - ] - }); - - if (!courseClassMeetings) throw new NotExistError(); - - return courseClassMeetings; - } catch (error){ - console.log(error); - throw error; - } -} + ], + }, + ], + }); + + if (!courseClassMeetings) throw new NotExistError(); + + return courseClassMeetings; + } catch (error) { + console.log(error); + throw error; + } +}; const updateCourseClassMeeting = async (courseClassMeeting, changeset) => { const { courseClassMeetingAttendances } = changeset; if (courseClassMeetingAttendances) { await deleteAllAttendance(courseClassMeeting.id); - await recreateAllCourseClassMeetingAttendance(courseClassMeeting.id, courseClassMeetingAttendances); + await recreateAllCourseClassMeetingAttendance( + courseClassMeeting.id, + courseClassMeetingAttendances, + ); } const result = await courseClassMeeting.update(changeset); @@ -106,11 +115,14 @@ const deleteAllAttendance = async (courseClassMeetingId) => { await CourseClassMeetingAttendance.destroy({ where: { courseClassMeetingId, - } + }, }); }; -const recreateAllCourseClassMeetingAttendance = async (courseClassMeetingId, courseClassMeetingAttendances) => { +const recreateAllCourseClassMeetingAttendance = async ( + courseClassMeetingId, + courseClassMeetingAttendances, +) => { for (const attendance of courseClassMeetingAttendances) { await CourseClassMeetingAttendance.create({ courseClassMeetingId, @@ -120,8 +132,8 @@ const recreateAllCourseClassMeetingAttendance = async (courseClassMeetingId, cou }; module.exports = { - getCourseClassMeetingById, - getCourseClassMeetingByStudentId, - getCourseClassMeetingByLecturerId, - updateCourseClassMeeting, + getCourseClassMeetingById, + getCourseClassMeetingByStudentId, + getCourseClassMeetingByLecturerId, + updateCourseClassMeeting, }; diff --git a/backend/src/util/db/course-class.js b/backend/src/util/db/course-class.js index 9a21ced78b4a99006d9183918f9ecb4e57d15f57..0a4616ba74503cf0cef32d3df645cf0401c4a4b5 100644 --- a/backend/src/util/db/course-class.js +++ b/backend/src/util/db/course-class.js @@ -1,72 +1,70 @@ 'use strict'; const { - CourseClass, - StudyPlanCourse, - Student, - StudyPlan, - CourseClassDefaultSchedule + CourseClass, + StudyPlanCourse, + Student, + StudyPlan, + CourseClassDefaultSchedule, } = require('../../models/index'); -const { - StudyPlanCourseStatusEnum -} = require('../../enums/index'); +const { StudyPlanCourseStatusEnum } = require('../../enums/index'); -const { - NotExistError -} = require('../error'); +const { NotExistError } = require('../error'); -const getCourseClass = async(req, getMany) =>{ - let foundCourseClass = await CourseClass.findAll(req.body.opts).catch(err => { - throw err; - }); +const getCourseClass = async (req, getMany) => { + let foundCourseClass = await CourseClass.findAll(req.body.opts).catch( + (err) => { + throw err; + }, + ); - if (!foundCourseClass || foundCourseClass.length === 0) throw new NotExistError; + if (!foundCourseClass || foundCourseClass.length === 0) + throw new NotExistError(); - if (req.body.includeStudent){ - await getCourseClassParticipants(foundCourseClass); - } + if (req.body.includeStudent) { + await getCourseClassParticipants(foundCourseClass); + } - if (!getMany) return foundCourseClass[0]; + if (!getMany) return foundCourseClass[0]; - return foundCourseClass; + return foundCourseClass; }; -const getCourseClassParticipants = async(foundCourseClass) => { - for (let courseClass of foundCourseClass){ - courseClass.dataValues.students = []; - - const studyPlanCourses = await StudyPlanCourse.findAll({ - where: { - courseClassId: courseClass.id, - status: StudyPlanCourseStatusEnum.APPROVED - }, - include: [{ - model: StudyPlan, - include: [ - Student - ] - }] - }); - - for (const studyPlanCourse of studyPlanCourses) { - courseClass.dataValues.students.push(studyPlanCourse["StudyPlan"]["Student"]) - } +const getCourseClassParticipants = async (foundCourseClass) => { + for (let courseClass of foundCourseClass) { + courseClass.dataValues.students = []; + + const studyPlanCourses = await StudyPlanCourse.findAll({ + where: { + courseClassId: courseClass.id, + status: StudyPlanCourseStatusEnum.APPROVED, + }, + include: [ + { + model: StudyPlan, + include: [Student], + }, + ], + }); + + for (const studyPlanCourse of studyPlanCourses) { + courseClass.dataValues.students.push( + studyPlanCourse['StudyPlan']['Student'], + ); } -} + } +}; -const createCourseClass = async(data) => { +const createCourseClass = async (data) => { try { - const courseClass = await CourseClass.create( - data, - { - include: [ - { - model: CourseClassDefaultSchedule, - as: 'courseClassDefaultSchedules', - } - ] - } - ); + const courseClass = await CourseClass.create(data, { + include: [ + { + model: CourseClassDefaultSchedule, + as: 'courseClassDefaultSchedules', + }, + ], + }); if (courseClass) return courseClass; else throw new NotExistError(); @@ -76,39 +74,45 @@ const createCourseClass = async(data) => { }; const updateCourseClass = async (courseClass, changeset) => { - const { courseClassDefaultSchedules } = changeset; + const { courseClassDefaultSchedules } = changeset; - if (courseClassDefaultSchedules) { - await deleteAllCourseClassDefaultSchedule(courseClass.id); - await recreateAllCourseClassDefaultSchedule(courseClass.id, courseClassDefaultSchedules); - } + if (courseClassDefaultSchedules) { + await deleteAllCourseClassDefaultSchedule(courseClass.id); + await recreateAllCourseClassDefaultSchedule( + courseClass.id, + courseClassDefaultSchedules, + ); + } - const result = await courseClass.update(changeset); + const result = await courseClass.update(changeset); - await result.reload(); + await result.reload(); - return result; + return result; }; const deleteAllCourseClassDefaultSchedule = async (courseClassId) => { - await CourseClassDefaultSchedule.destroy({ - where: { - courseClassId - } - }); + await CourseClassDefaultSchedule.destroy({ + where: { + courseClassId, + }, + }); }; -const recreateAllCourseClassDefaultSchedule = async (courseClassId, courseClassDefaultSchedules) => { - for (const schedule of courseClassDefaultSchedules) { - await CourseClassDefaultSchedule.create({ - courseClassId, - ...schedule, - }); - } +const recreateAllCourseClassDefaultSchedule = async ( + courseClassId, + courseClassDefaultSchedules, +) => { + for (const schedule of courseClassDefaultSchedules) { + await CourseClassDefaultSchedule.create({ + courseClassId, + ...schedule, + }); + } }; module.exports = { - getCourseClass, - createCourseClass, - updateCourseClass + getCourseClass, + createCourseClass, + updateCourseClass, }; diff --git a/backend/src/util/db/lecturer.js b/backend/src/util/db/lecturer.js index 9b1fbc77cf528a04ad8ddac8d61b642cd2a26a3c..96597ef818e62bba5e4e16888a1b624c95005d59 100644 --- a/backend/src/util/db/lecturer.js +++ b/backend/src/util/db/lecturer.js @@ -2,15 +2,14 @@ const { Lecturer } = require('../../models/index'); const { LecturerNotFoundError } = require('../error'); -const getAllLecturers = async(opts = {}) => { +const getAllLecturers = async (opts = {}) => { const foundLecturers = await Lecturer.findAll(opts); - if (!foundLecturers.length) throw new LecturerNotFoundError; + if (!foundLecturers.length) throw new LecturerNotFoundError(); return foundLecturers; }; - module.exports = { getAllLecturers, }; diff --git a/backend/src/util/db/student.js b/backend/src/util/db/student.js index 8a87b83076eac0b611d7905db9b9f74d860c70d7..e41bbb93c8d4e5309582b4e775c74844f6a12b2b 100644 --- a/backend/src/util/db/student.js +++ b/backend/src/util/db/student.js @@ -2,17 +2,12 @@ const { StudyPlan, StudyPlanCourse, Student, - CourseClass + CourseClass, } = require('../../models/index'); -const { - ScoreEnum -} = require('../../enums/index'); - -const { - NotExistError, -} = require('../error'); +const { ScoreEnum } = require('../../enums/index'); +const { NotExistError } = require('../error'); const getStudentIPK = async (student) => { let cumulativeTotal = 0; @@ -20,34 +15,35 @@ const getStudentIPK = async (student) => { let studyPlans = student.studyPlans; - if (!studyPlans){ + if (!studyPlans) { studyPlans = await getHistoricalTranscript(student.id); } - for (const studyPlan of studyPlans){ - const {count, total} = getScoreOneStudyPlan(studyPlan); + for (const studyPlan of studyPlans) { + const { count, total } = getScoreOneStudyPlan(studyPlan); cumulativeCount += count; cumulativeTotal += total; } - if (cumulativeCount !== 0) return Number((cumulativeTotal/cumulativeCount).toFixed(2)); + if (cumulativeCount !== 0) + return Number((cumulativeTotal / cumulativeCount).toFixed(2)); return 0; -} +}; const getScoreOneStudyPlan = (studyPlan) => { let count = 0; let total = 0; - for (const studyPlanCourse of studyPlan.studyPlanCourses){ - if (studyPlanCourse.score !== ScoreEnum.T.name ){ + for (const studyPlanCourse of studyPlan.studyPlanCourses) { + if (studyPlanCourse.score !== ScoreEnum.T.name) { count += 1; total += ScoreEnum[studyPlanCourse.score].value; } } - return {count, total}; -} + return { count, total }; +}; const getStudentIP = async (student) => { let total = 0; @@ -55,15 +51,18 @@ const getStudentIP = async (student) => { let studyPlans = student.studyPlans; - if (!studyPlans){ + if (!studyPlans) { studyPlans = await getHistoricalTranscript(student.id); } - let courses = [] + let courses = []; - for (const studyPlan of studyPlans){ - for (const studyPlanCourse of studyPlan.studyPlanCourses){ - if (studyPlanCourse.score !== ScoreEnum.T.name && !courses.includes(studyPlanCourse['CourseClass'].courseId)){ + for (const studyPlan of studyPlans) { + for (const studyPlanCourse of studyPlan.studyPlanCourses) { + if ( + studyPlanCourse.score !== ScoreEnum.T.name && + !courses.includes(studyPlanCourse['CourseClass'].courseId) + ) { count += 1; total += ScoreEnum[studyPlanCourse.score].value; courses.push(studyPlanCourse['CourseClass'].courseId); @@ -71,71 +70,75 @@ const getStudentIP = async (student) => { } } - if (count !== 0) return Number((total/count).toFixed(2)); + if (count !== 0) return Number((total / count).toFixed(2)); return 0; -} +}; const getStudentNR = async (student) => { let studyPlans = student.studyPlans; - if (!studyPlans){ + if (!studyPlans) { studyPlans = await getHistoricalTranscript(student.id); } - if (studyPlans.length !== 0){ + if (studyPlans.length !== 0) { const currentStudyPlan = studyPlans[0]; - const {count, total} = getScoreOneStudyPlan(currentStudyPlan); + const { count, total } = getScoreOneStudyPlan(currentStudyPlan); - if (count !== 0) return Number((total/count).toFixed(2)); + if (count !== 0) return Number((total / count).toFixed(2)); } return 0; -} +}; const getCreditsTotal = async (student) => { let total = 0; let studyPlans = student.studyPlans; - if (!studyPlans){ + if (!studyPlans) { studyPlans = await getHistoricalTranscript(student.id); } - for (const studyPlan of studyPlans){ + for (const studyPlan of studyPlans) { total += studyPlan.creditsTotal; } return total; -} +}; -const getStudent = async (opts) =>{ +const getStudent = async (opts) => { const student = await Student.findOne(opts); if (!student) throw new NotExistError(); return student; -} +}; const getHistoricalTranscript = async (studentId) => { return await StudyPlan.findAll({ where: { - studentId: studentId + studentId: studentId, }, - include: [{ - model: StudyPlanCourse, - as: 'studyPlanCourses', - include: [{ - model: CourseClass, - attributes: ['courseId'] - }] - }], + include: [ + { + model: StudyPlanCourse, + as: 'studyPlanCourses', + include: [ + { + model: CourseClass, + attributes: ['courseId'], + }, + ], + }, + ], order: [ ['startYear', 'DESC'], - ['semester', 'DESC'] - ] + ['semester', 'DESC'], + ], }); -} +}; module.exports = { getStudentIPK, @@ -143,5 +146,5 @@ module.exports = { getStudentNR, getCreditsTotal, getStudent, - getHistoricalTranscript -} \ No newline at end of file + getHistoricalTranscript, +}; diff --git a/backend/src/util/db/study-plan.js b/backend/src/util/db/study-plan.js index e54bbe27a39850ed143ba555c300a95e5c495ef8..83a2b2b7aa99dda1c8c98fc2cbb0218ce9a14853 100644 --- a/backend/src/util/db/study-plan.js +++ b/backend/src/util/db/study-plan.js @@ -1,17 +1,17 @@ 'use strict'; const { - StudyPlan, - StudyPlanCourse, - Course, - CourseClass + StudyPlan, + StudyPlanCourse, + Course, + CourseClass, } = require('../../models/index'); -const { CourseClassStatusEnum } = require('../../enums/index') +const { CourseClassStatusEnum } = require('../../enums/index'); const { - NotExistError, - ClassUnavailableError, - StudyPlanExistError + NotExistError, + ClassUnavailableError, + StudyPlanExistError, } = require('../error'); const getStudyPlan = async (opts = {}) => { @@ -22,55 +22,58 @@ const getStudyPlan = async (opts = {}) => { return studyPlan; }; -const createStudyPlan = async(data) => { +const createStudyPlan = async (data) => { try { const { studentId, semester, startYear } = data; const uniqueData = { studentId, semester, startYear }; const [studyPlan, created] = await StudyPlan.findOrCreate({ - where: uniqueData, - defaults: data, - include: [ - { - model: StudyPlanCourse, - as: 'studyPlanCourses', - } - ] + where: uniqueData, + defaults: data, + include: [ + { + model: StudyPlanCourse, + as: 'studyPlanCourses', + }, + ], }); if (!created) throw new StudyPlanExistError(); if (studyPlan) return studyPlan; else throw new NotExistError(); - } catch (error) { throw error; } }; const countTotalCredits = async (courses) => { - let total = 0; - for (const studyPlanCourse of courses){ - const courseClass = await CourseClass.findOne({ - where: { id : studyPlanCourse.courseClassId }, - include: Course - }); - total += courseClass.Course.credits; - } - return total; + let total = 0; + for (const studyPlanCourse of courses) { + const courseClass = await CourseClass.findOne({ + where: { id: studyPlanCourse.courseClassId }, + include: Course, + }); + total += courseClass.Course.credits; + } + return total; }; const checkClassAvailability = async (semester, startYear, courses) => { - for (const studyPlanCourse of courses){ - const courseClass = await CourseClass.findOne({ - where: { id : studyPlanCourse.courseClassId } - }); + for (const studyPlanCourse of courses) { + const courseClass = await CourseClass.findOne({ + where: { id: studyPlanCourse.courseClassId }, + }); - if (!courseClass) throw new ClassUnavailableError(); + if (!courseClass) throw new ClassUnavailableError(); - if (semester !== courseClass.semester || startYear !== courseClass.startYear || courseClass.status === CourseClassStatusEnum.CLOSED) - throw new ClassUnavailableError(); - } + if ( + semester !== courseClass.semester || + startYear !== courseClass.startYear || + courseClass.status === CourseClassStatusEnum.CLOSED + ) + throw new ClassUnavailableError(); + } }; const updateStudyPlan = async (studyPlan, changeset) => { @@ -91,8 +94,8 @@ const updateStudyPlan = async (studyPlan, changeset) => { const deleteAllStudyPlanCourses = async (studyPlanId) => { await StudyPlanCourse.destroy({ where: { - studyPlanId - } + studyPlanId, + }, }); }; diff --git a/backend/src/util/enum.js b/backend/src/util/enum.js index 720017cc0b26a77928fe523e5427fe5d40b43eb1..07d0b10219277f04596f53bb61dc068dd3df9718 100644 --- a/backend/src/util/enum.js +++ b/backend/src/util/enum.js @@ -1,13 +1,17 @@ const getEnumValues = (enumObject, field) => { - const enumKeys = Object.keys(enumObject); + const enumKeys = Object.keys(enumObject); - if (field){ - return enumKeys.map(function(k){return enumObject[k][field]}) - } else { - return enumKeys.map(function(k){return enumObject[k]}) - } + if (field) { + return enumKeys.map(function (k) { + return enumObject[k][field]; + }); + } else { + return enumKeys.map(function (k) { + return enumObject[k]; + }); + } }; module.exports = { - getEnumValues, -} + getEnumValues, +}; diff --git a/backend/src/util/error.js b/backend/src/util/error.js index 96cfcd1abf27aa900f1a0a9aa0a20302c3252acf..4b5b8a21aa4081b31ffe982f5cba58b975d955f6 100644 --- a/backend/src/util/error.js +++ b/backend/src/util/error.js @@ -20,7 +20,7 @@ class InvalidRequestBodyError extends Error { class NotExistError extends Error { constructor() { - super('Object doesn\'t exist.'); + super("Object doesn't exist."); } } @@ -38,7 +38,7 @@ class RequiredParameterUndefinedError extends Error { class StudyPlanExistError extends Error { constructor() { - super('Study plan\'s already exist'); + super("Study plan's already exist"); } } @@ -48,7 +48,6 @@ class LecturerNotFoundError extends NotExistError { } } - module.exports = { PasswordDoesntMatchError, EmailNotFoundError, diff --git a/backend/src/util/hook.js b/backend/src/util/hook.js index c9cd479ef779ff352895d0420d88f45977a1fe4c..9660ce13ef3de5d339ada1b46dae603080a8c809 100644 --- a/backend/src/util/hook.js +++ b/backend/src/util/hook.js @@ -1,5 +1,5 @@ -const { Op } = require("sequelize"); -'use strict'; +const { Op } = require('sequelize'); +('use strict'); const { Course, CourseClass, @@ -14,8 +14,8 @@ const calculateTotalCredits = async (studyPlanCourses) => { if (studyPlanCourses) { for (const studyPlanCourse of studyPlanCourses) { const courseClass = await CourseClass.findOne({ - where: { id : studyPlanCourse.courseClassId }, - include: Course + where: { id: studyPlanCourse.courseClassId }, + include: Course, }); totalCredits += courseClass.Course.credits; } @@ -27,34 +27,34 @@ const calculateTotalCredits = async (studyPlanCourses) => { const deleteCurrentMeetings = async (courseClass) => { await CourseClassMeeting.destroy({ where: { - courseClassId: courseClass.id - } + courseClassId: courseClass.id, + }, }); }; const deleteCurrentMeetingAttendances = async (studyPlan) => { const studyPlanCourses = await StudyPlanCourse.findAll({ where: { - studyPlanId: studyPlan.id - } + studyPlanId: studyPlan.id, + }, }); for (let i = 0; i < studyPlanCourses.length; i++) { const meetings = await CourseClassMeeting.findAll({ where: { - courseClassId: studyPlanCourses[i].courseClassId - } + courseClassId: studyPlanCourses[i].courseClassId, + }, }); - const meetingIds = meetings.map(meet => meet.id); + const meetingIds = meetings.map((meet) => meet.id); await CourseClassMeetingAttendance.destroy({ - where : { + where: { courseClassMeetingId: { - [Op.or]: meetingIds + [Op.or]: meetingIds, }, studentId: studyPlan.studentId, - } + }, }); } }; @@ -62,5 +62,5 @@ const deleteCurrentMeetingAttendances = async (studyPlan) => { module.exports = { calculateTotalCredits, deleteCurrentMeetings, - deleteCurrentMeetingAttendances + deleteCurrentMeetingAttendances, }; diff --git a/backend/src/util/salt.js b/backend/src/util/salt.js index 0250e732a394bfbb3008b73b2f91157d716cdf25..48c088a3487cf0cf65adab05936614ac8a679214 100644 --- a/backend/src/util/salt.js +++ b/backend/src/util/salt.js @@ -2,13 +2,13 @@ const bcrypt = require('bcrypt'); const saltRounds = require(__dirname + '/../config/hash.json')['saltRounds']; -const hashPasswordGivenSalt = async(password, salt) => { +const hashPasswordGivenSalt = async (password, salt) => { const hashedPassword = await bcrypt.hash(password, salt); return hashedPassword; }; -const hashPasswordWithoutSalt = async(password) => { +const hashPasswordWithoutSalt = async (password) => { const salt = await bcrypt.genSalt(saltRounds); const hashedPassword = await hashPasswordGivenSalt(password, salt);