SubscriptionUpdater.coffee 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. async = require("async")
  2. _ = require("underscore")
  3. Subscription = require('../../models/Subscription').Subscription
  4. SubscriptionLocator = require("./SubscriptionLocator")
  5. UserFeaturesUpdater = require("./UserFeaturesUpdater")
  6. PlansLocator = require("./PlansLocator")
  7. Settings = require("settings-sharelatex")
  8. logger = require("logger-sharelatex")
  9. ObjectId = require('mongoose').Types.ObjectId
  10. ReferalAllocator = require("../Referal/ReferalAllocator")
  11. oneMonthInSeconds = 60 * 60 * 24 * 30
  12. module.exports = SubscriptionUpdater =
  13. syncSubscription: (recurlySubscription, adminUser_id, callback) ->
  14. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "syncSubscription, creating new if subscription does not exist"
  15. SubscriptionLocator.getUsersSubscription adminUser_id, (err, subscription)->
  16. if subscription?
  17. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does exist"
  18. SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
  19. else
  20. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does not exist, creating a new one"
  21. SubscriptionUpdater._createNewSubscription adminUser_id, (err, subscription)->
  22. SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
  23. addUserToGroup: (adminUser_id, user_id, callback)->
  24. logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription"
  25. searchOps =
  26. admin_id: adminUser_id
  27. insertOperation =
  28. "$addToSet": {member_ids:user_id}
  29. Subscription.findAndModify searchOps, insertOperation, (err, subscription)->
  30. if err?
  31. logger.err err:err, searchOps:searchOps, insertOperation:insertOperation, "error findy and modify add user to group"
  32. return callback(err)
  33. UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, callback
  34. addEmailInviteToGroup: (adminUser_id, email, callback) ->
  35. logger.log {adminUser_id, email}, "adding email into mongo subscription"
  36. searchOps =
  37. admin_id: adminUser_id
  38. insertOperation =
  39. "$addToSet": {invited_emails: email}
  40. Subscription.findAndModify searchOps, insertOperation, callback
  41. removeUserFromGroup: (adminUser_id, user_id, callback)->
  42. searchOps =
  43. admin_id: adminUser_id
  44. removeOperation =
  45. "$pull": {member_ids:user_id}
  46. Subscription.update searchOps, removeOperation, (err)->
  47. if err?
  48. logger.err err:err, searchOps:searchOps, removeOperation:removeOperation, "error removing user from group"
  49. return callback(err)
  50. SubscriptionUpdater._setUsersMinimumFeatures user_id, callback
  51. removeEmailInviteFromGroup: (adminUser_id, email, callback)->
  52. Subscription.update {
  53. admin_id: adminUser_id
  54. }, "$pull": {
  55. invited_emails: email
  56. }, callback
  57. refreshSubscription: (user_id, callback=(err)->) ->
  58. SubscriptionUpdater._setUsersMinimumFeatures user_id, callback
  59. deleteSubscription: (subscription_id, callback = (error) ->) ->
  60. SubscriptionLocator.getSubscription subscription_id, (err, subscription) ->
  61. return callback(err) if err?
  62. affected_user_ids = [subscription.admin_id].concat(subscription.member_ids or [])
  63. logger.log {subscription_id, affected_user_ids}, "deleting subscription and downgrading users"
  64. Subscription.remove {_id: ObjectId(subscription_id)}, (err) ->
  65. return callback(err) if err?
  66. async.mapSeries affected_user_ids, SubscriptionUpdater._setUsersMinimumFeatures, callback
  67. _createNewSubscription: (adminUser_id, callback)->
  68. logger.log adminUser_id:adminUser_id, "creating new subscription"
  69. subscription = new Subscription(admin_id:adminUser_id)
  70. subscription.freeTrial.allowed = false
  71. subscription.save (err)->
  72. callback err, subscription
  73. _updateSubscriptionFromRecurly: (recurlySubscription, subscription, callback)->
  74. logger.log recurlySubscription:recurlySubscription, subscription:subscription, "updaing subscription"
  75. plan = PlansLocator.findLocalPlanInSettings(recurlySubscription.plan.plan_code)
  76. if recurlySubscription.state == "expired"
  77. subscription.recurlySubscription_id = undefined
  78. subscription.planCode = Settings.defaultPlanCode
  79. else
  80. subscription.recurlySubscription_id = recurlySubscription.uuid
  81. subscription.freeTrial.expiresAt = undefined
  82. subscription.freeTrial.planCode = undefined
  83. subscription.freeTrial.allowed = true
  84. subscription.planCode = recurlySubscription.plan.plan_code
  85. if plan.groupPlan
  86. subscription.groupPlan = true
  87. subscription.membersLimit = plan.membersLimit
  88. subscription.save ->
  89. allIds = _.union subscription.member_ids, [subscription.admin_id]
  90. jobs = allIds.map (user_id)->
  91. return (cb)->
  92. SubscriptionUpdater._setUsersMinimumFeatures user_id, cb
  93. async.series jobs, callback
  94. _setUsersMinimumFeatures: (user_id, callback)->
  95. jobs =
  96. subscription: (cb)->
  97. SubscriptionLocator.getUsersSubscription user_id, cb
  98. groupSubscription: (cb)->
  99. SubscriptionLocator.getGroupSubscriptionMemberOf user_id, cb
  100. v1PlanCode: (cb) ->
  101. Modules = require '../../infrastructure/Modules'
  102. Modules.hooks.fire 'getV1PlanCode', user_id, (err, results) ->
  103. cb(err, results?[0] || null)
  104. async.series jobs, (err, results)->
  105. if err?
  106. logger.err err:err, user_id:user_id,
  107. "error getting subscription or group for _setUsersMinimumFeatures"
  108. return callback(err)
  109. {subscription, groupSubscription, v1PlanCode} = results
  110. # Group Subscription
  111. if groupSubscription? and groupSubscription.planCode?
  112. logger.log user_id:user_id, "using group which user is memor of for features"
  113. UserFeaturesUpdater.updateFeatures user_id, groupSubscription.planCode, callback
  114. # Personal Subscription
  115. else if subscription? and subscription.planCode? and subscription.planCode != Settings.defaultPlanCode
  116. logger.log user_id:user_id, "using users subscription plan code for features"
  117. UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, callback
  118. # V1 Subscription
  119. else if v1PlanCode?
  120. logger.log user_id: user_id, "using the V1 plan for features"
  121. UserFeaturesUpdater.updateFeatures user_id, v1PlanCode, callback
  122. # Default
  123. else
  124. logger.log user_id:user_id, "using default features for user with no subscription or group"
  125. UserFeaturesUpdater.updateFeatures user_id, Settings.defaultPlanCode, (err)->
  126. if err?
  127. logger.err err:err, user_id:user_id, "Error setting minimum user feature"
  128. return callback(err)
  129. ReferalAllocator.assignBonus user_id, callback