diff --git a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js index dbb2e00f15..92acf9023f 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js @@ -203,6 +203,16 @@ describe('POST /group/:groupId/join', () => { await expect(invitedUser.get('/user')).to.eventually.have.nested.property('party._id', party._id); }); + it('Issue #12291: accepting a redundant party invite will let the user stay in the party', async () => { + await invitedUser.update({ + 'party._id': party._id, + }); + await expect(invitedUser.get('/user')).to.eventually.have.nested.property('party._id', party._id); + await invitedUser.post(`/groups/${party._id}/join`); + + await expect(invitedUser.get('/user')).to.eventually.have.nested.property('party._id', party._id); + }); + it('notifies inviting user that their invitation was accepted', async () => { await invitedUser.post(`/groups/${party._id}/join`); diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index ed3434c158..6b0d51b2d0 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -544,20 +544,23 @@ api.joinGroup = { // Check if was invited to party const inviterParty = _.find(user.invitations.parties, { id: group._id }); if (inviterParty) { - inviter = inviterParty.inviter; + // Check if the user is already a member of the party or not. Only make the user leave the + // party if the user is not a member of the party. See #12291 for more details. + if (user.party._id !== group._id) { + inviter = inviterParty.inviter; - // If user was in a different party (when partying solo you can be invited to a new party) - // make them leave that party before doing anything - if (user.party._id) { - const userPreviousParty = await Group.getGroup({ user, groupId: user.party._id }); + // If user was in a different party (when partying solo you can be invited to a new party) + // make them leave that party before doing anything + if (user.party._id) { + const userPreviousParty = await Group.getGroup({ user, groupId: user.party._id }); - if (userPreviousParty.memberCount === 1 && user.party.quest.key) { - throw new NotAuthorized(res.t('messageCannotLeaveWhileQuesting')); + if (userPreviousParty.memberCount === 1 && user.party.quest.key) { + throw new NotAuthorized(res.t('messageCannotLeaveWhileQuesting')); + } + + if (userPreviousParty) await userPreviousParty.leave(user); } - - if (userPreviousParty) await userPreviousParty.leave(user); } - // Clear all invitations of new user user.invitations.parties = []; user.invitations.party = {};