back_fill_staff_access.js 2.2 KB

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