From 9a8b1a78e11132d9f49d34d7126d3dfba5cc7984 Mon Sep 17 00:00:00 2001 From: rlacko Date: Thu, 6 Aug 2020 06:10:19 +0200 Subject: [PATCH 01/11] user controller files separated --- src/resources/user/controllers/getMany.js | 6 + .../user/controllers/getManyByRole.js | 14 ++ src/resources/user/controllers/getOne.js | 32 ++++ src/resources/user/controllers/helpers.js | 30 ++++ src/resources/user/controllers/softRemove.js | 29 ++++ src/resources/user/controllers/updateOne.js | 47 ++++++ src/resources/user/userControllers.js | 144 ------------------ src/resources/user/userRouter.js | 23 ++- 8 files changed, 173 insertions(+), 152 deletions(-) create mode 100644 src/resources/user/controllers/getMany.js create mode 100644 src/resources/user/controllers/getManyByRole.js create mode 100644 src/resources/user/controllers/getOne.js create mode 100644 src/resources/user/controllers/helpers.js create mode 100644 src/resources/user/controllers/softRemove.js create mode 100644 src/resources/user/controllers/updateOne.js delete mode 100644 src/resources/user/userControllers.js diff --git a/src/resources/user/controllers/getMany.js b/src/resources/user/controllers/getMany.js new file mode 100644 index 0000000..f319620 --- /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('./helpers') + +// Overwrite the returned keys +module.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 0000000..137e18d --- /dev/null +++ b/src/resources/user/controllers/getManyByRole.js @@ -0,0 +1,14 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { pickedKeys } = require('./helpers') + +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() + } +} diff --git a/src/resources/user/controllers/getOne.js b/src/resources/user/controllers/getOne.js new file mode 100644 index 0000000..fa18e02 --- /dev/null +++ b/src/resources/user/controllers/getOne.js @@ -0,0 +1,32 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { pickedKeys } = require('./helpers') + +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() + } +} diff --git a/src/resources/user/controllers/helpers.js b/src/resources/user/controllers/helpers.js new file mode 100644 index 0000000..2bf34cb --- /dev/null +++ b/src/resources/user/controllers/helpers.js @@ -0,0 +1,30 @@ +const pickedKeys = [ + 'schacc', + 'fullName', + 'secondaryEmail', + 'receiveMail', + 'nickName', + 'imagePath', + 'role', + 'valid', +] + +exports.pickedKeys = pickedKeys + +// 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 +} + +exports.getUpdateKeysByRole = getUpdateKeysByRole diff --git a/src/resources/user/controllers/softRemove.js b/src/resources/user/controllers/softRemove.js new file mode 100644 index 0000000..ae638e3 --- /dev/null +++ b/src/resources/user/controllers/softRemove.js @@ -0,0 +1,29 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { pickedKeys } = require('./helpers') + +// 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() + } +} diff --git a/src/resources/user/controllers/updateOne.js b/src/resources/user/controllers/updateOne.js new file mode 100644 index 0000000..bc525db --- /dev/null +++ b/src/resources/user/controllers/updateOne.js @@ -0,0 +1,47 @@ +const { User } = require('../userModel') +const { pick } = require('lodash') +const { getUpdateKeysByRole, pickedKeys } = require('./helpers') + +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/userControllers.js b/src/resources/user/userControllers.js deleted file mode 100644 index 875314b..0000000 --- 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 583a0c9..7c5f772 100644 --- a/src/resources/user/userRouter.js +++ b/src/resources/user/userRouter.js @@ -1,32 +1,39 @@ const { Router } = require('express') -const controllers = require('./userControllers') const { isLoggedIn, isMentor } = require('../../middlewares/auth') +const updateOne = require('./controllers/updateOne') +const softRemove = require('./controllers/softRemove') +const getManyByRole = require('./controllers/getManyByRole') +const getMany = require('./controllers/getMany') +const getOne = require('./controllers/getOne') + const router = Router() // /api/v1/user -router.route('/').get(isLoggedIn, isMentor, controllers.getMany) +router.route('/').get(isLoggedIn, isMentor, getMany.getMany) // /api/v1/user/role/:role -router.route('/role/:role').get(isLoggedIn, isMentor, controllers.getManyByRole) +router + .route('/role/:role') + .get(isLoggedIn, isMentor, getManyByRole.getManyByRole) // /api/v1/user/schacc/:schacc router .route('/schacc/:schacc') - .get(isLoggedIn, controllers.getOne) - .put(isLoggedIn, controllers.updateOne) - .delete(isLoggedIn, isMentor, controllers.softRemove) + .get(isLoggedIn, getOne.getOne) + .put(isLoggedIn, updateOne.updateOne) + .delete(isLoggedIn, isMentor, softRemove.softRemove) // /api/v1/user/me router .route('/me') .get(isLoggedIn, async (req, res) => { req.params.schacc = req.user.schacc - await controllers.getOne(req, res) + await getOne.getOne(req, res) }) .put(isLoggedIn, async (req, res) => { req.params.schacc = req.user.schacc - await controllers.updateOne(req, res) + await updateOne.updateOne(req, res) }) exports.default = router -- GitLab From 3486102301f4398d4c85b9342a809a6e04d1be49 Mon Sep 17 00:00:00 2001 From: rlacko Date: Sat, 8 Aug 2020 14:20:27 +0200 Subject: [PATCH 02/11] separate task controllers into files --- src/resources/task/controllers/createOne.js | 42 +++++++ src/resources/task/controllers/getMany.js | 34 ++++++ src/resources/task/controllers/getOne.js | 41 +++++++ src/resources/task/controllers/index.js | 14 +++ src/resources/task/controllers/removeOne.js | 5 + src/resources/task/controllers/updateOne.js | 5 + src/resources/task/taskControllers.js | 120 -------------------- src/resources/task/taskRouter.js | 14 +-- src/resources/user/controllers/getMany.js | 2 +- src/resources/user/controllers/helpers.js | 22 +--- src/resources/user/controllers/updateOne.js | 17 ++- 11 files changed, 166 insertions(+), 150 deletions(-) create mode 100644 src/resources/task/controllers/createOne.js create mode 100644 src/resources/task/controllers/getMany.js create mode 100644 src/resources/task/controllers/getOne.js create mode 100644 src/resources/task/controllers/index.js create mode 100644 src/resources/task/controllers/removeOne.js create mode 100644 src/resources/task/controllers/updateOne.js delete mode 100644 src/resources/task/taskControllers.js diff --git a/src/resources/task/controllers/createOne.js b/src/resources/task/controllers/createOne.js new file mode 100644 index 0000000..9b767a5 --- /dev/null +++ b/src/resources/task/controllers/createOne.js @@ -0,0 +1,42 @@ +const { Task } = require('../taskModel') +const { pick } = require('lodash') + +module.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 0000000..bddcdfc --- /dev/null +++ b/src/resources/task/controllers/getMany.js @@ -0,0 +1,34 @@ +const { Task } = require('../taskModel') +const { pick } = require('lodash') + +module.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 0000000..efd8a47 --- /dev/null +++ b/src/resources/task/controllers/getOne.js @@ -0,0 +1,41 @@ +const { Task } = require('../taskModel') +const { pick } = require('lodash') + +module.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 0000000..b71cf79 --- /dev/null +++ b/src/resources/task/controllers/index.js @@ -0,0 +1,14 @@ +module.exports.pickedKeys = [ + '_id', + 'title', + 'description', + 'deadline', + 'bit', + 'creator', +] + +module.exports.createOne = require('./createOne').createOne +module.exports.getMany = require('./getMany').getMany +module.exports.getOne = require('./getOne').getOne +module.exports.removeOne = require('./removeOne').removeOne +module.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 0000000..1cf06ac --- /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('./index') + +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 0000000..5f4ddbf --- /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('./index') + +exports.updateOne = updateOne(Task, [...pickedKeys]) diff --git a/src/resources/task/taskControllers.js b/src/resources/task/taskControllers.js deleted file mode 100644 index 865d652..0000000 --- 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 ecd9fbb..12dc080 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 index f319620..2fdb12b 100644 --- a/src/resources/user/controllers/getMany.js +++ b/src/resources/user/controllers/getMany.js @@ -2,5 +2,5 @@ const { getMany } = require('../../../utils/crud') const { User } = require('../userModel') const { pickedKeys } = require('./helpers') -// Overwrite the returned keys +// Only mentor can, so return bit and presence with pickedKeys module.exports.getMany = getMany(User, [...pickedKeys, 'bit', 'presence']) diff --git a/src/resources/user/controllers/helpers.js b/src/resources/user/controllers/helpers.js index 2bf34cb..b0f0ad2 100644 --- a/src/resources/user/controllers/helpers.js +++ b/src/resources/user/controllers/helpers.js @@ -1,4 +1,4 @@ -const pickedKeys = [ +module.exports.pickedKeys = [ 'schacc', 'fullName', 'secondaryEmail', @@ -8,23 +8,3 @@ const pickedKeys = [ 'role', 'valid', ] - -exports.pickedKeys = pickedKeys - -// 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 -} - -exports.getUpdateKeysByRole = getUpdateKeysByRole diff --git a/src/resources/user/controllers/updateOne.js b/src/resources/user/controllers/updateOne.js index bc525db..01c611a 100644 --- a/src/resources/user/controllers/updateOne.js +++ b/src/resources/user/controllers/updateOne.js @@ -1,6 +1,21 @@ const { User } = require('../userModel') const { pick } = require('lodash') -const { getUpdateKeysByRole, pickedKeys } = require('./helpers') +const { pickedKeys } = require('./helpers') + +const getUpdateKeysByRole = (role) => { + const notMentorKeys = ['receiveMail', 'nickName', 'imagePath'] + if (role === 'mentor') + return [ + ...notMentorKeys, + 'fullName', + 'secondaryEmail', + 'bit', + 'presence', + 'role', + 'valid', + ] + return notMentorKeys +} module.exports.updateOne = async (req, res) => { try { -- GitLab From fc091c3a7cf6918eef6a36a3be846b5c428d92c3 Mon Sep 17 00:00:00 2001 From: rlacko Date: Sat, 8 Aug 2020 14:25:33 +0200 Subject: [PATCH 03/11] better user controller import --- src/resources/task/controllers/removeOne.js | 2 +- src/resources/task/controllers/updateOne.js | 2 +- src/resources/user/controllers/getMany.js | 2 +- .../user/controllers/getManyByRole.js | 2 +- src/resources/user/controllers/getOne.js | 2 +- src/resources/user/controllers/helpers.js | 10 --------- src/resources/user/controllers/index.js | 16 ++++++++++++++ .../{softRemove.js => softRemoveOne.js} | 4 ++-- src/resources/user/controllers/updateOne.js | 2 +- src/resources/user/userRouter.js | 22 +++++++------------ 10 files changed, 32 insertions(+), 32 deletions(-) delete mode 100644 src/resources/user/controllers/helpers.js create mode 100644 src/resources/user/controllers/index.js rename src/resources/user/controllers/{softRemove.js => softRemoveOne.js} (86%) diff --git a/src/resources/task/controllers/removeOne.js b/src/resources/task/controllers/removeOne.js index 1cf06ac..7176446 100644 --- a/src/resources/task/controllers/removeOne.js +++ b/src/resources/task/controllers/removeOne.js @@ -1,5 +1,5 @@ const { removeOne } = require('../../../utils/crud') const { Task } = require('../taskModel') -const { pickedKeys } = require('./index') +const { pickedKeys } = require('.') exports.removeOne = removeOne(Task, [...pickedKeys]) diff --git a/src/resources/task/controllers/updateOne.js b/src/resources/task/controllers/updateOne.js index 5f4ddbf..22ca2e2 100644 --- a/src/resources/task/controllers/updateOne.js +++ b/src/resources/task/controllers/updateOne.js @@ -1,5 +1,5 @@ const { updateOne } = require('../../../utils/crud') const { Task } = require('../taskModel') -const { pickedKeys } = require('./index') +const { pickedKeys } = require('.') exports.updateOne = updateOne(Task, [...pickedKeys]) diff --git a/src/resources/user/controllers/getMany.js b/src/resources/user/controllers/getMany.js index 2fdb12b..addffab 100644 --- a/src/resources/user/controllers/getMany.js +++ b/src/resources/user/controllers/getMany.js @@ -1,6 +1,6 @@ const { getMany } = require('../../../utils/crud') const { User } = require('../userModel') -const { pickedKeys } = require('./helpers') +const { pickedKeys } = require('.') // Only mentor can, so return bit and presence with pickedKeys module.exports.getMany = getMany(User, [...pickedKeys, 'bit', 'presence']) diff --git a/src/resources/user/controllers/getManyByRole.js b/src/resources/user/controllers/getManyByRole.js index 137e18d..899ac61 100644 --- a/src/resources/user/controllers/getManyByRole.js +++ b/src/resources/user/controllers/getManyByRole.js @@ -1,6 +1,6 @@ const { User } = require('../userModel') const { pick } = require('lodash') -const { pickedKeys } = require('./helpers') +const { pickedKeys } = require('.') module.exports.getManyByRole = async (req, res) => { try { diff --git a/src/resources/user/controllers/getOne.js b/src/resources/user/controllers/getOne.js index fa18e02..7d41f4b 100644 --- a/src/resources/user/controllers/getOne.js +++ b/src/resources/user/controllers/getOne.js @@ -1,6 +1,6 @@ const { User } = require('../userModel') const { pick } = require('lodash') -const { pickedKeys } = require('./helpers') +const { pickedKeys } = require('.') module.exports.getOne = async (req, res) => { try { diff --git a/src/resources/user/controllers/helpers.js b/src/resources/user/controllers/helpers.js deleted file mode 100644 index b0f0ad2..0000000 --- a/src/resources/user/controllers/helpers.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports.pickedKeys = [ - 'schacc', - 'fullName', - 'secondaryEmail', - 'receiveMail', - 'nickName', - 'imagePath', - 'role', - 'valid', -] diff --git a/src/resources/user/controllers/index.js b/src/resources/user/controllers/index.js new file mode 100644 index 0000000..1c08645 --- /dev/null +++ b/src/resources/user/controllers/index.js @@ -0,0 +1,16 @@ +module.exports.pickedKeys = [ + 'schacc', + 'fullName', + 'secondaryEmail', + 'receiveMail', + 'nickName', + 'imagePath', + 'role', + 'valid', +] + +module.exports.getMany = require('./getMany').getMany +module.exports.getManyByRole = require('./getManyByRole').getManyByRole +module.exports.getOne = require('./getOne').getOne +module.exports.softRemoveOne = require('./softRemoveOne').softRemoveOne +module.exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/user/controllers/softRemove.js b/src/resources/user/controllers/softRemoveOne.js similarity index 86% rename from src/resources/user/controllers/softRemove.js rename to src/resources/user/controllers/softRemoveOne.js index ae638e3..1f643df 100644 --- a/src/resources/user/controllers/softRemove.js +++ b/src/resources/user/controllers/softRemoveOne.js @@ -1,9 +1,9 @@ const { User } = require('../userModel') const { pick } = require('lodash') -const { pickedKeys } = require('./helpers') +const { pickedKeys } = require('.') // Doesn't delete the user just disable it -module.exports.softRemove = async (req, res) => { +module.exports.softRemoveOne = async (req, res) => { try { let user = await User.findOneAndUpdate( { schacc: req.params.schacc }, diff --git a/src/resources/user/controllers/updateOne.js b/src/resources/user/controllers/updateOne.js index 01c611a..51c4c88 100644 --- a/src/resources/user/controllers/updateOne.js +++ b/src/resources/user/controllers/updateOne.js @@ -1,6 +1,6 @@ const { User } = require('../userModel') const { pick } = require('lodash') -const { pickedKeys } = require('./helpers') +const { pickedKeys } = require('.') const getUpdateKeysByRole = (role) => { const notMentorKeys = ['receiveMail', 'nickName', 'imagePath'] diff --git a/src/resources/user/userRouter.js b/src/resources/user/userRouter.js index 7c5f772..7ffb0b4 100644 --- a/src/resources/user/userRouter.js +++ b/src/resources/user/userRouter.js @@ -1,39 +1,33 @@ const { Router } = require('express') const { isLoggedIn, isMentor } = require('../../middlewares/auth') -const updateOne = require('./controllers/updateOne') -const softRemove = require('./controllers/softRemove') -const getManyByRole = require('./controllers/getManyByRole') -const getMany = require('./controllers/getMany') -const getOne = require('./controllers/getOne') +const controllers = require('./controllers') const router = Router() // /api/v1/user -router.route('/').get(isLoggedIn, isMentor, getMany.getMany) +router.route('/').get(isLoggedIn, isMentor, controllers.getMany) // /api/v1/user/role/:role -router - .route('/role/:role') - .get(isLoggedIn, isMentor, getManyByRole.getManyByRole) +router.route('/role/:role').get(isLoggedIn, isMentor, controllers.getManyByRole) // /api/v1/user/schacc/:schacc router .route('/schacc/:schacc') - .get(isLoggedIn, getOne.getOne) - .put(isLoggedIn, updateOne.updateOne) - .delete(isLoggedIn, isMentor, softRemove.softRemove) + .get(isLoggedIn, controllers.getOne) + .put(isLoggedIn, controllers.updateOne) + .delete(isLoggedIn, isMentor, controllers.softRemoveOne) // /api/v1/user/me router .route('/me') .get(isLoggedIn, async (req, res) => { req.params.schacc = req.user.schacc - await getOne.getOne(req, res) + await controllers.getOne(req, res) }) .put(isLoggedIn, async (req, res) => { req.params.schacc = req.user.schacc - await updateOne.updateOne(req, res) + await controllers.updateOne(req, res) }) exports.default = router -- GitLab From 0f9cb7ca1645528ee3eff2082ccb2bbdc6797d97 Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 10:29:42 +0200 Subject: [PATCH 04/11] separate settings conroller --- src/resources/settings/controllers/getOne.js | 21 +++++++++++++ src/resources/settings/controllers/index.js | 4 +++ .../updateOne.js} | 30 +++---------------- src/resources/settings/settingsRouter.js | 2 +- 4 files changed, 30 insertions(+), 27 deletions(-) create mode 100644 src/resources/settings/controllers/getOne.js create mode 100644 src/resources/settings/controllers/index.js rename src/resources/settings/{settingsControllers.js => controllers/updateOne.js} (52%) diff --git a/src/resources/settings/controllers/getOne.js b/src/resources/settings/controllers/getOne.js new file mode 100644 index 0000000..413d798 --- /dev/null +++ b/src/resources/settings/controllers/getOne.js @@ -0,0 +1,21 @@ +const { Settings } = require('../settingsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +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, 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 0000000..03a644d --- /dev/null +++ b/src/resources/settings/controllers/index.js @@ -0,0 +1,4 @@ +module.exports.pickedKeys = ['applicationEndDate'] + +module.exports.getOne = require('./getOne').getOne +module.exports.updateOne = require('./updateOne').updateOne diff --git a/src/resources/settings/settingsControllers.js b/src/resources/settings/controllers/updateOne.js similarity index 52% rename from src/resources/settings/settingsControllers.js rename to src/resources/settings/controllers/updateOne.js index 5412392..3dbf935 100644 --- a/src/resources/settings/settingsControllers.js +++ b/src/resources/settings/controllers/updateOne.js @@ -1,26 +1,6 @@ -const { crudControllers } = require('../../utils/crud') -const { Settings } = require('./settingsModel') +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() - } - } -} +const { pickedKeys } = require('.') // If there is no settings, then create it module.exports.updateOne = async (req, res) => { @@ -28,7 +8,7 @@ module.exports.updateOne = async (req, res) => { 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']) }) + return res.status(201).json({ data: pick(doc, pickedKeys) }) } const updatedSettings = await Settings.findOneAndUpdate( { @@ -44,9 +24,7 @@ module.exports.updateOne = async (req, res) => { return res.status(400).end() } - return res - .status(200) - .json({ data: pick(updatedSettings, ['applicationEndDate']) }) + return res.status(200).json({ data: pick(updatedSettings, pickedKeys) }) } catch (err) { if (err.name == 'ValidationError') { let messages = [] diff --git a/src/resources/settings/settingsRouter.js b/src/resources/settings/settingsRouter.js index 0daa1d3..cd8c96f 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') -- GitLab From 018f126996cf72149f7531f2276547a59614e4b3 Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 10:35:15 +0200 Subject: [PATCH 05/11] separate news conroller --- src/resources/news/controllers/createOne.js | 24 +++++++ src/resources/news/controllers/getMany.js | 22 +++++++ src/resources/news/controllers/getOne.js | 28 +++++++++ src/resources/news/controllers/index.js | 7 +++ src/resources/news/controllers/removeOne.js | 5 ++ src/resources/news/controllers/updateOne.js | 5 ++ src/resources/news/newsControllers.js | 70 --------------------- src/resources/news/newsRouter.js | 12 ++-- 8 files changed, 97 insertions(+), 76 deletions(-) create mode 100644 src/resources/news/controllers/createOne.js create mode 100644 src/resources/news/controllers/getMany.js create mode 100644 src/resources/news/controllers/getOne.js create mode 100644 src/resources/news/controllers/index.js create mode 100644 src/resources/news/controllers/removeOne.js create mode 100644 src/resources/news/controllers/updateOne.js delete mode 100644 src/resources/news/newsControllers.js diff --git a/src/resources/news/controllers/createOne.js b/src/resources/news/controllers/createOne.js new file mode 100644 index 0000000..a753994 --- /dev/null +++ b/src/resources/news/controllers/createOne.js @@ -0,0 +1,24 @@ +const { News } = require('../newsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +module.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 0000000..59d44d8 --- /dev/null +++ b/src/resources/news/controllers/getMany.js @@ -0,0 +1,22 @@ +const { News } = require('../newsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +module.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 0000000..54b212a --- /dev/null +++ b/src/resources/news/controllers/getOne.js @@ -0,0 +1,28 @@ +const { News } = require('../newsModel') +const { pick } = require('lodash') +const { pickedKeys } = require('.') + +module.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 0000000..e655086 --- /dev/null +++ b/src/resources/news/controllers/index.js @@ -0,0 +1,7 @@ +module.exports.pickedKeys = ['_id', 'title', 'body', 'creator'] + +module.exports.createOne = require('./createOne').createOne +module.exports.getMany = require('./getMany').getMany +module.exports.getOne = require('./getOne').getOne +module.exports.removeOne = require('./removeOne').removeOne +module.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 0000000..38cdb63 --- /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('.') + +module.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 0000000..5d9b7b2 --- /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('.') + +module.exports.updateOne = updateOne(News, [...pickedKeys]) diff --git a/src/resources/news/newsControllers.js b/src/resources/news/newsControllers.js deleted file mode 100644 index 23f6bb8..0000000 --- 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 47a4c88..9a5d04a 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 -- GitLab From 8d924a2d028c59388f7faf66f938fa290d9a2a4d Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 10:37:42 +0200 Subject: [PATCH 06/11] replace module.exports with exports --- src/resources/news/controllers/createOne.js | 2 +- src/resources/news/controllers/getMany.js | 2 +- src/resources/news/controllers/getOne.js | 2 +- src/resources/news/controllers/index.js | 12 ++++++------ src/resources/news/controllers/removeOne.js | 2 +- src/resources/news/controllers/updateOne.js | 2 +- src/resources/settings/controllers/getOne.js | 2 +- src/resources/settings/controllers/index.js | 6 +++--- src/resources/settings/controllers/updateOne.js | 2 +- src/resources/task/controllers/createOne.js | 2 +- src/resources/task/controllers/getMany.js | 2 +- src/resources/task/controllers/getOne.js | 2 +- src/resources/task/controllers/index.js | 12 ++++++------ src/resources/user/controllers/getMany.js | 2 +- src/resources/user/controllers/getManyByRole.js | 2 +- src/resources/user/controllers/getOne.js | 2 +- src/resources/user/controllers/index.js | 12 ++++++------ src/resources/user/controllers/softRemoveOne.js | 2 +- src/resources/user/controllers/updateOne.js | 2 +- 19 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/resources/news/controllers/createOne.js b/src/resources/news/controllers/createOne.js index a753994..c88acdb 100644 --- a/src/resources/news/controllers/createOne.js +++ b/src/resources/news/controllers/createOne.js @@ -2,7 +2,7 @@ const { News } = require('../newsModel') const { pick } = require('lodash') const { pickedKeys } = require('.') -module.exports.createOne = async (req, res) => { +exports.createOne = async (req, res) => { try { const createdNews = await News.create( pick(req.body, ['title', 'body', 'creator']) diff --git a/src/resources/news/controllers/getMany.js b/src/resources/news/controllers/getMany.js index 59d44d8..8f8f167 100644 --- a/src/resources/news/controllers/getMany.js +++ b/src/resources/news/controllers/getMany.js @@ -2,7 +2,7 @@ const { News } = require('../newsModel') const { pick } = require('lodash') const { pickedKeys } = require('.') -module.exports.getMany = async (req, res) => { +exports.getMany = async (req, res) => { try { news = await News.find() .populate({ path: '_creator', select: '-_id schacc fullName' }) diff --git a/src/resources/news/controllers/getOne.js b/src/resources/news/controllers/getOne.js index 54b212a..b05bfb8 100644 --- a/src/resources/news/controllers/getOne.js +++ b/src/resources/news/controllers/getOne.js @@ -2,7 +2,7 @@ const { News } = require('../newsModel') const { pick } = require('lodash') const { pickedKeys } = require('.') -module.exports.getOne = async (req, res) => { +exports.getOne = async (req, res) => { try { news = await News.findOne({ _id: req.params.id }) .populate({ path: '_creator', select: '-_id schacc fullName' }) diff --git a/src/resources/news/controllers/index.js b/src/resources/news/controllers/index.js index e655086..d0c590a 100644 --- a/src/resources/news/controllers/index.js +++ b/src/resources/news/controllers/index.js @@ -1,7 +1,7 @@ -module.exports.pickedKeys = ['_id', 'title', 'body', 'creator'] +exports.pickedKeys = ['_id', 'title', 'body', 'creator'] -module.exports.createOne = require('./createOne').createOne -module.exports.getMany = require('./getMany').getMany -module.exports.getOne = require('./getOne').getOne -module.exports.removeOne = require('./removeOne').removeOne -module.exports.updateOne = require('./updateOne').updateOne +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 index 38cdb63..448feca 100644 --- a/src/resources/news/controllers/removeOne.js +++ b/src/resources/news/controllers/removeOne.js @@ -2,4 +2,4 @@ const { removeOne } = require('../../../utils/crud') const { News } = require('../newsModel') const { pickedKeys } = require('.') -module.exports.removeOne = removeOne(News, [...pickedKeys]) +exports.removeOne = removeOne(News, [...pickedKeys]) diff --git a/src/resources/news/controllers/updateOne.js b/src/resources/news/controllers/updateOne.js index 5d9b7b2..dda33df 100644 --- a/src/resources/news/controllers/updateOne.js +++ b/src/resources/news/controllers/updateOne.js @@ -2,4 +2,4 @@ const { updateOne } = require('../../../utils/crud') const { News } = require('../newsModel') const { pickedKeys } = require('.') -module.exports.updateOne = updateOne(News, [...pickedKeys]) +exports.updateOne = updateOne(News, [...pickedKeys]) diff --git a/src/resources/settings/controllers/getOne.js b/src/resources/settings/controllers/getOne.js index 413d798..44c140e 100644 --- a/src/resources/settings/controllers/getOne.js +++ b/src/resources/settings/controllers/getOne.js @@ -2,7 +2,7 @@ const { Settings } = require('../settingsModel') const { pick } = require('lodash') const { pickedKeys } = require('.') -module.exports.getOne = async (req, res) => { +exports.getOne = async (req, res) => { try { const doc = await Settings.findOne().lean().exec() diff --git a/src/resources/settings/controllers/index.js b/src/resources/settings/controllers/index.js index 03a644d..68b6fe0 100644 --- a/src/resources/settings/controllers/index.js +++ b/src/resources/settings/controllers/index.js @@ -1,4 +1,4 @@ -module.exports.pickedKeys = ['applicationEndDate'] +exports.pickedKeys = ['applicationEndDate'] -module.exports.getOne = require('./getOne').getOne -module.exports.updateOne = require('./updateOne').updateOne +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 index 3dbf935..4cc15df 100644 --- a/src/resources/settings/controllers/updateOne.js +++ b/src/resources/settings/controllers/updateOne.js @@ -3,7 +3,7 @@ const { pick } = require('lodash') const { pickedKeys } = require('.') // If there is no settings, then create it -module.exports.updateOne = async (req, res) => { +exports.updateOne = async (req, res) => { try { const oldSettings = await Settings.findOne().lean().exec() if (!oldSettings) { diff --git a/src/resources/task/controllers/createOne.js b/src/resources/task/controllers/createOne.js index 9b767a5..43657fa 100644 --- a/src/resources/task/controllers/createOne.js +++ b/src/resources/task/controllers/createOne.js @@ -1,7 +1,7 @@ const { Task } = require('../taskModel') const { pick } = require('lodash') -module.exports.createOne = async (req, res) => { +exports.createOne = async (req, res) => { try { const createdTask = await Task.create( pick(req.body, [ diff --git a/src/resources/task/controllers/getMany.js b/src/resources/task/controllers/getMany.js index bddcdfc..a95b07e 100644 --- a/src/resources/task/controllers/getMany.js +++ b/src/resources/task/controllers/getMany.js @@ -1,7 +1,7 @@ const { Task } = require('../taskModel') const { pick } = require('lodash') -module.exports.getMany = async (req, res) => { +exports.getMany = async (req, res) => { try { tasks = await Task.find() .populate({ diff --git a/src/resources/task/controllers/getOne.js b/src/resources/task/controllers/getOne.js index efd8a47..9a54356 100644 --- a/src/resources/task/controllers/getOne.js +++ b/src/resources/task/controllers/getOne.js @@ -1,7 +1,7 @@ const { Task } = require('../taskModel') const { pick } = require('lodash') -module.exports.getOne = async (req, res) => { +exports.getOne = async (req, res) => { try { task = await Task.findOne({ _id: req.params.id }) .populate({ diff --git a/src/resources/task/controllers/index.js b/src/resources/task/controllers/index.js index b71cf79..097d2e4 100644 --- a/src/resources/task/controllers/index.js +++ b/src/resources/task/controllers/index.js @@ -1,4 +1,4 @@ -module.exports.pickedKeys = [ +exports.pickedKeys = [ '_id', 'title', 'description', @@ -7,8 +7,8 @@ module.exports.pickedKeys = [ 'creator', ] -module.exports.createOne = require('./createOne').createOne -module.exports.getMany = require('./getMany').getMany -module.exports.getOne = require('./getOne').getOne -module.exports.removeOne = require('./removeOne').removeOne -module.exports.updateOne = require('./updateOne').updateOne +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/user/controllers/getMany.js b/src/resources/user/controllers/getMany.js index addffab..1ecc86b 100644 --- a/src/resources/user/controllers/getMany.js +++ b/src/resources/user/controllers/getMany.js @@ -3,4 +3,4 @@ const { User } = require('../userModel') const { pickedKeys } = require('.') // Only mentor can, so return bit and presence with pickedKeys -module.exports.getMany = getMany(User, [...pickedKeys, 'bit', 'presence']) +exports.getMany = getMany(User, [...pickedKeys, 'bit', 'presence']) diff --git a/src/resources/user/controllers/getManyByRole.js b/src/resources/user/controllers/getManyByRole.js index 899ac61..49c3b75 100644 --- a/src/resources/user/controllers/getManyByRole.js +++ b/src/resources/user/controllers/getManyByRole.js @@ -2,7 +2,7 @@ const { User } = require('../userModel') const { pick } = require('lodash') const { pickedKeys } = require('.') -module.exports.getManyByRole = async (req, res) => { +exports.getManyByRole = async (req, res) => { try { const docs = await User.find({ role: req.params.role }).lean().exec() diff --git a/src/resources/user/controllers/getOne.js b/src/resources/user/controllers/getOne.js index 7d41f4b..8bac53d 100644 --- a/src/resources/user/controllers/getOne.js +++ b/src/resources/user/controllers/getOne.js @@ -2,7 +2,7 @@ const { User } = require('../userModel') const { pick } = require('lodash') const { pickedKeys } = require('.') -module.exports.getOne = async (req, res) => { +exports.getOne = async (req, res) => { try { // Get Own User if (req.params.schacc === req.user.schacc && req.user.role !== 'mentor') diff --git a/src/resources/user/controllers/index.js b/src/resources/user/controllers/index.js index 1c08645..cb39ff0 100644 --- a/src/resources/user/controllers/index.js +++ b/src/resources/user/controllers/index.js @@ -1,4 +1,4 @@ -module.exports.pickedKeys = [ +exports.pickedKeys = [ 'schacc', 'fullName', 'secondaryEmail', @@ -9,8 +9,8 @@ module.exports.pickedKeys = [ 'valid', ] -module.exports.getMany = require('./getMany').getMany -module.exports.getManyByRole = require('./getManyByRole').getManyByRole -module.exports.getOne = require('./getOne').getOne -module.exports.softRemoveOne = require('./softRemoveOne').softRemoveOne -module.exports.updateOne = require('./updateOne').updateOne +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 index 1f643df..a968559 100644 --- a/src/resources/user/controllers/softRemoveOne.js +++ b/src/resources/user/controllers/softRemoveOne.js @@ -3,7 +3,7 @@ const { pick } = require('lodash') const { pickedKeys } = require('.') // Doesn't delete the user just disable it -module.exports.softRemoveOne = async (req, res) => { +exports.softRemoveOne = async (req, res) => { try { let user = await User.findOneAndUpdate( { schacc: req.params.schacc }, diff --git a/src/resources/user/controllers/updateOne.js b/src/resources/user/controllers/updateOne.js index 51c4c88..0b2a4e3 100644 --- a/src/resources/user/controllers/updateOne.js +++ b/src/resources/user/controllers/updateOne.js @@ -17,7 +17,7 @@ const getUpdateKeysByRole = (role) => { return notMentorKeys } -module.exports.updateOne = async (req, res) => { +exports.updateOne = async (req, res) => { try { if (!(req.params.schacc === req.user.schacc || req.user.role === 'mentor')) return res.status(403).end() -- GitLab From 1d7a9941c8efb20f3b1adffb4deb7fe8b97f8d67 Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 10:42:24 +0200 Subject: [PATCH 07/11] separate mentor conroller --- src/resources/mentor/controllers/createOne.js | 24 +++++++++++++++ src/resources/mentor/controllers/getMany.js | 24 +++++++++++++++ src/resources/mentor/controllers/getOne.js | 30 +++++++++++++++++++ src/resources/mentor/controllers/index.js | 7 +++++ src/resources/mentor/controllers/removeOne.js | 5 ++++ src/resources/mentor/controllers/updateOne.js | 5 ++++ src/resources/mentor/mentorControllers.js | 8 ++--- src/resources/mentor/mentorRouter.js | 12 ++++---- 8 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 src/resources/mentor/controllers/createOne.js create mode 100644 src/resources/mentor/controllers/getMany.js create mode 100644 src/resources/mentor/controllers/getOne.js create mode 100644 src/resources/mentor/controllers/index.js create mode 100644 src/resources/mentor/controllers/removeOne.js create mode 100644 src/resources/mentor/controllers/updateOne.js diff --git a/src/resources/mentor/controllers/createOne.js b/src/resources/mentor/controllers/createOne.js new file mode 100644 index 0000000..ba7177a --- /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 0000000..d3038bc --- /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 0000000..09db4e9 --- /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 0000000..fd71a7e --- /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 0000000..862304e --- /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 0000000..562399d --- /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 index 4da413f..d826d79 100644 --- a/src/resources/mentor/mentorControllers.js +++ b/src/resources/mentor/mentorControllers.js @@ -2,8 +2,8 @@ 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) => { +exports = crudControllers(Mentor, ['_id', 'user', 'description']) +exports.getOne = async (req, res) => { try { mentor = await Mentor.findOne({ _id: req.params.id }) .populate({ @@ -29,7 +29,7 @@ exports.default.getOne = async (req, res) => { res.status(500).end() } } -exports.default.getMany = async (req, res) => { +exports.getMany = async (req, res) => { try { mentors = await Mentor.find() .populate({ @@ -49,7 +49,7 @@ exports.default.getMany = async (req, res) => { return res.status(500).end() } } -exports.default.createOne = async (req, res) => { +exports.createOne = async (req, res) => { try { const createdMentor = await Mentor.create( pick(req.body, ['user', 'description']) diff --git a/src/resources/mentor/mentorRouter.js b/src/resources/mentor/mentorRouter.js index a3f0c19..fc63a48 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 -- GitLab From 2ffa4de393848a262de422ea1d2a60b462b8cafe Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 10:51:31 +0200 Subject: [PATCH 08/11] separate groups controller --- src/resources/groups/controllers/createOne.js | 5 +++ src/resources/groups/controllers/getMany.js | 5 +++ src/resources/groups/controllers/getOne.js | 23 +++++++++++++ src/resources/groups/controllers/index.js | 7 ++++ src/resources/groups/controllers/removeOne.js | 25 ++++++++++++++ src/resources/groups/controllers/updateOne.js | 34 +++++++++++++++++++ src/resources/groups/groupsRouter.js | 2 +- 7 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/resources/groups/controllers/createOne.js create mode 100644 src/resources/groups/controllers/getMany.js create mode 100644 src/resources/groups/controllers/getOne.js create mode 100644 src/resources/groups/controllers/index.js create mode 100644 src/resources/groups/controllers/removeOne.js create mode 100644 src/resources/groups/controllers/updateOne.js diff --git a/src/resources/groups/controllers/createOne.js b/src/resources/groups/controllers/createOne.js new file mode 100644 index 0000000..14c70e4 --- /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 0000000..b1f609c --- /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 0000000..0e8264d --- /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 0000000..50a6765 --- /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 0000000..2a52fbd --- /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 0000000..7a6bace --- /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/groupsRouter.js b/src/resources/groups/groupsRouter.js index 16902ee..99e447c 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') -- GitLab From 3f5d92ecc83af3d7fbcfceb5604580068957378c Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 10:58:23 +0200 Subject: [PATCH 09/11] separate comment controller --- src/resources/comment/commentControllers.js | 259 ------------------ src/resources/comment/commentRouter.js | 12 +- .../comment/controllers/createOne.js | 58 ++++ src/resources/comment/controllers/getMany.js | 35 +++ src/resources/comment/controllers/getOne.js | 63 +++++ src/resources/comment/controllers/index.js | 35 +++ .../comment/controllers/removeOne.js | 44 +++ .../comment/controllers/updateOne.js | 40 +++ src/resources/groups/groupsControllers.js | 80 ------ src/resources/mentor/mentorControllers.js | 73 ----- 10 files changed, 281 insertions(+), 418 deletions(-) delete mode 100644 src/resources/comment/commentControllers.js create mode 100644 src/resources/comment/controllers/createOne.js create mode 100644 src/resources/comment/controllers/getMany.js create mode 100644 src/resources/comment/controllers/getOne.js create mode 100644 src/resources/comment/controllers/index.js create mode 100644 src/resources/comment/controllers/removeOne.js create mode 100644 src/resources/comment/controllers/updateOne.js delete mode 100644 src/resources/groups/groupsControllers.js delete mode 100644 src/resources/mentor/mentorControllers.js diff --git a/src/resources/comment/commentControllers.js b/src/resources/comment/commentControllers.js deleted file mode 100644 index 1b1d3b7..0000000 --- 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 f171178..ac69dd8 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 0000000..366ead0 --- /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 0000000..78da6f9 --- /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 0000000..b7e3fbf --- /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 0000000..baaddd3 --- /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 0000000..8cc675b --- /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 0000000..5368f96 --- /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/groupsControllers.js b/src/resources/groups/groupsControllers.js deleted file mode 100644 index bf65110..0000000 --- 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/mentor/mentorControllers.js b/src/resources/mentor/mentorControllers.js deleted file mode 100644 index d826d79..0000000 --- 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 = crudControllers(Mentor, ['_id', 'user', 'description']) -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, ['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.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.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() - } -} -- GitLab From 16e6aa8deb59b6125eb5a2aaee69cbc15db82ac0 Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 11:08:32 +0200 Subject: [PATCH 10/11] separate attendance controller --- .../attendance/attendanceControllers.js | 85 ------------------- src/resources/attendance/attendanceRouter.js | 2 +- .../attendance/controllers/createOne.js | 5 ++ .../attendance/controllers/getMany.js | 23 +++++ .../attendance/controllers/getOne.js | 28 ++++++ src/resources/attendance/controllers/index.js | 7 ++ .../attendance/controllers/removeOne.js | 5 ++ .../attendance/controllers/updateOne.js | 35 ++++++++ 8 files changed, 104 insertions(+), 86 deletions(-) delete mode 100644 src/resources/attendance/attendanceControllers.js create mode 100644 src/resources/attendance/controllers/createOne.js create mode 100644 src/resources/attendance/controllers/getMany.js create mode 100644 src/resources/attendance/controllers/getOne.js create mode 100644 src/resources/attendance/controllers/index.js create mode 100644 src/resources/attendance/controllers/removeOne.js create mode 100644 src/resources/attendance/controllers/updateOne.js diff --git a/src/resources/attendance/attendanceControllers.js b/src/resources/attendance/attendanceControllers.js deleted file mode 100644 index 6561838..0000000 --- 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 aa2468a..3479953 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 0000000..79c9b67 --- /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 0000000..fcaeb0f --- /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 0000000..6433322 --- /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 0000000..4771b93 --- /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 0000000..289db11 --- /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 0000000..ef88b97 --- /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() + } +} -- GitLab From 294e544d629822e670ad43960f85f3d18f4fd7bb Mon Sep 17 00:00:00 2001 From: rlacko Date: Tue, 11 Aug 2020 11:17:37 +0200 Subject: [PATCH 11/11] separate application controller --- .../application/applicationControllers.js | 244 ------------------ .../application/applicationRouter.js | 12 +- .../application/controllers/createOne.js | 118 +++++++++ .../application/controllers/getMany.js | 23 ++ .../application/controllers/getOneByID.js | 38 +++ .../application/controllers/getOneBySchacc.js | 33 +++ .../application/controllers/index.js | 14 + 7 files changed, 231 insertions(+), 251 deletions(-) delete mode 100644 src/resources/application/applicationControllers.js create mode 100644 src/resources/application/controllers/createOne.js create mode 100644 src/resources/application/controllers/getMany.js create mode 100644 src/resources/application/controllers/getOneByID.js create mode 100644 src/resources/application/controllers/getOneBySchacc.js create mode 100644 src/resources/application/controllers/index.js diff --git a/src/resources/application/applicationControllers.js b/src/resources/application/applicationControllers.js deleted file mode 100644 index 22be0bb..0000000 --- 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 093fbbf..3030e81 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 0000000..329ad31 --- /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 0000000..35ce38c --- /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 0000000..6c2a6df --- /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 0000000..4f4dae8 --- /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 0000000..ad9fa21 --- /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 -- GitLab