Merge pull request #2606 from overleaf/ta-check-sso-users

Add SSO Users Info on Users Features Check Summary

GitOrigin-RevId: 5c874e1bf50005eb311317b867b17380ca017118
This commit is contained in:
Timothée Alby 2020-02-14 10:27:27 -05:00 committed by Copybot
parent 69a98355ce
commit cd9a9b43bd
2 changed files with 57 additions and 15 deletions

View file

@ -21,6 +21,7 @@ const { ObjectId } = require('../../infrastructure/mongojs')
const { getInstitutionAffiliations } = require('./InstitutionsAPI')
const FeaturesUpdater = require('../Subscription/FeaturesUpdater')
const UserGetter = require('../User/UserGetter')
const SAMLIdentityManager = require('../User/SAMLIdentityManager')
const NotificationsBuilder = require('../Notifications/NotificationsBuilder')
const SubscriptionLocator = require('../Subscription/SubscriptionLocator')
const { Institution } = require('../../models/Institution')
@ -60,8 +61,8 @@ module.exports = InstitutionsManager = {
return getInstitutionAffiliations(institutionId, (error, affiliations) =>
UserGetter.getUsersByAnyConfirmedEmail(
affiliations.map(affiliation => affiliation.email),
{ features: 1 },
(error, users) => callback(error, checkFeatures(users))
{ features: 1, samlIdentifiers: 1 },
(error, users) => callback(error, checkFeatures(institutionId, users))
)
)
},
@ -170,19 +171,45 @@ var notifyUser = (user, affiliation, subscription, featuresChanged, callback) =>
callback
)
var checkFeatures = function(users) {
var checkFeatures = function(institutionId, users) {
const usersSummary = {
totalConfirmedUsers: users.length,
totalConfirmedProUsers: 0,
totalConfirmedNonProUsers: 0,
confirmedNonProUsers: []
confirmedEmailUsers: {
total: users.length, // all users are confirmed email users
totalProUsers: 0,
totalNonProUsers: 0,
nonProUsers: []
},
entitledSSOUsers: {
total: 0,
totalProUsers: 0,
totalNonProUsers: 0,
nonProUsers: []
}
}
users.forEach(function(user) {
let isSSOEntitled = SAMLIdentityManager.userHasEntitlement(
user,
institutionId
)
if (isSSOEntitled) {
usersSummary.entitledSSOUsers.total += 1
}
if (user.features.collaborators === -1 && user.features.trackChanges) {
return (usersSummary.totalConfirmedProUsers += 1)
// user is on Pro
usersSummary.confirmedEmailUsers.totalProUsers += 1
if (isSSOEntitled) {
usersSummary.entitledSSOUsers.totalProUsers += 1
}
} else {
usersSummary.totalConfirmedNonProUsers += 1
return usersSummary.confirmedNonProUsers.push(user._id)
// user is not on Pro
usersSummary.confirmedEmailUsers.totalNonProUsers += 1
usersSummary.confirmedEmailUsers.nonProUsers.push(user._id)
if (isSSOEntitled) {
usersSummary.entitledSSOUsers.totalNonProUsers += 1
usersSummary.entitledSSOUsers.nonProUsers.push(user._id)
}
}
})
return usersSummary

View file

@ -50,6 +50,9 @@ describe('InstitutionsManager', function() {
}
}
this.subscriptionExec = sinon.stub().yields()
this.SAMLIdentityManager = {
userHasEntitlement: sinon.stub().returns(false)
}
const SubscriptionModel = {
Subscription: {
find: () => {
@ -80,7 +83,8 @@ describe('InstitutionsManager', function() {
'../Subscription/SubscriptionLocator': this.SubscriptionLocator,
'../../models/Institution': this.InstitutionModel,
'../../models/Subscription': SubscriptionModel,
'../../infrastructure/mongojs': this.Mongo
'../../infrastructure/mongojs': this.Mongo,
'../User/SAMLIdentityManager': this.SAMLIdentityManager
}
}))
})
@ -176,17 +180,28 @@ describe('InstitutionsManager', function() {
]
this.getInstitutionAffiliations.yields(null, affiliations)
this.UserGetter.getUsersByAnyConfirmedEmail.yields(null, stubbedUsers)
this.SAMLIdentityManager.userHasEntitlement.onCall(0).returns(true)
this.SAMLIdentityManager.userHasEntitlement.onCall(1).returns(true)
this.SAMLIdentityManager.userHasEntitlement.onCall(2).returns(false)
return this.InstitutionsManager.checkInstitutionUsers(
this.institutionId,
(error, usersSummary) => {
should.not.exist(error)
usersSummary.totalConfirmedUsers.should.equal(3)
usersSummary.totalConfirmedProUsers.should.equal(1)
usersSummary.totalConfirmedNonProUsers.should.equal(2)
expect(usersSummary.confirmedNonProUsers).to.deep.equal([
usersSummary.confirmedEmailUsers.total.should.equal(3)
usersSummary.confirmedEmailUsers.totalProUsers.should.equal(1)
usersSummary.confirmedEmailUsers.totalNonProUsers.should.equal(2)
expect(usersSummary.confirmedEmailUsers.nonProUsers).to.deep.equal([
'456def456def456def456def',
'789def789def789def789def'
])
usersSummary.entitledSSOUsers.total.should.equal(2)
usersSummary.entitledSSOUsers.totalProUsers.should.equal(1)
usersSummary.entitledSSOUsers.totalNonProUsers.should.equal(1)
expect(usersSummary.entitledSSOUsers.nonProUsers).to.deep.equal([
'456def456def456def456def'
])
return done()
}
)