From a29280a1fec0c13f32ab772ca0c2b2d344f2ce92 Mon Sep 17 00:00:00 2001 From: M Fahru Date: Thu, 17 Apr 2025 07:37:15 -0700 Subject: [PATCH] Merge pull request #24833 from overleaf/kh-add-stripe-get-subscription [web] fetch Stripe subscription GitOrigin-RevId: bffc31224aece584f4f1e3294bb1285d17f99195 --- .../src/Features/Subscription/PlansLocator.js | 18 ++++++++++++++++++ .../SubscriptionViewModelBuilder.js | 4 ++++ .../acceptance/src/helpers/Subscription.mjs | 1 + .../unit/src/Subscription/PlansLocatorTests.js | 16 ++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/services/web/app/src/Features/Subscription/PlansLocator.js b/services/web/app/src/Features/Subscription/PlansLocator.js index 937d2d3ccb..905fa7e7da 100644 --- a/services/web/app/src/Features/Subscription/PlansLocator.js +++ b/services/web/app/src/Features/Subscription/PlansLocator.js @@ -36,6 +36,15 @@ const recurlyPlanCodeToStripeLookupKey = { student_free_trial_7_days: 'student_monthly', } +const stripeLookupKeyToRecurlyPlanCode = { + professional_annual: 'professional-annual', + professional_monthly: 'professional', + standard_annual: 'collaborator-annual', + standard_monthly: 'collaborator', + student_annual: 'student-annual', + student_monthly: 'student', +} + /** * * @param {RecurlyPlanCode} recurlyPlanCode @@ -45,6 +54,14 @@ function mapRecurlyPlanCodeToStripeLookupKey(recurlyPlanCode) { return recurlyPlanCodeToStripeLookupKey[recurlyPlanCode] } +/** + * @param {StripeLookupKey} stripeLookupKey + * @returns {RecurlyPlanCode} + */ +function mapStripeLookupKeyToRecurlyPlanCode(stripeLookupKey) { + return stripeLookupKeyToRecurlyPlanCode[stripeLookupKey] +} + const recurlyPlanCodeToPlanTypeAndPeriod = { collaborator: { planType: 'standard', period: 'monthly' }, collaborator_free_trial_7_days: { planType: 'standard', period: 'monthly' }, @@ -82,5 +99,6 @@ module.exports = { ensurePlansAreSetupCorrectly, findLocalPlanInSettings, mapRecurlyPlanCodeToStripeLookupKey, + mapStripeLookupKeyToRecurlyPlanCode, getPlanTypeAndPeriodFromRecurlyPlanCode, } diff --git a/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js b/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js index 4761222a2e..45766dd09c 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js +++ b/services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.js @@ -260,6 +260,10 @@ async function buildUsersSubscriptionViewModel(user, locale = 'en') { } if (personalSubscription && paymentRecord && paymentRecord.subscription) { + // don't return subscription payment information + delete personalSubscription.paymentProvider + delete personalSubscription.recurly + const tax = paymentRecord.subscription.taxAmount || 0 // Some plans allow adding more seats than the base plan provides. // This is recorded as a subscription add on. diff --git a/services/web/test/acceptance/src/helpers/Subscription.mjs b/services/web/test/acceptance/src/helpers/Subscription.mjs index ee6f1a7d8a..db5c9c5898 100644 --- a/services/web/test/acceptance/src/helpers/Subscription.mjs +++ b/services/web/test/acceptance/src/helpers/Subscription.mjs @@ -25,6 +25,7 @@ class PromisifiedSubscription { this.ssoConfig = options.ssoConfig this.groupPolicy = options.groupPolicy this.addOns = options.addOns + this.paymentProvider = options.paymentProvider } async ensureExists() { diff --git a/services/web/test/unit/src/Subscription/PlansLocatorTests.js b/services/web/test/unit/src/Subscription/PlansLocatorTests.js index 9373c02b89..7d1972a1ad 100644 --- a/services/web/test/unit/src/Subscription/PlansLocatorTests.js +++ b/services/web/test/unit/src/Subscription/PlansLocatorTests.js @@ -114,6 +114,22 @@ describe('PlansLocator', function () { }) }) + describe('mapStripeLookupKeyToRecurlyPlanCode', function () { + it('should return the recurly plan code for existing plans', function () { + const planCode = 'standard_monthly' + const lookupKey = + this.PlansLocator.mapStripeLookupKeyToRecurlyPlanCode(planCode) + expect(lookupKey).to.equal('collaborator') + }) + + it('should return undefined for unknown plans', function () { + const planCode = 'foobar' + const lookupKey = + this.PlansLocator.mapStripeLookupKeyToRecurlyPlanCode(planCode) + expect(lookupKey).to.equal(undefined) + }) + }) + describe('getPlanTypeAndPeriodFromRecurlyPlanCode', function () { it('should return the plan type and period for "collaborator"', function () { const { planType, period } =