SubscriptionUpdater.coffee 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. async = require("async")
  2. _ = require("underscore")
  3. Subscription = require('../../models/Subscription').Subscription
  4. SubscriptionLocator = require("./SubscriptionLocator")
  5. PlansLocator = require("./PlansLocator")
  6. Settings = require("settings-sharelatex")
  7. logger = require("logger-sharelatex")
  8. ObjectId = require('mongoose').Types.ObjectId
  9. FeaturesUpdater = require('./FeaturesUpdater')
  10. oneMonthInSeconds = 60 * 60 * 24 * 30
  11. module.exports = SubscriptionUpdater =
  12. syncSubscription: (recurlySubscription, adminUser_id, callback) ->
  13. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "syncSubscription, creating new if subscription does not exist"
  14. SubscriptionLocator.getUsersSubscription adminUser_id, (err, subscription)->
  15. return callback(err) if err?
  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. return callback(err) if err?
  23. SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
  24. addUserToGroup: (adminUser_id, user_id, callback)->
  25. logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription"
  26. searchOps =
  27. admin_id: adminUser_id
  28. insertOperation =
  29. "$addToSet": {member_ids:user_id}
  30. Subscription.findAndModify searchOps, insertOperation, (err, subscription)->
  31. if err?
  32. logger.err err:err, searchOps:searchOps, insertOperation:insertOperation, "error findy and modify add user to group"
  33. return callback(err)
  34. FeaturesUpdater.refreshFeatures user_id, callback
  35. addEmailInviteToGroup: (adminUser_id, email, callback) ->
  36. logger.log {adminUser_id, email}, "adding email into mongo subscription"
  37. searchOps =
  38. admin_id: adminUser_id
  39. insertOperation =
  40. "$addToSet": {invited_emails: email}
  41. Subscription.findAndModify searchOps, insertOperation, callback
  42. removeUserFromGroup: (adminUser_id, user_id, callback)->
  43. searchOps =
  44. admin_id: adminUser_id
  45. removeOperation =
  46. "$pull": {member_ids:user_id}
  47. Subscription.update searchOps, removeOperation, (err)->
  48. if err?
  49. logger.err err:err, searchOps:searchOps, removeOperation:removeOperation, "error removing user from group"
  50. return callback(err)
  51. FeaturesUpdater.refreshFeatures user_id, callback
  52. removeEmailInviteFromGroup: (adminUser_id, email, callback)->
  53. Subscription.update {
  54. admin_id: adminUser_id
  55. }, "$pull": {
  56. invited_emails: email
  57. }, callback
  58. deleteSubscription: (subscription_id, callback = (error) ->) ->
  59. SubscriptionLocator.getSubscription subscription_id, (err, subscription) ->
  60. return callback(err) if err?
  61. affected_user_ids = [subscription.admin_id].concat(subscription.member_ids or [])
  62. logger.log {subscription_id, affected_user_ids}, "deleting subscription and downgrading users"
  63. Subscription.remove {_id: ObjectId(subscription_id)}, (err) ->
  64. return callback(err) if err?
  65. async.mapSeries affected_user_ids, FeaturesUpdater.refreshFeatures, callback
  66. _createNewSubscription: (adminUser_id, callback)->
  67. logger.log adminUser_id:adminUser_id, "creating new subscription"
  68. subscription = new Subscription(admin_id:adminUser_id)
  69. subscription.freeTrial.allowed = false
  70. subscription.save (err)->
  71. callback err, subscription
  72. _updateSubscriptionFromRecurly: (recurlySubscription, subscription, callback)->
  73. logger.log recurlySubscription:recurlySubscription, subscription:subscription, "updaing subscription"
  74. plan = PlansLocator.findLocalPlanInSettings(recurlySubscription.plan.plan_code)
  75. if recurlySubscription.state == "expired"
  76. subscription.recurlySubscription_id = undefined
  77. subscription.planCode = Settings.defaultPlanCode
  78. else
  79. subscription.recurlySubscription_id = recurlySubscription.uuid
  80. subscription.freeTrial.expiresAt = undefined
  81. subscription.freeTrial.planCode = undefined
  82. subscription.freeTrial.allowed = true
  83. subscription.planCode = recurlySubscription.plan.plan_code
  84. if plan.groupPlan
  85. subscription.groupPlan = true
  86. subscription.membersLimit = plan.membersLimit
  87. subscription.save ->
  88. allIds = _.union subscription.member_ids, [subscription.admin_id]
  89. jobs = allIds.map (user_id)->
  90. return (cb)->
  91. FeaturesUpdater.refreshFeatures user_id, cb
  92. async.series jobs, callback