UserUpdater.coffee 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. logger = require("logger-sharelatex")
  2. mongojs = require("../../infrastructure/mongojs")
  3. metrics = require("metrics-sharelatex")
  4. db = mongojs.db
  5. async = require("async")
  6. ObjectId = mongojs.ObjectId
  7. UserGetter = require("./UserGetter")
  8. module.exports = UserUpdater =
  9. updateUser: (query, update, callback = (error) ->) ->
  10. if typeof query == "string"
  11. query = _id: ObjectId(query)
  12. else if query instanceof ObjectId
  13. query = _id: query
  14. else if typeof query._id == "string"
  15. query._id = ObjectId(query._id)
  16. db.users.update query, update, callback
  17. #
  18. # DEPRECATED
  19. #
  20. # Change the user's main email address by adding a new email, switching the
  21. # default email and removing the old email. Prefer manipulating multiple
  22. # emails and the default rather than calling this method directly
  23. #
  24. changeEmailAddress: (userId, newEmail, callback)->
  25. logger.log userId: userId, newEmail: newEmail, "updaing email address of user"
  26. oldEmail = null
  27. async.series [
  28. (cb) ->
  29. UserGetter.getUserEmail userId, (error, email) ->
  30. oldEmail = email
  31. cb(error)
  32. (cb) -> UserUpdater.addEmailAddress userId, newEmail, cb
  33. (cb) -> UserUpdater.setDefaultEmailAddress userId, newEmail, cb
  34. (cb) -> UserUpdater.removeEmailAddress userId, oldEmail, cb
  35. ], callback
  36. # Add a new email address for the user. Email cannot be already used by this
  37. # or any other user
  38. addEmailAddress: (userId, newEmail, callback) ->
  39. @_ensureUniqueEmailAddress newEmail, (error) =>
  40. return callback(error) if error?
  41. update = $push: emails: email: newEmail, createdAt: new Date()
  42. @updateUser userId, update, (error) ->
  43. if error?
  44. logger.err error: error, 'problem updating users emails'
  45. return callback(error)
  46. callback()
  47. # remove one of the user's email addresses. The email cannot be the user's
  48. # default email address
  49. removeEmailAddress: (userId, email, callback) ->
  50. query = _id: userId, email: $ne: email
  51. update = $pull: emails: email: email
  52. @updateUser query, update, (error, res) ->
  53. if error?
  54. logger.err error:error, 'problem removing users email'
  55. return callback(error)
  56. if res.nMatched == 0
  57. return callback(new Error('Cannot remove default email'))
  58. callback()
  59. # set the default email address by setting the `email` attribute. The email
  60. # must be one of the user's multiple emails (`emails` attribute)
  61. setDefaultEmailAddress: (userId, email, callback) ->
  62. query = _id: userId, 'emails.email': email
  63. update = $set: email: email
  64. @updateUser query, update, (error, res) ->
  65. if error?
  66. logger.err error:error, 'problem setting default emails'
  67. return callback(error)
  68. if res.nMatched == 0
  69. return callback(new Error('Default email does not belong to user'))
  70. callback()
  71. # check for duplicate email address. This is also enforced at the DB level
  72. _ensureUniqueEmailAddress: (newEmail, callback) ->
  73. UserGetter.getUserByAnyEmail newEmail, (error, user) ->
  74. return callback(message: 'alread_exists') if user?
  75. callback()
  76. [
  77. 'updateUser'
  78. 'changeEmailAddress'
  79. 'setDefaultEmailAddress'
  80. 'addEmailAddress'
  81. 'removeEmailAddress'
  82. '_ensureUniqueEmailAddress'
  83. ].map (method) ->
  84. metrics.timeAsyncMethod(UserUpdater, method, 'mongo.UserUpdater', logger)