SubscriptionHandler.coffee 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. EmailHandler.sendEmail "reactivatedSubscription", to: user.email
  74. Analytics.recordEvent user._id, "subscription-reactivated"
  75. callback()
  76. else
  77. callback()
  78. recurlyCallback: (recurlySubscription, callback) ->
  79. RecurlyWrapper.getSubscription recurlySubscription.uuid, includeAccount: true, (error, recurlySubscription) ->
  80. return callback(error) if error?
  81. User.findById recurlySubscription.account.account_code, (error, user) ->
  82. return callback(error) if error?
  83. if !user?
  84. return callback("no user found")
  85. SubscriptionUpdater.syncSubscription recurlySubscription, user?._id, callback
  86. extendTrial: (subscription, daysToExend, callback)->
  87. RecurlyWrapper.extendTrial subscription.recurlySubscription_id, daysToExend, callback