mirror of
https://github.com/overleaf/overleaf.git
synced 2024-09-16 02:52:31 -04:00
Merge pull request #4316 from overleaf/jel-user-confirmed-institutions
Exclude lapsed reconfirmations from confirmed affiliations GitOrigin-RevId: 5987299ead2717abd54e313693f1cfc141915f8d
This commit is contained in:
parent
bb882c697c
commit
c6786cadc0
2 changed files with 101 additions and 79 deletions
|
@ -1,9 +1,35 @@
|
||||||
let InstitutionsGetter
|
const { callbackify } = require('util')
|
||||||
const UserGetter = require('../User/UserGetter')
|
const UserGetter = require('../User/UserGetter')
|
||||||
const UserMembershipsHandler = require('../UserMembership/UserMembershipsHandler')
|
const UserMembershipsHandler = require('../UserMembership/UserMembershipsHandler')
|
||||||
const UserMembershipEntityConfigs = require('../UserMembership/UserMembershipEntityConfigs')
|
const UserMembershipEntityConfigs = require('../UserMembership/UserMembershipEntityConfigs')
|
||||||
|
|
||||||
module.exports = InstitutionsGetter = {
|
async function _getCurrentAffiliations(userId) {
|
||||||
|
const fullEmails = await UserGetter.promises.getUserFullEmails(userId)
|
||||||
|
// current are those confirmed and not with lapsed reconfirmations
|
||||||
|
return fullEmails
|
||||||
|
.filter(
|
||||||
|
emailData =>
|
||||||
|
emailData.confirmedAt &&
|
||||||
|
emailData.affiliation &&
|
||||||
|
emailData.affiliation.institution &&
|
||||||
|
emailData.affiliation.institution.confirmed &&
|
||||||
|
!emailData.affiliation.pastReconfirmDate
|
||||||
|
)
|
||||||
|
.map(emailData => emailData.affiliation)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getCurrentInstitutionIds(userId) {
|
||||||
|
// current are those confirmed and not with lapsed reconfirmations
|
||||||
|
// only 1 record returned per current institutionId
|
||||||
|
const institutionIds = new Set()
|
||||||
|
const currentAffiliations = await _getCurrentAffiliations(userId)
|
||||||
|
currentAffiliations.forEach(affiliation => {
|
||||||
|
institutionIds.add(affiliation.institution.id)
|
||||||
|
})
|
||||||
|
return [...institutionIds]
|
||||||
|
}
|
||||||
|
|
||||||
|
const InstitutionsGetter = {
|
||||||
getConfirmedAffiliations(userId, callback) {
|
getConfirmedAffiliations(userId, callback) {
|
||||||
UserGetter.getUserFullEmails(userId, function (error, emailsData) {
|
UserGetter.getUserFullEmails(userId, function (error, emailsData) {
|
||||||
if (error) {
|
if (error) {
|
||||||
|
@ -24,23 +50,7 @@ module.exports = InstitutionsGetter = {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
getConfirmedInstitutions(userId, callback) {
|
getCurrentInstitutionIds: callbackify(getCurrentInstitutionIds),
|
||||||
InstitutionsGetter.getConfirmedAffiliations(
|
|
||||||
userId,
|
|
||||||
(error, confirmedAffiliations) => {
|
|
||||||
if (error) {
|
|
||||||
return callback(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
const confirmedInstitutions = confirmedAffiliations.map(
|
|
||||||
confirmedAffiliation =>
|
|
||||||
confirmedAffiliation ? confirmedAffiliation.institution : undefined
|
|
||||||
)
|
|
||||||
|
|
||||||
callback(null, confirmedInstitutions)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
getManagedInstitutions(userId, callback) {
|
getManagedInstitutions(userId, callback) {
|
||||||
UserMembershipsHandler.getEntitiesByUser(
|
UserMembershipsHandler.getEntitiesByUser(
|
||||||
|
@ -50,3 +60,9 @@ module.exports = InstitutionsGetter = {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InstitutionsGetter.promises = {
|
||||||
|
getCurrentInstitutionIds,
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = InstitutionsGetter
|
||||||
|
|
|
@ -1,14 +1,3 @@
|
||||||
/* eslint-disable
|
|
||||||
max-len,
|
|
||||||
no-return-assign,
|
|
||||||
*/
|
|
||||||
// TODO: This file was created by bulk-decaffeinate.
|
|
||||||
// Fix any style issues and re-enable lint.
|
|
||||||
/*
|
|
||||||
* decaffeinate suggestions:
|
|
||||||
* DS102: Remove unnecessary code created because of implicit returns
|
|
||||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
||||||
*/
|
|
||||||
const SandboxedModule = require('sandboxed-module')
|
const SandboxedModule = require('sandboxed-module')
|
||||||
const { expect } = require('chai')
|
const { expect } = require('chai')
|
||||||
const sinon = require('sinon')
|
const sinon = require('sinon')
|
||||||
|
@ -19,7 +8,12 @@ const modulePath = require('path').join(
|
||||||
|
|
||||||
describe('InstitutionsGetter', function () {
|
describe('InstitutionsGetter', function () {
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
this.UserGetter = { getUserFullEmails: sinon.stub() }
|
this.UserGetter = {
|
||||||
|
getUserFullEmails: sinon.stub(),
|
||||||
|
promises: {
|
||||||
|
getUserFullEmails: sinon.stub(),
|
||||||
|
},
|
||||||
|
}
|
||||||
this.InstitutionsGetter = SandboxedModule.require(modulePath, {
|
this.InstitutionsGetter = SandboxedModule.require(modulePath, {
|
||||||
requires: {
|
requires: {
|
||||||
'../User/UserGetter': this.UserGetter,
|
'../User/UserGetter': this.UserGetter,
|
||||||
|
@ -28,60 +22,72 @@ describe('InstitutionsGetter', function () {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
return (this.userId = '12345abcde')
|
this.userId = '12345abcde'
|
||||||
|
this.confirmedAffiliation = {
|
||||||
|
confirmedAt: new Date(),
|
||||||
|
affiliation: {
|
||||||
|
institution: { id: 456, confirmed: true },
|
||||||
|
pastReconfirmDate: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
this.confirmedAffiliationPastReconfirmation = {
|
||||||
|
confirmedAt: new Date('2000-01-01'),
|
||||||
|
affiliation: {
|
||||||
|
institution: { id: 135, confirmed: true },
|
||||||
|
pastReconfirmDate: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
this.userEmails = [
|
||||||
|
{
|
||||||
|
confirmedAt: null,
|
||||||
|
affiliation: {
|
||||||
|
institution: { id: 123, confirmed: true, pastReconfirmDate: false },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
this.confirmedAffiliation,
|
||||||
|
this.confirmedAffiliation,
|
||||||
|
this.confirmedAffiliationPastReconfirmation,
|
||||||
|
{ confirmedAt: new Date(), affiliation: null, pastReconfirmDate: false },
|
||||||
|
{
|
||||||
|
confirmedAt: new Date(),
|
||||||
|
affiliation: { institution: null, pastReconfirmDate: false },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
confirmedAt: new Date(),
|
||||||
|
affiliation: {
|
||||||
|
institution: { id: 789, confirmed: false, pastReconfirmDate: false },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('getConfirmedInstitutions', function () {
|
describe('getCurrentInstitutionIds', function () {
|
||||||
it('filters unconfirmed affiliations', function (done) {
|
it('filters unconfirmed affiliations, those past reconfirmation, and returns only 1 result per institution', async function () {
|
||||||
this.userEmails = [
|
this.UserGetter.promises.getUserFullEmails.resolves(this.userEmails)
|
||||||
{
|
const institutions = await this.InstitutionsGetter.promises.getCurrentInstitutionIds(
|
||||||
confirmedAt: null,
|
this.userId
|
||||||
affiliation: { institution: { id: 123, confirmed: true } },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
confirmedAt: new Date(),
|
|
||||||
affiliation: { institution: { id: 456, confirmed: true } },
|
|
||||||
},
|
|
||||||
{ confirmedAt: new Date(), affiliation: null },
|
|
||||||
{ confirmedAt: new Date(), affiliation: { institution: null } },
|
|
||||||
{
|
|
||||||
confirmedAt: new Date(),
|
|
||||||
affiliation: { institution: { id: 789, confirmed: false } },
|
|
||||||
},
|
|
||||||
]
|
|
||||||
this.UserGetter.getUserFullEmails.yields(null, this.userEmails)
|
|
||||||
return this.InstitutionsGetter.getConfirmedInstitutions(
|
|
||||||
this.userId,
|
|
||||||
(error, institutions) => {
|
|
||||||
expect(error).to.not.exist
|
|
||||||
institutions.length.should.equal(1)
|
|
||||||
institutions[0].id.should.equal(456)
|
|
||||||
return done()
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
expect(institutions.length).to.equal(1)
|
||||||
|
expect(institutions[0]).to.equal(456)
|
||||||
})
|
})
|
||||||
|
it('handles empty response', async function () {
|
||||||
it('should handle empty response', function (done) {
|
this.UserGetter.promises.getUserFullEmails.resolves([])
|
||||||
this.UserGetter.getUserFullEmails.yields(null, [])
|
const institutions = await this.InstitutionsGetter.promises.getCurrentInstitutionIds(
|
||||||
return this.InstitutionsGetter.getConfirmedInstitutions(
|
this.userId
|
||||||
this.userId,
|
|
||||||
(error, institutions) => {
|
|
||||||
expect(error).to.not.exist
|
|
||||||
institutions.length.should.equal(0)
|
|
||||||
return done()
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
expect(institutions).to.deep.equal([])
|
||||||
})
|
})
|
||||||
|
it('handles errors', async function () {
|
||||||
it('should handle error', function (done) {
|
this.UserGetter.promises.getUserFullEmails.rejects(new Error('oops'))
|
||||||
this.UserGetter.getUserFullEmails.yields(new Error('Nope'))
|
let e
|
||||||
return this.InstitutionsGetter.getConfirmedInstitutions(
|
try {
|
||||||
this.userId,
|
await this.InstitutionsGetter.promises.getCurrentInstitutionIds(
|
||||||
(error, institutions) => {
|
this.userId
|
||||||
expect(error).to.exist
|
)
|
||||||
return done()
|
} catch (error) {
|
||||||
}
|
e = error
|
||||||
)
|
}
|
||||||
|
expect(e.message).to.equal('oops')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue