diff --git a/services/web/app/src/Features/Project/ProjectController.js b/services/web/app/src/Features/Project/ProjectController.js index 5016651119..f94f9e8eb0 100644 --- a/services/web/app/src/Features/Project/ProjectController.js +++ b/services/web/app/src/Features/Project/ProjectController.js @@ -478,6 +478,7 @@ const ProjectController = { } SubscriptionViewModelBuilder.getBestSubscription( { _id: userId }, + { id: userId, ip: req.ip }, (err, subscription) => { if (err) { // do not fail loading the project list when fetching the best subscription fails diff --git a/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js b/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js index 934179a7f7..bd898eaa84 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js +++ b/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js @@ -340,7 +340,7 @@ function buildUsersSubscriptionViewModel(user, callback) { * @param {{_id: string}} user * @returns {Promise} */ -async function getBestSubscription(user) { +async function getBestSubscription(user, requesterData = {}) { let [ individualSubscription, memberGroupSubscriptions, @@ -350,14 +350,19 @@ async function getBestSubscription(user) { SubscriptionLocator.promises.getMemberSubscriptions(user), InstitutionsGetter.promises.getCurrentInstitutionsWithLicence(user._id), ]) - if (individualSubscription && !individualSubscription.recurly?.state) { + if ( + individualSubscription && + individualSubscription.recurlySubscription_id && + !individualSubscription.recurly?.state + ) { const recurlySubscription = await RecurlyWrapper.promises.getSubscription( individualSubscription.recurlySubscription_id, { includeAccount: true } ) await SubscriptionUpdater.promises.updateSubscriptionFromRecurly( recurlySubscription, - individualSubscription + individualSubscription, + requesterData ) individualSubscription = await SubscriptionLocator.promises.getUsersSubscription(user) diff --git a/services/web/test/unit/src/Subscription/SubscriptionViewModelBuilderTests.js b/services/web/test/unit/src/Subscription/SubscriptionViewModelBuilderTests.js index 94d1441bec..3f1c20d167 100644 --- a/services/web/test/unit/src/Subscription/SubscriptionViewModelBuilderTests.js +++ b/services/web/test/unit/src/Subscription/SubscriptionViewModelBuilderTests.js @@ -27,6 +27,12 @@ describe('SubscriptionViewModelBuilder', function () { }, } + this.individualCustomSubscription = { + planCode: this.planCode, + plan: this.plan, + recurlySubscription_id: this.recurlySubscription_id, + } + this.groupPlanCode = 'group_collaborator_monthly' this.groupPlanFeatures = { compileGroup: 'priority', @@ -123,6 +129,24 @@ describe('SubscriptionViewModelBuilder', function () { }) describe('with a individual subscription only', function () { + it('should return a individual subscription when user has non-Recurly one', async function () { + this.SubscriptionLocator.promises.getUsersSubscription + .withArgs(this.user) + .resolves(this.individualCustomSubscription) + + const usersBestSubscription = + await this.SubscriptionViewModelBuilder.promises.getBestSubscription( + this.user + ) + + assert.deepEqual(usersBestSubscription, { + type: 'individual', + subscription: this.individualCustomSubscription, + plan: this.plan, + remainingTrialDays: -1, + }) + }) + it('should return a individual subscription when user has an active one', async function () { this.SubscriptionLocator.promises.getUsersSubscription .withArgs(this.user) @@ -205,9 +229,11 @@ describe('SubscriptionViewModelBuilder', function () { }) .resolves(this.recurlySubscription) + const requesterData = { id: this.user._id, ip: '1.2.3.4' } const usersBestSubscription = await this.SubscriptionViewModelBuilder.promises.getBestSubscription( - this.user + this.user, + requesterData ) sinon.assert.calledWith( @@ -218,7 +244,8 @@ describe('SubscriptionViewModelBuilder', function () { sinon.assert.calledWith( this.SubscriptionUpdater.promises.updateSubscriptionFromRecurly, this.recurlySubscription, - this.individualSubscriptionWithoutRecurly + this.individualSubscriptionWithoutRecurly, + requesterData ) assert.deepEqual(usersBestSubscription, { type: 'individual',