From 2cc795d420c0ae0c4f8280a161e6bb4cb50d891b Mon Sep 17 00:00:00 2001 From: rlacko <rlacko@sch.bme.hu> Date: Thu, 30 Jul 2020 01:51:22 +0200 Subject: [PATCH] fix activity controller --- src/resources/activity/activityControllers.js | 138 +++++++----------- 1 file changed, 52 insertions(+), 86 deletions(-) diff --git a/src/resources/activity/activityControllers.js b/src/resources/activity/activityControllers.js index 185572c..e5df705 100644 --- a/src/resources/activity/activityControllers.js +++ b/src/resources/activity/activityControllers.js @@ -17,36 +17,6 @@ const pickedKeys = [ 'comment', ] -const activitySelector = - '_id title description date type createdAt updatedAt attendance comment' -const commentSelector = '_id creator _creator text createdAt' -const attendanceSelector = '_id user state' -const creatorSelector = '-_id fullName nickName schacc' - -// Overwrites the given field with the populated User -// field: populate on this -// byPopulate: user schacc field name -async function populateUsersOnField(fieldToPopulate, byPopulate) { - let newField = [] - for (let field of fieldToPopulate) { - const populated = await User.findOne({ - schacc: field[byPopulate], - }) - .lean() - .exec() - - field[byPopulate] = pick(populated, creatorSelector.split(' ')) - newField.push(field) - } - return newField -} - -async function populateCommentsandAttendances(activity) { - activity.comment = await populateUsersOnField(activity.comment, 'creator') - activity.attendance = await populateUsersOnField(activity.attendance, 'user') - return activity -} - // Controller module.exports.createOne = async function createOne(req, res) { @@ -87,21 +57,6 @@ module.exports.createOne = async function createOne(req, res) { .exec() } - await activity - .populate({ - path: 'comment', - select: commentSelector, - }) - .populate({ - path: 'attendance', - select: attendanceSelector, - }) - .execPopulate() - - const populatedActivity = await populateCommentsandAttendances( - activity.toObject() - ) - return res .status(200) .json({ @@ -125,24 +80,36 @@ module.exports.createOne = async function createOne(req, res) { module.exports.getOne = async function getOne(req, res) { try { const activity = await Activity.findOne({ _id: req.params.id }) - .populate({ - path: 'comment', - select: commentSelector, - }) - .populate({ - path: 'attendance', - select: attendanceSelector, - }) .lean() .exec() if (!activity) return res.status(404).json({ messages: ['No such activity.'] }) - const populatedActivity = await populateCommentsandAttendances(activity) - - return res.status(200).json({ data: pick(populatedActivity, pickedKeys) }) + if (req.user.role == 'mentor') + return res.status(200).json({ + data: pick(activity, pickedKeys), + }) + return res.status(200).json({ + data: pick(activity, [ + '_id', + 'title', + 'description', + 'date', + 'type', + 'createdAt', + 'updatedAt', + ]), + }) } 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 }) } @@ -150,31 +117,25 @@ module.exports.getOne = async function getOne(req, res) { module.exports.getMany = async function getMany(req, res) { try { - const activity = await Activity.find() - .populate({ - path: 'comment', - select: '_id creator text createdAt', - }) - .populate({ - path: 'attendance', - select: '_id user state', - }) - .select('-__v') - .lean() - .exec() + const activity = await Activity.find().select('-__v').lean().exec() if (!activity) return res.status(404).json({ message: 'Activity not found!' }) res.status(200).json({ - data: await Promise.all( - activity.map(async function pickKeys(doc) { - const populatedActivity = await populateCommentsandAttendances(doc) - return pick(populatedActivity, pickedKeys) - }) - ), + data: activity.map(function pickKeys(doc) { + return pick(populatedActivity, 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) res.status(500).json({ message: err.message }) } @@ -185,17 +146,11 @@ module.exports.removeOne = async function removeOne(req, res) { const activity = await Activity.findByIdAndDelete({ _id: req.params.id, }) - .populate({ - path: 'comment', - select: '_id creator text createdAt', - }) - .select('-__v') .lean() .exec() - if (!activity) { + if (!activity) return res.status(404).json({ message: 'Activity not found!' }) - } await Attendance.deleteMany({ _id: activity.attendance.map(function getAttendanceIds(element) { @@ -211,6 +166,14 @@ module.exports.removeOne = async function removeOne(req, res) { return res.status(200).json({ data: pick(activity, 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 }) } @@ -223,11 +186,6 @@ module.exports.updateOne = async function updateOne(req, res) { omit(req.body, ['attendance', 'comment']), { new: true } ) - .populate({ - path: 'comment', - select: '_id creator text createdAt', - }) - .select('-__v') .lean() .exec() @@ -236,6 +194,14 @@ module.exports.updateOne = async function updateOne(req, res) { res.status(200).json({ data: pick(activity, 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) res.status(500).json({ message: err.message }) } -- GitLab