UserMembershipViewModel.mjs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import UserGetter from '../User/UserGetter.mjs'
  2. import Mongo from '../Helpers/Mongo.mjs'
  3. const { isObjectIdInstance } = Mongo
  4. const UserMembershipViewModel = {
  5. build(userOrEmail) {
  6. if (userOrEmail._id) {
  7. return buildUserViewModel(userOrEmail, false)
  8. } else {
  9. return buildUserViewModelWithEmail(userOrEmail)
  10. }
  11. },
  12. async buildAsync(userOrIdOrEmailArray) {
  13. const userObjectIds = userOrIdOrEmailArray.filter(isObjectIdInstance)
  14. const results = []
  15. try {
  16. const users = await UserGetter.promises.getUsers(userObjectIds, {
  17. email: 1,
  18. first_name: 1,
  19. last_name: 1,
  20. lastLoggedIn: 1,
  21. lastActive: 1,
  22. enrollment: 1,
  23. })
  24. const usersMap = new Map()
  25. for (const user of users) {
  26. usersMap.set(user._id.toString(), user)
  27. }
  28. userOrIdOrEmailArray.forEach(item => {
  29. if (isObjectIdInstance(item)) {
  30. const user = usersMap.get(item.toString())
  31. if (!user) {
  32. results.push(buildUserViewModelWithId(item.toString()))
  33. } else {
  34. results.push(buildUserViewModel(user, false))
  35. }
  36. } else {
  37. // `item` is a user or an email and can be parsed by #build
  38. results.push(UserMembershipViewModel.build(item))
  39. }
  40. })
  41. } catch (error) {
  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. }
  51. return results
  52. },
  53. }
  54. function buildUserViewModel(user, isInvite) {
  55. return {
  56. _id: user._id || null,
  57. email: user.email || null,
  58. first_name: user.first_name || null,
  59. last_name: user.last_name || null,
  60. last_active_at: user.lastActive || user.lastLoggedIn || null,
  61. last_logged_in_at: user.lastLoggedIn || null,
  62. invite: isInvite,
  63. enrollment: user.enrollment
  64. ? {
  65. managedBy: user.enrollment.managedBy,
  66. enrolledAt: user.enrollment.enrolledAt,
  67. sso: user.enrollment.sso,
  68. }
  69. : undefined,
  70. }
  71. }
  72. const buildUserViewModelWithEmail = email => buildUserViewModel({ email }, true)
  73. const buildUserViewModelWithId = id => buildUserViewModel({ _id: id }, false)
  74. UserMembershipViewModel.promises = {
  75. buildAsync: UserMembershipViewModel.buildAsync,
  76. }
  77. export default UserMembershipViewModel