diff --git a/website/client/src/components/group-plans/groupPlanSelectionModal.vue b/website/client/src/components/group-plans/groupPlanSelectionModal.vue index 5fb9d21d73..fa25ad40f0 100644 --- a/website/client/src/components/group-plans/groupPlanSelectionModal.vue +++ b/website/client/src/components/group-plans/groupPlanSelectionModal.vue @@ -393,6 +393,8 @@ export default { ...mapState({ user: 'user.data' }), upgradeableGuilds () { return this.userGuilds.filter(group => { + const leaderId = group.leader?._id || group.leader; + if (leaderId !== this.user._id) return false; const plan = group.purchased?.plan; if (!plan?.customerId) return false; if (this.activeGroupPlanIds.includes(group._id)) return false; @@ -421,7 +423,7 @@ export default { try { const [guildsResponse, partyResponse] = await Promise.all([ - axios.get('/api/v4/groups', { params: { type: 'guilds' } }), + axios.get('/api/v4/groups', { params: { type: 'guilds', includeExpiredPlans: 'true' } }), axios.get('/api/v4/groups/party').catch(() => ({ data: { data: null } })), ]); diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index 159adb8466..fd70adc307 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -371,6 +371,10 @@ api.getGroups = { filters.$or.push({ description: searchQuery }); } + if (req.query.includeExpiredPlans === 'true') { + filters.includeExpiredPlans = true; + } + const results = await Group.getGroups({ user, types, diff --git a/website/server/models/group.js b/website/server/models/group.js index 7d181c818e..590e4e1733 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -309,13 +309,16 @@ schema.statics.getGroups = async function getGroups (options = {}) { privacy: 'private', _id: { $in: user.guilds }, 'purchased.plan.customerId': { $exists: true }, - $or: [ + }; + if (!filters.includeExpiredPlans) { + query.$or = [ { 'purchased.plan.dateTerminated': null }, { 'purchased.plan.dateTerminated': { $exists: false } }, { 'purchased.plan.dateTerminated': { $gt: new Date() } }, - ], - }; - _.assign(query, filters); + ]; + } + const filtersWithoutCustom = _.omit(filters, ['includeExpiredPlans']); + _.assign(query, filtersWithoutCustom); const privateGuildsQuery = this.find(query).select(groupFields); if (populateLeader === true) privateGuildsQuery.populate('leader', nameFields); privateGuildsQuery.sort(sort);