back_fill_staff_access.mjs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import {
  2. db,
  3. READ_PREFERENCE_SECONDARY,
  4. } from '../app/src/infrastructure/mongodb.mjs'
  5. import UserSessionsManager from '../app/src/Features/User/UserSessionsManager.mjs'
  6. import { scriptRunner } from './lib/ScriptRunner.mjs'
  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. const adminUsers = await db.users
  38. .find(
  39. { isAdmin: true },
  40. {
  41. projection: {
  42. _id: 1,
  43. email: 1,
  44. staffAccess: 1,
  45. },
  46. readPreference: READ_PREFERENCE_SECONDARY,
  47. }
  48. )
  49. .toArray()
  50. console.log('All Admin users:')
  51. console.table(adminUsers.map(formatUser))
  52. const incompleteUsers = adminUsers.filter(doesNotHaveFullStaffAccess)
  53. if (incompleteUsers.length === 0) {
  54. console.warn('All Admin users have full staff access.')
  55. return
  56. }
  57. console.log()
  58. console.log('Incomplete staff access:')
  59. console.table(incompleteUsers.map(formatUser))
  60. if (COMMIT) {
  61. for (const user of incompleteUsers) {
  62. console.error(
  63. `Granting ${user.email} (${user._id.toString()}) full staff access`
  64. )
  65. await db.users.updateOne(
  66. { _id: user._id, isAdmin: true },
  67. { $set: { staffAccess: FULL_STAFF_ACCESS } }
  68. )
  69. if (!KEEP_SESSIONS) {
  70. await UserSessionsManager.promises.removeSessionsFromRedis(user)
  71. }
  72. }
  73. } else {
  74. console.warn('Use --commit to grant missing staff access.')
  75. }
  76. }
  77. try {
  78. await scriptRunner(main)
  79. console.error('Done.')
  80. process.exit(0)
  81. } catch (error) {
  82. console.error({ error })
  83. process.exit(1)
  84. }