UserMembershipViewModel.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /* eslint-disable
  2. n/handle-callback-err,
  3. max-len,
  4. */
  5. // TODO: This file was created by bulk-decaffeinate.
  6. // Fix any style issues and re-enable lint.
  7. /*
  8. * decaffeinate suggestions:
  9. * DS102: Remove unnecessary code created because of implicit returns
  10. * DS207: Consider shorter variations of null checks
  11. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  12. */
  13. const UserGetter = require('../User/UserGetter')
  14. const { isObjectIdInstance } = require('../Helpers/Mongo')
  15. const { promisify } = require('@overleaf/promise-utils')
  16. const UserMembershipViewModel = {
  17. build(userOrEmail) {
  18. if (userOrEmail._id) {
  19. return buildUserViewModel(userOrEmail)
  20. } else {
  21. return buildUserViewModelWithEmail(userOrEmail)
  22. }
  23. },
  24. buildAsync(userOrIdOrEmailArray, callback) {
  25. if (callback == null) {
  26. callback = function () {}
  27. }
  28. const userObjectIds = userOrIdOrEmailArray.filter(isObjectIdInstance)
  29. return UserGetter.getUsers(
  30. userObjectIds,
  31. {
  32. email: 1,
  33. first_name: 1,
  34. last_name: 1,
  35. lastLoggedIn: 1,
  36. lastActive: 1,
  37. enrollment: 1,
  38. },
  39. function (error, users) {
  40. const results = []
  41. if (error != null) {
  42. userOrIdOrEmailArray.forEach(item => {
  43. if (isObjectIdInstance(item)) {
  44. results.push(buildUserViewModelWithId(item.toString()))
  45. } else {
  46. // `item` is a user or an email and can be parsed by #build
  47. results.push(UserMembershipViewModel.build(item))
  48. }
  49. })
  50. } else {
  51. const usersMap = new Map()
  52. for (const user of users) {
  53. usersMap.set(user._id.toString(), user)
  54. }
  55. userOrIdOrEmailArray.forEach(item => {
  56. if (isObjectIdInstance(item)) {
  57. const user = usersMap.get(item.toString())
  58. if (user == null) {
  59. results.push(buildUserViewModelWithId(item.toString()))
  60. } else {
  61. results.push(buildUserViewModel(user))
  62. }
  63. } else {
  64. // `item` is a user or an email and can be parsed by #build
  65. results.push(UserMembershipViewModel.build(item))
  66. }
  67. })
  68. }
  69. callback(null, results)
  70. }
  71. )
  72. },
  73. }
  74. function buildUserViewModel(user, isInvite) {
  75. if (isInvite == null) {
  76. isInvite = false
  77. }
  78. return {
  79. _id: user._id || null,
  80. email: user.email || null,
  81. first_name: user.first_name || null,
  82. last_name: user.last_name || null,
  83. last_active_at: user.lastActive || user.lastLoggedIn || null,
  84. last_logged_in_at: user.lastLoggedIn || null,
  85. invite: isInvite,
  86. enrollment: user.enrollment
  87. ? {
  88. managedBy: user.enrollment.managedBy,
  89. enrolledAt: user.enrollment.enrolledAt,
  90. sso: user.enrollment.sso,
  91. }
  92. : undefined,
  93. }
  94. }
  95. const buildUserViewModelWithEmail = email => buildUserViewModel({ email }, true)
  96. const buildUserViewModelWithId = id => buildUserViewModel({ _id: id }, false)
  97. UserMembershipViewModel.promises = {
  98. buildAsync: promisify(UserMembershipViewModel.buildAsync),
  99. }
  100. module.exports = UserMembershipViewModel