UserMembershipViewModel.mjs 2.4 KB

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