back_fill_staff_access.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. const {
  2. db,
  3. waitForDb,
  4. READ_PREFERENCE_SECONDARY,
  5. } = require('../app/src/infrastructure/mongodb')
  6. const UserSessionsManager = require('../app/src/Features/User/UserSessionsManager')
  7. const COMMIT = process.argv.includes('--commit')
  8. const KEEP_SESSIONS = process.argv.includes('--keep-sessions')
  9. const FULL_STAFF_ACCESS = {
  10. publisherMetrics: true,
  11. publisherManagement: true,
  12. institutionMetrics: true,
  13. institutionManagement: true,
  14. groupMetrics: true,
  15. groupManagement: true,
  16. adminMetrics: true,
  17. splitTestMetrics: true,
  18. splitTestManagement: true,
  19. }
  20. function doesNotHaveFullStaffAccess(user) {
  21. if (!user.staffAccess) {
  22. return true
  23. }
  24. for (const field of Object.keys(FULL_STAFF_ACCESS)) {
  25. if (!user.staffAccess[field]) {
  26. return true
  27. }
  28. }
  29. return false
  30. }
  31. function formatUser(user) {
  32. user = Object.assign({}, user, user.staffAccess)
  33. delete user.staffAccess
  34. return user
  35. }
  36. async function main() {
  37. await waitForDb()
  38. const adminUsers = await db.users
  39. .find(
  40. { isAdmin: true },
  41. {
  42. projection: {
  43. _id: 1,
  44. email: 1,
  45. staffAccess: 1,
  46. },
  47. readPreference: READ_PREFERENCE_SECONDARY,
  48. }
  49. )
  50. .toArray()
  51. console.log('All Admin users:')
  52. console.table(adminUsers.map(formatUser))
  53. const incompleteUsers = adminUsers.filter(doesNotHaveFullStaffAccess)
  54. if (incompleteUsers.length === 0) {
  55. console.warn('All Admin users have full staff access.')
  56. return
  57. }
  58. console.log()
  59. console.log('Incomplete staff access:')
  60. console.table(incompleteUsers.map(formatUser))
  61. if (COMMIT) {
  62. for (const user of incompleteUsers) {
  63. console.error(
  64. `Granting ${user.email} (${user._id.toString()}) full staff access`
  65. )
  66. await db.users.updateOne(
  67. { _id: user._id, isAdmin: true },
  68. { $set: { staffAccess: FULL_STAFF_ACCESS } }
  69. )
  70. if (!KEEP_SESSIONS) {
  71. await UserSessionsManager.promises.revokeAllUserSessions(user, [])
  72. }
  73. }
  74. } else {
  75. console.warn('Use --commit to grant missing staff access.')
  76. }
  77. }
  78. main()
  79. .then(() => {
  80. console.error('Done.')
  81. process.exit(0)
  82. })
  83. .catch(error => {
  84. console.error({ error })
  85. process.exit(1)
  86. })