Kaynağa Gözat

DRY logic to get subscription from Recurly

We were making two calls to recurly: one from the SubscriptionController
and another from the SubscriptionViewModelBuilder. This change moves
all the logic to the builder so we only have to do one call.
Alberto Fernández Capel 8 yıl önce
ebeveyn
işleme
6d007bfe74

+ 15 - 33
services/web/app/coffee/Features/Subscription/SubscriptionController.coffee

@@ -97,39 +97,21 @@ module.exports = SubscriptionController =
 				logger.log user: user, "redirecting to plans"
 				res.redirect "/user/subscription/plans"
 			else
-				RecurlyWrapper.getSubscription subscription?.recurlySubscription_id,
-					includeAccount: true,
-					(err, usersSubscription)->
-						# always render the page, but skip the recurly link if
-						# we can't get it for some reason
-						if err?
-							logger.err {err, userId: user._id}, "error getting billing details link from recurly, proceeding"
-						hostedLoginToken = usersSubscription?.account?.hosted_login_token
-						recurlySubdomain = Settings?.apis?.recurly?.subdomain
-						if err? || !hostedLoginToken || !recurlySubdomain
-							billingDetailsLink = null
-						else
-							billingDetailsLink = [
-								"https://",
-								recurlySubdomain,
-								".recurly.com/account/billing_info/edit?ht=",
-								hostedLoginToken
-							].join("")
-						SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions) ->
-							return next(error) if error?
-							logger.log {user, subscription, hasSubOrIsGroupMember, groupSubscriptions, billingDetailsLink}, "showing subscription dashboard"
-							plans = SubscriptionViewModelBuilder.buildViewModel()
-							res.render "subscriptions/dashboard",
-								title: "your_subscription"
-								recomendedCurrency: subscription?.currency
-								taxRate:subscription?.taxRate
-								plans: plans
-								subscription: subscription || {}
-								groupSubscriptions: groupSubscriptions
-								subscriptionTabActive: true
-								user:user
-								saved_billing_details: req.query.saved_billing_details?
-								billingDetailsLink: billingDetailsLink
+				SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions, billingDetailsLink) ->
+					return next(error) if error?
+					logger.log {user, subscription, hasSubOrIsGroupMember, groupSubscriptions, billingDetailsLink}, "showing subscription dashboard"
+					plans = SubscriptionViewModelBuilder.buildViewModel()
+					res.render "subscriptions/dashboard",
+						title: "your_subscription"
+						recomendedCurrency: subscription?.currency
+						taxRate:subscription?.taxRate
+						plans: plans
+						subscription: subscription || {}
+						groupSubscriptions: groupSubscriptions
+						subscriptionTabActive: true
+						user:user
+						saved_billing_details: req.query.saved_billing_details?
+						billingDetailsLink: billingDetailsLink
 
 	userCustomSubscriptionPage: (req, res, next)->
 		user = AuthenticationController.getSessionUser(req)

+ 16 - 4
services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee

@@ -7,8 +7,20 @@ SubscriptionLocator = require("./SubscriptionLocator")
 logger = require('logger-sharelatex')
 _ = require("underscore")
 
-module.exports =
 
+buildBillingDetails = (recurlySubscription) ->
+	hostedLoginToken = recurlySubscription?.account?.hosted_login_token
+	recurlySubdomain = Settings?.apis?.recurly?.subdomain
+
+	if hostedLoginToken? && recurlySubdomain?
+		return [
+			"https://",
+			recurlySubdomain,
+			".recurly.com/account/billing_info/edit?ht=",
+			hostedLoginToken
+		].join("")
+
+module.exports =
 	buildUsersSubscriptionViewModel: (user, callback = (error, subscription, memberSubscriptions) ->) ->
 		SubscriptionLocator.getUsersSubscription user, (err, subscription) ->
 			return callback(err) if err?
@@ -21,7 +33,7 @@ module.exports =
 						err = new Error("No plan found for planCode '#{subscription.planCode}'")
 						logger.error {user_id: user._id, err}, "error getting subscription plan for user"
 						return callback(err)
-					RecurlyWrapper.getSubscription subscription.recurlySubscription_id, (err, recurlySubscription)->
+					RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)->
 						tax = recurlySubscription?.tax_in_cents || 0
 						callback null, {
 							admin_id:subscription.admin_id
@@ -34,9 +46,9 @@ module.exports =
 							taxRate:parseFloat(recurlySubscription?.tax_rate?._)
 							groupPlan: subscription.groupPlan
 							trial_ends_at:recurlySubscription?.trial_ends_at
-						}, memberSubscriptions
+						}, memberSubscriptions, buildBillingDetails(recurlySubscription)
 				else
-					callback null, null, memberSubscriptions
+					callback null, null, memberSubscriptions, null
 
 	buildViewModel : ->
 		plans = Settings.plans