UserGetter.coffee 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. mongojs = require("../../infrastructure/mongojs")
  2. metrics = require('metrics-sharelatex')
  3. logger = require('logger-sharelatex')
  4. db = mongojs.db
  5. ObjectId = mongojs.ObjectId
  6. module.exports = UserGetter =
  7. getUser: (query, projection, callback = (error, user) ->) ->
  8. if query?.email?
  9. return callback(new Error("Don't use getUser to find user by email"), null)
  10. if arguments.length == 2
  11. callback = projection
  12. projection = {}
  13. if typeof query == "string"
  14. try
  15. query = _id: ObjectId(query)
  16. catch e
  17. return callback(null, null)
  18. else if query instanceof ObjectId
  19. query = _id: query
  20. db.users.findOne query, projection, callback
  21. getUserEmail: (userId, callback = (error, email) ->) ->
  22. @getUser userId, { email: 1 }, (error, user) ->
  23. callback(error, user?.email)
  24. getUserByMainEmail: (email, projection, callback = (error, user) ->) ->
  25. email = email.trim()
  26. if arguments.length == 2
  27. callback = projection
  28. projection = {}
  29. db.users.findOne email: email, projection, callback
  30. getUserByAnyEmail: (email, projection, callback = (error, user) ->) ->
  31. email = email.trim()
  32. if arguments.length == 2
  33. callback = projection
  34. projection = {}
  35. # $exists: true MUST be set to use the partial index
  36. query = emails: { $exists: true }, 'emails.email': email
  37. db.users.findOne query, projection, (error, user) =>
  38. return callback(error, user) if error? or user?
  39. # While multiple emails are being rolled out, check for the main email as
  40. # well
  41. @getUserByMainEmail email, projection, callback
  42. getUsers: (user_ids, projection, callback = (error, users) ->) ->
  43. try
  44. user_ids = user_ids.map (u) -> ObjectId(u.toString())
  45. catch error
  46. return callback error
  47. db.users.find { _id: { $in: user_ids} }, projection, callback
  48. getUserOrUserStubById: (user_id, projection, callback = (error, user) ->) ->
  49. try
  50. query = _id: ObjectId(user_id.toString())
  51. catch e
  52. return callback(new Error(e))
  53. db.users.findOne query, projection, (error, user) ->
  54. return callback(error) if error?
  55. return callback(null, user) if user?
  56. db.userstubs.findOne query, projection, callback
  57. # check for duplicate email address. This is also enforced at the DB level
  58. ensureUniqueEmailAddress: (newEmail, callback) ->
  59. @getUserByAnyEmail newEmail, (error, user) ->
  60. return callback(message: 'alread_exists') if user?
  61. callback(error)
  62. [
  63. 'getUser',
  64. 'getUserEmail',
  65. 'getUserByMainEmail',
  66. 'getUserByAnyEmail',
  67. 'getUsers',
  68. 'getUserOrUserStubById',
  69. 'ensureUniqueEmailAddress',
  70. ].map (method) ->
  71. metrics.timeAsyncMethod UserGetter, method, 'mongo.UserGetter', logger