diff --git a/website/src/controllers/groups.js b/website/src/controllers/groups.js index bf9bf0397c..64b45da0e8 100644 --- a/website/src/controllers/groups.js +++ b/website/src/controllers/groups.js @@ -511,97 +511,8 @@ api.leave = function(req, res, next) { // When removing the user from challenges, should we keep the tasks? var keep = (/^remove-all/i).test(req.query.keep) ? 'remove-all' : 'keep-all'; - async.parallel([ - // Remove active quest from user if they're leaving the party - function(cb){ - if (group.type != 'party') return cb(null,{},1); - user.party.quest = Group.cleanQuestProgress(); - user.save(cb); - }, - // Remove user from group challenges - function(cb){ - async.waterfall([ - // Find relevant challenges - function(cb2) { - Challenge.find({ - _id: {$in: user.challenges}, // Challenges I am in - group: group._id // that belong to the group I am leaving - }, cb2); - }, - // Update each challenge - function(challenges, cb2) { - Challenge.update( - {_id:{$in: _.pluck(challenges, '_id')}}, - {$pull:{members:user._id}}, - {multi: true}, - function(err) { - cb2(err, challenges); // pass `challenges` above to cb - } - ); - }, - // Unlink the challenge tasks from user - function(challenges, cb2) { - async.waterfall(challenges.map(function(chal) { - return function(cb3) { - var i = user.challenges.indexOf(chal._id) - if (~i) user.challenges.splice(i,1); - user.unlink({cid:chal._id, keep:keep}, cb3); - } - }), cb2); - } - ], cb); - }, - // Update the group - function(cb){ - var update = {$pull:{members:user._id}}; - if (group.type == 'party' && group.quest.key){ - update['$unset'] = {}; - update['$unset']['quest.members.' + user._id] = 1; - } - // FIXME do we want to remove the group `if group.members.length == 0` ? (well, 1 since the update hasn't gone through yet) - if (group.members.length > 1) { - var seniorMember = _.find(group.members, function (m) {return m != user._id}); - // If the leader is leaving (or if the leader previously left, and this wasn't accounted for) - var leader = group.leader; - if (leader == user._id || !~group.members.indexOf(leader)) { - update['$set'] = update['$set'] || {}; - update['$set'].leader = seniorMember; - } - leader = group.quest && group.quest.leader; - if (leader && (leader == user._id || !~group.members.indexOf(leader))) { - update['$set'] = update['$set'] || {}; - update['$set']['quest.leader'] = seniorMember; - } - update['$inc'] = {memberCount: -1}; - Group.update({_id:group._id}, update, cb); - } - if (group.members.length === 1 && (group.privacy === 'private' || group.type === 'party') ) { - async.waterfall([ - function(cb2) { - User.find({ - 'invitations.guilds.id': group._id - }, cb2); - }, - function(users, cb2) { - if (users) { - users.forEach(function (user, index, array) { - var i = _.findIndex(user.invitations.guilds, {id: group._id}); - user.invitations.guilds.splice(i, 1); - user.save(); - }); - } - cb2(); - }, - function(cb2) { - Group.remove({_id:group._id}, cb2); - }, - ], cb); - } else { - update['$inc'] = {memberCount: -1}; - Group.update({_id:group._id}, update, cb); - } - } - ],function(err){ + + group.leave(user, keep, function(err){ if (err) return next(err); user = group = keep = null; return res.send(204); diff --git a/website/src/models/group.js b/website/src/models/group.js index 5f79f46a89..32fe6bd7a3 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -359,7 +359,7 @@ GroupSchema.methods.leave = function(user, keep, mainCb){ var group = this; var groupWasRemoved = false; - + async.parallel([ // Remove user from group challenges function(cb){ @@ -404,11 +404,29 @@ GroupSchema.methods.leave = function(user, keep, mainCb){ group.type === 'party' || (group.type === 'guild' && group.privacy === 'private') )){ - // TODO remove invitations to this group - groupWasRemoved = true; - Group.remove({ - _id: group._id - }, cb); + async.waterfall([ + function(cb2) { + User.find({ + 'invitations.guilds.id': group._id + }, cb2); + }, + function(users, cb2) { + if (users) { + users.forEach(function (user, index, array) { + var i = _.findIndex(user.invitations.guilds, {id: group._id}); + user.invitations.guilds.splice(i, 1); + user.save(); + }); + } + cb2(); + }, + function(cb2) { + groupWasRemoved = true; + Group.remove({ + _id: group._id + }, cb2); + }, + ], cb); }else{ // otherwise just remove a member var update = {$pull: {members: user._id}}; @@ -468,4 +486,4 @@ Group.count({_id: 'habitrpg'}, function(err, ct){ type: 'guild', privacy: 'public' }).save(); -}); \ No newline at end of file +});