diff --git a/test/api/groups.coffee b/test/api/groups.coffee index 5240d4c4c4..b5a4fa2765 100644 --- a/test/api/groups.coffee +++ b/test/api/groups.coffee @@ -172,11 +172,11 @@ describe "Guilds", -> cb() ], done - it "deletes all invites to a group when the last member leaves", (done) -> + it "deletes all invites to a group (guild) when the last member leaves", (done) -> groupToDeleteAfterLeave = undefined userToRemoveInvite = undefined request.post(baseURL + "/groups").send( - name: "TestGroupToDeleteAfteLeave" + name: "TestGroupToDeleteAfterLeave" type: "guild" privacy: "private" ).end (res) -> @@ -217,6 +217,53 @@ describe "Guilds", -> cb() ], done + it "deletes all invites to a group (party) when the last member leaves", (done) -> + partyToDeleteAfterLeave = undefined + userToRemovePartyInvite = undefined + request.post(baseURL + "/groups").send( + name: "TestPartyToDeleteAfterLeave" + type: "party" + ).end (res) -> + partyToDeleteAfterLeave = res.body + async.waterfall [ + (cb) -> + registerManyUsers 1, cb + + (_members, cb) -> + userToRemovePartyInvite = _members[0] + inviteURL = baseURL + "/groups/" + partyToDeleteAfterLeave._id + "/invite" + request.post(inviteURL).send( + uuids: [userToRemovePartyInvite._id] + ) + .end -> + cb() + + (cb) -> + request.post(baseURL + "/groups/" + partyToDeleteAfterLeave._id + "/leave") + .end (res) -> + expectCode res, 204 + cb() + + (cb) -> + request.get(baseURL + '/user') + .set("X-API-User", userToRemovePartyInvite._id) + .set("X-API-Key", userToRemovePartyInvite.apiToken) + .end (err, res) -> + expectCode res, 200 + party = partyToDeleteAfterLeave + partyInvitation = _.find(res.body.invitations.party, (invite) -> + return invite == party._id + ) + expect(partyInvitation).to.not.exist + cb() + + (cb) -> + request.post(baseURL + "/groups/" + partyToDeleteAfterLeave._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/models/group.js b/website/src/models/group.js index 602c57bbc9..e6da96c7bc 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -87,23 +87,46 @@ GroupSchema.pre('save', function(next){ GroupSchema.pre('remove', function(next) { var group = this; - async.waterfall([ - function(cb) { - User.find({ - 'invitations.guilds.id': group._id - }, cb); - }, - function(users, cb) { - 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(); - }); + if ( group.type == "guild" ) { + async.waterfall([ + function(cb) { + User.find({ + 'invitations.guilds.id': group._id + }, cb); + }, + function(users, cb) { + 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(); + }); + } + cb(); } - cb(); - } - ], next); + ], next); + } else if ( group.type == "party" ) { + async.waterfall([ + function(cb) { + User.find({ + 'invitations.party.id': group._id + }, cb); + }, + function(users, cb) { + if (users) { + users.forEach(function (user, index, array) { + if (user.invitations.party.id === group._id) { + user.invitations.party = {}; + } + user.save(); + }); + } + cb(); + } + ], next); + } + + }); GroupSchema.post('remove', function(group) {