Просмотр исходного кода

Merge pull request #17830 from overleaf/rh-reduce-staff-access-session

[web] Reduce size of staffAccess field in session

GitOrigin-RevId: 7745dc595e8096caef04fd140b47532f0775f165
roo hutton 2 лет назад
Родитель
Сommit
754609f379

+ 21 - 2
services/web/app/src/Features/Authentication/AuthenticationController.js

@@ -50,6 +50,20 @@ function checkCredentials(userDetailsMap, user, password) {
   return isValid
   return isValid
 }
 }
 
 
+function reduceStaffAccess(staffAccess) {
+  const reducedStaffAccess = {}
+  for (const field in staffAccess) {
+    if (staffAccess[field]) {
+      reducedStaffAccess[field] = true
+    }
+  }
+  return reducedStaffAccess
+}
+
+function userHasStaffAccess(user) {
+  return user.staffAccess && Object.values(user.staffAccess).includes(true)
+}
+
 const AuthenticationController = {
 const AuthenticationController = {
   serializeUser(user, callback) {
   serializeUser(user, callback) {
     if (!user._id || !user.email) {
     if (!user._id || !user.email) {
@@ -61,8 +75,6 @@ const AuthenticationController = {
       _id: user._id,
       _id: user._id,
       first_name: user.first_name,
       first_name: user.first_name,
       last_name: user.last_name,
       last_name: user.last_name,
-      isAdmin: user.isAdmin,
-      staffAccess: user.staffAccess,
       email: user.email,
       email: user.email,
       referal_id: user.referal_id,
       referal_id: user.referal_id,
       session_created: new Date().toISOString(),
       session_created: new Date().toISOString(),
@@ -73,6 +85,13 @@ const AuthenticationController = {
       alphaProgram: user.alphaProgram || undefined, // only store if set
       alphaProgram: user.alphaProgram || undefined, // only store if set
       betaProgram: user.betaProgram || undefined, // only store if set
       betaProgram: user.betaProgram || undefined, // only store if set
     }
     }
+    if (user.isAdmin) {
+      lightUser.isAdmin = true
+    }
+    if (userHasStaffAccess(user)) {
+      lightUser.staffAccess = reduceStaffAccess(user.staffAccess)
+    }
+
     callback(null, lightUser)
     callback(null, lightUser)
   },
   },
 
 

+ 79 - 0
services/web/test/unit/src/Authentication/AuthenticationControllerTests.js

@@ -24,6 +24,34 @@ describe('AuthenticationController', function () {
       referal_id: 1234,
       referal_id: 1234,
       isAdmin: false,
       isAdmin: false,
     }
     }
+    this.staffUser = {
+      ...this.user,
+      staffAccess: {
+        publisherMetrics: true,
+        publisherManagement: false,
+        institutionMetrics: true,
+        institutionManagement: false,
+        groupMetrics: true,
+        groupManagement: false,
+        adminMetrics: true,
+        splitTestMetrics: false,
+        splitTestManagement: true,
+      },
+    }
+    this.noStaffAccessUser = {
+      ...this.user,
+      staffAccess: {
+        publisherMetrics: false,
+        publisherManagement: false,
+        institutionMetrics: false,
+        institutionManagement: false,
+        groupMetrics: false,
+        groupManagement: false,
+        adminMetrics: false,
+        splitTestMetrics: false,
+        splitTestManagement: false,
+      },
+    }
     this.password = 'banana'
     this.password = 'banana'
     this.req = new MockRequest()
     this.req = new MockRequest()
     this.res = new MockResponse()
     this.res = new MockResponse()
@@ -181,6 +209,57 @@ describe('AuthenticationController', function () {
     })
     })
   })
   })
 
 
+  describe('serializeUser', function () {
+    describe('when isAdmin is false', function () {
+      it('does not return an isAdmin field', function () {
+        const isAdminMatcher = sinon.match(value => {
+          return !('isAdmin' in value)
+        })
+
+        this.AuthenticationController.serializeUser(this.user, this.callback)
+        expect(this.callback).to.have.been.calledWith(null, isAdminMatcher)
+      })
+    })
+
+    describe('when staffAccess fields are provided', function () {
+      it('only returns the fields set to true', function () {
+        const expectedStaffAccess = {
+          publisherMetrics: true,
+          institutionMetrics: true,
+          groupMetrics: true,
+          adminMetrics: true,
+          splitTestManagement: true,
+        }
+        const staffAccessMatcher = sinon.match(value => {
+          return (
+            Object.keys(value.staffAccess).length ===
+            Object.keys(expectedStaffAccess).length
+          )
+        })
+
+        this.AuthenticationController.serializeUser(
+          this.staffUser,
+          this.callback
+        )
+        expect(this.callback).to.have.been.calledWith(null, staffAccessMatcher)
+      })
+    })
+
+    describe('when all staffAccess fields are false', function () {
+      it('no staffAccess attribute is set', function () {
+        const staffAccessMatcher = sinon.match(value => {
+          return !('staffAccess' in value)
+        })
+
+        this.AuthenticationController.serializeUser(
+          this.noStaffAccessUser,
+          this.callback
+        )
+        expect(this.callback).to.have.been.calledWith(null, staffAccessMatcher)
+      })
+    })
+  })
+
   describe('passportLogin', function () {
   describe('passportLogin', function () {
     beforeEach(function () {
     beforeEach(function () {
       this.info = null
       this.info = null