SubscriptionHandler.coffee 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. async = require("async")
  2. RecurlyWrapper = require("./RecurlyWrapper")
  3. Settings = require "settings-sharelatex"
  4. User = require('../../models/User').User
  5. logger = require('logger-sharelatex')
  6. SubscriptionUpdater = require("./SubscriptionUpdater")
  7. LimitationsManager = require('./LimitationsManager')
  8. EmailHandler = require("../Email/EmailHandler")
  9. Events = require "../../infrastructure/Events"
  10. Analytics = require("../Analytics/AnalyticsManager")
  11. module.exports =
  12. validateNoSubscriptionInRecurly: (user_id, callback = (error, valid) ->) ->
  13. RecurlyWrapper.listAccountActiveSubscriptions user_id, (error, subscriptions = []) ->
  14. return callback(error) if error?
  15. if subscriptions.length > 0
  16. SubscriptionUpdater.syncSubscription subscriptions[0], user_id, (error) ->
  17. return callback(error) if error?
  18. return callback(null, false)
  19. else
  20. return callback(null, true)
  21. createSubscription: (user, subscriptionDetails, recurly_token_id, callback)->
  22. self = @
  23. clientTokenId = ""
  24. @validateNoSubscriptionInRecurly user._id, (error, valid) ->
  25. return callback(error) if error?
  26. if !valid
  27. return callback(new Error("user already has subscription in recurly"))
  28. RecurlyWrapper.createSubscription user, subscriptionDetails, recurly_token_id, (error, recurlySubscription)->
  29. return callback(error) if error?
  30. SubscriptionUpdater.syncSubscription recurlySubscription, user._id, (error) ->
  31. return callback(error) if error?
  32. callback()
  33. updateSubscription: (user, plan_code, coupon_code, callback)->
  34. logger.log user:user, plan_code:plan_code, coupon_code:coupon_code, "updating subscription"
  35. LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
  36. if !hasSubscription
  37. return callback()
  38. else
  39. async.series [
  40. (cb)->
  41. return cb() if !coupon_code?
  42. logger.log user_id:user._id, plan_code:plan_code, coupon_code:coupon_code, "updating subscription with coupon code applied first"
  43. RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, usersSubscription)->
  44. return callback(err) if err?
  45. account_code = usersSubscription.account.account_code
  46. RecurlyWrapper.redeemCoupon account_code, coupon_code, cb
  47. (cb)->
  48. RecurlyWrapper.updateSubscription subscription.recurlySubscription_id, {plan_code: plan_code, timeframe: "now"}, (error, recurlySubscription) ->
  49. return callback(error) if error?
  50. SubscriptionUpdater.syncSubscription recurlySubscription, user._id, cb
  51. ], callback
  52. cancelSubscription: (user, callback) ->
  53. LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
  54. if hasSubscription
  55. RecurlyWrapper.cancelSubscription subscription.recurlySubscription_id, (error) ->
  56. return callback(error) if error?
  57. emailOpts =
  58. to: user.email
  59. first_name: user.first_name
  60. ONE_HOUR_IN_MS = 1000 * 60 * 60
  61. setTimeout (-> EmailHandler.sendEmail "canceledSubscription", emailOpts
  62. ), ONE_HOUR_IN_MS
  63. Events.emit "cancelSubscription", user._id
  64. Analytics.recordEvent user._id, "subscription-canceled"
  65. callback()
  66. else
  67. callback()
  68. reactivateSubscription: (user, callback) ->
  69. LimitationsManager.userHasV2Subscription user, (err, hasSubscription, subscription)->
  70. if hasSubscription
  71. RecurlyWrapper.reactivateSubscription subscription.recurlySubscription_id, (error) ->
  72. return callback(error) if error?
  73. callback()
  74. else
  75. callback()
  76. recurlyCallback: (recurlySubscription, callback) ->
  77. RecurlyWrapper.getSubscription recurlySubscription.uuid, includeAccount: true, (error, recurlySubscription) ->
  78. return callback(error) if error?
  79. User.findById recurlySubscription.account.account_code, (error, user) ->
  80. return callback(error) if error?
  81. if !user?
  82. return callback("no user found")
  83. SubscriptionUpdater.syncSubscription recurlySubscription, user?._id, callback
  84. extendTrial: (subscription, daysToExend, callback)->
  85. RecurlyWrapper.extendTrial subscription.recurlySubscription_id, daysToExend, callback