SubscriptionUpdater.coffee 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 =
  13. syncSubscription: (recurlySubscription, adminUser_id, callback) ->
  14. self = @
  15. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "syncSubscription, creating new if subscription does not exist"
  16. SubscriptionLocator.getUsersSubscription adminUser_id, (err, subscription)->
  17. if subscription?
  18. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does exist"
  19. self._updateSubscription recurlySubscription, subscription, callback
  20. else
  21. logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does not exist, creating a new one"
  22. self._createNewSubscription adminUser_id, (err, subscription)->
  23. self._updateSubscription 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. UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, callback
  35. removeUserFromGroup: (adminUser_id, user_id, callback)->
  36. searchOps =
  37. admin_id: adminUser_id
  38. removeOperation =
  39. "$pull": {member_ids:user_id}
  40. Subscription.update searchOps, removeOperation, (err)->
  41. if err?
  42. logger.err err:err, searchOps:searchOps, removeOperation:removeOperation, "error removing user from group"
  43. return callback(err)
  44. UserFeaturesUpdater.updateFeatures user_id, Settings.defaultPlanCode, callback
  45. _createNewSubscription: (adminUser_id, callback)->
  46. logger.log adminUser_id:adminUser_id, "creating new subscription"
  47. subscription = new Subscription(admin_id:adminUser_id)
  48. subscription.freeTrial.allowed = false
  49. subscription.save (err)->
  50. callback err, subscription
  51. _updateSubscription: (recurlySubscription, subscription, callback)->
  52. logger.log recurlySubscription:recurlySubscription, subscription:subscription, "updaing subscription"
  53. plan = PlansLocator.findLocalPlanInSettings(recurlySubscription.plan.plan_code)
  54. if recurlySubscription.state == "expired"
  55. subscription.recurlySubscription_id = undefined
  56. subscription.planCode = Settings.defaultPlanCode
  57. else
  58. subscription.recurlySubscription_id = recurlySubscription.uuid
  59. subscription.freeTrial.expiresAt = undefined
  60. subscription.freeTrial.planCode = undefined
  61. subscription.freeTrial.allowed = true
  62. subscription.planCode = recurlySubscription.plan.plan_code
  63. if plan.groupPlan
  64. subscription.groupPlan = true
  65. subscription.membersLimit = plan.membersLimit
  66. subscription.save ->
  67. allIds = _.union subscription.members_id, [subscription.admin_id]
  68. jobs = allIds.map (user_id)->
  69. return (cb)->
  70. UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, cb
  71. jobs.push (cb)-> ReferalAllocator.assignBonus subscription.admin_id, cb
  72. async.series jobs, callback