From 700a6ddd9e1446de5f71def86dcff6c32f993186 Mon Sep 17 00:00:00 2001 From: TheHollidayInn Date: Fri, 4 Sep 2015 14:44:47 -0500 Subject: [PATCH] Remove users inviations when guild is deleted --- test/api/groups.coffee | 45 +++++++++++++++++++++++++++++++ website/src/controllers/groups.js | 21 ++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/test/api/groups.coffee b/test/api/groups.coffee index 2c2674bbdf..5240d4c4c4 100644 --- a/test/api/groups.coffee +++ b/test/api/groups.coffee @@ -172,6 +172,51 @@ describe "Guilds", -> cb() ], done + it "deletes all invites to a group when the last member leaves", (done) -> + groupToDeleteAfterLeave = undefined + userToRemoveInvite = undefined + request.post(baseURL + "/groups").send( + name: "TestGroupToDeleteAfteLeave" + type: "guild" + privacy: "private" + ).end (res) -> + groupToDeleteAfterLeave = res.body + async.waterfall [ + (cb) -> + registerManyUsers 1, cb + + (_members, cb) -> + userToRemoveInvite = _members[0] + inviteURL = baseURL + "/groups/" + groupToDeleteAfterLeave._id + "/invite" + request.post(inviteURL).send( + uuids: [userToRemoveInvite._id] + ) + .end -> + cb() + + (cb) -> + request.post(baseURL + "/groups/" + groupToDeleteAfterLeave._id + "/leave") + .end (res) -> + expectCode res, 204 + cb() + + (cb) -> + request.get(baseURL + '/user') + .set("X-API-User", userToRemoveInvite._id) + .set("X-API-Key", userToRemoveInvite.apiToken) + .end (err, res) -> + expectCode res, 200 + groupInvitation = _.find(res.body.invitations.guilds, {id: groupToDeleteAfterLeave._id}) + expect(groupInvitation).to.not.exist + cb() + + (cb) -> + request.post(baseURL + "/groups/" + groupToDeleteAfterLeave._id) + .end (res) -> + expectCode res, 404 + cb() + ], done + context "removing users groups", -> it "allows guild leaders to remove a member (but not themselves)", (done) -> guildToRemoveMember = undefined diff --git a/website/src/controllers/groups.js b/website/src/controllers/groups.js index 774037b8c0..95f27d0c6a 100644 --- a/website/src/controllers/groups.js +++ b/website/src/controllers/groups.js @@ -577,7 +577,26 @@ api.leave = function(req, res, next) { } else if (group.members.length === 1) { //We don't delete public groups when they are empty if (group.privacy === 'private' || group.type === 'party') { - 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) { + Group.remove({_id:group._id}, cb2); + }, + ], cb); } } }