SubscriptionGroupHandler.coffee 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. async = require("async")
  2. _ = require("underscore")
  3. SubscriptionUpdater = require("./SubscriptionUpdater")
  4. SubscriptionLocator = require("./SubscriptionLocator")
  5. UserGetter = require("../User/UserGetter")
  6. Subscription = require("../../models/Subscription").Subscription
  7. LimitationsManager = require("./LimitationsManager")
  8. logger = require("logger-sharelatex")
  9. OneTimeTokenHandler = require("../Security/OneTimeTokenHandler")
  10. TeamInvitesHandler = require("./TeamInvitesHandler")
  11. EmailHandler = require("../Email/EmailHandler")
  12. settings = require("settings-sharelatex")
  13. NotificationsBuilder = require("../Notifications/NotificationsBuilder")
  14. module.exports = SubscriptionGroupHandler =
  15. addUserToGroup: (subscriptionId, newEmail, callback)->
  16. logger.log subscriptionId:subscriptionId, newEmail:newEmail, "adding user to group"
  17. LimitationsManager.hasGroupMembersLimitReached subscriptionId, (err, limitReached, subscription)->
  18. if err?
  19. logger.err err:err, subscriptionId:subscriptionId, newEmail:newEmail, "error checking if limit reached for group plan"
  20. return callback(err)
  21. if limitReached
  22. logger.err subscriptionId:subscriptionId, newEmail:newEmail, "group subscription limit reached not adding user to group"
  23. return callback(limitReached:limitReached)
  24. UserGetter.getUserByAnyEmail newEmail, (err, user)->
  25. return callback(err) if err?
  26. if user?
  27. SubscriptionUpdater.addUserToGroup subscriptionId, user._id, (err)->
  28. if err?
  29. logger.err err:err, "error adding user to group"
  30. return callback(err)
  31. NotificationsBuilder.groupPlan(user, {subscription_id:subscription._id}).read()
  32. userViewModel = buildUserViewModel(user)
  33. callback(err, userViewModel)
  34. else
  35. TeamInvitesHandler.createInvite subscriptionId, newEmail, (err) ->
  36. return callback(err) if err?
  37. userViewModel = buildEmailInviteViewModel(newEmail)
  38. callback(err, userViewModel)
  39. removeUserFromGroup: (subscriptionId, userToRemove_id, callback)->
  40. SubscriptionUpdater.removeUserFromGroup subscriptionId, userToRemove_id, callback
  41. replaceUserReferencesInGroups: (oldId, newId, callback) ->
  42. Subscription.update {admin_id: oldId}, {admin_id: newId}, (error) ->
  43. callback(error) if error?
  44. replaceInArray Subscription, "manager_ids", oldId, newId, (error) ->
  45. callback(error) if error?
  46. replaceInArray Subscription, "member_ids", oldId, newId, callback
  47. getPopulatedListOfMembers: (subscriptionId, callback)->
  48. SubscriptionLocator.getSubscription subscriptionId, (err, subscription)->
  49. users = []
  50. for email in subscription.invited_emails or []
  51. users.push buildEmailInviteViewModel(email)
  52. for teamInvite in subscription.teamInvites or []
  53. users.push buildEmailInviteViewModel(teamInvite.email)
  54. jobs = _.map subscription.member_ids, (user_id)->
  55. return (cb)->
  56. UserGetter.getUser user_id, (err, user)->
  57. if err? or !user?
  58. users.push _id:user_id
  59. return cb()
  60. userViewModel = buildUserViewModel(user)
  61. users.push(userViewModel)
  62. cb()
  63. async.series jobs, (err)->
  64. callback(err, users)
  65. isUserPartOfGroup: (user_id, subscription_id, callback=(err, partOfGroup)->)->
  66. SubscriptionLocator.getSubscriptionByMemberIdAndId user_id, subscription_id, (err, subscription)->
  67. if subscription?
  68. partOfGroup = true
  69. else
  70. partOfGroup = false
  71. logger.log user_id:user_id, subscription_id:subscription_id, partOfGroup:partOfGroup, "checking if user is part of a group"
  72. callback(err, partOfGroup)
  73. replaceInArray = (model, property, oldValue, newValue, callback) ->
  74. logger.log "Replacing #{oldValue} with #{newValue} in #{property} of #{model}"
  75. # Mongo won't let us pull and addToSet in the same query, so do it in
  76. # two. Note we need to add first, since the query is based on the old user.
  77. query = {}
  78. query[property] = oldValue
  79. setNewValue = {}
  80. setNewValue[property] = newValue
  81. setOldValue = {}
  82. setOldValue[property] = oldValue
  83. model.update query, { $addToSet: setNewValue }, { multi: true }, (error) ->
  84. return callback(error) if error?
  85. model.update query, { $pull: setOldValue }, { multi: true }, callback
  86. buildUserViewModel = (user)->
  87. u =
  88. email: user.email
  89. first_name: user.first_name
  90. last_name: user.last_name
  91. invite: user.holdingAccount
  92. _id: user._id
  93. return u
  94. buildEmailInviteViewModel = (email) ->
  95. return {
  96. email: email
  97. invite: true
  98. }