diff --git a/server/controllers/LearnerController.js b/server/controllers/LearnerController.js index 3a7e960..c3ed4c2 100644 --- a/server/controllers/LearnerController.js +++ b/server/controllers/LearnerController.js @@ -24,7 +24,7 @@ module.exports = { await learner.save(); if (learner.mentor) throw new Error('Learner already has a mentor'); let mentor = (await Mentor.aggregate() - .match({ isAvailable: true, isValidated: true }) + .match({ isAvailable: true, isValidated: true, _id: { $nin: learner.noAssociations } }) .group({ _id: '$_id', size: { $max: '$learners' }, @@ -77,10 +77,12 @@ module.exports = { if (!learner.mentor) throw new Error('Learner does not have a mentor'); await Mentor.findByIdAndUpdate(learner.mentor, { $pull: { learners: learner._id }, + $push: { noAssociations: learner._id }, isAvailable: false, }); const oldMentor = learner.mentor; const mentorMail = await Mentor.findById(learner.mentor); + learner.noAssociations.push(learner.mentor); learner.mentor = null; await learner.save(); const data = mail.unassignMentor(req.user.email, req.user.name, mentorMail.name, mentorMail.gender); // eslint-disable-line max-len @@ -101,13 +103,24 @@ module.exports = { const hasLearnerCertificate = reqUser.courseCertificates.length > 0; if (!hasLearnerCertificate) throw new Error('User did not conclude Tutorial'); - - const user = await User.findOneAndUpdate( - { _id }, - { $set: { userType: 'Mentor' } }, { new: true }, + if (reqUser.mentor) { + await User.findOneAndUpdate({ _id }, { + $pull: { learners: reqUser._id }, + $push: { noAssociations: reqUser._id }, + isAvailable: false, + }); + reqUser.noAssociations.push(reqUser.mentor); + reqUser.mentor = null; + reqUser.save(); + } + const user = await User.findByIdAndUpdate( + _id, + { + $set: { userType: 'Mentor' }, + mentor_request: false, + }, { new: true }, ); user.isValidated = true; - user.mentor_request = false; user.save(); const data = mail.learnerPromotion(user.email, user.name); await transport.sendMail(data); diff --git a/server/controllers/MentorController.js b/server/controllers/MentorController.js index f9ceb2e..12e1c4c 100644 --- a/server/controllers/MentorController.js +++ b/server/controllers/MentorController.js @@ -21,13 +21,21 @@ module.exports = { async assignLearner(req, res) { const { user } = req; + if (!user.isValidated) throw new Error('Mentor not validated'); user.isAvailable = true; try { await user.save(); const learner = ( - await Learner.find({ mentor_request: true, mentor: null }).sort({ - createdAt: 'asc', + await Learner.find({ + mentor_request: true, + mentor: null, + _id: { + $nin: user.noAssociations, + }, }) + .sort({ + createdAt: 'asc', + }) )[0]; if (!learner) throw new Error("There's no available learners"); learner.mentor = user._id; @@ -66,8 +74,10 @@ module.exports = { const learner = await Learner.findByIdAndUpdate(learnerID, { mentor: null, mentor_request: false, + $push: { noAssociations: user._id }, }, { new: true }); + user.noAssociations.push(learnerID); await user.save(); await user.execPopulate('learners'); const data = mail.unassignMentor(learner.email, learner.name, user.name, user.gender); diff --git a/server/models/User.js b/server/models/User.js index acd3ab3..43b9a1a 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -45,10 +45,11 @@ const UserSchema = new Schema( type: Boolean, select: false, }, - noAssociations: { - type: [String], + noAssociations: [{ + type: mongoose.Schema.Types.ObjectId, + ref: 'blacklistedUser', select: false, - }, + }], courseCertificates: [{ type: mongoose.Schema.Types.ObjectId, ref: 'courseCertificate',