Просмотр исходного кода

Check with v1 before allowing a new subscription

James Allen 8 лет назад
Родитель
Сommit
ce60e6941c

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

@@ -34,7 +34,7 @@ module.exports = LimitationsManager =
 						callback null, false
 						callback null, false
 
 
 	userHasSubscriptionOrIsGroupMember: (user, callback = (err, hasSubscriptionOrIsMember)->) ->
 	userHasSubscriptionOrIsGroupMember: (user, callback = (err, hasSubscriptionOrIsMember)->) ->
-		@userHasSubscription user, (err, hasSubscription, subscription)=>
+		@userHasV2Subscription user, (err, hasSubscription, subscription)=>
 			return callback(err) if err?
 			return callback(err) if err?
 			@userIsMemberOfGroupSubscription user, (err, isMember)=>
 			@userIsMemberOfGroupSubscription user, (err, isMember)=>
 				return callback(err) if err?
 				return callback(err) if err?
@@ -43,7 +43,7 @@ module.exports = LimitationsManager =
 					logger.log {user_id:user._id, isMember, hasSubscription, hasV1Subscription}, "checking if user has subscription or is group member"
 					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
 					callback err, isMember or hasSubscription or hasV1Subscription, subscription
 
 
-	userHasSubscription: (user, callback = (err, hasSubscription, subscription)->) ->
+	userHasV2Subscription: (user, callback = (err, hasSubscription, subscription)->) ->
 		logger.log user_id:user._id, "checking if user has subscription"
 		logger.log user_id:user._id, "checking if user has subscription"
 		SubscriptionLocator.getUsersSubscription user._id, (err, subscription)->
 		SubscriptionLocator.getUsersSubscription user._id, (err, subscription)->
 			if err?
 			if err?
@@ -52,12 +52,26 @@ module.exports = LimitationsManager =
 			logger.log user:user, hasValidSubscription:hasValidSubscription, subscription:subscription, "checking if user has subscription"
 			logger.log user:user, hasValidSubscription:hasValidSubscription, subscription:subscription, "checking if user has subscription"
 			callback err, hasValidSubscription, subscription
 			callback err, hasValidSubscription, subscription
 
 
+	userHasV1OrV2Subscription: (user, callback = (err, hasSubscription) ->) ->
+		@userHasV2Subscription user, (err, hasV2Subscription) =>
+			return callback(err) if err?
+			return callback null, true if hasV2Subscription
+			@userHasV1Subscription user, (err, hasV1Subscription) =>
+				return callback(err) if err?
+				return callback null, true if hasV1Subscription
+				return callback null, false
+
 	userIsMemberOfGroupSubscription: (user, callback = (error, isMember, subscriptions) ->) ->
 	userIsMemberOfGroupSubscription: (user, callback = (error, isMember, subscriptions) ->) ->
 		logger.log user_id: user._id, "checking is user is member of subscription groups"
 		logger.log user_id: user._id, "checking is user is member of subscription groups"
 		SubscriptionLocator.getMemberSubscriptions user._id, (err, subscriptions = []) ->
 		SubscriptionLocator.getMemberSubscriptions user._id, (err, subscriptions = []) ->
 			return callback(err) if err?
 			return callback(err) if err?
 			callback err, subscriptions.length > 0, subscriptions
 			callback err, subscriptions.length > 0, subscriptions
 
 
+	userHasV1Subscription: (user, callback = (error, hasV1Subscription) ->) ->
+		V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscription) ->
+			logger.log {user_id: user._id, v1Subscription}, '[userHasV1Subscription]'
+			callback err, !!v1Subscription?.has_subscription
+
 	userHasV1SubscriptionOrTeam: (user, callback = (error, hasV1Subscription) ->) ->
 	userHasV1SubscriptionOrTeam: (user, callback = (error, hasV1Subscription) ->) ->
 		V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscription = {}) ->
 		V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscription = {}) ->
 			return callback(err) if err?
 			return callback(err) if err?

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

@@ -45,12 +45,12 @@ module.exports = SubscriptionController =
 	paymentPage: (req, res, next) ->
 	paymentPage: (req, res, next) ->
 		user = AuthenticationController.getSessionUser(req)
 		user = AuthenticationController.getSessionUser(req)
 		plan = PlansLocator.findLocalPlanInSettings(req.query.planCode)
 		plan = PlansLocator.findLocalPlanInSettings(req.query.planCode)
-		LimitationsManager.userHasSubscription user, (err, hasSubscription)->
+		LimitationsManager.userHasV1OrV2Subscription user, (err, hasSubscription)->
 			return next(err) if err?
 			return next(err) if err?
 			if hasSubscription or !plan?
 			if hasSubscription or !plan?
 				res.redirect "/user/subscription"
 				res.redirect "/user/subscription"
 			else
 			else
