Procházet zdrojové kódy

Merge pull request #23248 from overleaf/jdt-institutional-policies-include-past-affiliates

Policy checks apply for lapsed affiliates

GitOrigin-RevId: b4d42a2dc2d43b531886fb4eb8c4c6d990e324e7
Jimmy Domagala-Tang před 1 rokem
rodič
revize
a249c8e643

+ 14 - 0
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),
 }
 

+ 33 - 8
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