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.
This commit is contained in:
Alberto Fernández Capel 2018-01-05 16:25:01 +00:00
parent 79eddcc736
commit 6d007bfe74
2 changed files with 31 additions and 37 deletions

View file

@ -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)

View file

@ -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