diff --git a/src/resources/application/applicationControllers.js b/src/resources/application/applicationControllers.js deleted file mode 100644 index 22be0bbbf6322f0eb5e7e734ed2b478faa4b121a..0000000000000000000000000000000000000000 --- a/src/resources/application/applicationControllers.js +++ /dev/null @@ -1,244 +0,0 @@ -const { crudControllers } = require('../../utils/crud') -const { Application } = require('./applicationModel') -const { Groups } = require('../groups/groupsModel') -const { Settings } = require('../settings/settingsModel') -const { pick, merge } = require('lodash') -const { isValidObjectId } = require('mongoose') - -exports.default = crudControllers(Application, [ - '_id', - 'motivation', - 'expectation', - 'solution', - 'groups', -]) - -const findGroupIds = async (group) => { - groupObject = await Groups.findOne({ name: group }).lean().exec() - if (!groupObject) - throw { name: 'NotExists', message: `Group ${group} doesn't exist!` } - return groupObject._id -} - -exports.default.createOne = async (req, res) => { - try { - // Convert group names to Ids - let groupIds = await Promise.all( - await req.body.groups.map((group) => findGroupIds(group)) - ) - let doc - if (req.user.role === 'mentor' && req.body.creator) { - // Mentor Creates/Updates an Application to someone - doc = await Application.findOneAndUpdate( - { creator: req.body.creator }, - { - ...req.body, - groups: groupIds, - creator: req.body.creator, - }, - { - upsert: true, // Create new One if there is no match - returnOriginal: false, - setDefaultsOnInsert: true, - runValidators: true, - } - ) - .lean() - .exec() - } else if (req.user.role === 'mentor' && req.body.state) { - // Mentor Creates own with state - doc = await Application.findOneAndUpdate( - { creator: req.user.schacc }, - { - ...req.body, - creator: req.user.schacc, - groups: groupIds, - state: req.body.state, - }, - { - upsert: true, // Create new One if there is no match - returnOriginal: false, - setDefaultsOnInsert: true, - runValidators: true, - } - ) - .lean() - .exec() - } else { - // Someone creates an application - if (req.user.role !== 'mentor') delete req.body.state - // Get deadline of Application - const settings = await Settings.findOne().lean().exec() - if (!settings) - return res.status(400).json("Initial settings wasn't provided") - if ( - !( - settings.applicationEndDate > new Date() || req.user.role === 'mentor' - ) - ) - return res.status(400).json({ - message: `Can't create new Application! End date was ${settings.applicationEndDate.toDateString()}`, - }) - - // Before deadline or role === mentor - doc = await Application.findOneAndUpdate( - { creator: req.user.schacc }, - { - ...req.body, - creator: req.user.schacc, - groups: groupIds, - }, - { - upsert: true, // Create new One if there is no match - returnOriginal: false, - setDefaultsOnInsert: true, - runValidators: true, - } - ) - .lean() - .exec() - } - - // Return group and creator populated - const retDoc = await Application.findById(doc._id) - .populate('groups', ['name']) - .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) - .lean() - .exec() - retDoc.creator = retDoc._creator - return res.status(201).json({ - data: pick(retDoc, [ - '_id', - 'creator', - 'motivation', - 'expectation', - 'solution', - 'groups', - 'state', - ]), - }) - } catch (err) { - if (err.name == 'ValidationError') { - // Mongoose validation errors - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - if (err.name == 'NotExists') - return res.status(404).json({ message: err.message }) - - console.error(err) - return res.status(400).end() - } -} - -exports.default.getMany = async (req, res) => { - try { - const docs = await Application.find() - .populate('groups', ['name']) - .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) - .lean() - .exec() - - res.status(200).json({ - data: docs.map((e) => { - e.creator = e._creator - return pick(e, [ - '_id', - 'creator', - 'motivation', - 'expectation', - 'solution', - 'groups', - 'state', - ]) - }), - }) - } catch (e) { - console.error(e) - res.status(400).end() - } -} - -exports.default.getOneByID = async (req, res) => { - try { - let doc - if (req.params.id === 'own') - doc = Application.findOne({ creator: req.user.schacc }) - else doc = Application.findOne({ _id: req.params.id }) - - doc = await doc - .populate('groups', ['name']) - .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) - .lean() - .exec() - - if (!doc) { - return res.status(404).end() - } - - if (doc.creator != req.user.schacc && req.user.role != 'mentor') - return res.status(403).end() - - doc.creator = doc._creator - res.status(200).json({ - data: pick(doc, [ - '_id', - 'creator', - 'motivation', - 'expectation', - 'solution', - 'groups', - 'state', - ]), - }) - } catch (err) { - if (err.name == 'CastError') { - // Throwed by Mongoose - return res.status(422).json('Invalid ID provided') - } else { - console.error(err) - res.status(400).end() - } - } -} - -exports.default.getOneBySchacc = async (req, res) => { - try { - let doc = await Application.findOne({ creator: req.params.schacc }) - .populate('groups', ['name']) - .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) - .lean() - .exec() - - if (!doc) { - return res.status(404).end() - } - - if (doc.creator != req.user.schacc && req.user.role != 'mentor') - return res.status(403).end() - - doc.creator = doc._creator - res.status(200).json({ - data: pick(doc, [ - '_id', - 'creator', - 'motivation', - 'expectation', - 'solution', - 'groups', - 'state', - ]), - }) - } catch (err) { - if (err.name == 'CastError') { - // Throwed by Mongoose - return res.status(422).json('Invalid ID provided') - } else { - console.error(err) - res.status(400).end() - } - } -} diff --git a/src/resources/application/applicationRouter.js b/src/resources/application/applicationRouter.js index 093fbbf514638c179473b9aa58c1c57702c3ab94..3030e8101653ebf338a6d0a15644d5a8f7199d59 100644 --- a/src/resources/application/applicationRouter.js +++ b/src/resources/application/applicationRouter.js @@ -1,5 +1,5 @@ const { Router } = require('express') -const controllers = require('./applicationControllers') +const controllers = require('./controllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') const router = Router() @@ -7,15 +7,13 @@ const router = Router() // /api/v1/application router .route('/') - .get(isLoggedIn, isMentor, controllers.default.getMany) - .post(isLoggedIn, controllers.default.createOne) + .get(isLoggedIn, isMentor, controllers.getMany) + .post(isLoggedIn, controllers.createOne) // /api/v1/application/id/:id -router.route('/id/:id').get(isLoggedIn, controllers.default.getOneByID) +router.route('/id/:id').get(isLoggedIn, controllers.getOneByID) // /api/v1/application/schacc/:schacc -router - .route('/schacc/:schacc') - .get(isLoggedIn, controllers.default.getOneBySchacc) +router.route('/schacc/:schacc').get(isLoggedIn, controllers.getOneBySchacc) exports.default = router diff --git a/src/resources/application/controllers/createOne.js b/src/resources/application/controllers/createOne.js new file mode 100644 index 0000000000000000000000000000000000000000..329ad3119523e7902f69220fbc32e02a89ea892e --- /dev/null +++ b/src/resources/application/controllers/createOne.js @@ -0,0 +1,118 @@ +const { Application } = require('../applicationModel') +const { Groups } = require('../../groups/groupsModel') +const { Settings } = require('../../settings/settingsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +const findGroupIds = async (group) => { + groupObject = await Groups.findOne({ name: group }).lean().exec() + if (!groupObject) + throw { name: 'NotExists', message: `Group ${group} doesn't exist!` } + return groupObject._id +} + +exports.createOne = async (req, res) => { + try { + // Convert group names to Ids + let groupIds = await Promise.all( + await req.body.groups.map((group) => findGroupIds(group)) + ) + let doc + if (req.user.role === 'mentor' && req.body.creator) { + // Mentor Creates/Updates an Application to someone + doc = await Application.findOneAndUpdate( + { creator: req.body.creator }, + { + ...req.body, + groups: groupIds, + creator: req.body.creator, + }, + { + upsert: true, + returnOriginal: false, + setDefaultsOnInsert: true, + runValidators: true, + } + ) + .lean() + .exec() + } else if (req.user.role === 'mentor' && req.body.state) { + // Mentor Creates own with state + doc = await Application.findOneAndUpdate( + { creator: req.user.schacc }, + { + ...req.body, + creator: req.user.schacc, + groups: groupIds, + state: req.body.state, + }, + { + upsert: true, + returnOriginal: false, + setDefaultsOnInsert: true, + runValidators: true, + } + ) + .lean() + .exec() + } else { + // Someone creates an application + if (req.user.role !== 'mentor') delete req.body.state + // Get deadline of Application + const settings = await Settings.findOne().lean().exec() + if (!settings) + return res.status(400).json("Initial settings wasn't provided") + if ( + !( + settings.applicationEndDate > new Date() || req.user.role === 'mentor' + ) + ) + return res.status(400).json({ + message: `Can't create new Application! End date was ${settings.applicationEndDate.toDateString()}`, + }) + + // Before deadline or role === mentor + doc = await Application.findOneAndUpdate( + { creator: req.user.schacc }, + { + ...req.body, + creator: req.user.schacc, + groups: groupIds, + }, + { + upsert: true, + returnOriginal: false, + setDefaultsOnInsert: true, + runValidators: true, + } + ) + .lean() + .exec() + } + + // Return group and creator populated + const retDoc = await Application.findById(doc._id) + .populate('groups', ['name']) + .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) + .lean() + .exec() + retDoc.creator = retDoc._creator + return res.status(201).json({ + data: pick(retDoc, pickedKeys), + }) + } catch (err) { + if (err.name == 'ValidationError') { + // Mongoose validation errors + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + if (err.name == 'NotExists') + return res.status(404).json({ message: err.message }) + + console.error(err) + return res.status(400).end() + } +} diff --git a/src/resources/application/controllers/getMany.js b/src/resources/application/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..35ce38c1ac4bad36d0c2004fa16fbd7b3b968bf7 --- /dev/null +++ b/src/resources/application/controllers/getMany.js @@ -0,0 +1,23 @@ +const { Application } = require('../applicationModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getMany = async (req, res) => { + try { + const docs = await Application.find() + .populate('groups', ['name']) + .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) + .lean() + .exec() + + res.status(200).json({ + data: docs.map((e) => { + e.creator = e._creator + return pick(e, pickedKeys) + }), + }) + } catch (e) { + console.error(e) + res.status(400).end() + } +} diff --git a/src/resources/application/controllers/getOneByID.js b/src/resources/application/controllers/getOneByID.js new file mode 100644 index 0000000000000000000000000000000000000000..6c2a6df136f8cebfd05bdbf1e5d0ccf296af4af2 --- /dev/null +++ b/src/resources/application/controllers/getOneByID.js @@ -0,0 +1,38 @@ +const { Application } = require('../applicationModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getOneByID = async (req, res) => { + try { + let doc + if (req.params.id === 'own') + doc = Application.findOne({ creator: req.user.schacc }) + else doc = Application.findOne({ _id: req.params.id }) + + doc = await doc + .populate('groups', ['name']) + .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) + .lean() + .exec() + + if (!doc) { + return res.status(404).end() + } + + if (doc.creator != req.user.schacc && req.user.role != 'mentor') + return res.status(403).end() + + doc.creator = doc._creator + res.status(200).json({ + data: pick(doc, pickedKeys), + }) + } catch (err) { + if (err.name == 'CastError') { + // Throwed by Mongoose + return res.status(422).json('Invalid ID provided') + } else { + console.error(err) + res.status(400).end() + } + } +} diff --git a/src/resources/application/controllers/getOneBySchacc.js b/src/resources/application/controllers/getOneBySchacc.js new file mode 100644 index 0000000000000000000000000000000000000000..4f4dae8d20c2e0d872a3ad1a21aef5dacbf67f42 --- /dev/null +++ b/src/resources/application/controllers/getOneBySchacc.js @@ -0,0 +1,33 @@ +const { Application } = require('../applicationModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getOneBySchacc = async (req, res) => { + try { + let doc = await Application.findOne({ creator: req.params.schacc }) + .populate('groups', ['name']) + .populate('_creator', ['schacc', 'fullName', 'secondaryEmail']) + .lean() + .exec() + + if (!doc) { + return res.status(404).end() + } + + if (doc.creator != req.user.schacc && req.user.role != 'mentor') + return res.status(403).end() + + doc.creator = doc._creator + res.status(200).json({ + data: pick(doc, pickedKeys), + }) + } catch (err) { + if (err.name == 'CastError') { + // Throwed by Mongoose + return res.status(422).json('Invalid ID provided') + } else { + console.error(err) + res.status(400).end() + } + } +} diff --git a/src/resources/application/controllers/index.js b/src/resources/application/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ad9fa21bcceccb2c327f9b18d2210270b76ed12f --- /dev/null +++ b/src/resources/application/controllers/index.js @@ -0,0 +1,14 @@ +exports.pickedKeys = [ + '_id', + 'creator', + 'motivation', + 'expectation', + 'solution', + 'groups', + 'state', +] + +exports.createOne = require('./createOne').createOne +exports.getMany = require('./getMany').getMany +exports.getOneByID = require('./getOneByID').getOneByID +exports.getOneBySchacc = require('./getOneBySchacc').getOneBySchacc diff --git a/src/resources/attendance/attendanceControllers.js b/src/resources/attendance/attendanceControllers.js deleted file mode 100644 index 6561838748979edd9f0aaedeb246701a91c17df7..0000000000000000000000000000000000000000 --- a/src/resources/attendance/attendanceControllers.js +++ /dev/null @@ -1,85 +0,0 @@ -const { crudControllers } = require('../../utils/crud') -const { Attendance } = require('./attendanceModel') -const { pick } = require('lodash') - -const pickedKeys = ['_id', 'activity', 'user', 'state', 'comments'] - -module.exports = crudControllers(Attendance, pickedKeys) - -// On create update activity - -module.exports.getOne = async (req, res) => { - try { - const attendance = await Attendance.findOne({ _id: req.params.id }) - .populate('_user', ['_id', 'fullName', 'schacc']) - .populate('comments', ['creator', 'date', 'text']) - .lean() - .exec() - - if (!attendance) return res.status(404).end() - attendance.user = attendance._user - return res.status(200).json({ - data: pick(attendance, pickedKeys), - }) - } catch (err) { - if (err.name == 'CastError') { - // Throwed by Mongoose - return res.status(422).json('Invalid ID provided') - } - - console.error(err) - return res.status(400).end() - } -} - -module.exports.getMany = async (req, res) => { - try { - const attendances = await Attendance.find() - .populate('_user', ['_id', 'fullName', 'schacc']) - .populate('comments', ['creator', 'date', 'text']) - .lean() - .exec() - - return res.status(200).json({ - data: attendances.map((e) => { - e.user = e._user - return pick(e, pickedKeys) - }), - }) - } catch (e) { - console.error(e) - return res.status(400).end() - } -} - -module.exports.updateOne = async (req, res) => { - try { - const updatedAttendance = await Attendance.findOneAndUpdate( - { - _id: req.params.id, - }, - pick(req.body, ['state']), // only state can be updated - { new: true, runValidators: true } - ) - .populate('_user', ['_id', 'fullName', 'schacc']) - .populate('comments', ['creator', 'date', 'text']) - .lean() - .exec() - - if (!updatedAttendance) return res.status(400).end() - - updatedAttendance.user = updatedAttendance._user - return res.status(200).json({ data: pick(updatedAttendance, pickedKeys) }) - } catch (err) { - if (err.name == 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - console.error(err) - return res.status(400).end() - } -} diff --git a/src/resources/attendance/attendanceRouter.js b/src/resources/attendance/attendanceRouter.js index aa2468a81b646a4029ccb579b3b6cec73e932e07..34799534c805a3cc537b95132310030fb439a70c 100644 --- a/src/resources/attendance/attendanceRouter.js +++ b/src/resources/attendance/attendanceRouter.js @@ -1,5 +1,5 @@ const { Router } = require('express') -const controllers = require('./attendanceControllers') +const controllers = require('./controllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') const router = Router() diff --git a/src/resources/attendance/controllers/createOne.js b/src/resources/attendance/controllers/createOne.js new file mode 100644 index 0000000000000000000000000000000000000000..79c9b67dbe7ea2cec302f18c5558b6f87fca11d5 --- /dev/null +++ b/src/resources/attendance/controllers/createOne.js @@ -0,0 +1,5 @@ +const { createOne } = require('../../../utils/crud') +const { Attendance } = require('../attendanceModel') +const { pickedKeys } = require('.') + +exports.createOne = createOne(Attendance, [...pickedKeys]) diff --git a/src/resources/attendance/controllers/getMany.js b/src/resources/attendance/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..fcaeb0f738df17249c91d1977702f7dc1184f4c6 --- /dev/null +++ b/src/resources/attendance/controllers/getMany.js @@ -0,0 +1,23 @@ +const { Attendance } = require('../attendanceModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getMany = async (req, res) => { + try { + const attendances = await Attendance.find() + .populate('_user', ['_id', 'fullName', 'schacc']) + .populate('comments', ['creator', 'date', 'text']) + .lean() + .exec() + + return res.status(200).json({ + data: attendances.map((e) => { + e.user = e._user + return pick(e, pickedKeys) + }), + }) + } catch (e) { + console.error(e) + return res.status(400).end() + } +} diff --git a/src/resources/attendance/controllers/getOne.js b/src/resources/attendance/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..6433322f7bc1f6ccaae98f2630134125ea7a10a0 --- /dev/null +++ b/src/resources/attendance/controllers/getOne.js @@ -0,0 +1,28 @@ +const { Attendance } = require('../attendanceModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +// On create update activity +exports.getOne = async (req, res) => { + try { + const attendance = await Attendance.findOne({ _id: req.params.id }) + .populate('_user', ['_id', 'fullName', 'schacc']) + .populate('comments', ['creator', 'date', 'text']) + .lean() + .exec() + + if (!attendance) return res.status(404).end() + attendance.user = attendance._user + return res.status(200).json({ + data: pick(attendance, pickedKeys), + }) + } catch (err) { + if (err.name == 'CastError') { + // Throwed by Mongoose + return res.status(422).json('Invalid ID provided') + } + + console.error(err) + return res.status(400).end() + } +} diff --git a/src/resources/attendance/controllers/index.js b/src/resources/attendance/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4771b935f1963678415f856f66591737e8f159d5 --- /dev/null +++ b/src/resources/attendance/controllers/index.js @@ -0,0 +1,7 @@ +exports.pickedKeys = ['_id', 'activity', 'user', 'state', 'comments'] + +exports.createOne = require('./createOne').createOne +exports.getMany = require('./getMany').getMany +exports.getOne = require('./getOne').getOne +exports.removeOne = require('./removeOne').removeOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/attendance/controllers/removeOne.js b/src/resources/attendance/controllers/removeOne.js new file mode 100644 index 0000000000000000000000000000000000000000..289db11ac41770fe0654befefdcf2ee91ac6b60c --- /dev/null +++ b/src/resources/attendance/controllers/removeOne.js @@ -0,0 +1,5 @@ +const { removeOne } = require('../../../utils/crud') +const { Attendance } = require('../attendanceModel') +const { pickedKeys } = require('.') + +exports.removeOne = removeOne(Attendance, [...pickedKeys]) diff --git a/src/resources/attendance/controllers/updateOne.js b/src/resources/attendance/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..ef88b97b35c503f31ccd5efc4163432392dbe86a --- /dev/null +++ b/src/resources/attendance/controllers/updateOne.js @@ -0,0 +1,35 @@ +const { Attendance } = require('../attendanceModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.updateOne = async (req, res) => { + try { + const updatedAttendance = await Attendance.findOneAndUpdate( + { + _id: req.params.id, + }, + pick(req.body, ['state']), + { new: true, runValidators: true } + ) + .populate('_user', ['_id', 'fullName', 'schacc']) + .populate('comments', ['creator', 'date', 'text']) + .lean() + .exec() + + if (!updatedAttendance) return res.status(400).end() + + updatedAttendance.user = updatedAttendance._user + return res.status(200).json({ data: pick(updatedAttendance, pickedKeys) }) + } catch (err) { + if (err.name == 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + console.error(err) + return res.status(400).end() + } +} diff --git a/src/resources/comment/commentControllers.js b/src/resources/comment/commentControllers.js deleted file mode 100644 index 1b1d3b7555a5cccacddb6e40bf09d4c1b7e91b69..0000000000000000000000000000000000000000 --- a/src/resources/comment/commentControllers.js +++ /dev/null @@ -1,259 +0,0 @@ -const { crudControllers } = require('../../utils/crud') -const { pick } = require('lodash') - -const { Comment } = require('./commentModel') -const { Solution } = require('../solution/solutionModel') -const { Task } = require('../task/taskModel') -const { Attendance } = require('../attendance/attendanceModel') -const { Activity } = require('../activity/activityModel') - -const pickedKeys = [ - '_id', - 'parentId', - 'parentType', - 'creator', - 'text', - 'createdAt', - 'updatedAt', -] - -exports.default = crudControllers(Comment, pickedKeys) - -function getParentModel(comment) { - switch (comment.parentType) { - case 'solution': - return Solution - case 'task': - return Task - case 'attendance': - return Attendance - case 'activity': - return Activity - default: - throw { message: `Invalid Parent Type: ${comment.parentType}` } - } -} - -exports.default.getOne = async (req, res) => { - try { - const comment = await Comment.findOne({ - _id: req.params.id, - }) - .populate('_creator', ['fullName', 'nickName', 'schacc']) - .lean() - .exec() - - if (!comment) return res.status(404).end() - - if ( - (comment.parentType == 'attendance' || - comment.parentType == 'activity') && - req.user.role !== 'mentor' - ) - return res - .status(403) - .json({ messages: ['You cannot get other users comment.'] }) - .end() - - if (req.user.role !== 'mentor') { - // Check if own solution - if (comment.parentType == 'solution') { - const solution = await Solution.findById(comment.parentId).lean().exec() - if (!solution) - return res - .status(404) - .json({ messages: ["Parent Object doesn't exist!"] }) - - if (solution.creator != req.user.schacc) - return res - .status(403) - .json({ messages: ['You cannot get other users comment.'] }) - .end() - } - } - - comment.creator = comment._creator - if (comment.isAnonim) comment.creator = '' - - return res - .status(200) - .json({ data: pick(comment, pickedKeys) }) - .end() - } catch (err) { - if (err.name == 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - console.error(err) - return res.status(500).json({ message: err.message }) - } -} - -exports.default.getMany = async (req, res) => { - try { - const comments = await Comment.find() - .populate('_creator', 'fullName nickName schacc') - .select(['-__v']) - .lean() - .exec() - - return res - .status(200) - .json({ - data: comments.map((e) => { - if (e.isAnonim) e.creator = '' - else e.creator = e._creator - return pick(e, pickedKeys) - }), - }) - .end() - } catch (err) { - if (err.name == 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - console.error(err) - return res.status(500).json({ message: err.message }) - } -} - -exports.default.createOne = async (req, res) => { - try { - if (req.user.role != 'mentor' && !req.body.creator) - req.body.creator = req.user.schacc - - let comment = await Comment.create({ - ...req.body, - }) - - // Add to parent - let updateParent = await getParentModel(comment).findById(comment.parentId) - if (!updateParent) { - await Comment.findByIdAndRemove(comment._id).lean().exec() - return res - .status(404) - .json({ messages: ["Parent Object doesn't exist!"] }) - } - if (updateParent.comments.indexOf(comment._id) == -1) { - updateParent.comments.push(comment._id) - try { - await updateParent.save() - } catch (error) { - await Comment.findByIdAndRemove(comment._id) - } - } - - comment = await comment - .populate('_creator', 'fullName nickName schacc') - .execPopulate() - - let retComment = comment.toObject() - retComment.creator = retComment._creator - - if (retComment.isAnonim) retComment.creator = '' - - return res - .status(200) - .json({ - data: pick(retComment, pickedKeys), - }) - .end() - } catch (err) { - if (err.name == 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - console.error(err) - return res.status(500).json({ message: err.message }) - } -} - -exports.default.updateOne = async (req, res) => { - try { - const comment = await Comment.findById(req.params.id).lean().exec() - - if (!comment) return res.status(404).end() - - if (comment.creator !== req.user.schacc && req.user.role != 'mentor') - return res - .status(403) - .json({ messages: ['You cannot update other users comment.'] }) - .end() - - const updatedComment = await Comment.findOneAndUpdate( - { _id: req.params.id }, - { text: req.body.text }, - { new: true } - ) - .lean() - .exec() - - if (updatedComment.isAnonim) updatedComment.creator = '' - - return res.status(200).json({ data: pick(updatedComment, pickedKeys) }) - } catch (err) { - if (err.name == 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - console.error(err) - return res.status(500).json({ message: err.message }) - } -} - -exports.default.removeOne = async (req, res) => { - try { - const comment = await Comment.findById({ _id: req.params.id }).lean().exec() - - if (comment.creator !== req.user.schacc && req.user.role != 'mentor') - return res - .status(403) - .json({ messages: ['You cannot delete other users comment.'] }) - .end() - - const removed = await Comment.findByIdAndRemove({ _id: req.params.id }) - if (!removed) { - return res.status(404).end() - } - - // remove from parent model - await getParentModel(removed).updateMany( - {}, - { $pull: { comments: { $in: removed._id } } } - ) - - if (removed.isAnonim) removed.creator = '' - - return res - .status(200) - .json({ data: pick(removed, pickedKeys) }) - .end() - } catch (err) { - if (err.name == 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - console.error(err) - return res.status(500).json({ message: err.message }) - } -} diff --git a/src/resources/comment/commentRouter.js b/src/resources/comment/commentRouter.js index f1711782e830e09505b64b451d00e73e82141cc5..ac69dd88dafa06b993a3878c8f269edf7d92ffea 100644 --- a/src/resources/comment/commentRouter.js +++ b/src/resources/comment/commentRouter.js @@ -1,5 +1,5 @@ const { Router } = require('express') -const controllers = require('./commentControllers') +const controllers = require('./controllers') const { isLoggedIn, isMentor, @@ -11,14 +11,14 @@ const router = Router() // /api/v1/comment router .route('/') - .get(isLoggedIn, isMentor, controllers.default.getMany) - .post(isLoggedIn, isAcceptedOrMentor, controllers.default.createOne) + .get(isLoggedIn, isMentor, controllers.getMany) + .post(isLoggedIn, isAcceptedOrMentor, controllers.createOne) // /api/v1/comment/id/:id router .route('/id/:id') - .get(isLoggedIn, isAcceptedOrMentor, controllers.default.getOne) - .put(isLoggedIn, isAcceptedOrMentor, controllers.default.updateOne) - .delete(isLoggedIn, isAcceptedOrMentor, controllers.default.removeOne) + .get(isLoggedIn, isAcceptedOrMentor, controllers.getOne) + .put(isLoggedIn, isAcceptedOrMentor, controllers.updateOne) + .delete(isLoggedIn, isAcceptedOrMentor, controllers.removeOne) exports.default = router diff --git a/src/resources/comment/controllers/createOne.js b/src/resources/comment/controllers/createOne.js new file mode 100644 index 0000000000000000000000000000000000000000..366ead0fe2772195823682f93cfa934fa988de13 --- /dev/null +++ b/src/resources/comment/controllers/createOne.js @@ -0,0 +1,58 @@ +const { pick } = require('lodash') +const { Comment } = require('../commentModel') +const { getParentModel, pickedKeys } = require('.') + +exports.createOne = async (req, res) => { + try { + if (req.user.role != 'mentor' && !req.body.creator) + req.body.creator = req.user.schacc + + let comment = await Comment.create({ + ...req.body, + }) + + // Add to parent + let updateParent = await getParentModel(comment).findById(comment.parentId) + if (!updateParent) { + await Comment.findByIdAndRemove(comment._id).lean().exec() + return res + .status(404) + .json({ messages: ["Parent Object doesn't exist!"] }) + } + if (updateParent.comments.indexOf(comment._id) == -1) { + updateParent.comments.push(comment._id) + try { + await updateParent.save() + } catch (error) { + await Comment.findByIdAndRemove(comment._id) + } + } + + comment = await comment + .populate('_creator', 'fullName nickName schacc') + .execPopulate() + + let retComment = comment.toObject() + retComment.creator = retComment._creator + + if (retComment.isAnonim) retComment.creator = '' + + return res + .status(200) + .json({ + data: pick(retComment, pickedKeys), + }) + .end() + } catch (err) { + if (err.name == 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + console.error(err) + return res.status(500).json({ message: err.message }) + } +} diff --git a/src/resources/comment/controllers/getMany.js b/src/resources/comment/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..78da6f9fbb982d63332869faf7abd932526269fd --- /dev/null +++ b/src/resources/comment/controllers/getMany.js @@ -0,0 +1,35 @@ +const { pick } = require('lodash') +const { Comment } = require('../commentModel') +const { pickedKeys } = require('.') + +exports.getMany = async (req, res) => { + try { + const comments = await Comment.find() + .populate('_creator', 'fullName nickName schacc') + .select(['-__v']) + .lean() + .exec() + + return res + .status(200) + .json({ + data: comments.map((e) => { + if (e.isAnonim) e.creator = '' + else e.creator = e._creator + return pick(e, pickedKeys) + }), + }) + .end() + } catch (err) { + if (err.name == 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + console.error(err) + return res.status(500).json({ message: err.message }) + } +} diff --git a/src/resources/comment/controllers/getOne.js b/src/resources/comment/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..b7e3fbfcc55857cd3113f56e6e576d7a069c4f76 --- /dev/null +++ b/src/resources/comment/controllers/getOne.js @@ -0,0 +1,63 @@ +const { pick } = require('lodash') +const { Comment } = require('../commentModel') +const { Solution } = require('../../solution/solutionModel') +const { pickedKeys } = require('.') + +exports.getOne = async (req, res) => { + try { + const comment = await Comment.findOne({ + _id: req.params.id, + }) + .populate('_creator', ['fullName', 'nickName', 'schacc']) + .lean() + .exec() + + if (!comment) return res.status(404).end() + + if ( + (comment.parentType == 'attendance' || + comment.parentType == 'activity') && + req.user.role !== 'mentor' + ) + return res + .status(403) + .json({ messages: ['You cannot get other users comment.'] }) + .end() + + if (req.user.role !== 'mentor') { + // Check if own solution + if (comment.parentType == 'solution') { + const solution = await Solution.findById(comment.parentId).lean().exec() + if (!solution) + return res + .status(404) + .json({ messages: ["Parent Object doesn't exist!"] }) + + if (solution.creator != req.user.schacc) + return res + .status(403) + .json({ messages: ['You cannot get other users comment.'] }) + .end() + } + } + + comment.creator = comment._creator + if (comment.isAnonim) comment.creator = '' + + return res + .status(200) + .json({ data: pick(comment, pickedKeys) }) + .end() + } catch (err) { + if (err.name == 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + console.error(err) + return res.status(500).json({ message: err.message }) + } +} diff --git a/src/resources/comment/controllers/index.js b/src/resources/comment/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..baaddd332e09e6ce0a5d0f1df472542b2d1adf38 --- /dev/null +++ b/src/resources/comment/controllers/index.js @@ -0,0 +1,35 @@ +const { Solution } = require('../../solution/solutionModel') +const { Task } = require('../../task/taskModel') +const { Attendance } = require('../../attendance/attendanceModel') +const { Activity } = require('../../activity/activityModel') + +exports.pickedKeys = [ + '_id', + 'parentId', + 'parentType', + 'creator', + 'text', + 'createdAt', + 'updatedAt', +] + +exports.getParentModel = function getParentModel(comment) { + switch (comment.parentType) { + case 'solution': + return Solution + case 'task': + return Task + case 'attendance': + return Attendance + case 'activity': + return Activity + default: + throw { message: `Invalid Parent Type: ${comment.parentType}` } + } +} + +exports.createOne = require('./createOne').createOne +exports.getMany = require('./getMany').getMany +exports.getOne = require('./getOne').getOne +exports.removeOne = require('./removeOne').removeOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/comment/controllers/removeOne.js b/src/resources/comment/controllers/removeOne.js new file mode 100644 index 0000000000000000000000000000000000000000..8cc675b4f5eef40f5f1454f91e12295ca011124e --- /dev/null +++ b/src/resources/comment/controllers/removeOne.js @@ -0,0 +1,44 @@ +const { pick } = require('lodash') +const { Comment } = require('../commentModel') +const { getParentModel, pickedKeys } = require('.') + +exports.removeOne = async (req, res) => { + try { + const comment = await Comment.findById({ _id: req.params.id }).lean().exec() + + if (comment.creator !== req.user.schacc && req.user.role != 'mentor') + return res + .status(403) + .json({ messages: ['You cannot delete other users comment.'] }) + .end() + + const removed = await Comment.findByIdAndRemove({ _id: req.params.id }) + if (!removed) { + return res.status(404).end() + } + + // remove from parent model + await getParentModel(removed).updateMany( + {}, + { $pull: { comments: { $in: removed._id } } } + ) + + if (removed.isAnonim) removed.creator = '' + + return res + .status(200) + .json({ data: pick(removed, pickedKeys) }) + .end() + } catch (err) { + if (err.name == 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + console.error(err) + return res.status(500).json({ message: err.message }) + } +} diff --git a/src/resources/comment/controllers/updateOne.js b/src/resources/comment/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..5368f965d2af62c58192ef487b3030fc6287be5b --- /dev/null +++ b/src/resources/comment/controllers/updateOne.js @@ -0,0 +1,40 @@ +const { pick } = require('lodash') +const { Comment } = require('../commentModel') +const { pickedKeys } = require('.') + +exports.updateOne = async (req, res) => { + try { + const comment = await Comment.findById(req.params.id).lean().exec() + + if (!comment) return res.status(404).end() + + if (comment.creator !== req.user.schacc && req.user.role != 'mentor') + return res + .status(403) + .json({ messages: ['You cannot update other users comment.'] }) + .end() + + const updatedComment = await Comment.findOneAndUpdate( + { _id: req.params.id }, + { text: req.body.text }, + { new: true } + ) + .lean() + .exec() + + if (updatedComment.isAnonim) updatedComment.creator = '' + + return res.status(200).json({ data: pick(updatedComment, pickedKeys) }) + } catch (err) { + if (err.name == 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + console.error(err) + return res.status(500).json({ message: err.message }) + } +} diff --git a/src/resources/groups/controllers/createOne.js b/src/resources/groups/controllers/createOne.js new file mode 100644 index 0000000000000000000000000000000000000000..14c70e41a2c5ce611ef2f4a98afadb7bf38cffff --- /dev/null +++ b/src/resources/groups/controllers/createOne.js @@ -0,0 +1,5 @@ +const { createOne } = require('../../../utils/crud') +const { Groups } = require('../groupsModel') +const { pickedKeys } = require('.') + +exports.createOne = createOne(Groups, [...pickedKeys]) diff --git a/src/resources/groups/controllers/getMany.js b/src/resources/groups/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..b1f609cb52853886900195e19191718131417dc7 --- /dev/null +++ b/src/resources/groups/controllers/getMany.js @@ -0,0 +1,5 @@ +const { getMany } = require('../../../utils/crud') +const { Groups } = require('../groupsModel') +const { pickedKeys } = require('.') + +exports.getMany = getMany(Groups, [...pickedKeys]) diff --git a/src/resources/groups/controllers/getOne.js b/src/resources/groups/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..0e8264d9f52c38acc16aef1c1de84c7cbcd7e1d9 --- /dev/null +++ b/src/resources/groups/controllers/getOne.js @@ -0,0 +1,23 @@ +const { Groups } = require('../groupsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getOne = async (req, res) => { + try { + const group = await Groups.findOne({ name: req.params.groupName }) + .lean() + .exec() + + if (!group) { + return res.status(404).end() + } + res.status(200).json({ data: pick(group, pickedKeys) }) + } catch (err) { + if (err.name == 'CastError') { + return res.status(422).json('Invalid ID provided') + } else { + console.error(err) + res.status(400).end() + } + } +} diff --git a/src/resources/groups/controllers/index.js b/src/resources/groups/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..50a67652eee6ca9a58ec0ee555863e38f05a3e3d --- /dev/null +++ b/src/resources/groups/controllers/index.js @@ -0,0 +1,7 @@ +exports.pickedKeys = ['name', 'description', 'groupPath'] + +exports.createOne = require('./createOne').createOne +exports.getMany = require('./getMany').getMany +exports.getOne = require('./getOne').getOne +exports.removeOne = require('./removeOne').removeOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/groups/controllers/removeOne.js b/src/resources/groups/controllers/removeOne.js new file mode 100644 index 0000000000000000000000000000000000000000..2a52fbd04be108046b21055ab86a49e6c6595023 --- /dev/null +++ b/src/resources/groups/controllers/removeOne.js @@ -0,0 +1,25 @@ +const { Groups } = require('../groupsModel') +const { Application } = require('../../application/applicationModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.removeOne = async (req, res) => { + try { + const removed = await Groups.findOneAndRemove({ + name: req.params.groupName, + }) + + if (!removed) { + return res.status(404).end() + } + + Application.updateMany({}, { $pull: { groups: { $in: removed._id } } }) + + return res.status(200).json({ + data: pick(removed, pickedKeys), + }) + } catch (e) { + console.error(e) + return res.status(400).end() + } +} diff --git a/src/resources/groups/controllers/updateOne.js b/src/resources/groups/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..7a6bace6efeaccbd04cf1f3ee1e9e10e0e98c5c7 --- /dev/null +++ b/src/resources/groups/controllers/updateOne.js @@ -0,0 +1,34 @@ +const { Groups } = require('../groupsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.updateOne = async (req, res) => { + try { + const updatedGroup = await Groups.findOneAndUpdate( + { + name: req.params.groupName, + }, + req.body, + { new: true, runValidators: true } + ) + .lean() + .exec() + + if (!updatedGroup) { + return res.status(404).end() + } + + res.status(200).json({ data: pick(updatedGroup, pickedKeys) }) + } catch (err) { + if (err.name == 'ValidationError') { + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + res.status(422).json({ messages }) + } else { + console.error(err) + res.status(400).end() + } + } +} diff --git a/src/resources/groups/groupsControllers.js b/src/resources/groups/groupsControllers.js deleted file mode 100644 index bf65110e3013786bb1f82c7cdff8d2f79a393fb8..0000000000000000000000000000000000000000 --- a/src/resources/groups/groupsControllers.js +++ /dev/null @@ -1,80 +0,0 @@ -const { crudControllers, createOne } = require('../../utils/crud') -const { Groups } = require('./groupsModel') -const { Application } = require('../application/applicationModel') -const { pick } = require('lodash') - -const pickedKeys = ['name', 'description', 'groupPath'] - -module.exports = crudControllers(Groups, pickedKeys) - -module.exports.getOne = async (req, res) => { - try { - const group = await Groups.findOne({ name: req.params.groupName }) - .lean() - .exec() - - if (!group) { - return res.status(404).end() - } - res.status(200).json({ data: pick(group, pickedKeys) }) - } catch (err) { - if (err.name == 'CastError') { - return res.status(422).json('Invalid ID provided') - } else { - console.error(err) - res.status(400).end() - } - } -} - -module.exports.updateOne = async (req, res) => { - try { - const updatedGroup = await Groups.findOneAndUpdate( - { - name: req.params.groupName, - }, - req.body, - { new: true, runValidators: true } - ) - .lean() - .exec() - - if (!updatedGroup) { - return res.status(404).end() - } - - res.status(200).json({ data: pick(updatedGroup, pickedKeys) }) - } catch (err) { - if (err.name == 'ValidationError') { - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - res.status(422).json({ messages }) - } else { - console.error(err) - res.status(400).end() - } - } -} - -module.exports.removeOne = async (req, res) => { - try { - const removed = await Groups.findOneAndRemove({ - name: req.params.groupName, - }) - - if (!removed) { - return res.status(404).end() - } - - Application.updateMany({}, { $pull: { groups: { $in: removed._id } } }) - - return res.status(200).json({ - data: pick(removed, pickedKeys), - }) - } catch (e) { - console.error(e) - return res.status(400).end() - } -} diff --git a/src/resources/groups/groupsRouter.js b/src/resources/groups/groupsRouter.js index 16902eecdecdf14a2c260ad3f06278f03b8d5b52..99e447c0673c985bc8b77d17a12094e25d2538b9 100644 --- a/src/resources/groups/groupsRouter.js +++ b/src/resources/groups/groupsRouter.js @@ -1,5 +1,5 @@ const { Router } = require('express') -const controllers = require('./groupsControllers') +const controllers = require('./controllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') diff --git a/src/resources/mentor/controllers/createOne.js b/src/resources/mentor/controllers/createOne.js new file mode 100644 index 0000000000000000000000000000000000000000..ba7177a9f415c57c6d475c57bb299d72e036b649 --- /dev/null +++ b/src/resources/mentor/controllers/createOne.js @@ -0,0 +1,24 @@ +const { Mentor } = require('../mentorModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.createOne = async (req, res) => { + try { + const createdMentor = await Mentor.create( + pick(req.body, ['user', 'description']) + ) + res.status(201).json({ data: pick(createdMentor, pickedKeys) }) + } catch (err) { + if (err.name === 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + + console.error(err) + return res.status(500).end() + } +} diff --git a/src/resources/mentor/controllers/getMany.js b/src/resources/mentor/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..d3038bca9731a3640f21ffc906edb0eaf42dc9ad --- /dev/null +++ b/src/resources/mentor/controllers/getMany.js @@ -0,0 +1,24 @@ +const { Mentor } = require('../mentorModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getMany = async (req, res) => { + try { + mentors = await Mentor.find() + .populate({ + path: '_user', + select: '-_id schacc fullName secondaryEmail nickName imagePath', + }) + .lean() + .exec() + return res.status(200).json({ + data: mentors.map((e) => { + e.user = e._user + return pick(e, pickedKeys) + }), + }) + } catch (err) { + console.error(err) + return res.status(500).end() + } +} diff --git a/src/resources/mentor/controllers/getOne.js b/src/resources/mentor/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..09db4e9e2d65bdac1a2c2fa32f80a57d1db04a4d --- /dev/null +++ b/src/resources/mentor/controllers/getOne.js @@ -0,0 +1,30 @@ +const { Mentor } = require('../mentorModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getOne = async (req, res) => { + try { + mentor = await Mentor.findOne({ _id: req.params.id }) + .populate({ + path: '_user', + select: '-_id schacc fullName secondaryEmail nickName imagePath', + }) + .lean() + .exec() + if (mentor) { + mentor.user = mentor._user + return res.status(200).json({ + data: pick(mentor, pickedKeys), + }) + } else { + return res.status(404).end() + } + } catch (err) { + if (err.name === 'CastError') { + // Throwed by Mongoose + return res.status(422).json({ message: 'Invalid ID provided' }) + } + console.error(err) + res.status(500).end() + } +} diff --git a/src/resources/mentor/controllers/index.js b/src/resources/mentor/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..fd71a7e5c1e938bb24c64a36d7f9214dec122437 --- /dev/null +++ b/src/resources/mentor/controllers/index.js @@ -0,0 +1,7 @@ +exports.pickedKeys = ['_id', 'user', 'description'] + +exports.createOne = require('./createOne').createOne +exports.getMany = require('./getMany').getMany +exports.getOne = require('./getOne').getOne +exports.removeOne = require('./removeOne').removeOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/mentor/controllers/removeOne.js b/src/resources/mentor/controllers/removeOne.js new file mode 100644 index 0000000000000000000000000000000000000000..862304ea5e171ed2f3163ad891cacad453297393 --- /dev/null +++ b/src/resources/mentor/controllers/removeOne.js @@ -0,0 +1,5 @@ +const { removeOne } = require('../../../utils/crud') +const { Mentor } = require('../mentorModel') +const { pickedKeys } = require('.') + +exports.removeOne = removeOne(Mentor, [...pickedKeys]) diff --git a/src/resources/mentor/controllers/updateOne.js b/src/resources/mentor/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..562399d8a959f3d285af9b80a9d130a17d28b9ac --- /dev/null +++ b/src/resources/mentor/controllers/updateOne.js @@ -0,0 +1,5 @@ +const { updateOne } = require('../../../utils/crud') +const { Mentor } = require('../mentorModel') +const { pickedKeys } = require('.') + +exports.updateOne = updateOne(Mentor, [...pickedKeys]) diff --git a/src/resources/mentor/mentorControllers.js b/src/resources/mentor/mentorControllers.js deleted file mode 100644 index 4da413f67440c53ede0c0503e471a75448991a1c..0000000000000000000000000000000000000000 --- a/src/resources/mentor/mentorControllers.js +++ /dev/null @@ -1,73 +0,0 @@ -const { crudControllers } = require('../../utils/crud') -const { Mentor } = require('./mentorModel') -const { pick } = require('lodash') - -exports.default = crudControllers(Mentor, ['_id', 'user', 'description']) -exports.default.getOne = async (req, res) => { - try { - mentor = await Mentor.findOne({ _id: req.params.id }) - .populate({ - path: '_user', - select: '-_id schacc fullName secondaryEmail nickName imagePath', - }) - .lean() - .exec() - if (mentor) { - mentor.user = mentor._user - return res.status(200).json({ - data: pick(mentor, ['user', 'description']), - }) - } else { - return res.status(404).end() - } - } catch (err) { - if (err.name === 'CastError') { - // Throwed by Mongoose - return res.status(422).json({ message: 'Invalid ID provided' }) - } - console.error(err) - res.status(500).end() - } -} -exports.default.getMany = async (req, res) => { - try { - mentors = await Mentor.find() - .populate({ - path: '_user', - select: '-_id schacc fullName secondaryEmail nickName imagePath', - }) - .lean() - .exec() - return res.status(200).json({ - data: mentors.map((e) => { - e.user = e._user - return pick(e, ['_id', 'user', 'description']) - }), - }) - } catch (err) { - console.error(err) - return res.status(500).end() - } -} -exports.default.createOne = async (req, res) => { - try { - const createdMentor = await Mentor.create( - pick(req.body, ['user', 'description']) - ) - res - .status(201) - .json({ data: pick(createdMentor, ['_id', 'user', 'description']) }) - } catch (err) { - if (err.name === 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - - console.error(err) - return res.status(500).end() - } -} diff --git a/src/resources/mentor/mentorRouter.js b/src/resources/mentor/mentorRouter.js index a3f0c19d8abe5f4f73a33af0ab645776ebc5aa9f..fc63a4801234ca3395a435c572c5086d50d2d463 100644 --- a/src/resources/mentor/mentorRouter.js +++ b/src/resources/mentor/mentorRouter.js @@ -1,5 +1,5 @@ const { Router } = require('express') -const controllers = require('./mentorControllers') +const controllers = require('./controllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') @@ -8,14 +8,14 @@ const router = Router() // /api/v1/mentor router .route('/') - .get(isLoggedIn, controllers.default.getMany) - .post(isLoggedIn, isMentor, controllers.default.createOne) + .get(isLoggedIn, controllers.getMany) + .post(isLoggedIn, isMentor, controllers.createOne) // /api/v1/mentor/id/:id router .route('/id/:id') - .get(isLoggedIn, controllers.default.getOne) - .put(isLoggedIn, isMentor, controllers.default.updateOne) - .delete(isLoggedIn, isMentor, controllers.default.removeOne) + .get(isLoggedIn, controllers.getOne) + .put(isLoggedIn, isMentor, controllers.updateOne) + .delete(isLoggedIn, isMentor, controllers.removeOne) exports.default = router diff --git a/src/resources/news/controllers/createOne.js b/src/resources/news/controllers/createOne.js new file mode 100644 index 0000000000000000000000000000000000000000..c88acdbcac650c42e8f63d2d275cb1f009dc2e54 --- /dev/null +++ b/src/resources/news/controllers/createOne.js @@ -0,0 +1,24 @@ +const { News } = require('../newsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.createOne = async (req, res) => { + try { + const createdNews = await News.create( + pick(req.body, ['title', 'body', 'creator']) + ) + res.status(201).json({ data: pick(createdNews, pickedKeys) }) + } catch (err) { + if (err.name === 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + + console.error(err) + return res.status(500).end() + } +} diff --git a/src/resources/news/controllers/getMany.js b/src/resources/news/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..8f8f167dc396f7ae256e093faaaf2f2fc5cee6dd --- /dev/null +++ b/src/resources/news/controllers/getMany.js @@ -0,0 +1,22 @@ +const { News } = require('../newsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getMany = async (req, res) => { + try { + news = await News.find() + .populate({ path: '_creator', select: '-_id schacc fullName' }) + .lean() + .exec() + + return res.status(200).json({ + data: news.map((e) => { + e.creator = e._creator + return pick(e, pickedKeys) + }), + }) + } catch (err) { + console.error(err) + res, status(500).end() + } +} diff --git a/src/resources/news/controllers/getOne.js b/src/resources/news/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..b05bfb827e69f48be16de38b78f02143b73f9514 --- /dev/null +++ b/src/resources/news/controllers/getOne.js @@ -0,0 +1,28 @@ +const { News } = require('../newsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getOne = async (req, res) => { + try { + news = await News.findOne({ _id: req.params.id }) + .populate({ path: '_creator', select: '-_id schacc fullName' }) + .lean() + .exec() + if (news) { + news.creator = news._creator + return res.status(200).json({ + data: pick(news, pickedKeys), + }) + } else { + return res.status(404).end() + } + } catch (err) { + if (err.name === 'CastError') { + // Throwed by Mongoose + return res.status(422).json({ message: 'Invalid ID provided' }) + } + + console.error(err) + res.status(500).end() + } +} diff --git a/src/resources/news/controllers/index.js b/src/resources/news/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d0c590a6cb8cc250d723fc31c77e6dca08ea33f6 --- /dev/null +++ b/src/resources/news/controllers/index.js @@ -0,0 +1,7 @@ +exports.pickedKeys = ['_id', 'title', 'body', 'creator'] + +exports.createOne = require('./createOne').createOne +exports.getMany = require('./getMany').getMany +exports.getOne = require('./getOne').getOne +exports.removeOne = require('./removeOne').removeOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/news/controllers/removeOne.js b/src/resources/news/controllers/removeOne.js new file mode 100644 index 0000000000000000000000000000000000000000..448feca9124af9cd33abf342e04bb7c26f0226bc --- /dev/null +++ b/src/resources/news/controllers/removeOne.js @@ -0,0 +1,5 @@ +const { removeOne } = require('../../../utils/crud') +const { News } = require('../newsModel') +const { pickedKeys } = require('.') + +exports.removeOne = removeOne(News, [...pickedKeys]) diff --git a/src/resources/news/controllers/updateOne.js b/src/resources/news/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..dda33dfbb810e5b454036886b02c3af68296b84e --- /dev/null +++ b/src/resources/news/controllers/updateOne.js @@ -0,0 +1,5 @@ +const { updateOne } = require('../../../utils/crud') +const { News } = require('../newsModel') +const { pickedKeys } = require('.') + +exports.updateOne = updateOne(News, [...pickedKeys]) diff --git a/src/resources/news/newsControllers.js b/src/resources/news/newsControllers.js deleted file mode 100644 index 23f6bb8ccd67cf71b4c5f50e2929f4e22fbab8c3..0000000000000000000000000000000000000000 --- a/src/resources/news/newsControllers.js +++ /dev/null @@ -1,70 +0,0 @@ -const { crudControllers } = require('../../utils/crud') -const { News } = require('./newsModel') -const { pick } = require('lodash') - -exports.default = crudControllers(News, ['_id', 'title', 'body', 'creator']) -exports.default.getOne = async (req, res) => { - try { - news = await News.findOne({ _id: req.params.id }) - .populate({ path: '_creator', select: '-_id schacc fullName' }) - .lean() - .exec() - if (news) { - news.creator = news._creator - return res.status(200).json({ - data: pick(news, ['_id', 'title', 'body', 'creator']), - }) - } else { - return res.status(404).end() - } - } catch (err) { - if (err.name === 'CastError') { - // Throwed by Mongoose - return res.status(422).json({ message: 'Invalid ID provided' }) - } - - console.error(err) - res.status(500).end() - } -} -exports.default.getMany = async (req, res) => { - try { - news = await News.find() - .populate({ path: '_creator', select: '-_id schacc fullName' }) - .lean() - .exec() - - return res.status(200).json({ - data: news.map((e) => { - e.creator = e._creator - return pick(e, ['_id', 'title', 'body', 'creator']) - }), - }) - } catch (err) { - console.error(err) - res, status(500).end() - } -} - -exports.default.createOne = async (req, res) => { - try { - const createdNews = await News.create( - pick(req.body, ['title', 'body', 'creator']) - ) - res - .status(201) - .json({ data: pick(createdNews, ['_id', 'title', 'body', 'creator']) }) - } catch (err) { - if (err.name === 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - - console.error(err) - return res.status(500).end() - } -} diff --git a/src/resources/news/newsRouter.js b/src/resources/news/newsRouter.js index 47a4c888c2aa6448aa26984a46b1b0da9b14eb18..9a5d04a45c4bc3bbdf314f423e2cccd80aa4dccd 100644 --- a/src/resources/news/newsRouter.js +++ b/src/resources/news/newsRouter.js @@ -1,5 +1,5 @@ const { Router } = require('express') -const controllers = require('./newsControllers') +const controllers = require('./controllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') @@ -8,14 +8,14 @@ const router = Router() // /api/v1/news router .route('/') - .get(isLoggedIn, controllers.default.getMany) - .post(isLoggedIn, isMentor, controllers.default.createOne) + .get(isLoggedIn, controllers.getMany) + .post(isLoggedIn, isMentor, controllers.createOne) // /api/v1/news/id/:id router .route('/id/:id') - .get(isLoggedIn, controllers.default.getOne) - .put(isLoggedIn, isMentor, controllers.default.updateOne) - .delete(isLoggedIn, isMentor, controllers.default.removeOne) + .get(isLoggedIn, controllers.getOne) + .put(isLoggedIn, isMentor, controllers.updateOne) + .delete(isLoggedIn, isMentor, controllers.removeOne) exports.default = router diff --git a/src/resources/settings/controllers/getOne.js b/src/resources/settings/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..44c140e6701ac10f5be175a04dbcd8571f4b54a3 --- /dev/null +++ b/src/resources/settings/controllers/getOne.js @@ -0,0 +1,21 @@ +const { Settings } = require('../settingsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getOne = async (req, res) => { + try { + const doc = await Settings.findOne().lean().exec() + + if (!doc) { + return res.status(404).end() + } + res.status(200).json({ data: pick(doc, pickedKeys) }) + } catch (err) { + if (err.name == 'CastError') { + return res.status(422).json('Invalid ID provided') + } else { + console.error(err) + res.status(400).end() + } + } +} diff --git a/src/resources/settings/controllers/index.js b/src/resources/settings/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..68b6fe0667c7f1c75bc266e6d60694e43e8d3587 --- /dev/null +++ b/src/resources/settings/controllers/index.js @@ -0,0 +1,4 @@ +exports.pickedKeys = ['applicationEndDate'] + +exports.getOne = require('./getOne').getOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/settings/controllers/updateOne.js b/src/resources/settings/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..4cc15dfc1e2bb637efe079a69510c60532e8b565 --- /dev/null +++ b/src/resources/settings/controllers/updateOne.js @@ -0,0 +1,40 @@ +const { Settings } = require('../settingsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +// If there is no settings, then create it +exports.updateOne = async (req, res) => { + try { + const oldSettings = await Settings.findOne().lean().exec() + if (!oldSettings) { + const doc = await Settings.create({ ...req.body }) + return res.status(201).json({ data: pick(doc, pickedKeys) }) + } + const updatedSettings = await Settings.findOneAndUpdate( + { + _id: oldSettings._id, + }, + req.body, + { new: true, runValidators: true } + ) + .lean() + .exec() + + if (!updatedSettings) { + return res.status(400).end() + } + + return res.status(200).json({ data: pick(updatedSettings, pickedKeys) }) + } catch (err) { + if (err.name == 'ValidationError') { + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } else { + console.error(err) + return res.status(400).end() + } + } +} diff --git a/src/resources/settings/settingsControllers.js b/src/resources/settings/settingsControllers.js deleted file mode 100644 index 54123924b5c8faa6e743e84dc78789c10d9f74c4..0000000000000000000000000000000000000000 --- a/src/resources/settings/settingsControllers.js +++ /dev/null @@ -1,62 +0,0 @@ -const { crudControllers } = require('../../utils/crud') -const { Settings } = require('./settingsModel') -const { pick } = require('lodash') - -module.exports = crudControllers(Settings, ['applicationEndDate']) - -module.exports.getOne = async (req, res) => { - try { - const doc = await Settings.findOne().lean().exec() - - if (!doc) { - return res.status(404).end() - } - res.status(200).json({ data: pick(doc, ['applicationEndDate']) }) - } catch (err) { - if (err.name == 'CastError') { - return res.status(422).json('Invalid ID provided') - } else { - console.error(err) - res.status(400).end() - } - } -} - -// If there is no settings, then create it -module.exports.updateOne = async (req, res) => { - try { - const oldSettings = await Settings.findOne().lean().exec() - if (!oldSettings) { - const doc = await Settings.create({ ...req.body }) - return res.status(201).json({ data: pick(doc, ['applicationEndDate']) }) - } - const updatedSettings = await Settings.findOneAndUpdate( - { - _id: oldSettings._id, - }, - req.body, - { new: true, runValidators: true } - ) - .lean() - .exec() - - if (!updatedSettings) { - return res.status(400).end() - } - - return res - .status(200) - .json({ data: pick(updatedSettings, ['applicationEndDate']) }) - } catch (err) { - if (err.name == 'ValidationError') { - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } else { - console.error(err) - return res.status(400).end() - } - } -} diff --git a/src/resources/settings/settingsRouter.js b/src/resources/settings/settingsRouter.js index 0daa1d32501c22bd0f45a01a2b483cd3fe14a75a..cd8c96f82c4c25eb81214fc112ebbe19856abda5 100644 --- a/src/resources/settings/settingsRouter.js +++ b/src/resources/settings/settingsRouter.js @@ -1,5 +1,5 @@ const { Router } = require('express') -const controllers = require('./settingsControllers') +const controllers = require('./controllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') diff --git a/src/resources/task/controllers/createOne.js b/src/resources/task/controllers/createOne.js new file mode 100644 index 0000000000000000000000000000000000000000..43657fa255ed1b283a0ae7c3cc331ef59150765f --- /dev/null +++ b/src/resources/task/controllers/createOne.js @@ -0,0 +1,42 @@ +const { Task } = require('../taskModel') +const { pick } = require('lodash') + +exports.createOne = async (req, res) => { + try { + const createdTask = await Task.create( + pick(req.body, [ + 'title', + 'description', + 'deadline', + 'createData', + 'bit', + 'creator', + 'solutions', + ]) + ) + res.status(201).json({ + data: pick(createdTask, [ + '_id', + 'title', + 'description', + 'deadline', + 'createData', + 'bit', + 'creator', + 'solutions', + ]), + }) + } catch (err) { + if (err.name === 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + + console.error(err) + return res.status(500).end() + } +} diff --git a/src/resources/task/controllers/getMany.js b/src/resources/task/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..a95b07e88f8108b75ae1c055017d696056f2330e --- /dev/null +++ b/src/resources/task/controllers/getMany.js @@ -0,0 +1,34 @@ +const { Task } = require('../taskModel') +const { pick } = require('lodash') + +exports.getMany = async (req, res) => { + try { + tasks = await Task.find() + .populate({ + path: '_creator', + select: '-_id schacc fullName secondaryEmail', + }) + .populate('comments', 'text creator createdAt') + .lean() + .exec() + + return res.status(200).json({ + data: tasks.map((e) => { + e.creator = e._creator + return pick(e, [ + '_id', + 'title', + 'description', + 'deadline', + 'createData', + 'bit', + 'creator', + 'solutions', + ]) + }), + }) + } catch (err) { + console.error(err) + res.status(500).end() + } +} diff --git a/src/resources/task/controllers/getOne.js b/src/resources/task/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..9a5435628518934a7e8cf2d1d959507af4a297b0 --- /dev/null +++ b/src/resources/task/controllers/getOne.js @@ -0,0 +1,41 @@ +const { Task } = require('../taskModel') +const { pick } = require('lodash') + +exports.getOne = async (req, res) => { + try { + task = await Task.findOne({ _id: req.params.id }) + .populate({ + path: '_creator', + select: '-_id schacc fullName secondaryEmail', + }) + .populate('comments', 'text creator createdAt') + .lean() + .exec() + + if (task) { + task.creator = task._creator + return res.status(200).json({ + data: pick(task, [ + '_id', + 'title', + 'description', + 'deadline', + 'createData', + 'bit', + 'creator', + 'solutions', + ]), + }) + } else { + return res.status(404).end() + } + } catch (err) { + if (err.name === 'CastError') { + // Throwed by Mongoose + return res.status(422).json({ message: 'Invalid ID provided' }) + } + + console.error(err) + res.status(500).end() + } +} diff --git a/src/resources/task/controllers/index.js b/src/resources/task/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..097d2e4d38ae3b9a3a21e1a6880307051aec9be1 --- /dev/null +++ b/src/resources/task/controllers/index.js @@ -0,0 +1,14 @@ +exports.pickedKeys = [ + '_id', + 'title', + 'description', + 'deadline', + 'bit', + 'creator', +] + +exports.createOne = require('./createOne').createOne +exports.getMany = require('./getMany').getMany +exports.getOne = require('./getOne').getOne +exports.removeOne = require('./removeOne').removeOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/task/controllers/removeOne.js b/src/resources/task/controllers/removeOne.js new file mode 100644 index 0000000000000000000000000000000000000000..7176446d68205afd4ee64b8f01d5903ebb0dde7a --- /dev/null +++ b/src/resources/task/controllers/removeOne.js @@ -0,0 +1,5 @@ +const { removeOne } = require('../../../utils/crud') +const { Task } = require('../taskModel') +const { pickedKeys } = require('.') + +exports.removeOne = removeOne(Task, [...pickedKeys]) diff --git a/src/resources/task/controllers/updateOne.js b/src/resources/task/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..22ca2e2f32ecf04fe5e5c92f9765c7af29de8d06 --- /dev/null +++ b/src/resources/task/controllers/updateOne.js @@ -0,0 +1,5 @@ +const { updateOne } = require('../../../utils/crud') +const { Task } = require('../taskModel') +const { pickedKeys } = require('.') + +exports.updateOne = updateOne(Task, [...pickedKeys]) diff --git a/src/resources/task/taskControllers.js b/src/resources/task/taskControllers.js deleted file mode 100644 index 865d652a5dbd5874a387cb13af24abdae65b2028..0000000000000000000000000000000000000000 --- a/src/resources/task/taskControllers.js +++ /dev/null @@ -1,120 +0,0 @@ -const { crudControllers } = require('../../utils/crud') -const { Task } = require('./taskModel') -const { pick } = require('lodash') - -exports.default = crudControllers(Task, [ - '_id', - 'title', - 'description', - 'deadline', - 'bit', - 'creator', -]) -exports.default.getOne = async (req, res) => { - try { - task = await Task.findOne({ _id: req.params.id }) - .populate({ - path: '_creator', - select: '-_id schacc fullName secondaryEmail', - }) - .populate('comments', 'text creator createdAt') - .lean() - .exec() - - if (task) { - task.creator = task._creator - return res.status(200).json({ - data: pick(task, [ - '_id', - 'title', - 'description', - 'deadline', - 'createData', - 'bit', - 'creator', - 'solutions', - ]), - }) - } else { - return res.status(404).end() - } - } catch (err) { - if (err.name === 'CastError') { - // Throwed by Mongoose - return res.status(422).json({ message: 'Invalid ID provided' }) - } - - console.error(err) - res.status(500).end() - } -} -exports.default.getMany = async (req, res) => { - try { - tasks = await Task.find() - .populate({ - path: '_creator', - select: '-_id schacc fullName secondaryEmail', - }) - .populate('comments', 'text creator createdAt') - .lean() - .exec() - - return res.status(200).json({ - data: tasks.map((e) => { - e.creator = e._creator - return pick(e, [ - '_id', - 'title', - 'description', - 'deadline', - 'createData', - 'bit', - 'creator', - 'solutions', - ]) - }), - }) - } catch (err) { - console.error(err) - res.status(500).end() - } -} -exports.default.createOne = async (req, res) => { - try { - const createdTask = await Task.create( - pick(req.body, [ - 'title', - 'description', - 'deadline', - 'createData', - 'bit', - 'creator', - 'solutions', - ]) - ) - res.status(201).json({ - data: pick(createdTask, [ - '_id', - 'title', - 'description', - 'deadline', - 'createData', - 'bit', - 'creator', - 'solutions', - ]), - }) - } catch (err) { - if (err.name === 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - - console.error(err) - return res.status(500).end() - } -} diff --git a/src/resources/task/taskRouter.js b/src/resources/task/taskRouter.js index ecd9fbb1f48c1889fe878d627e0b8a4e7c69a2b4..12dc08015202ec2a3cc3b50e0a0f0fe0a3b46191 100644 --- a/src/resources/task/taskRouter.js +++ b/src/resources/task/taskRouter.js @@ -1,25 +1,25 @@ const { Router } = require('express') -const controllers = require('./taskControllers') - const { isLoggedIn, isMentor, isAcceptedOrMentor, } = require('../../middlewares/auth') +const controllers = require('./controllers') + const router = Router() // /api/v1/task router .route('/') - .get(isLoggedIn, isAcceptedOrMentor, controllers.default.getMany) - .post(isLoggedIn, isMentor, controllers.default.createOne) + .get(isLoggedIn, isAcceptedOrMentor, controllers.getMany) + .post(isLoggedIn, isMentor, controllers.createOne) // /api/v1/task/id/:id router .route('/id/:id') - .get(isLoggedIn, isAcceptedOrMentor, controllers.default.getOne) - .put(isLoggedIn, isMentor, controllers.default.updateOne) - .delete(isLoggedIn, isMentor, controllers.default.removeOne) + .get(isLoggedIn, isAcceptedOrMentor, controllers.getOne) + .put(isLoggedIn, isMentor, controllers.updateOne) + .delete(isLoggedIn, isMentor, controllers.removeOne) exports.default = router diff --git a/src/resources/user/controllers/getMany.js b/src/resources/user/controllers/getMany.js new file mode 100644 index 0000000000000000000000000000000000000000..1ecc86bbab43cb0f34015dd94465cf6bc68a5173 --- /dev/null +++ b/src/resources/user/controllers/getMany.js @@ -0,0 +1,6 @@ +const { getMany } = require('../../../utils/crud') +const { User } = require('../userModel') +const { pickedKeys } = require('.') + +// Only mentor can, so return bit and presence with pickedKeys +exports.getMany = getMany(User, [...pickedKeys, 'bit', 'presence']) diff --git a/src/resources/user/controllers/getManyByRole.js b/src/resources/user/controllers/getManyByRole.js new file mode 100644 index 0000000000000000000000000000000000000000..49c3b7559a30ac3b04071794cd411ee439c2ee45 --- /dev/null +++ b/src/resources/user/controllers/getManyByRole.js @@ -0,0 +1,14 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getManyByRole = async (req, res) => { + try { + const docs = await User.find({ role: req.params.role }).lean().exec() + + res.status(200).json({ data: docs.map((e) => pick(e, pickedKeys)) }) + } catch (e) { + console.error(e) + res.status(400).end() + } +} diff --git a/src/resources/user/controllers/getOne.js b/src/resources/user/controllers/getOne.js new file mode 100644 index 0000000000000000000000000000000000000000..8bac53d33a5ff7c9c966542fc11f15d54072b381 --- /dev/null +++ b/src/resources/user/controllers/getOne.js @@ -0,0 +1,32 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +exports.getOne = async (req, res) => { + try { + // Get Own User + if (req.params.schacc === req.user.schacc && req.user.role !== 'mentor') + return res.status(200).json({ data: pick(req.user, pickedKeys) }) + + // Get Other User + if (req.user.role !== 'mentor') return res.status(403).end() + + const userSchacc = req.params.schacc + + // Get user from db + const user = await User.findOne({ schacc: userSchacc }).lean().exec() + + if (!user) return res.status(404).end() + + return res + .status(200) + .json({ data: pick(user, [...pickedKeys, 'bit', 'presence']) }) + } catch (err) { + if (err.name === 'CastError') + // Throwed by Mongoose + return res.status(422).json({ messages: ['Invalid Schacc provided'] }) + + console.error(err) + return res.status(400).end() + } +} diff --git a/src/resources/user/controllers/index.js b/src/resources/user/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..cb39ff0f665010df06ce59d614ffc8fc8663e521 --- /dev/null +++ b/src/resources/user/controllers/index.js @@ -0,0 +1,16 @@ +exports.pickedKeys = [ + 'schacc', + 'fullName', + 'secondaryEmail', + 'receiveMail', + 'nickName', + 'imagePath', + 'role', + 'valid', +] + +exports.getMany = require('./getMany').getMany +exports.getManyByRole = require('./getManyByRole').getManyByRole +exports.getOne = require('./getOne').getOne +exports.softRemoveOne = require('./softRemoveOne').softRemoveOne +exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/user/controllers/softRemoveOne.js b/src/resources/user/controllers/softRemoveOne.js new file mode 100644 index 0000000000000000000000000000000000000000..a96855989a2b4e3a14f7940d428f0411757c8dbf --- /dev/null +++ b/src/resources/user/controllers/softRemoveOne.js @@ -0,0 +1,29 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +// Doesn't delete the user just disable it +exports.softRemoveOne = async (req, res) => { + try { + let user = await User.findOneAndUpdate( + { schacc: req.params.schacc }, + { + valid: false, + receiveMail: false, + }, + { new: true } + ) + .lean() + .exec() + + if (!user) return res.status(404).json({ messages: 'User not found!' }) + + // Users application is kept + return res + .status(200) + .json({ data: pick(user, [...pickedKeys, 'bit', 'presence']) }) + } catch (e) { + console.error(e) + return res.status(400).end() + } +} diff --git a/src/resources/user/controllers/updateOne.js b/src/resources/user/controllers/updateOne.js new file mode 100644 index 0000000000000000000000000000000000000000..0b2a4e3ff1b19fc899580b8af077daf7d757b05e --- /dev/null +++ b/src/resources/user/controllers/updateOne.js @@ -0,0 +1,62 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +const getUpdateKeysByRole = (role) => { + const notMentorKeys = ['receiveMail', 'nickName', 'imagePath'] + if (role === 'mentor') + return [ + ...notMentorKeys, + 'fullName', + 'secondaryEmail', + 'bit', + 'presence', + 'role', + 'valid', + ] + return notMentorKeys +} + +exports.updateOne = async (req, res) => { + try { + if (!(req.params.schacc === req.user.schacc || req.user.role === 'mentor')) + return res.status(403).end() + + const userSchacc = req.params.schacc + + // Update with given keys + const updatedUser = await User.findOneAndUpdate( + { + schacc: userSchacc, + }, + pick(req.body, getUpdateKeysByRole(req.user.role)), + { new: true, runValidators: true } + ) + .lean() + .exec() + + if (!updatedUser) + return res.status(404).json({ messages: 'User not found!' }) + + // Pick keys + let returnData + if (req.user.role === 'mentor') + returnData = pick(updatedUser, [...pickedKeys, 'bit', 'presence']) + else returnData = pick(updatedUser, pickedKeys) + + return res.status(200).json({ + data: returnData, + }) + } catch (err) { + if (err.name === 'ValidationError') { + // Throwed by Mongoose + let messages = [] + for (field in err.errors) { + messages.push(err.errors[field].message) + } + return res.status(422).json({ messages }) + } + console.error(err) + return res.status(400).end() + } +} diff --git a/src/resources/user/userControllers.js b/src/resources/user/userControllers.js deleted file mode 100644 index 875314b1a99dd76d79143b6950b1e87324ca017b..0000000000000000000000000000000000000000 --- a/src/resources/user/userControllers.js +++ /dev/null @@ -1,144 +0,0 @@ -const { crudControllers, getMany } = require('../../utils/crud') -const { User } = require('./userModel') -const { pick } = require('lodash') - -const pickedKeys = [ - 'schacc', - 'fullName', - 'secondaryEmail', - 'receiveMail', - 'nickName', - 'imagePath', - 'role', - 'valid', -] - -// Keys that can be updated by role -const getUpdateKeysByRole = (role) => { - const notMentorKeys = ['receiveMail', 'nickName', 'imagePath'] - if (role === 'mentor') - return [ - ...notMentorKeys, - 'fullName', - 'secondaryEmail', - 'bit', - 'presence', - 'role', - 'valid', - ] - return notMentorKeys -} - -module.exports.getOne = async (req, res) => { - try { - // Get Own User - if (req.params.schacc === req.user.schacc && req.user.role !== 'mentor') - return res.status(200).json({ data: pick(req.user, pickedKeys) }) - - // Get Other User - if (req.user.role !== 'mentor') return res.status(403).end() - - const userSchacc = req.params.schacc - - // Get user from db - const user = await User.findOne({ schacc: userSchacc }).lean().exec() - - if (!user) return res.status(404).end() - - return res - .status(200) - .json({ data: pick(user, [...pickedKeys, 'bit', 'presence']) }) - } catch (err) { - if (err.name === 'CastError') - // Throwed by Mongoose - return res.status(422).json({ messages: ['Invalid Schacc provided'] }) - - console.error(err) - return res.status(400).end() - } -} - -// Overwrite the returned keys -module.exports.getMany = getMany(User, [...pickedKeys, 'bit', 'presence']) - -module.exports.getManyByRole = async (req, res) => { - try { - const docs = await User.find({ role: req.params.role }).lean().exec() - - res.status(200).json({ data: docs.map((e) => pick(e, pickedKeys)) }) - } catch (e) { - console.error(e) - res.status(400).end() - } -} - -// Doesn't delete the user just disable it -module.exports.softRemove = async (req, res) => { - try { - let user = await User.findOneAndUpdate( - { schacc: req.params.schacc }, - { - valid: false, - receiveMail: false, - }, - { new: true } - ) - .lean() - .exec() - - if (!user) return res.status(404).json({ messages: 'User not found!' }) - - // Users application is kept - - return res - .status(200) - .json({ data: pick(user, [...pickedKeys, 'bit', 'presence']) }) - } catch (e) { - console.error(e) - return res.status(400).end() - } -} - -module.exports.updateOne = async (req, res) => { - try { - if (!(req.params.schacc === req.user.schacc || req.user.role === 'mentor')) - return res.status(403).end() - - const userSchacc = req.params.schacc - - // Update with given keys - const updatedUser = await User.findOneAndUpdate( - { - schacc: userSchacc, - }, - pick(req.body, getUpdateKeysByRole(req.user.role)), - { new: true, runValidators: true } - ) - .lean() - .exec() - - if (!updatedUser) - return res.status(404).json({ messages: 'User not found!' }) - - // Pick keys - let returnData - if (req.user.role === 'mentor') - returnData = pick(updatedUser, [...pickedKeys, 'bit', 'presence']) - else returnData = pick(updatedUser, pickedKeys) - - return res.status(200).json({ - data: returnData, - }) - } catch (err) { - if (err.name === 'ValidationError') { - // Throwed by Mongoose - let messages = [] - for (field in err.errors) { - messages.push(err.errors[field].message) - } - return res.status(422).json({ messages }) - } - console.error(err) - return res.status(400).end() - } -} diff --git a/src/resources/user/userRouter.js b/src/resources/user/userRouter.js index 583a0c920c50a3a8cbc16aa0c3d9e8726492d0cf..7ffb0b49ee96233ac49c1d8e2ed1328189b80269 100644 --- a/src/resources/user/userRouter.js +++ b/src/resources/user/userRouter.js @@ -1,7 +1,8 @@ const { Router } = require('express') -const controllers = require('./userControllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') +const controllers = require('./controllers') + const router = Router() // /api/v1/user @@ -15,7 +16,7 @@ router .route('/schacc/:schacc') .get(isLoggedIn, controllers.getOne) .put(isLoggedIn, controllers.updateOne) - .delete(isLoggedIn, isMentor, controllers.softRemove) + .delete(isLoggedIn, isMentor, controllers.softRemoveOne) // /api/v1/user/me router