From 80dbc1111e231cce0ae9eb25f84d49049162b77a Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 11 Jul 2014 16:29:42 -0600 Subject: [PATCH] fix(quests): when leaving group, if leader or quest.leader is leaving, re-assign to most senior member. #3709 --- public/js/controllers/groupsCtrl.js | 6 +++--- src/controllers/groups.js | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index fb25ae5bcb..ca062e95e8 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -304,14 +304,14 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' $scope.create = function(group){ group.$save(function(){ - $rootScope.hardRedirect('/#/options/social/party'); + $rootScope.hardRedirect('/#/options/groups/party'); }); } $scope.join = function(party){ var group = new Groups.Group({_id: party.id, name: party.name}); group.$join(function(){ - $rootScope.hardRedirect('/#/options/social/party'); + $rootScope.hardRedirect('/#/options/groups/party'); }); } @@ -322,7 +322,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' $scope.popoverEl.popover('destroy'); } else { Groups.Group.leave({gid: $scope.selectedGroup._id, keep:keep}, undefined, function(){ - $rootScope.hardRedirect('/#/options/social/party'); + $rootScope.hardRedirect('/#/options/groups/party'); }); } } diff --git a/src/controllers/groups.js b/src/controllers/groups.js index ebb0970f9e..d867f0048d 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -367,12 +367,29 @@ api.leave = function(req, res, next) { } ], 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); } ],function(err){