diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index f00e90f497..ed3434c158 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -603,7 +603,14 @@ api.joinGroup = { group.leader = user._id; // If new user is only member -> set as leader } - group.memberCount += 1; + if (group.type === 'party') { + // For parties we count the number of members from the database to get the correct value. + // See #12275 on why this is necessary and only done for parties. + const currentMembers = await group.getMemberCount(); + group.memberCount = currentMembers + 1; + } else { + group.memberCount += 1; + } let promises = [group.save(), user.save()]; @@ -948,7 +955,14 @@ api.removeGroupMember = { } if (isInGroup) { - group.memberCount -= 1; + // For parties we count the number of members from the database to get the correct value. + // See #12275 on why this is necessary and only done for parties. + if (group.type === 'party') { + const currentMembers = await group.getMemberCount(); + group.memberCount = currentMembers - 1; + } else { + group.memberCount -= 1; + } if (group.quest && group.quest.leader === member._id) { group.quest.key = undefined; diff --git a/website/server/models/group.js b/website/server/models/group.js index 237c6f6989..996be822a0 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -1415,23 +1415,12 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all', keepC } else { members = await User.find({ 'party._id': group._id }).select('_id').exec(); } - _.remove(members, { _id: user._id }); if (members.length === 0) { promises.push(group.remove()); return Promise.all(promises); } - // otherwise If the leader is leaving - // (or if the leader previously left, and this wasn't accounted for) - } else if (group.leader === user._id) { - const query = group.type === 'party' ? { 'party._id': group._id } : { guilds: group._id }; - query._id = { $ne: user._id }; - const seniorMember = await User.findOne(query).select('_id').exec(); - - // could be missing in case of public guild (that can have 0 members) - // with 1 member who is leaving - if (seniorMember) update.$set = { leader: seniorMember._id }; } // otherwise If the leader is leaving // (or if the leader previously left, and this wasn't accounted for) @@ -1720,13 +1709,7 @@ schema.methods.hasCancelled = function hasCancelled () { schema.methods.updateGroupPlan = async function updateGroupPlan (removingMember) { // Recheck the group plan count - let members; - if (this.type === 'guild') { - members = await User.find({ guilds: this._id }).select('_id').exec(); - } else { - members = await User.find({ 'party._id': this._id }).select('_id').exec(); - } - this.memberCount = members.length; + this.memberCount = await this.getMemberCount(); if (this.purchased.plan.paymentMethod === stripePayments.constants.PAYMENT_METHOD) { await stripePayments.chargeForAdditionalGroupMember(this);