diff --git a/test/api/v3/integration/groups/POST-groups_groupId_leave.js b/test/api/v3/integration/groups/POST-groups_groupId_leave.js index ae16fb256e..60d6ee6bd2 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_leave.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_leave.js @@ -65,6 +65,19 @@ describe('POST /groups/:groupId/leave', () => { expect(groupToLeave.leader).to.equal(member._id); }); + it('removes new messages for that group from user', async () => { + await member.post(`/groups/${groupToLeave._id}/chat`, { message: 'Some message' }); + + await leader.sync(); + + expect(leader.newMessages[groupToLeave._id]).to.not.be.empty; + + await leader.post(`/groups/${groupToLeave._id}/leave`); + await leader.sync(); + + expect(leader.newMessages[groupToLeave._id]).to.be.empty; + }); + context('With challenges', () => { let challenge; @@ -122,6 +135,8 @@ describe('POST /groups/:groupId/leave', () => { privateGuild = group; leader = groupLeader; invitedUser = invitees[0]; + + await leader.post(`/groups/${group._id}/chat`, { message: 'Some message' }); }); it('removes a group when the last member leaves', async () => { diff --git a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js index e86a4aadf7..281d179baf 100644 --- a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js +++ b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js @@ -87,6 +87,7 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { let partyLeader; let partyInvitedUser; let partyMember; + let removedMember; beforeEach(async () => { let { group, groupLeader, invitees, members } = await createAndPopulateGroup({ @@ -96,13 +97,14 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { privacy: 'private', }, invites: 1, - members: 1, + members: 2, }); party = group; partyLeader = groupLeader; partyInvitedUser = invitees[0]; partyMember = members[0]; + removedMember = members[1]; }); it('can remove other members', async () => { @@ -129,6 +131,18 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { expect(invitedUserWithoutInvite.invitations.party).to.be.empty; }); + it('removes new messages from a member who is removed', async () => { + await partyLeader.post(`/groups/${party._id}/chat`, { message: 'Some message' }); + await removedMember.sync(); + + expect(removedMember.newMessages[party._id]).to.not.be.empty; + + await partyLeader.post(`/groups/${party._id}/removeMember/${removedMember._id}`); + await removedMember.sync(); + + expect(removedMember.newMessages[party._id]).to.be.empty; + }); + it('removes user from quest when removing user from party after quest starts', async () => { let petQuest = 'whale'; await partyLeader.update({ diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index a638c819be..65446652ac 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -380,6 +380,13 @@ api.rejectGroupInvite = { }, }; +function _removeMessagesFromMember (member, groupId) { + if (member.newMessages[groupId]) { + delete member.newMessages[groupId]; + member.markModified('newMessages'); + } +} + /** * @api {post} /api/v3/groups/:groupId/leave Leave a group * @apiName LeaveGroup @@ -398,7 +405,6 @@ api.leaveGroup = { middlewares: [authWithHeaders()], async handler (req, res) { let user = res.locals.user; - req.checkParams('groupId', res.t('groupIdRequired')).notEmpty(); // When removing the user from challenges, should we keep the tasks? req.checkQuery('keep', res.t('keepOrRemoveAll')).optional().isIn(['keep-all', 'remove-all']); @@ -412,7 +418,7 @@ api.leaveGroup = { throw new NotFound(res.t('groupNotFound')); } - // During quests, checke wheter user can leave + // During quests, check if user can leave if (group.type === 'party') { if (group.quest && group.quest.leader === user._id) { throw new NotAuthorized(res.t('questLeaderCannotLeaveGroup')); @@ -424,6 +430,11 @@ api.leaveGroup = { } await group.leave(user, req.query.keep); + + _removeMessagesFromMember(user, group._id); + + await user.save(); + res.respond(200, {}); }, }; @@ -518,10 +529,7 @@ api.removeGroupMember = { member.party._id = undefined; // TODO remove quest information too? Use group.leave()? } - if (member.newMessages[group._id]) { - member.newMessages[group._id] = undefined; - member.markModified('newMessages'); - } + _removeMessagesFromMember(member, group._id); if (group.quest && group.quest.active && group.quest.leader === member._id) { member.items.quests[group.quest.key] += 1;