diff --git a/test/api/v3/unit/libs/payments/amazon/subscribe.test.js b/test/api/v3/unit/libs/payments/amazon/subscribe.test.js index 930c64d06a..b0ae072880 100644 --- a/test/api/v3/unit/libs/payments/amazon/subscribe.test.js +++ b/test/api/v3/unit/libs/payments/amazon/subscribe.test.js @@ -216,6 +216,9 @@ describe('Amazon Payments - Subscribe', () => { }); it('subscribes with amazon', async () => { + user.guilds.push(groupId); + await user.save(); + await amzLib.subscribe({ billingAgreementId, sub, @@ -241,8 +244,13 @@ describe('Amazon Payments - Subscribe', () => { user = new User(); user.guilds.push(groupId); await user.save(); - group.memberCount = 2; - await group.save(); + + // Add existing users + user = new User(); + user.guilds.push(groupId); + await user.save(); + + // Set expected amount sub.key = 'group_monthly'; sub.price = 9; amount = 12; diff --git a/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js b/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js index 7271b1dbd3..411acbedaf 100644 --- a/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js +++ b/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js @@ -227,6 +227,11 @@ describe('checkout with subscription', () => { sub = data.sub; groupId = group._id; email = 'test@test.com'; + + // Add user to group + user.guilds.push(groupId); + await user.save(); + headers = {}; await stripePayments.checkout({ @@ -267,9 +272,15 @@ describe('checkout with subscription', () => { groupId = group._id; email = 'test@test.com'; headers = {}; + + // Add user to group + user.guilds.push(groupId); + await user.save(); + user = new User(); user.guilds.push(groupId); await user.save(); + group.memberCount = 2; await group.save(); diff --git a/website/server/libs/amazonPayments.js b/website/server/libs/amazonPayments.js index f71185526f..75ccddcecc 100644 --- a/website/server/libs/amazonPayments.js +++ b/website/server/libs/amazonPayments.js @@ -270,10 +270,10 @@ api.subscribe = async function subscribe (options) { let priceOfSingleMember = 3; if (groupId) { - let groupFields = basicGroupFields.concat(' purchased'); - let group = await Group.getGroup({user, groupId, populateLeader: false, groupFields}); - - amount = sub.price + (group.memberCount - leaderCount) * priceOfSingleMember; + const groupFields = basicGroupFields.concat(' purchased'); + const group = await Group.getGroup({user, groupId, populateLeader: false, groupFields}); + const membersCount = await group.getMemberCount(); + amount = sub.price + (membersCount - leaderCount) * priceOfSingleMember; } await this.setBillingAgreementDetails({ diff --git a/website/server/libs/stripePayments.js b/website/server/libs/stripePayments.js index 63b2041ca3..7cf6c0b75e 100644 --- a/website/server/libs/stripePayments.js +++ b/website/server/libs/stripePayments.js @@ -97,9 +97,10 @@ api.checkout = async function checkout (options, stripeInc) { if (groupId) { customerObject.quantity = sub.quantity; - let groupFields = basicGroupFields.concat(' purchased'); - let group = await Group.getGroup({user, groupId, populateLeader: false, groupFields}); - customerObject.quantity = group.memberCount + sub.quantity - 1; + const groupFields = basicGroupFields.concat(' purchased'); + const group = await Group.getGroup({user, groupId, populateLeader: false, groupFields}); + const membersCount = await group.getMemberCount(); + customerObject.quantity = membersCount + sub.quantity - 1; } response = await stripeApi.customers.create(customerObject); diff --git a/website/server/models/group.js b/website/server/models/group.js index 45c7c99235..3a0e8df2c5 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -442,6 +442,16 @@ schema.methods.isMember = function isGroupMember (user) { } }; +schema.methods.getMemberCount = async function getMemberCount () { + let query = { guilds: this._id }; + + if (this.type === 'party') { + query = { 'party._id': this._id }; + } + + return await User.count(query).exec(); +}; + export function chatDefaults (msg, user) { let message = { id: shared.uuid(),