diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index 890c625892..6d70859922 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -192,7 +192,6 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A var group = new Groups.Group({_id: party.id, name: party.name}); // there a better way to access GroupsCtrl.groups.party? group.$join(function(){ - User.user.invitations.party = undefined; location.reload(); }); } diff --git a/src/controllers/groups.js b/src/controllers/groups.js index bafd4e015d..5a7fdf1ed4 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -49,16 +49,12 @@ api.getGroups = function(req, res, next) { if (type && !~type.indexOf('party')) return cb(null, {}); Group .findOne({type: 'party', members: {'$in': [user._id]}}) - .populate({ - path: 'members', - //match: {_id: {$ne: user._id}}, //fixme this causes it to hang?? - select: partyFields - }) + .populate('members invites', partyFields) .exec(cb); }, guilds: function(cb) { if (type && !~type.indexOf('guilds')) return cb(null, []); - Group.find({type: 'guild', members: {'$in': [user._id]}}).populate('members', usernameFields).exec(cb); + Group.find({type: 'guild', members: {'$in': [user._id]}}).populate('members invites', usernameFields).exec(cb); // Group.find({type: 'guild', members: {'$in': [user._id]}}, cb); }, tavern: function(cb) { @@ -101,7 +97,7 @@ api.getGroup = function(req, res, next) { var user = res.locals.user; var gid = req.params.gid; - Group.findById(gid).populate('members', partyFields).exec(function(err, group){ + Group.findById(gid).populate('members invites', partyFields).exec(function(err, group){ if ( (group.type == 'guild' && group.privacy == 'private') || group.type == 'party') { if(!_.find(group.members, {_id: user._id})) return res.json(401, {err: "You don't have access to this group"}); @@ -156,7 +152,7 @@ api.updateGroup = function(req, res, next) { function(cb){group.save(cb);}, function(cb){ var fields = group.type == 'party' ? partyFields : usernameFields; - Group.findById(group._id).populate('members', fields).exec(cb); + Group.findById(group._id).populate('members invites', fields).exec(cb); } ], function(err, results){ if (err) return res.json(500,{err:err}); @@ -197,7 +193,7 @@ api.postChat = function(req, res, next) { async.series([ function(cb){group.save(cb)}, function(cb){ - Group.findById(group._id).populate('members', partyFields).exec(cb); + Group.findById(group._id).populate('members invites', partyFields).exec(cb); } ], function(err, results){ if (err) return res.json(500, {err:err}); @@ -244,12 +240,13 @@ api.join = function(req, res, next) { } group.members.push(user._id); + group.invites.splice(_.indexOf(group.invites, user._id), 1); async.series([ function(cb){ group.save(cb); }, function(cb){ - Group.findById(group._id).populate('members', partyFields).exec(cb); + Group.findById(group._id).populate('members invites', partyFields).exec(cb); } ], function(err, results){ if (err) return res.json(500,{err:err}); @@ -274,6 +271,7 @@ api.leave = function(req, res, next) { api.invite = function(req, res, next) { var group = res.locals.group; var uuid = req.query.uuid; + var user = res.locals.user; User.findById(uuid, function(err,invite){ if (err) return res.json(500,{err:err}); @@ -293,7 +291,7 @@ api.invite = function(req, res, next) { if (!_.isEmpty(groups)) return res.json(400,{err:"User already in a party."}) sendInvite(); - }) + }); } function sendInvite (){ @@ -304,13 +302,26 @@ api.invite = function(req, res, next) { invite.invitations.party = {id: group._id, name: group.name} } - invite.save(); - Group.findById(group._id) - .populate('members', partyFields).exec(function(err, saved){ - if (group.type === 'party') removeSelf(saved, res.locals.user); - res.json(saved); - }); + group.invites.push(invite._id); + async.series([ + function(cb){ + invite.save(cb); + }, + function(cb){ + group.save(cb); + }, + function(cb){ + Group.findById(group._id).populate('members invites', partyFields).exec(cb); + } + ], function(err, results){ + if (err) return res.json(500,{err:err}); + + // Remove self from party (see above failing `match` directive in `populate` + if(results[2].type == 'party') removeSelf(results[2], user); + + res.json(results[2]); + }); } }); } @@ -327,7 +338,35 @@ api.removeMember = function(req, res, next){ if(_.contains(group.members, uuid)){ Group.update({_id:group._id},{$pull:{members:uuid}}, function(err, saved){ if (err) return res.json(500,{err:err}); - return res.json(saved); + + // Sending an empty 204 because Group.update doesn't return the group + // see http://mongoosejs.com/docs/api.html#model_Model.update + res.send(204); + }); + }else if(_.contains(group.invites, uuid)){ + User.findById(uuid, function(err,invited){ + var invitations = invited.invitations; + if(group.type === 'guild'){ + invitations.guilds.splice(_.indexOf(invitations.guilds, group._id), 1); + }else{ + invitations.party = undefined; + } + + async.series([ + function(cb){ + invited.save(cb); + }, + function(cb){ + Group.update({_id:group._id},{$pull:{invites:uuid}}, cb); + } + ], function(err, results){ + if (err) return res.json(500,{err:err}); + + // Sending an empty 204 because Group.update doesn't return the group + // see http://mongoosejs.com/docs/api.html#model_Model.update + res.send(204); + }); + }); }else{ return res.json(400, {err: "User not found among group's members!"}); diff --git a/views/options/groups/group.jade b/views/options/groups/group.jade index 283fcacb26..c8c08f4ef0 100644 --- a/views/options/groups/group.jade +++ b/views/options/groups/group.jade @@ -57,14 +57,24 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank' td // allow leaders to ban members div(ng-show='group.leader == user.id && user.id!=member._id') - // {{#with group.members[$index]}} a(ng-click='removeMember(group, member)') i.icon-ban-circle(tooltip='Boot Member') - // {{/}} - a(data-toggle='modal', data-target='#avatar-modal-{{member._id}}') + a span(ng-class='{"badge badge-info": group.leader==member._id}', ng-click='clickMember(member._id, true)') | {{username(member.auth, member.profile.name)}} td ({{member._id}}) + h4(ng-show='group.invites.length > 0') Invited + table.table.table-striped + tr(ng-repeat='invite in group.invites') + td + // allow leaders to ban members + div(ng-show='group.leader == user.id') + a(ng-click='removeMember(group, invite)') + i.icon-ban-circle(tooltip='Boot Member') + a + span(ng-click='clickMember(invite._id, true)') + | {{username(invite.auth, invite.profile.name)}} + td ({{invite._id}}) .modal-footer.whatever-options form.form-inline(ng-submit='invite(group)') //.alert.alert-danger(ng-show='_groupError') {{_groupError}}