Merge pull request #3467 from overleaf/jel-async-getUserFullEmails

Convert getUserFullEmails to async

GitOrigin-RevId: 88e81460a7cc5703eb900e81f7cf594aeb204932
This commit is contained in:
Jakob Ackermann 2020-12-11 10:40:38 +00:00 committed by Copybot
parent 55bf16c06d
commit 4781c0bc3c
2 changed files with 52 additions and 58 deletions

View file

@ -1,13 +1,43 @@
const { callbackify } = require('util')
const { db } = require('../../infrastructure/mongodb') const { db } = require('../../infrastructure/mongodb')
const metrics = require('@overleaf/metrics') const metrics = require('@overleaf/metrics')
const logger = require('logger-sharelatex') const logger = require('logger-sharelatex')
const { promisifyAll } = require('../../util/promises') const { promisifyAll } = require('../../util/promises')
const { getUserAffiliations } = require('../Institutions/InstitutionsAPI') const {
promises: InstitutionsAPIPromises
} = require('../Institutions/InstitutionsAPI')
const InstitutionsHelper = require('../Institutions/InstitutionsHelper') const InstitutionsHelper = require('../Institutions/InstitutionsHelper')
const Errors = require('../Errors/Errors') const Errors = require('../Errors/Errors')
const Features = require('../../infrastructure/Features') const Features = require('../../infrastructure/Features')
const { normalizeQuery, normalizeMultiQuery } = require('../Helpers/Mongo') const { normalizeQuery, normalizeMultiQuery } = require('../Helpers/Mongo')
async function getUserFullEmails(userId) {
const user = await UserGetter.promises.getUser(userId, {
email: 1,
emails: 1,
samlIdentifiers: 1
})
if (!user) {
throw new Error('User not Found')
}
if (!Features.hasFeature('affiliations')) {
return decorateFullEmails(user.email, user.emails, [], [])
}
const affiliationsData = await InstitutionsAPIPromises.getUserAffiliations(
userId
)
return decorateFullEmails(
user.email,
user.emails || [],
affiliationsData,
user.samlIdentifiers || []
)
}
const UserGetter = { const UserGetter = {
getUser(query, projection, callback) { getUser(query, projection, callback) {
if (arguments.length === 2) { if (arguments.length === 2) {
@ -28,41 +58,7 @@ const UserGetter = {
) )
}, },
getUserFullEmails(userId, callback) { getUserFullEmails: callbackify(getUserFullEmails),
this.getUser(userId, { email: 1, emails: 1, samlIdentifiers: 1 }, function(
error,
user
) {
if (error) {
return callback(error)
}
if (!user) {
return callback(new Error('User not Found'))
}
if (!Features.hasFeature('affiliations')) {
return callback(
null,
decorateFullEmails(user.email, user.emails, [], [])
)
}
getUserAffiliations(userId, function(error, affiliationsData) {
if (error) {
return callback(error)
}
callback(
null,
decorateFullEmails(
user.email,
user.emails || [],
affiliationsData,
user.samlIdentifiers || []
)
)
})
})
},
getUserByMainEmail(email, projection, callback) { getUserByMainEmail(email, projection, callback) {
email = email.trim() email = email.trim()
@ -204,5 +200,9 @@ var decorateFullEmails = (
metrics.timeAsyncMethod(UserGetter, method, 'mongo.UserGetter', logger) metrics.timeAsyncMethod(UserGetter, method, 'mongo.UserGetter', logger)
) )
UserGetter.promises = promisifyAll(UserGetter) UserGetter.promises = promisifyAll(UserGetter, {
without: ['getUserFullEmails']
})
UserGetter.promises.getUserFullEmails = getUserFullEmails
module.exports = UserGetter module.exports = UserGetter

View file

@ -42,7 +42,7 @@ describe('UserGetter', function() {
ObjectId ObjectId
} }
const settings = { apis: { v1: { url: 'v1.url', user: '', pass: '' } } } const settings = { apis: { v1: { url: 'v1.url', user: '', pass: '' } } }
this.getUserAffiliations = sinon.stub().callsArgWith(1, null, []) this.getUserAffiliations = sinon.stub().resolves([])
this.UserGetter = SandboxedModule.require(modulePath, { this.UserGetter = SandboxedModule.require(modulePath, {
globals: { globals: {
@ -59,7 +59,9 @@ describe('UserGetter', function() {
}, },
'settings-sharelatex': settings, 'settings-sharelatex': settings,
'../Institutions/InstitutionsAPI': { '../Institutions/InstitutionsAPI': {
getUserAffiliations: this.getUserAffiliations promises: {
getUserAffiliations: this.getUserAffiliations
}
}, },
'../../infrastructure/Features': { '../../infrastructure/Features': {
hasFeature: sinon.stub().returns(true) hasFeature: sinon.stub().returns(true)
@ -116,16 +118,14 @@ describe('UserGetter', function() {
describe('getUserFullEmails', function() { describe('getUserFullEmails', function() {
it('should get user', function(done) { it('should get user', function(done) {
this.UserGetter.getUser = sinon this.UserGetter.promises.getUser = sinon.stub().resolves(this.fakeUser)
.stub()
.callsArgWith(2, null, this.fakeUser)
const projection = { email: 1, emails: 1, samlIdentifiers: 1 } const projection = { email: 1, emails: 1, samlIdentifiers: 1 }
this.UserGetter.getUserFullEmails( this.UserGetter.getUserFullEmails(
this.fakeUser._id, this.fakeUser._id,
(error, fullEmails) => { (error, fullEmails) => {
expect(error).to.not.exist expect(error).to.not.exist
this.UserGetter.getUser.called.should.equal(true) this.UserGetter.promises.getUser.called.should.equal(true)
this.UserGetter.getUser this.UserGetter.promises.getUser
.calledWith(this.fakeUser._id, projection) .calledWith(this.fakeUser._id, projection)
.should.equal(true) .should.equal(true)
done() done()
@ -134,9 +134,7 @@ describe('UserGetter', function() {
}) })
it('should fetch emails data', function(done) { it('should fetch emails data', function(done) {
this.UserGetter.getUser = sinon this.UserGetter.promises.getUser = sinon.stub().resolves(this.fakeUser)
.stub()
.callsArgWith(2, null, this.fakeUser)
this.UserGetter.getUserFullEmails( this.UserGetter.getUserFullEmails(
this.fakeUser._id, this.fakeUser._id,
(error, fullEmails) => { (error, fullEmails) => {
@ -162,9 +160,7 @@ describe('UserGetter', function() {
}) })
it('should merge affiliation data', function(done) { it('should merge affiliation data', function(done) {
this.UserGetter.getUser = sinon this.UserGetter.promises.getUser = sinon.stub().resolves(this.fakeUser)
.stub()
.callsArgWith(2, null, this.fakeUser)
const affiliationsData = [ const affiliationsData = [
{ {
email: 'email1@foo.bar', email: 'email1@foo.bar',
@ -179,7 +175,7 @@ describe('UserGetter', function() {
} }
} }
] ]
this.getUserAffiliations.callsArgWith(1, null, affiliationsData) this.getUserAffiliations.resolves(affiliationsData)
this.UserGetter.getUserFullEmails( this.UserGetter.getUserFullEmails(
this.fakeUser._id, this.fakeUser._id,
(error, fullEmails) => { (error, fullEmails) => {
@ -218,8 +214,8 @@ describe('UserGetter', function() {
const fakeUserWithSaml = this.fakeUser const fakeUserWithSaml = this.fakeUser
fakeUserWithSaml.emails[0].samlProviderId = 'saml_id' fakeUserWithSaml.emails[0].samlProviderId = 'saml_id'
fakeUserWithSaml.samlIdentifiers = fakeSamlIdentifiers fakeUserWithSaml.samlIdentifiers = fakeSamlIdentifiers
this.UserGetter.getUser = sinon.stub().yields(null, this.fakeUser) this.UserGetter.promises.getUser = sinon.stub().resolves(this.fakeUser)
this.getUserAffiliations.callsArgWith(1, null, []) this.getUserAffiliations.resolves([])
this.UserGetter.getUserFullEmails( this.UserGetter.getUserFullEmails(
this.fakeUser._id, this.fakeUser._id,
(error, fullEmails) => { (error, fullEmails) => {
@ -251,16 +247,14 @@ describe('UserGetter', function() {
_id: '12390i', _id: '12390i',
email: 'email2@foo.bar' email: 'email2@foo.bar'
} }
this.UserGetter.getUser = sinon this.UserGetter.promises.getUser = sinon.stub().resolves(this.fakeUser)
.stub()
.callsArgWith(2, null, this.fakeUser)
const projection = { email: 1, emails: 1, samlIdentifiers: 1 } const projection = { email: 1, emails: 1, samlIdentifiers: 1 }
this.UserGetter.getUserFullEmails( this.UserGetter.getUserFullEmails(
this.fakeUser._id, this.fakeUser._id,
(error, fullEmails) => { (error, fullEmails) => {
expect(error).to.not.exist expect(error).to.not.exist
this.UserGetter.getUser.called.should.equal(true) this.UserGetter.promises.getUser.called.should.equal(true)
this.UserGetter.getUser this.UserGetter.promises.getUser
.calledWith(this.fakeUser._id, projection) .calledWith(this.fakeUser._id, projection)
.should.equal(true) .should.equal(true)
assert.deepEqual(fullEmails, []) assert.deepEqual(fullEmails, [])