SubscriptionUpdater.coffee 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. async = require("async")
  2. _ = require("underscore")
  3. Subscription = require('../../models/Subscription').Subscription
  4. SubscriptionLocator = require("./SubscriptionLocator")
  5. UserGetter = require("../User/UserGetter")
  6. PlansLocator = require("./PlansLocator")
  7. Settings = require("settings-sharelatex")
  8. logger = require("logger-sharelatex")
  9. ObjectId = require('mongoose').Types.ObjectId
  10. FeaturesUpdater = require('./FeaturesUpdater')
  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. return callback(err) if err?
  17. if subscription?
  18. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does exist"
  19. SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
  20. else
  21. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does not exist, creating a new one"
  22. SubscriptionUpdater._createNewSubscription adminUser_id, (err, subscription)->
  23. return callback(err) if err?
  24. SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
  25. addUserToGroup: (subscriptionId, userId, callback)->
  26. @addUsersToGroup(subscriptionId, [userId], callback)
  27. addUsersToGroup: (subscriptionId, memberIds, callback)->
  28. @addUsersToGroupWithoutFeaturesRefresh subscriptionId, memberIds, (err) ->
  29. return callback(err) if err?
  30. # Only apply features updates to users, not user stubs
  31. UserGetter.getUsers memberIds, { _id: 1 }, (err, users) ->
  32. return callback(err) if err?
  33. userIds = users.map (u) -> u._id.toString()
  34. async.map userIds, FeaturesUpdater.refreshFeatures, callback
  35. addUsersToGroupWithoutFeaturesRefresh: (subscriptionId, memberIds, callback)->
  36. logger.log subscriptionId: subscriptionId, memberIds: memberIds, "adding members into mongo subscription"
  37. searchOps =
  38. _id: subscriptionId
  39. insertOperation =
  40. { $addToSet: { member_ids: { $each: memberIds } } }
  41. Subscription.findAndModify searchOps, insertOperation, callback
  42. removeUserFromGroups: (filter, user_id, callback)->
  43. removeOperation =
  44. "$pull": {member_ids:user_id}
  45. Subscription.updateMany filter, removeOperation, (err)->
  46. if err?
  47. logger.err err:err, searchOps:searchOps, removeOperation:removeOperation, "error removing user from groups"
  48. return callback(err)
  49. UserGetter.getUserOrUserStubById user_id, {}, (error, user, isStub) ->
  50. return callback(error) if error
  51. return callback() if isStub
  52. FeaturesUpdater.refreshFeatures user_id, callback
  53. removeUserFromGroup: (subscriptionId, user_id, callback)->
  54. SubscriptionUpdater.removeUserFromGroups { _id: subscriptionId }, user_id, callback
  55. removeUserFromAllGroups: (user_id, callback) ->
  56. SubscriptionLocator.getMemberSubscriptions user_id, (error, subscriptions) ->
  57. return callback(error) if error
  58. return callback() unless subscriptions
  59. subscriptionIds = subscriptions.map (sub) -> sub._id
  60. SubscriptionUpdater.removeUserFromGroups { _id: subscriptionIds }, user_id, callback
  61. deleteWithV1Id: (v1TeamId, callback)->
  62. Subscription.deleteOne { "overleaf.id": v1TeamId }, callback
  63. deleteSubscription: (subscription_id, callback = (error) ->) ->
  64. SubscriptionLocator.getSubscription subscription_id, (err, subscription) ->
  65. return callback(err) if err?
  66. affected_user_ids = [subscription.admin_id].concat(subscription.member_ids or [])
  67. logger.log {subscription_id, affected_user_ids}, "deleting subscription and downgrading users"
  68. Subscription.remove {_id: ObjectId(subscription_id)}, (err) ->
  69. return callback(err) if err?
  70. async.mapSeries affected_user_ids, FeaturesUpdater.refreshFeatures, callback
  71. _createNewSubscription: (adminUser_id, callback)->
  72. logger.log adminUser_id:adminUser_id, "creating new subscription"
  73. subscription = new Subscription(admin_id:adminUser_id, manager_ids: [adminUser_id])
  74. subscription.save (err)->
  75. callback err, subscription
  76. _updateSubscriptionFromRecurly: (recurlySubscription, subscription, callback)->
  77. logger.log recurlySubscription:recurlySubscription, subscription:subscription, "updaing subscription"
  78. if recurlySubscription.state == "expired"
  79. return SubscriptionUpdater.deleteSubscription subscription._id, callback
  80. subscription.recurlySubscription_id = recurlySubscription.uuid
  81. subscription.planCode = recurlySubscription.plan.plan_code
  82. plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
  83. if !plan?
  84. return callback(new Error("plan code not found: #{subscription.planCode}"))
  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. FeaturesUpdater.refreshFeatures user_id, cb
  93. async.series jobs, callback