From 1c719a8dbb409efc3f696d52f978f252293aad84 Mon Sep 17 00:00:00 2001 From: nikosmonaut Date: Sat, 14 Dec 2019 14:53:54 +0100 Subject: [PATCH 1/2] Unlink group tags when a user leaves it --- website/server/models/group.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/website/server/models/group.js b/website/server/models/group.js index 805532f280..85b46a09bf 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -1345,6 +1345,8 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all', keepC .map(task => this.unlinkTask(task, user, keep, false)); await Promise.all(assignedTasksToRemoveUserFrom); + this.unlinkTags(user); + // the user could be modified by calls to `unlinkTask` for challenge and group tasks // it has not been saved before to avoid multiple saves in parallel const promises = user.isModified() ? [user.save()] : []; @@ -1407,6 +1409,15 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all', keepC return Promise.all(promises); }; +schema.methods.unlinkTags = function unlinkTags (user) { + const group = this; + user.tags.forEach(tag => { + if (tag.group && tag.group === group._id) { + tag.group = undefined; + } + }); +}; + /** * Updates all linked tasks for a group task * From 8c6938022c1f83907a660ee77017bcabe39d7413 Mon Sep 17 00:00:00 2001 From: nikosmonaut Date: Mon, 30 Dec 2019 15:22:11 +0100 Subject: [PATCH 2/2] Add test for leaving group After leaving group the previous associated tag should no more be bound to this group. --- test/api/unit/models/group.test.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/api/unit/models/group.test.js b/test/api/unit/models/group.test.js index b96d7f9297..4e22dd161c 100644 --- a/test/api/unit/models/group.test.js +++ b/test/api/unit/models/group.test.js @@ -1164,6 +1164,23 @@ describe('Group Model', () => { }); }); + it('unlink group tag', async () => { + participatingMember.tags.push({ + name: party.name, + id: party._id, + group: party._id, + }); + + await participatingMember.save(); + await party.leave(participatingMember); + + participatingMember = await User.findOne({ _id: participatingMember._id }); + const groupTag = participatingMember.tags.find(tag => tag.id === party._id); + + expect(groupTag).to.not.be.undefined; + expect(groupTag.group).to.be.undefined; + }); + it('deletes a private party when the last member leaves', async () => { await party.leave(participatingMember); await party.leave(sleepingParticipatingMember);