Explorar o código

Fetch subscription details from v1 and display to user

James Allen %!s(int64=8) %!d(string=hai) anos
pai
achega
9d84263463

+ 15 - 2
services/web/app/coffee/Features/Subscription/LimitationsManager.coffee

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

+ 3 - 2
services/web/app/coffee/Features/Subscription/SubscriptionController.coffee

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

+ 32 - 28
services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee

@@ -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?
-
-					plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
-
-					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)
-
-					RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)->
-						tax = recurlySubscription?.tax_in_cents || 0
-
-						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)
-
-				else
-					callback null, null, memberSubscriptions, null
+				V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscriptions) ->
+					return callback(err) if err?
+
+					if subscription?
+						return callback(error) if error?
+
+						plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
+
+						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)
+
+						RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)->
+							tax = recurlySubscription?.tax_in_cents || 0
+
+							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

+ 6 - 0
services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee

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

+ 19 - 2
services/web/app/views/subscriptions/dashboard.pug

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