diff --git a/test/api/unit/models/group.test.js b/test/api/unit/models/group.test.js index 134204b6a9..5bb1967d92 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); diff --git a/website/server/models/group.js b/website/server/models/group.js index dbdcee2d60..de9704c4ea 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 *