Fetch subscription details from v1 and display to user

This commit is contained in:
James Allen 2018-06-04 17:55:02 +01:00
parent ea8f2fc7a3
commit 9d84263463
5 changed files with 70 additions and 29 deletions

View file

@ -5,6 +5,7 @@ SubscriptionLocator = require("./SubscriptionLocator")
Settings = require("settings-sharelatex")
CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler")
CollaboratorsInvitesHandler = require("../Collaborators/CollaboratorsInviteHandler")
V1SubscriptionManager = require("./V1SubscriptionManager")
module.exports = LimitationsManager =
allowedNumberOfCollaboratorsInProject: (project_id, callback) ->
@ -37,8 +38,10 @@ module.exports = LimitationsManager =
return callback(err) if err?
@userIsMemberOfGroupSubscription user, (err, isMember)=>
return callback(err) if err?
logger.log user_id:user._id, isMember:isMember, hasSubscription:hasSubscription, "checking if user has subscription or is group member"
callback err, isMember or hasSubscription, subscription
@userHasV1SubscriptionOrTeam user, (err, hasV1Subscription)=>
return callback(err) if err?
logger.log {user_id:user._id, isMember, hasSubscription, hasV1Subscription}, "checking if user has subscription or is group member"
callback err, isMember or hasSubscription or hasV1Subscription, subscription
userHasSubscription: (user, callback = (err, hasSubscription, subscription)->) ->
logger.log user_id:user._id, "checking if user has subscription"
@ -55,6 +58,16 @@ module.exports = LimitationsManager =
return callback(err) if err?
callback err, subscriptions.length > 0, subscriptions
userHasV1SubscriptionOrTeam: (user, callback = (error, hasV1Subscription) ->) ->
V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscription = {}) ->
return callback(err) if err?
hasV1Subscription = false
if v1Subscription.has_subscription
hasV1Subscription = true
if (v1Subscription.teams or []).length > 0
hasV1Subscription = true
return callback null, hasV1Subscription
teamHasReachedMemberLimit: (subscription) ->
currentTotal = (subscription.member_ids or []).length +
(subscription.teamInvites or []).length +

View file

@ -101,9 +101,9 @@ module.exports = SubscriptionController =
logger.log user: user, "redirecting to plans"
res.redirect "/user/subscription/plans"
else
SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions, billingDetailsLink) ->
SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions, billingDetailsLink, v1Subscription) ->
return next(error) if error?
logger.log {user, subscription, hasSubOrIsGroupMember, groupSubscriptions, billingDetailsLink}, "showing subscription dashboard"
logger.log {user, subscription, hasSubOrIsGroupMember, groupSubscriptions, billingDetailsLink, v1Subscription}, "showing subscription dashboard"
plans = SubscriptionViewModelBuilder.buildViewModel()
res.render "subscriptions/dashboard",
title: "your_subscription"
@ -116,6 +116,7 @@ module.exports = SubscriptionController =
user:user
saved_billing_details: req.query.saved_billing_details?
billingDetailsLink: billingDetailsLink
v1Subscription: v1Subscription
userCustomSubscriptionPage: (req, res, next)->
user = AuthenticationController.getSessionUser(req)

View file

@ -4,6 +4,7 @@ PlansLocator = require("./PlansLocator")
SubscriptionFormatters = require("./SubscriptionFormatters")
LimitationsManager = require("./LimitationsManager")
SubscriptionLocator = require("./SubscriptionLocator")
V1SubscriptionManager = require("./V1SubscriptionManager")
logger = require('logger-sharelatex')
_ = require("underscore")
@ -27,34 +28,37 @@ module.exports =
SubscriptionLocator.getMemberSubscriptions user, (err, memberSubscriptions = []) ->
return callback(err) if err?
if subscription?
return callback(error) if error?
V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscriptions) ->
return callback(err) if err?
plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
if subscription?
return callback(error) if error?
if !plan?
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)
plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)->
tax = recurlySubscription?.tax_in_cents || 0
if !plan?
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)
callback null, {
admin_id:subscription.admin_id
name: plan.name
nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription?.current_period_ends_at)
state: recurlySubscription?.state
price: SubscriptionFormatters.formatPrice (recurlySubscription?.unit_amount_in_cents + tax), recurlySubscription?.currency
planCode: subscription.planCode
currency:recurlySubscription?.currency
taxRate:parseFloat(recurlySubscription?.tax_rate?._)
groupPlan: subscription.groupPlan
trial_ends_at:recurlySubscription?.trial_ends_at
}, memberSubscriptions, buildBillingDetails(recurlySubscription)
RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)->
tax = recurlySubscription?.tax_in_cents || 0
else
callback null, null, memberSubscriptions, null
callback null, {
admin_id:subscription.admin_id
name: plan.name
nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription?.current_period_ends_at)
state: recurlySubscription?.state
price: SubscriptionFormatters.formatPrice (recurlySubscription?.unit_amount_in_cents + tax), recurlySubscription?.currency
planCode: subscription.planCode
currency:recurlySubscription?.currency
taxRate:parseFloat(recurlySubscription?.tax_rate?._)
groupPlan: subscription.groupPlan
trial_ends_at:recurlySubscription?.trial_ends_at
}, memberSubscriptions, buildBillingDetails(recurlySubscription), v1Subscriptions
else
callback null, null, memberSubscriptions, null, v1Subscriptions
buildViewModel : ->
plans = Settings.plans

View file

@ -32,6 +32,12 @@ module.exports = V1SubscriptionManager =
url: (v1Id) -> "/api/v1/sharelatex/users/#{v1Id}/sync"
}, callback
getSubscriptionsFromV1: (userId, callback=(err, subscriptions) ->) ->
V1SubscriptionManager._v1Request userId, {
method: 'GET',
url: (v1Id) -> "/api/v1/sharelatex/users/#{v1Id}/subscriptions"
}, callback
_v1Request: (userId, options, callback=(err, body)->) ->
if !settings?.apis?.v1
return callback null, null

View file

@ -103,18 +103,35 @@ block content
+printPlans(plans.studentAccounts)
+printPlans(plans.individualMonthlyPlans)
+printPlans(plans.individualAnnualPlans)
hr
each groupSubscription in groupSubscriptions
- if (user._id+'' != groupSubscription.admin_id._id+'')
div
p !{translate("member_of_group_subscription", {admin_email: "<strong>" + groupSubscription.admin_id.email + "</strong>"})}
span
button.btn.btn-danger(ng-click="removeSelfFromGroup('"+groupSubscription.admin_id._id+"')") #{translate("leave_group")}
button.btn.btn-danger.text-capitalise(ng-click="removeSelfFromGroup('"+groupSubscription.admin_id._id+"')") #{translate("leave_group")}
hr
-if(subscription.groupPlan && user._id+'' == subscription.admin_id+'')
div
a(href="/subscription/group").btn.btn-primary !{translate("manage_group")}
hr
if v1Subscription.has_subscription
p
| You are subscribed to Overleaf through Overleaf v1
p
a.btn.btn-primary(href=settings.overleaf.host+"/users/edit#status") Manage v1 Subscription
hr
if v1Subscription.teams && v1Subscription.teams.length > 0
for team in v1Subscription.teams
p
| You are a member of the Overleaf v1 team: <strong>#{team.name}</strong>
p
a.btn.btn-primary(href=settings.overleaf.host+"/teams") Manage v1 Team Membership
hr
.card(ng-if="view == 'cancelation'")
.page-header