UserUpdater.coffee 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. EmailHelper = require "../Helpers/EmailHelper"
  9. Errors = require "../Errors/Errors"
  10. module.exports = UserUpdater =
  11. updateUser: (query, update, callback = (error) ->) ->
  12. if typeof query == "string"
  13. query = _id: ObjectId(query)
  14. else if query instanceof ObjectId
  15. query = _id: query
  16. else if typeof query._id == "string"
  17. query._id = ObjectId(query._id)
  18. db.users.update query, update, callback
  19. #
  20. # DEPRECATED
  21. #
  22. # Change the user's main email address by adding a new email, switching the
  23. # default email and removing the old email. Prefer manipulating multiple
  24. # emails and the default rather than calling this method directly
  25. #
  26. changeEmailAddress: (userId, newEmail, callback)->
  27. logger.log userId: userId, newEmail: newEmail, "updaing email address of user"
  28. oldEmail = null
  29. async.series [
  30. (cb) ->
  31. UserGetter.getUserEmail userId, (error, email) ->
  32. oldEmail = email
  33. cb(error)
  34. (cb) -> UserUpdater.addEmailAddress userId, newEmail, cb
  35. (cb) -> UserUpdater.setDefaultEmailAddress userId, newEmail, cb
  36. (cb) -> UserUpdater.removeEmailAddress userId, oldEmail, cb
  37. ], callback
  38. # Add a new email address for the user. Email cannot be already used by this
  39. # or any other user
  40. addEmailAddress: (userId, newEmail, callback) ->
  41. UserGetter.ensureUniqueEmailAddress newEmail, (error) =>
  42. return callback(error) if error?
  43. update = $push: emails: email: newEmail, createdAt: new Date()
  44. @updateUser userId, update, (error) ->
  45. if error?
  46. logger.err error: error, 'problem updating users emails'
  47. return callback(error)
  48. callback()
  49. # remove one of the user's email addresses. The email cannot be the user's
  50. # default email address
  51. removeEmailAddress: (userId, email, callback) ->
  52. query = _id: userId, email: $ne: email
  53. update = $pull: emails: email: email
  54. @updateUser query, update, (error, res) ->
  55. if error?
  56. logger.err error:error, 'problem removing users email'
  57. return callback(error)
  58. if res.n == 0
  59. return callback(new Error('Cannot remove default email'))
  60. callback()
  61. # set the default email address by setting the `email` attribute. The email
  62. # must be one of the user's multiple emails (`emails` attribute)
  63. setDefaultEmailAddress: (userId, email, callback) ->
  64. query = _id: userId, 'emails.email': email
  65. update = $set: email: email
  66. @updateUser query, update, (error, res) ->
  67. if error?
  68. logger.err error:error, 'problem setting default emails'
  69. return callback(error)
  70. if res.n == 0 # TODO: Check n or nMatched?
  71. return callback(new Error('Default email does not belong to user'))
  72. callback()
  73. confirmEmail: (userId, email, callback) ->
  74. email = EmailHelper.parseEmail(email)
  75. return callback(new Error('invalid email')) if !email?
  76. logger.log {userId, email}, 'confirming user email'
  77. query =
  78. _id: userId
  79. 'emails.email': email
  80. update =
  81. $set:
  82. 'emails.$.confirmedAt': new Date()
  83. @updateUser query, update, (error, res) ->
  84. return callback(error) if error?
  85. logger.log {res, userId, email}, "tried to confirm email"
  86. if res.n == 0
  87. return callback(new Errors.NotFoundError('user id and email do no match'))
  88. callback()
  89. [
  90. 'updateUser'
  91. 'changeEmailAddress'
  92. 'setDefaultEmailAddress'
  93. 'addEmailAddress'
  94. 'removeEmailAddress'
  95. ].map (method) ->
  96. metrics.timeAsyncMethod(UserUpdater, method, 'mongo.UserUpdater', logger)