From a249c8e6439dd99a3ca5ad4b43ae14622a385dfa Mon Sep 17 00:00:00 2001 From: Jimmy Domagala-Tang Date: Thu, 6 Feb 2025 12:26:39 -0600 Subject: [PATCH] Merge pull request #23248 from overleaf/jdt-institutional-policies-include-past-affiliates Policy checks apply for lapsed affiliates GitOrigin-RevId: b4d42a2dc2d43b531886fb4eb8c4c6d990e324e7 --- .../Institutions/InstitutionsGetter.js | 14 +++++++ .../Institutions/InstitutionsGetterTests.js | 41 +++++++++++++++---- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/services/web/app/src/Features/Institutions/InstitutionsGetter.js b/services/web/app/src/Features/Institutions/InstitutionsGetter.js index b11cdb7ceb..7b6ef48ad0 100644 --- a/services/web/app/src/Features/Institutions/InstitutionsGetter.js +++ b/services/web/app/src/Features/Institutions/InstitutionsGetter.js @@ -18,6 +18,19 @@ async function getCurrentAffiliations(userId) { .map(emailData => emailData.affiliation) } +async function getCurrentAndPastAffiliationIds(userId) { + let fullEmails = await UserGetter.promises.getUserFullEmails(userId) + // current are those confirmed and not with lapsed reconfirmations + fullEmails = fullEmails + .filter( + emailData => + emailData.confirmedAt && emailData.affiliation?.institution?.confirmed + ) + .map(emailData => emailData.affiliation.institution.id) + // remove dupes + return [...new Set(fullEmails)] +} + async function getCurrentInstitutionIds(userId) { // current are those confirmed and not with lapsed reconfirmations // only 1 record returned per current institutionId @@ -81,6 +94,7 @@ InstitutionsGetter.promises = { getCurrentAffiliations, getCurrentInstitutionIds, getCurrentInstitutionsWithLicence, + getCurrentAndPastAffiliationIds, getManagedInstitutions: promisify(InstitutionsGetter.getManagedInstitutions), } diff --git a/services/web/test/unit/src/Institutions/InstitutionsGetterTests.js b/services/web/test/unit/src/Institutions/InstitutionsGetterTests.js index 0d82b5d218..76a445c3a7 100644 --- a/services/web/test/unit/src/Institutions/InstitutionsGetterTests.js +++ b/services/web/test/unit/src/Institutions/InstitutionsGetterTests.js @@ -124,6 +124,15 @@ describe('InstitutionsGetter', function () { }, }, ] + this.fullEmailCollection = [ + this.licencedAffiliation, + this.licencedAffiliation, + this.licencedAffiliationPastReconfirmation, + this.confirmedAffiliation, + this.confirmedAffiliationPastReconfirmation, + this.unconfirmedDomainLicensedAffiliation, + this.unconfirmedEmailLicensedAffiliation, + ] }) describe('getCurrentInstitutionIds', function () { @@ -158,16 +167,32 @@ describe('InstitutionsGetter', function () { }) }) + describe('getCurrentAndPastAffiliationIds', function () { + it('filters unconfirmed affiliations, preserves those past reconfirmation, and returns only 1 result per institution', async function () { + this.UserGetter.promises.getUserFullEmails.resolves( + this.fullEmailCollection + ) + const institutions = + await this.InstitutionsGetter.promises.getCurrentAndPastAffiliationIds( + this.userId + ) + expect(institutions).to.deep.equal([777, 888, 456, 135]) + }) + it('handles empty response', async function () { + this.UserGetter.promises.getUserFullEmails.resolves([]) + const institutions = + await this.InstitutionsGetter.promises.getCurrentInstitutionIds( + this.userId + ) + expect(institutions).to.deep.equal([]) + }) + }) + describe('getCurrentInstitutionsWithLicence', function () { it('returns one result per institution and filters out affiliations without license', async function () { - this.UserGetter.promises.getUserFullEmails.resolves([ - this.licencedAffiliation, - this.licencedAffiliation, - this.licencedAffiliationPastReconfirmation, - this.confirmedAffiliation, - this.unconfirmedDomainLicensedAffiliation, - this.unconfirmedEmailLicensedAffiliation, - ]) + this.UserGetter.promises.getUserFullEmails.resolves( + this.fullEmailCollection + ) const institutions = await this.InstitutionsGetter.promises.getCurrentInstitutionsWithLicence( this.userId