SubscriptionController.coffee 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. SecurityManager = require '../../managers/SecurityManager'
  2. SubscriptionHandler = require './SubscriptionHandler'
  3. PlansLocator = require("./PlansLocator")
  4. SubscriptionFormatters = require("./SubscriptionFormatters")
  5. SubscriptionViewModelBuilder = require('./SubscriptionViewModelBuilder')
  6. LimitationsManager = require("./LimitationsManager")
  7. RecurlyWrapper = require './RecurlyWrapper'
  8. Settings = require 'settings-sharelatex'
  9. logger = require('logger-sharelatex')
  10. module.exports = SubscriptionController =
  11. plansPage: (req, res, next) ->
  12. plans = SubscriptionViewModelBuilder.buildViewModel()
  13. viewName = "subscriptions/plans"
  14. logger.log viewName:viewName, "showing plans page"
  15. res.render viewName,
  16. title: "Plans and Pricing"
  17. #get to show the recurly.js page
  18. paymentPage: (req, res, next) ->
  19. SecurityManager.getCurrentUser req, (error, user) =>
  20. return next(error) if error?
  21. plan = PlansLocator.findLocalPlanInSettings(req.query.planCode)
  22. LimitationsManager.userHasSubscription user, (err, hasSubscription)->
  23. if hasSubscription or !plan?
  24. res.redirect "/user/subscription"
  25. else
  26. RecurlyWrapper.sign {
  27. subscription:
  28. plan_code : req.query.planCode
  29. account_code: user.id
  30. }, (error, signature) ->
  31. return next(error) if error?
  32. res.render "subscriptions/new",
  33. title : "Subscribe"
  34. plan_code: req.query.planCode
  35. recurlyConfig: JSON.stringify
  36. currency: "USD"
  37. subdomain: Settings.apis.recurly.subdomain
  38. subscriptionFormOptions: JSON.stringify
  39. acceptedCards: ['discover', 'mastercard', 'visa']
  40. target : "#subscribeForm"
  41. signature : signature
  42. planCode : req.query.planCode
  43. successURL : "#{Settings.siteUrl}/user/subscription/create?_csrf=#{req.session._csrf}"
  44. accountCode : user.id
  45. enableCoupons: true
  46. acceptPaypal: true
  47. account :
  48. firstName : user.first_name
  49. lastName : user.last_name
  50. email : user.email
  51. userSubscriptionPage: (req, res, next) ->
  52. SecurityManager.getCurrentUser req, (error, user) =>
  53. return next(error) if error?
  54. LimitationsManager.userHasSubscriptionOrFreeTrial user, (err, hasSubOrFreeTrial)->
  55. if !hasSubOrFreeTrial
  56. logger.log user: user, "redirecting to plans"
  57. res.redirect "/user/subscription/plans"
  58. else
  59. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription) ->
  60. return next(error) if error?
  61. logger.log user: user, subscription:subscription, hasSubOrFreeTrial:hasSubOrFreeTrial, "showing subscription dashboard"
  62. plans = SubscriptionViewModelBuilder.buildViewModel()
  63. res.render "subscriptions/dashboard",
  64. title: "Your Subscription"
  65. plans: plans
  66. subscription: subscription
  67. subscriptionTabActive: true
  68. editBillingDetailsPage: (req, res, next) ->
  69. SecurityManager.getCurrentUser req, (error, user) ->
  70. return next(error) if error?
  71. LimitationsManager.userHasSubscription user, (err, hasSubscription)->
  72. if !hasSubscription
  73. res.redirect "/user/subscription"
  74. else
  75. RecurlyWrapper.sign {
  76. account_code: user.id
  77. }, (error, signature) ->
  78. return next(error) if error?
  79. res.render "subscriptions/edit-billing-details",
  80. title : "Update Billing Details"
  81. recurlyConfig: JSON.stringify
  82. currency: "USD"
  83. subdomain: Settings.apis.recurly.subdomain
  84. signature : signature
  85. successURL : "#{Settings.siteUrl}/user/subscription/update"
  86. user :
  87. id : user.id
  88. createSubscription: (req, res, next)->
  89. SecurityManager.getCurrentUser req, (error, user) ->
  90. return callback(error) if error?
  91. subscriptionId = req.body.recurly_token
  92. logger.log subscription_id: subscriptionId, user_id:user._id, "creating subscription"
  93. SubscriptionHandler.createSubscription user, subscriptionId, (err)->
  94. if err?
  95. logger.err err:err, user_id:user._id, "something went wrong creating subscription"
  96. res.redirect "/user/subscription/thank-you"
  97. successful_subscription: (req, res)->
  98. SecurityManager.getCurrentUser req, (error, user) =>
  99. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription) ->
  100. res.render "subscriptions/successful_subscription",
  101. title: "Thank you!"
  102. subscription:subscription
  103. cancelSubscription: (req, res, next) ->
  104. SecurityManager.getCurrentUser req, (error, user) ->
  105. logger.log user_id:user._id, "canceling subscription"
  106. return next(error) if error?
  107. SubscriptionHandler.cancelSubscription user, (err)->
  108. if err?
  109. logger.err err:err, user_id:user._id, "something went wrong canceling subscription"
  110. res.redirect "/user/subscription"
  111. updateSubscription: (req, res)->
  112. SecurityManager.getCurrentUser req, (error, user) ->
  113. return next(error) if error?
  114. planCode = req.body.plan_code
  115. logger.log planCode: planCode, user_id:user._id, "updating subscription"
  116. SubscriptionHandler.updateSubscription user, planCode, (err)->
  117. if err?
  118. logger.err err:err, user_id:user._id, "something went wrong updating subscription"
  119. res.redirect "/user/subscription"
  120. reactivateSubscription: (req, res)->
  121. SecurityManager.getCurrentUser req, (error, user) ->
  122. logger.log user_id:user._id, "reactivating subscription"
  123. return next(error) if error?
  124. SubscriptionHandler.reactivateSubscription user, (err)->
  125. if err?
  126. logger.err err:err, user_id:user._id, "something went wrong reactivating subscription"
  127. res.redirect "/user/subscription"
  128. recurlyCallback: (req, res)->
  129. logger.log data: req.body, "received recurly callback"
  130. # we only care if a subscription has exipired
  131. if req.body? and req.body["expired_subscription_notification"]?
  132. recurlySubscription = req.body["expired_subscription_notification"].subscription
  133. SubscriptionHandler.recurlyCallback recurlySubscription, ->
  134. res.send 200
  135. else
  136. res.send 200
  137. recurlyNotificationParser: (req, res, next) ->
  138. xml = ""
  139. req.on "data", (chunk) ->
  140. xml += chunk
  141. req.on "end", () ->
  142. RecurlyWrapper._parseXml xml, (error, body) ->
  143. return next(error) if error?
  144. req.body = body
  145. next()
  146. gaExperimentCode = '''
  147. <!-- Google Analytics Content Experiment code -->
  148. <script>function utmx_section(){}function utmx(){}(function(){var
  149. k='51652689-2',d=document,l=d.location,c=d.cookie;
  150. if(l.search.indexOf('utm_expid='+k)>0)return;
  151. function f(n){if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.
  152. indexOf(';',i);return escape(c.substring(i+n.length+1,j<0?c.
  153. length:j))}}}var x=f('__utmx'),xx=f('__utmxx'),h=l.hash;d.write(
  154. '<sc'+'ript src="'+'http'+(l.protocol=='https:'?'s://ssl':
  155. '://www')+'.google-analytics.com/ga_exp.js?'+'utmxkey='+k+
  156. '&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='+new Date().
  157. valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+
  158. '" type="text/javascript" charset="utf-8"><\/sc'+'ript>')})();
  159. </script><script>utmx('url','A/B');</script>
  160. <!-- End of Google Analytics Content Experiment code -->
  161. '''