delete unread messages when a user leaves a group

closes #7955
closes #7965
This commit is contained in:
Thomas Gamble
2016-09-01 19:32:09 -04:00
committed by Blade Barringer
parent 8bb92577b0
commit cb38475765
3 changed files with 44 additions and 7 deletions

View File

@@ -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 () => {

View File

@@ -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({

View File

@@ -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;