-				# LimitationsManager.userHasSubscription only checks Mongo. Double check with
+				# LimitationsManager.userHasV2Subscription only checks Mongo. Double check with
 				# Recurly as well at this point (we don't do this most places for speed).
 				# Recurly as well at this point (we don't do this most places for speed).
 				SubscriptionHandler.validateNoSubscriptionInRecurly user._id, (error, valid) ->
 				SubscriptionHandler.validateNoSubscriptionInRecurly user._id, (error, valid) ->
 					return next(error) if error?
 					return next(error) if error?
@@ -135,11 +135,17 @@ module.exports = SubscriptionController =
 		recurly_token_id = req.body.recurly_token_id
 		recurly_token_id = req.body.recurly_token_id
 		subscriptionDetails = req.body.subscriptionDetails
 		subscriptionDetails = req.body.subscriptionDetails
 		logger.log recurly_token_id: recurly_token_id, user_id:user._id, subscriptionDetails:subscriptionDetails, "creating subscription"
 		logger.log recurly_token_id: recurly_token_id, user_id:user._id, subscriptionDetails:subscriptionDetails, "creating subscription"
-		SubscriptionHandler.createSubscription user, subscriptionDetails, recurly_token_id, (err)->
-			if err?
-				logger.err err:err, user_id:user._id, "something went wrong creating subscription"
-				return res.sendStatus 500
-			res.sendStatus 201
+		
+		LimitationsManager.userHasV1OrV2Subscription user, (err, hasSubscription)->
+			return next(err) if err?
+			if hasSubscription
+				logger.warn {user_id: user._id}, 'user already has subscription'
+				res.sendStatus 409 # conflict
+			SubscriptionHandler.createSubscription user, subscriptionDetails, recurly_token_id, (err)->
+				if err?
+					logger.err err:err, user_id:user._id, "something went wrong creating subscription"
+					return next(err)
+				res.sendStatus 201
 
 
 	successful_subscription: (req, res, next)->
 	successful_subscription: (req, res, next)->
 		user = AuthenticationController.getSessionUser(req)
 		user = AuthenticationController.getSessionUser(req)
@@ -195,7 +201,7 @@ module.exports = SubscriptionController =
 
 
 	renderUpgradeToAnnualPlanPage: (req, res, next)->
 	renderUpgradeToAnnualPlanPage: (req, res, next)->
 		user = AuthenticationController.getSessionUser(req)
 		user = AuthenticationController.getSessionUser(req)
-		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
+		LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
 			return next(err) if err?
 			return next(err) if err?
 			planCode = subscription?.planCode.toLowerCase()
 			planCode = subscription?.planCode.toLowerCase()
 			if planCode?.indexOf("annual") != -1
 			if planCode?.indexOf("annual") != -1
@@ -225,7 +231,7 @@ module.exports = SubscriptionController =
 
 
 	extendTrial: (req, res, next)->
 	extendTrial: (req, res, next)->
 		user = AuthenticationController.getSessionUser(req)
 		user = AuthenticationController.getSessionUser(req)
-		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
+		LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
 			return next(err) if err?
 			return next(err) if err?
 			SubscriptionHandler.extendTrial subscription, 14, (err)->
 			SubscriptionHandler.extendTrial subscription, 14, (err)->
 				if err?
 				if err?

+ 3 - 3
services/web/app/coffee/Features/Subscription/SubscriptionHandler.coffee

@@ -36,7 +36,7 @@ module.exports =
 
 
 	updateSubscription: (user, plan_code, coupon_code, callback)->
 	updateSubscription: (user, plan_code, coupon_code, callback)->
 		logger.log user:user, plan_code:plan_code, coupon_code:coupon_code, "updating subscription"
 		logger.log user:user, plan_code:plan_code, coupon_code:coupon_code, "updating subscription"
-		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
+		LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
 			if !hasSubscription
 			if !hasSubscription
 				return callback()
 				return callback()
 			else
 			else
@@ -56,7 +56,7 @@ module.exports =
 		
 		
 
 
 	cancelSubscription: (user, callback) ->
 	cancelSubscription: (user, callback) ->
-		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
+		LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
 			if hasSubscription
 			if hasSubscription
 				RecurlyWrapper.cancelSubscription subscription.recurlySubscription_id, (error) ->
 				RecurlyWrapper.cancelSubscription subscription.recurlySubscription_id, (error) ->
 					return callback(error) if error?
 					return callback(error) if error?
@@ -73,7 +73,7 @@ module.exports =
 				callback()
 				callback()
 
 
 	reactivateSubscription: (user, callback) ->
 	reactivateSubscription: (user, callback) ->
-		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
+		LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
 			if hasSubscription
 			if hasSubscription
 				RecurlyWrapper.reactivateSubscription subscription.recurlySubscription_id, (error) ->
 				RecurlyWrapper.reactivateSubscription subscription.recurlySubscription_id, (error) ->
 					return callback(error) if error?
 					return callback(error) if error?