Browse Source

Merge pull request #6721 from overleaf/jpa-back-fill-staff-access

[web] scripts: add a new script for back filling staff access for admins

GitOrigin-RevId: c7eaa5887bdbc1a9594553961bd08fba48a451ed
Jakob Ackermann 4 years ago
parent
commit
fa55598c82
1 changed files with 93 additions and 0 deletions
  1. 93 0
      services/web/scripts/back_fill_staff_access.js

+ 93 - 0
services/web/scripts/back_fill_staff_access.js

@@ -0,0 +1,93 @@
+const { db, waitForDb } = require('../app/src/infrastructure/mongodb')
+const { ReadPreference } = require('mongodb')
+const UserSessionsManager = require('../app/src/Features/User/UserSessionsManager')
+
+const COMMIT = process.argv.includes('--commit')
+const KEEP_SESSIONS = process.argv.includes('--keep-sessions')
+
+const FULL_STAFF_ACCESS = {
+  publisherMetrics: true,
+  publisherManagement: true,
+  institutionMetrics: true,
+  institutionManagement: true,
+  groupMetrics: true,
+  groupManagement: true,
+  adminMetrics: true,
+  splitTestMetrics: true,
+  splitTestManagement: true,
+}
+
+function doesNotHaveFullStaffAccess(user) {
+  if (!user.staffAccess) {
+    return true
+  }
+  for (const field of Object.keys(FULL_STAFF_ACCESS)) {
+    if (!user.staffAccess[field]) {
+      return true
+    }
+  }
+  return false
+}
+
+function formatUser(user) {
+  user = Object.assign({}, user, user.staffAccess)
+  delete user.staffAccess
+  return user
+}
+
+async function main() {
+  await waitForDb()
+  const adminUsers = await db.users
+    .find(
+      { isAdmin: true },
+      {
+        projection: {
+          _id: 1,
+          email: 1,
+          staffAccess: 1,
+        },
+        readPreference: ReadPreference.SECONDARY,
+      }
+    )
+    .toArray()
+
+  console.log('All Admin users:')
+  console.table(adminUsers.map(formatUser))
+
+  const incompleteUsers = adminUsers.filter(doesNotHaveFullStaffAccess)
+  if (incompleteUsers.length === 0) {
+    console.warn('All Admin users have full staff access.')
+    return
+  }
+
+  console.log()
+  console.log('Incomplete staff access:')
+  console.table(incompleteUsers.map(formatUser))
+
+  if (COMMIT) {
+    for (const user of incompleteUsers) {
+      console.error(
+        `Granting ${user.email} (${user._id.toString()}) full staff access`
+      )
+      await db.users.updateOne(
+        { _id: user._id, isAdmin: true },
+        { $set: { staffAccess: FULL_STAFF_ACCESS } }
+      )
+      if (!KEEP_SESSIONS) {
+        await UserSessionsManager.promises.revokeAllUserSessions(user, [])
+      }
+    }
+  } else {
+    console.warn('Use --commit to grant missing staff access.')
+  }
+}
+
+main()
+  .then(() => {
+    console.error('Done.')
+    process.exit(0)
+  })
+  .catch(error => {
+    console.error({ error })
+    process.exit(1)
+  })