From e70e55c470e657c909f1d2b24a44077944ab612c Mon Sep 17 00:00:00 2001 From: FestiveKyle Date: Thu, 7 May 2026 10:31:32 -0300 Subject: [PATCH 1/3] Add latest org summaries directly to the organizationSummaries collection and store reference on the org --- ...-affiliation-connections-by-org-id.test.js | 22 +-- ...affiliation-connections-by-user-id.test.js | 60 +++---- ...load-affiliation-connections-by-user-id.js | 96 +++++------ .../__tests__/remove-user-from-org.test.js | 24 --- api/src/organization/data-source.js | 2 +- .../load-organization-by-key.test.js | 53 +++--- .../load-organization-by-slug.test.js | 40 ++--- ...anization-connections-by-domain-id.test.js | 160 ++++++++++-------- ...rganization-connections-by-user-id.test.js | 160 ++++++++++-------- .../loaders/load-organization-by-key.js | 4 +- .../loaders/load-organization-by-slug.js | 2 +- ...d-organization-connections-by-domain-id.js | 74 ++++---- ...oad-organization-connections-by-user-id.js | 74 ++++---- .../load-organization-summaries-by-period.js | 18 +- api/src/testUtilities.js | 7 +- ...oad-verified-org-conn-by-domain-id.test.js | 150 +++++++++++----- .../__tests__/load-verified-org-conn.test.js | 77 +++------ .../load-verified-organization-by-key.test.js | 68 ++++---- ...load-verified-organization-by-slug.test.js | 68 ++++---- .../load-verified-organization-by-key.js | 4 +- .../load-verified-organization-by-slug.js | 4 +- ...d-organization-connections-by-domain-id.js | 74 ++++---- ...load-verified-organizations-connections.js | 76 ++++----- services/summaries/summaries.py | 32 +++- services/summaries/tests/test_summaries.py | 7 +- 25 files changed, 693 insertions(+), 663 deletions(-) diff --git a/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-org-id.test.js b/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-org-id.test.js index fcbe68e91e..b303e69591 100644 --- a/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-org-id.test.js +++ b/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-org-id.test.js @@ -13,7 +13,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given the load affiliations by org id function', () => { - let query, drop, truncate, collections, user, org, userTwo, i18n + let query, drop, truncate, collections, db, user, org, userTwo, i18n const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -28,7 +28,7 @@ describe('given the load affiliations by org id function', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -403,18 +403,6 @@ describe('given the load affiliations by org id function', () => { }) orgOne = await collections.organizations.save({ verified: false, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'slug-org-a', @@ -438,6 +426,12 @@ describe('given the load affiliations by org id function', () => { }, }, }) + const orgOneSummary = await collections.organizationSummaries.save({ + organization: orgOne._id, + web: { pass: 50, fail: 1000, total: 1050 }, + mail: { pass: 50, fail: 1000, total: 1050 }, + }) + await db.collection('organizations').update(orgOne._key, { latestSummaryId: orgOneSummary._id }) affOne = await collections.affiliations.save({ _key: '1', _from: orgOne._id, diff --git a/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-user-id.test.js b/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-user-id.test.js index 3de9c42f6d..2d6ca85ec7 100644 --- a/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-user-id.test.js +++ b/api/src/affiliation/loaders/__tests__/load-affiliation-connections-by-user-id.test.js @@ -13,7 +13,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given the load affiliations by user id function', () => { - let query, drop, truncate, collections, user, orgOne, orgTwo, i18n + let query, drop, truncate, collections, db, user, orgOne, orgTwo, i18n const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -31,7 +31,7 @@ describe('given the load affiliations by user id function', () => { describe('given there are user affiliations to be returned', () => { let affOne, affTwo beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -513,18 +513,6 @@ describe('given the load affiliations by user id function', () => { }) orgOne = await collections.organizations.save({ verified: false, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'slug-org-a', @@ -548,20 +536,15 @@ describe('given the load affiliations by user id function', () => { }, }, }) + const orgOneSummary = await collections.organizationSummaries.save({ + organization: orgOne._id, + web: { pass: 50, fail: 1000, total: 1050 }, + mail: { pass: 50, fail: 1000, total: 1050 }, + }) + await db.collection('organizations').update(orgOne._key, { latestSummaryId: orgOneSummary._id }) + orgTwo = await collections.organizations.save({ verified: false, - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-b', @@ -585,20 +568,15 @@ describe('given the load affiliations by user id function', () => { }, }, }) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + web: { pass: 51, fail: 1001, total: 1052 }, + mail: { pass: 51, fail: 1001, total: 1052 }, + }) + await db.collection('organizations').update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) + orgThree = await collections.organizations.save({ verified: false, - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'slug-org-c', @@ -622,6 +600,12 @@ describe('given the load affiliations by user id function', () => { }, }, }) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + web: { pass: 52, fail: 1002, total: 1054 }, + mail: { pass: 52, fail: 1002, total: 1054 }, + }) + await db.collection('organizations').update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) affOne = await collections.affiliations.save({ _key: '1', _from: orgOne._id, diff --git a/api/src/affiliation/loaders/load-affiliation-connections-by-user-id.js b/api/src/affiliation/loaders/load-affiliation-connections-by-user-id.js index 7e14151d75..d84fd6898b 100644 --- a/api/src/affiliation/loaders/load-affiliation-connections-by-user-id.js +++ b/api/src/affiliation/loaders/load-affiliation-connections-by-user-id.js @@ -48,23 +48,23 @@ export const loadAffiliationConnectionsByUserId = affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).verified` documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).verified` } else if (orderBy.field === 'org-summary-mail-pass') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.pass` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).summaries.mail.pass` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.pass` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).latestSummaryId).mail.pass` } else if (orderBy.field === 'org-summary-mail-fail') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.fail` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).summaries.mail.fail` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.fail` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).latestSummaryId).mail.fail` } else if (orderBy.field === 'org-summary-mail-total') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.total` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).summaries.mail.total` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.total` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).latestSummaryId).mail.total` } else if (orderBy.field === 'org-summary-web-pass') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.pass` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).summaries.web.pass` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.pass` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).latestSummaryId).web.pass` } else if (orderBy.field === 'org-summary-web-fail') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.fail` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).summaries.web.fail` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.fail` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).latestSummaryId).web.fail` } else if (orderBy.field === 'org-summary-web-total') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.total` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).summaries.web.total` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.total` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key).latestSummaryId).web.total` } else if (orderBy.field === 'org-domain-count') { affiliationField = aql`COUNT(FOR v, e IN 1..1 ANY DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key)._id claims RETURN e._to)` documentField = aql`COUNT(FOR v, e IN 1..1 ANY DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${afterId})._from).key)._id claims RETURN e._to)` @@ -121,23 +121,23 @@ export const loadAffiliationConnectionsByUserId = affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).verified` documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).verified` } else if (orderBy.field === 'org-summary-mail-pass') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.pass` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).summaries.mail.pass` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.pass` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).latestSummaryId).mail.pass` } else if (orderBy.field === 'org-summary-mail-fail') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.fail` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).summaries.mail.fail` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.fail` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).latestSummaryId).mail.fail` } else if (orderBy.field === 'org-summary-mail-total') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.total` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).summaries.mail.total` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.total` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).latestSummaryId).mail.total` } else if (orderBy.field === 'org-summary-web-pass') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.pass` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).summaries.web.pass` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.pass` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).latestSummaryId).web.pass` } else if (orderBy.field === 'org-summary-web-fail') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.fail` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).summaries.web.fail` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.fail` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).latestSummaryId).web.fail` } else if (orderBy.field === 'org-summary-web-total') { - affiliationField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.total` - documentField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).summaries.web.total` + affiliationField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.total` + documentField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key).latestSummaryId).web.total` } else if (orderBy.field === 'org-domain-count') { affiliationField = aql`COUNT(FOR v, e IN 1..1 ANY DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key)._id claims RETURN e._to)` documentField = aql`COUNT(FOR v, e IN 1..1 ANY DOCUMENT(organizations, PARSE_IDENTIFIER(DOCUMENT(affiliations, ${beforeId})._from).key)._id claims RETURN e._to)` @@ -261,29 +261,29 @@ export const loadAffiliationConnectionsByUserId = hasNextPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).verified` hasPreviousPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).verified` } else if (orderBy.field === 'org-summary-mail-pass') { - affField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.pass` - hasNextPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).summaries.mail.pass` - hasPreviousPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).summaries.mail.pass` + affField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.pass` + hasNextPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).latestSummaryId).mail.pass` + hasPreviousPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).latestSummaryId).mail.pass` } else if (orderBy.field === 'org-summary-mail-fail') { - affField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.fail` - hasNextPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).summaries.mail.fail` - hasPreviousPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).summaries.mail.fail` + affField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.fail` + hasNextPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).latestSummaryId).mail.fail` + hasPreviousPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).latestSummaryId).mail.fail` } else if (orderBy.field === 'org-summary-mail-total') { - affField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.total` - hasNextPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).summaries.mail.total` - hasPreviousPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).summaries.mail.total` + affField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.total` + hasNextPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).latestSummaryId).mail.total` + hasPreviousPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).latestSummaryId).mail.total` } else if (orderBy.field === 'org-summary-web-pass') { - affField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.pass` - hasNextPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).summaries.web.pass` - hasPreviousPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).summaries.web.pass` + affField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.pass` + hasNextPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).latestSummaryId).web.pass` + hasPreviousPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).latestSummaryId).web.pass` } else if (orderBy.field === 'org-summary-web-fail') { - affField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.fail` - hasNextPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).summaries.web.fail` - hasPreviousPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).summaries.web.fail` + affField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.fail` + hasNextPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).latestSummaryId).web.fail` + hasPreviousPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).latestSummaryId).web.fail` } else if (orderBy.field === 'org-summary-web-total') { - affField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.total` - hasNextPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).summaries.web.total` - hasPreviousPageDocument = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).summaries.web.total` + affField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.total` + hasNextPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key).latestSummaryId).web.total` + hasPreviousPageDocument = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(FIRST(retrievedAffiliations)._from).key).latestSummaryId).web.total` } else if (orderBy.field === 'org-domain-count') { affField = aql`COUNT(FOR v, e IN 1..1 ANY DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key)._id claims RETURN e._to)` hasNextPageDocument = aql`COUNT(FOR v, e IN 1..1 ANY DOCUMENT(organizations, PARSE_IDENTIFIER(LAST(retrievedAffiliations)._from).key)._id claims RETURN e._to)` @@ -325,17 +325,17 @@ export const loadAffiliationConnectionsByUserId = } else if (orderBy.field === 'org-verified') { sortByField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).verified ${orderBy.direction},` } else if (orderBy.field === 'org-summary-mail-pass') { - sortByField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.pass ${orderBy.direction},` } else if (orderBy.field === 'org-summary-mail-fail') { - sortByField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.fail ${orderBy.direction},` } else if (orderBy.field === 'org-summary-mail-total') { - sortByField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.mail.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).mail.total ${orderBy.direction},` } else if (orderBy.field === 'org-summary-web-pass') { - sortByField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.pass ${orderBy.direction},` } else if (orderBy.field === 'org-summary-web-fail') { - sortByField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.fail ${orderBy.direction},` } else if (orderBy.field === 'org-summary-web-total') { - sortByField = aql`DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).summaries.web.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key).latestSummaryId).web.total ${orderBy.direction},` } else if (orderBy.field === 'org-domain-count') { sortByField = aql`COUNT(FOR v, e IN 1..1 ANY DOCUMENT(organizations, PARSE_IDENTIFIER(affiliation._from).key)._id claims RETURN e._to) ${orderBy.direction},` } diff --git a/api/src/affiliation/mutations/__tests__/remove-user-from-org.test.js b/api/src/affiliation/mutations/__tests__/remove-user-from-org.test.js index a7140084c1..f994ded22e 100644 --- a/api/src/affiliation/mutations/__tests__/remove-user-from-org.test.js +++ b/api/src/affiliation/mutations/__tests__/remove-user-from-org.test.js @@ -20,18 +20,6 @@ const { DB_PASS: rootPass, DB_URL: url } = process.env const orgOneData = { verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'treasury-board-secretariat', @@ -58,18 +46,6 @@ const orgOneData = { const orgTwoData = { verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'communications-security-establishment', diff --git a/api/src/organization/data-source.js b/api/src/organization/data-source.js index 166622e7fd..7484037642 100644 --- a/api/src/organization/data-source.js +++ b/api/src/organization/data-source.js @@ -46,7 +46,7 @@ export class OrganizationDataSource { id: NEW._key, verified: NEW.verified, domainCount: 0, - summaries: NEW.summaries + summaries: null }, TRANSLATE(${language}, NEW.orgDetails) ) diff --git a/api/src/organization/loaders/__tests__/load-organization-by-key.test.js b/api/src/organization/loaders/__tests__/load-organization-by-key.test.js index 2cba5076d1..d4ec290547 100644 --- a/api/src/organization/loaders/__tests__/load-organization-by-key.test.js +++ b/api/src/organization/loaders/__tests__/load-organization-by-key.test.js @@ -10,7 +10,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given a loadOrgByKey dataloader', () => { - let query, drop, truncate, collections, i18n + let query, drop, truncate, collections, db, i18n const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -23,7 +23,7 @@ describe('given a loadOrgByKey dataloader', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -36,21 +36,9 @@ describe('given a loadOrgByKey dataloader', () => { })) }) beforeEach(async () => { - await collections.organizations.save({ + const org1 = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'communications-security-establishment', @@ -74,21 +62,16 @@ describe('given a loadOrgByKey dataloader', () => { }, }, }) - await collections.organizations.save({ + const summary1 = await collections.organizationSummaries.save({ + organization: org1._id, + web: { pass: 50, fail: 1000, total: 1050 }, + mail: { pass: 50, fail: 1000, total: 1050 }, + }) + await db.collection('organizations').update(org1._key, { latestSummaryId: summary1._id }) + + const org2 = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'treasury-board-secretariat', @@ -112,6 +95,12 @@ describe('given a loadOrgByKey dataloader', () => { }, }, }) + const summary2 = await collections.organizationSummaries.save({ + organization: org2._id, + web: { pass: 50, fail: 1000, total: 1050 }, + mail: { pass: 50, fail: 1000, total: 1050 }, + }) + await db.collection('organizations').update(org2._key, { latestSummaryId: summary2._id }) }) afterEach(async () => { await truncate() @@ -141,7 +130,7 @@ describe('given a loadOrgByKey dataloader', () => { FOR org IN organizations FILTER org.orgDetails.en.slug == "communications-security-establishment" LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("en", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("en", org.orgDetails)) ` const expectedOrg = await expectedCursor.next() @@ -158,7 +147,7 @@ describe('given a loadOrgByKey dataloader', () => { const expectedCursor = await query` FOR org IN organizations LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("en", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("en", org.orgDetails)) ` while (expectedCursor.hasMore) { @@ -195,7 +184,7 @@ describe('given a loadOrgByKey dataloader', () => { FOR org IN organizations FILTER org.orgDetails.fr.slug == "centre-de-la-securite-des-telecommunications" LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("fr", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("fr", org.orgDetails)) ` const expectedOrg = await expectedCursor.next() @@ -212,7 +201,7 @@ describe('given a loadOrgByKey dataloader', () => { const expectedCursor = await query` FOR org IN organizations LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("fr", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, _rev: org._rev, _type: "organization", id: org._key, verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("fr", org.orgDetails)) ` while (expectedCursor.hasMore) { diff --git a/api/src/organization/loaders/__tests__/load-organization-by-slug.test.js b/api/src/organization/loaders/__tests__/load-organization-by-slug.test.js index 26eb5d7065..65f1581ab0 100644 --- a/api/src/organization/loaders/__tests__/load-organization-by-slug.test.js +++ b/api/src/organization/loaders/__tests__/load-organization-by-slug.test.js @@ -10,7 +10,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given a loadOrgBySlug dataloader', () => { - let query, drop, truncate, collections, i18n + let query, drop, truncate, collections, db, i18n const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -23,7 +23,7 @@ describe('given a loadOrgBySlug dataloader', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -36,21 +36,9 @@ describe('given a loadOrgBySlug dataloader', () => { })) }) beforeEach(async () => { - await collections.organizations.save({ + const org1 = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'communications-security-establishment', @@ -74,6 +62,20 @@ describe('given a loadOrgBySlug dataloader', () => { }, }, }) + const summary1 = await collections.organizationSummaries.save({ + organization: org1._id, + web: { + pass: 50, + fail: 1000, + total: 1050, + }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, + }) + await db.collection('organizations').update(org1._key, { latestSummaryId: summary1._id }) await collections.organizations.save({ verified: false, externalId: 'test', @@ -139,7 +141,7 @@ describe('given a loadOrgBySlug dataloader', () => { verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), - summaries: org.summaries, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null, slugEN: org.orgDetails.en.slug, slugFR: org.orgDetails.fr.slug }, @@ -170,7 +172,7 @@ describe('given a loadOrgBySlug dataloader', () => { id: org._key, verified: org.verified, domainCount: COUNT(domains), - summaries: org.summaries, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null, slugEN: org.orgDetails.en.slug, slugFR: org.orgDetails.fr.slug }, @@ -222,7 +224,7 @@ describe('given a loadOrgBySlug dataloader', () => { verified: org.verified, externalId: org.externalId, domainCount: COUNT(domains), - summaries: org.summaries, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null, slugEN: org.orgDetails.en.slug, slugFR: org.orgDetails.fr.slug }, @@ -253,7 +255,7 @@ describe('given a loadOrgBySlug dataloader', () => { id: org._key, verified: org.verified, domainCount: COUNT(domains), - summaries: org.summaries, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null, slugEN: org.orgDetails.en.slug, slugFR: org.orgDetails.fr.slug }, diff --git a/api/src/organization/loaders/__tests__/load-organization-connections-by-domain-id.test.js b/api/src/organization/loaders/__tests__/load-organization-connections-by-domain-id.test.js index 71a4df6221..1e7ef4c31f 100644 --- a/api/src/organization/loaders/__tests__/load-organization-connections-by-domain-id.test.js +++ b/api/src/organization/loaders/__tests__/load-organization-connections-by-domain-id.test.js @@ -13,7 +13,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given the load organizations connection function', () => { - let query, drop, truncate, collections, user, org, orgTwo, domain, domainTwo, domainThree, i18n + let query, drop, truncate, collections, db, user, org, orgTwo, domain, domainTwo, domainThree, i18n const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -28,7 +28,7 @@ describe('given the load organizations connection function', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -50,18 +50,6 @@ describe('given the load organizations connection function', () => { org = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'slug-org-one', @@ -85,21 +73,23 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgSummary = await collections.organizationSummaries.save({ + organization: org._id, + web: { + pass: 50, + fail: 1000, + total: 1050, + }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, + }) + await db.collection("organizations").update(org._key, { latestSummaryId: orgSummary._id }) orgTwo = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'slug-org-two', @@ -123,6 +113,20 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + web: { + pass: 52, + fail: 1002, + total: 1054, + }, + mail: { + pass: 52, + fail: 1002, + total: 1054, + }, + }) + await db.collection("organizations").update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) await collections.affiliations.save({ _from: org._id, _to: user._id, @@ -521,18 +525,6 @@ describe('given the load organizations connection function', () => { orgThree = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-three', @@ -556,6 +548,20 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + web: { + pass: 51, + fail: 1001, + total: 1052, + }, + mail: { + pass: 51, + fail: 1001, + total: 1052, + }, + }) + await db.collection("organizations").update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) await collections.affiliations.save({ _from: orgThree._id, _to: user._id, @@ -2275,18 +2281,6 @@ describe('given the load organizations connection function', () => { saOrg = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'super-admin', @@ -2310,6 +2304,20 @@ describe('given the load organizations connection function', () => { }, }, }) + const saOrgSummary = await collections.organizationSummaries.save({ + organization: saOrg._id, + web: { + pass: 52, + fail: 1002, + total: 1054, + }, + mail: { + pass: 52, + fail: 1002, + total: 1054, + }, + }) + await db.collection("organizations").update(saOrg._key, { latestSummaryId: saOrgSummary._id }) await collections.affiliations.save({ _from: saOrg._id, _to: user._id, @@ -2785,18 +2793,6 @@ describe('given the load organizations connection function', () => { orgThree = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-three', @@ -2820,6 +2816,20 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + web: { + pass: 51, + fail: 1001, + total: 1052, + }, + mail: { + pass: 51, + fail: 1001, + total: 1052, + }, + }) + await db.collection("organizations").update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) await collections.affiliations.save({ _from: orgThree._id, _to: user._id, @@ -4539,18 +4549,6 @@ describe('given the load organizations connection function', () => { saOrg = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'super-admin', @@ -4574,6 +4572,20 @@ describe('given the load organizations connection function', () => { }, }, }) + const saOrgSummary = await collections.organizationSummaries.save({ + organization: saOrg._id, + web: { + pass: 52, + fail: 1002, + total: 1054, + }, + mail: { + pass: 52, + fail: 1002, + total: 1054, + }, + }) + await db.collection("organizations").update(saOrg._key, { latestSummaryId: saOrgSummary._id }) await collections.affiliations.save({ _from: saOrg._id, _to: user._id, diff --git a/api/src/organization/loaders/__tests__/load-organization-connections-by-user-id.test.js b/api/src/organization/loaders/__tests__/load-organization-connections-by-user-id.test.js index 15e4c96922..8d2380c3e6 100644 --- a/api/src/organization/loaders/__tests__/load-organization-connections-by-user-id.test.js +++ b/api/src/organization/loaders/__tests__/load-organization-connections-by-user-id.test.js @@ -13,7 +13,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given the load organization connections by user id function', () => { - let query, drop, truncate, collections, user, orgOne, orgTwo, i18n, domain, domainTwo, domainThree + let query, drop, truncate, collections, db, user, orgOne, orgTwo, i18n, domain, domainTwo, domainThree const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -29,7 +29,7 @@ describe('given the load organization connections by user id function', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -51,18 +51,6 @@ describe('given the load organization connections by user id function', () => { orgOne = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'slug-org-one', @@ -86,21 +74,23 @@ describe('given the load organization connections by user id function', () => { }, }, }) + const orgOneSummary = await collections.organizationSummaries.save({ + organization: orgOne._id, + web: { + pass: 50, + fail: 1000, + total: 1050, + }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, + }) + await db.collection("organizations").update(orgOne._key, { latestSummaryId: orgOneSummary._id }) orgTwo = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'slug-org-two', @@ -124,6 +114,20 @@ describe('given the load organization connections by user id function', () => { }, }, }) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + web: { + pass: 52, + fail: 1002, + total: 1054, + }, + mail: { + pass: 52, + fail: 1002, + total: 1054, + }, + }) + await db.collection("organizations").update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) await collections.affiliations.save({ _from: orgOne._id, _to: user._id, @@ -514,18 +518,6 @@ describe('given the load organization connections by user id function', () => { orgThree = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-three', @@ -549,6 +541,20 @@ describe('given the load organization connections by user id function', () => { }, }, }) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + web: { + pass: 51, + fail: 1001, + total: 1052, + }, + mail: { + pass: 51, + fail: 1001, + total: 1052, + }, + }) + await db.collection("organizations").update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) await collections.affiliations.save({ _from: orgThree._id, _to: user._id, @@ -2247,18 +2253,6 @@ describe('given the load organization connections by user id function', () => { saOrg = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'super-admin', @@ -2282,6 +2276,20 @@ describe('given the load organization connections by user id function', () => { }, }, }) + const saOrgSummary = await collections.organizationSummaries.save({ + organization: saOrg._id, + web: { + pass: 52, + fail: 1002, + total: 1054, + }, + mail: { + pass: 52, + fail: 1002, + total: 1054, + }, + }) + await db.collection("organizations").update(saOrg._key, { latestSummaryId: saOrgSummary._id }) await collections.affiliations.save({ _from: saOrg._id, _to: user._id, @@ -2621,18 +2629,6 @@ describe('given the load organization connections by user id function', () => { orgThree = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-three', @@ -2656,6 +2652,20 @@ describe('given the load organization connections by user id function', () => { }, }, }) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + web: { + pass: 51, + fail: 1001, + total: 1052, + }, + mail: { + pass: 51, + fail: 1001, + total: 1052, + }, + }) + await db.collection("organizations").update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) await collections.affiliations.save({ _from: orgThree._id, _to: user._id, @@ -4455,18 +4465,6 @@ describe('given the load organization connections by user id function', () => { saOrg = await collections.organizations.save({ verified: false, externalId: 'test', - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'super-admin', @@ -4490,6 +4488,20 @@ describe('given the load organization connections by user id function', () => { }, }, }) + const saOrgSummary = await collections.organizationSummaries.save({ + organization: saOrg._id, + web: { + pass: 52, + fail: 1002, + total: 1054, + }, + mail: { + pass: 52, + fail: 1002, + total: 1054, + }, + }) + await db.collection("organizations").update(saOrg._key, { latestSummaryId: saOrgSummary._id }) await collections.affiliations.save({ _from: saOrg._id, _to: user._id, diff --git a/api/src/organization/loaders/load-organization-by-key.js b/api/src/organization/loaders/load-organization-by-key.js index ee76ff782a..13ac3a803f 100644 --- a/api/src/organization/loaders/load-organization-by-key.js +++ b/api/src/organization/loaders/load-organization-by-key.js @@ -21,8 +21,8 @@ export const loadOrgByKey = ({ query, language, userKey, i18n }) => verified: org.verified, externalId: org.externalId, domainCount: COUNT(orgDomains), - summaries: org.summaries - }, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null + }, TRANSLATE(${language}, org.orgDetails) ) ` diff --git a/api/src/organization/loaders/load-organization-by-slug.js b/api/src/organization/loaders/load-organization-by-slug.js index 27ca324452..e895a4e803 100644 --- a/api/src/organization/loaders/load-organization-by-slug.js +++ b/api/src/organization/loaders/load-organization-by-slug.js @@ -22,7 +22,7 @@ export const loadOrgBySlug = ({ query, language, userKey, i18n }) => verified: org.verified, externalId: org.externalId, domainCount: COUNT(orgDomains), - summaries: org.summaries, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null, slugEN: org.orgDetails.en.slug, slugFR: org.orgDetails.fr.slug }, diff --git a/api/src/organization/loaders/load-organization-connections-by-domain-id.js b/api/src/organization/loaders/load-organization-connections-by-domain-id.js index 50a84fc55a..49653adee5 100644 --- a/api/src/organization/loaders/load-organization-connections-by-domain-id.js +++ b/api/src/organization/loaders/load-organization-connections-by-domain-id.js @@ -52,23 +52,23 @@ export const loadOrgConnectionsByDomainId = documentField = aql`afterVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`afterVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`afterVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`afterVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`afterVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`afterVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`afterVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND afterVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -127,23 +127,23 @@ export const loadOrgConnectionsByDomainId = documentField = aql`beforeVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`beforeVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`beforeVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`beforeVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`beforeVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`beforeVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`beforeVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND beforeVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -254,27 +254,27 @@ export const loadOrgConnectionsByDomainId = hasNextPageDocumentField = aql`LAST(retrievedOrgs).verified` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).verified` } else if (orderBy.field === 'summary-mail-pass') { - orgField = aql`org.summaries.mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - orgField = aql`org.summaries.mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.fail` } else if (orderBy.field === 'summary-mail-total') { - orgField = aql`org.summaries.mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.total` } else if (orderBy.field === 'summary-web-pass') { - orgField = aql`org.summaries.web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.pass` } else if (orderBy.field === 'summary-web-fail') { - orgField = aql`org.summaries.web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.fail` } else if (orderBy.field === 'summary-web-total') { - orgField = aql`org.summaries.web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.total` } else if (orderBy.field === 'domain-count') { @@ -317,17 +317,17 @@ export const loadOrgConnectionsByDomainId = } else if (orderBy.field === 'verified') { sortByField = aql`org.verified ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-pass') { - sortByField = aql`org.summaries.mail.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-fail') { - sortByField = aql`org.summaries.mail.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-total') { - sortByField = aql`org.summaries.mail.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.total ${orderBy.direction},` } else if (orderBy.field === 'summary-web-pass') { - sortByField = aql`org.summaries.web.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-web-fail') { - sortByField = aql`org.summaries.web.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-web-total') { - sortByField = aql`org.summaries.web.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.total ${orderBy.direction},` } else if (orderBy.field === 'domain-count') { sortByField = aql`COUNT(orgDomains) ${orderBy.direction},` } @@ -468,7 +468,7 @@ export const loadOrgConnectionsByDomainId = verified: org.verified, externalId: org.externalId, domainCount: COUNT(orgDomains), - summaries: org.summaries + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE(${language}, org.orgDetails) ) diff --git a/api/src/organization/loaders/load-organization-connections-by-user-id.js b/api/src/organization/loaders/load-organization-connections-by-user-id.js index c1383a7445..ca09acda34 100644 --- a/api/src/organization/loaders/load-organization-connections-by-user-id.js +++ b/api/src/organization/loaders/load-organization-connections-by-user-id.js @@ -64,23 +64,23 @@ export const loadOrgConnectionsByUserId = documentField = aql`afterVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`afterVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`afterVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`afterVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`afterVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`afterVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`afterVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND afterVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -139,23 +139,23 @@ export const loadOrgConnectionsByUserId = documentField = aql`beforeVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`beforeVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`beforeVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`beforeVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`beforeVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`beforeVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`beforeVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND beforeVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -264,27 +264,27 @@ export const loadOrgConnectionsByUserId = hasNextPageDocumentField = aql`LAST(retrievedOrgs).verified` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).verified` } else if (orderBy.field === 'summary-mail-pass') { - orgField = aql`org.summaries.mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - orgField = aql`org.summaries.mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.fail` } else if (orderBy.field === 'summary-mail-total') { - orgField = aql`org.summaries.mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.total` } else if (orderBy.field === 'summary-web-pass') { - orgField = aql`org.summaries.web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.pass` } else if (orderBy.field === 'summary-web-fail') { - orgField = aql`org.summaries.web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.fail` } else if (orderBy.field === 'summary-web-total') { - orgField = aql`org.summaries.web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.total` } else if (orderBy.field === 'domain-count') { @@ -327,17 +327,17 @@ export const loadOrgConnectionsByUserId = } else if (orderBy.field === 'verified') { sortByField = aql`org.verified ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-pass') { - sortByField = aql`org.summaries.mail.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-fail') { - sortByField = aql`org.summaries.mail.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-total') { - sortByField = aql`org.summaries.mail.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.total ${orderBy.direction},` } else if (orderBy.field === 'summary-web-pass') { - sortByField = aql`org.summaries.web.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-web-fail') { - sortByField = aql`org.summaries.web.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-web-total') { - sortByField = aql`org.summaries.web.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.total ${orderBy.direction},` } else if (orderBy.field === 'domain-count') { sortByField = aql`COUNT(orgDomains) ${orderBy.direction},` } @@ -504,7 +504,7 @@ export const loadOrgConnectionsByUserId = verified: org.verified, externalId: org.externalId, domainCount: COUNT(orgDomains), - summaries: org.summaries + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE(${language}, org.orgDetails) ) diff --git a/api/src/organization/loaders/load-organization-summaries-by-period.js b/api/src/organization/loaders/load-organization-summaries-by-period.js index 5a2105439f..d30cab85ba 100644 --- a/api/src/organization/loaders/load-organization-summaries-by-period.js +++ b/api/src/organization/loaders/load-organization-summaries-by-period.js @@ -19,9 +19,8 @@ export const loadOrganizationSummariesByPeriod = return filteredArray } - const sortString = aql`SORT summary.date ${sortDirection}` let startDateFilter = aql`` - if (typeof cleansedStartDate !== 'undefined') { + if (cleansedStartDate !== null) { startDateFilter = aql`FILTER DATE_FORMAT(summary.date, '%yyyy-%mm-%dd') >= DATE_FORMAT(${cleansedStartDate}, '%yyyy-%mm-%dd')` } let endDateFilter = aql`` @@ -36,16 +35,11 @@ export const loadOrganizationSummariesByPeriod = let requestedSummaryInfo try { requestedSummaryInfo = await query` - LET latestSummary = (RETURN DOCUMENT(organizations, ${orgId}).summaries) - LET historicalSummaries = ( - FOR summary IN organizationSummaries - FILTER summary.organization == ${orgId} - ${startDateFilter} - ${endDateFilter} - RETURN summary - ) - FOR summary IN APPEND(latestSummary, historicalSummaries) - ${sortString} + FOR summary IN organizationSummaries + FILTER summary.organization == ${orgId} + ${startDateFilter} + ${endDateFilter} + SORT summary.date ${sortDirection} ${limitString} RETURN summary ` diff --git a/api/src/testUtilities.js b/api/src/testUtilities.js index 548773207c..7df1884dcb 100644 --- a/api/src/testUtilities.js +++ b/api/src/testUtilities.js @@ -33,7 +33,12 @@ export async function ensureDatabase(options) { ensureOptions = options } - return await ensure(ensureOptions) + const ensured = await ensure(ensureOptions) + + const db = new Database({ url: variables.url, databaseName: variables.name }) + await db.login(variables.username || 'root', variables.password || variables.rootPassword) + + return { ...ensured, db } } export function createUserContextGenerator({ query, db, transaction, collectionNames, i18n, secret, salt }) { diff --git a/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn-by-domain-id.test.js b/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn-by-domain-id.test.js index b7ad6383d9..2419fbb120 100644 --- a/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn-by-domain-id.test.js +++ b/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn-by-domain-id.test.js @@ -25,20 +25,21 @@ const i18n = setupI18n({ }, }) +const orgOneSummaryData = { + web: { + pass: 50, + fail: 1000, + total: 1050, + }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, +} + const orgOneData = { verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'slug-org-one', @@ -63,20 +64,21 @@ const orgOneData = { }, } +const orgTwoSummaryData = { + web: { + pass: 52, + fail: 1002, + total: 1054, + }, + mail: { + pass: 52, + fail: 1002, + total: 1054, + }, +} + const orgTwoData = { verified: true, - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'slug-org-two', @@ -101,20 +103,21 @@ const orgTwoData = { }, } +const orgThreeSummaryData = { + web: { + pass: 51, + fail: 1001, + total: 1052, + }, + mail: { + pass: 51, + fail: 1001, + total: 1052, + }, +} + const orgThreeData = { verified: true, - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-three', @@ -161,10 +164,10 @@ describe('given the load organizations connection function', () => { console.error = mockedError console.warn = mockedWarn - let query, drop, truncate, collections, org, orgTwo, domain, domainTwo, domainThree + let query, drop, truncate, collections, db, org, orgTwo, domain, domainTwo, domainThree beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -178,7 +181,17 @@ describe('given the load organizations connection function', () => { }) beforeEach(async () => { org = await collections.organizations.save(orgOneData) + const orgSummary = await collections.organizationSummaries.save({ + organization: org._id, + ...orgOneSummaryData, + }) + await db.collection("organizations").update(org._key, { latestSummaryId: orgSummary._id }) orgTwo = await collections.organizations.save(orgTwoData) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + ...orgTwoSummaryData, + }) + await db.collection("organizations").update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) domain = await collections.domains.save(domainOneData) domainTwo = await collections.domains.save(domainTwoData) @@ -264,10 +277,10 @@ describe('given the load organizations connection function', () => { console.error = mockedError console.warn = mockedWarn - let query, drop, truncate, collections, org, orgTwo, domain, domainTwo, domainThree + let query, drop, truncate, collections, db, org, orgTwo, domain, domainTwo, domainThree beforeEach(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -279,7 +292,17 @@ describe('given the load organizations connection function', () => { schema: dbschema, })) org = await collections.organizations.save(orgOneData) + const orgSummary = await collections.organizationSummaries.save({ + organization: org._id, + ...orgOneSummaryData, + }) + await db.collection("organizations").update(org._key, { latestSummaryId: orgSummary._id }) orgTwo = await collections.organizations.save(orgTwoData) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + ...orgTwoSummaryData, + }) + await db.collection("organizations").update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) domain = await collections.domains.save(domainOneData) domainTwo = await collections.domains.save(domainTwoData) @@ -365,10 +388,10 @@ describe('given the load organizations connection function', () => { console.error = mockedError console.warn = mockedWarn - let query, drop, truncate, collections, org, orgTwo, domain, domainTwo, domainThree + let query, drop, truncate, collections, db, org, orgTwo, domain, domainTwo, domainThree beforeEach(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -380,7 +403,17 @@ describe('given the load organizations connection function', () => { schema: dbschema, })) org = await collections.organizations.save(orgOneData) + const orgSummary = await collections.organizationSummaries.save({ + organization: org._id, + ...orgOneSummaryData, + }) + await db.collection("organizations").update(org._key, { latestSummaryId: orgSummary._id }) orgTwo = await collections.organizations.save(orgTwoData) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + ...orgTwoSummaryData, + }) + await db.collection("organizations").update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) domain = await collections.domains.save(domainOneData) domainTwo = await collections.domains.save(domainTwoData) @@ -465,10 +498,10 @@ describe('given the load organizations connection function', () => { console.error = mockedError console.warn = mockedWarn - let query, drop, truncate, collections, org, orgTwo, domain, domainTwo, domainThree + let query, drop, truncate, collections, db, org, orgTwo, domain, domainTwo, domainThree beforeEach(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -480,7 +513,17 @@ describe('given the load organizations connection function', () => { schema: dbschema, })) org = await collections.organizations.save(orgOneData) + const orgSummary = await collections.organizationSummaries.save({ + organization: org._id, + ...orgOneSummaryData, + }) + await db.collection("organizations").update(org._key, { latestSummaryId: orgSummary._id }) orgTwo = await collections.organizations.save(orgTwoData) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + ...orgTwoSummaryData, + }) + await db.collection("organizations").update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) domain = await collections.domains.save(domainOneData) domainTwo = await collections.domains.save(domainTwoData) @@ -565,10 +608,10 @@ describe('given the load organizations connection function', () => { console.error = mockedError console.warn = mockedWarn - let query, drop, truncate, collections, org, orgTwo, domain, domainTwo, domainThree, orgThree + let query, drop, truncate, collections, db, org, orgTwo, domain, domainTwo, domainThree, orgThree beforeEach(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -581,8 +624,23 @@ describe('given the load organizations connection function', () => { })) org = await collections.organizations.save(orgOneData) + const orgSummary = await collections.organizationSummaries.save({ + organization: org._id, + ...orgOneSummaryData, + }) + await db.collection("organizations").update(org._key, { latestSummaryId: orgSummary._id }) orgTwo = await collections.organizations.save(orgTwoData) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + ...orgTwoSummaryData, + }) + await db.collection("organizations").update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) orgThree = await collections.organizations.save(orgThreeData) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + ...orgThreeSummaryData, + }) + await db.collection("organizations").update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) domain = await collections.domains.save(domainOneData) domainTwo = await collections.domains.save(domainTwoData) diff --git a/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn.test.js b/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn.test.js index 95d76034cb..67ebce6778 100644 --- a/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn.test.js +++ b/api/src/verified-organizations/loaders/__tests__/load-verified-org-conn.test.js @@ -13,7 +13,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given the load organizations connection function', () => { - let query, drop, truncate, collections, org, orgTwo, i18n, domain, domainTwo, domainThree + let query, drop, truncate, collections, db, org, orgTwo, i18n, domain, domainTwo, domainThree const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -28,7 +28,7 @@ describe('given the load organizations connection function', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -43,18 +43,6 @@ describe('given the load organizations connection function', () => { beforeEach(async () => { org = await collections.organizations.save({ verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'slug-org-one', @@ -78,20 +66,15 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgSummary = await collections.organizationSummaries.save({ + organization: org._id, + web: { pass: 50, fail: 1000, total: 1050 }, + mail: { pass: 50, fail: 1000, total: 1050 }, + }) + await db.collection('organizations').update(org._key, { latestSummaryId: orgSummary._id }) + orgTwo = await collections.organizations.save({ verified: true, - summaries: { - web: { - pass: 52, - fail: 1002, - total: 1054, - }, - mail: { - pass: 52, - fail: 1002, - total: 1054, - }, - }, orgDetails: { en: { slug: 'slug-org-two', @@ -115,6 +98,12 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgTwoSummary = await collections.organizationSummaries.save({ + organization: orgTwo._id, + web: { pass: 52, fail: 1002, total: 1054 }, + mail: { pass: 52, fail: 1002, total: 1054 }, + }) + await db.collection('organizations').update(orgTwo._key, { latestSummaryId: orgTwoSummary._id }) domain = await collections.domains.save({ domain: 'test.domain.gc.ca', }) @@ -341,18 +330,6 @@ describe('given the load organizations connection function', () => { beforeEach(async () => { orgThree = await collections.organizations.save({ verified: true, - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-three', @@ -376,6 +353,12 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + web: { pass: 51, fail: 1001, total: 1052 }, + mail: { pass: 51, fail: 1001, total: 1052 }, + }) + await db.collection('organizations').update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) await collections.claims.save({ _from: orgThree._id, _to: domain._id, @@ -1837,18 +1820,6 @@ describe('given the load organizations connection function', () => { beforeEach(async () => { orgThree = await collections.organizations.save({ verified: true, - summaries: { - web: { - pass: 51, - fail: 1001, - total: 1052, - }, - mail: { - pass: 51, - fail: 1001, - total: 1052, - }, - }, orgDetails: { en: { slug: 'slug-org-three', @@ -1872,6 +1843,12 @@ describe('given the load organizations connection function', () => { }, }, }) + const orgThreeSummary = await collections.organizationSummaries.save({ + organization: orgThree._id, + web: { pass: 51, fail: 1001, total: 1052 }, + mail: { pass: 51, fail: 1001, total: 1052 }, + }) + await db.collection('organizations').update(orgThree._key, { latestSummaryId: orgThreeSummary._id }) await collections.claims.save({ _from: orgThree._id, _to: domain._id, diff --git a/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-key.test.js b/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-key.test.js index d4564b6ad5..fd7b4014ad 100644 --- a/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-key.test.js +++ b/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-key.test.js @@ -10,7 +10,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given a loadVerifiedOrgByKey dataloader', () => { - let query, drop, truncate, collections, i18n + let query, drop, truncate, collections, db, i18n const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -23,7 +23,7 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -36,20 +36,8 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { })) }) beforeEach(async () => { - await collections.organizations.save({ + const org1 = await collections.organizations.save({ verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'communications-security-establishment', @@ -73,20 +61,22 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { }, }, }) - await collections.organizations.save({ - verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, + const summary1 = await collections.organizationSummaries.save({ + organization: org1._id, + web: { + pass: 50, + fail: 1000, + total: 1050, }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, + }) + await db.collection("organizations").update(org1._key, { latestSummaryId: summary1._id }) + const org2 = await collections.organizations.save({ + verified: true, orgDetails: { en: { slug: 'treasury-board-secretariat', @@ -110,6 +100,20 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { }, }, }) + const summary2 = await collections.organizationSummaries.save({ + organization: org2._id, + web: { + pass: 50, + fail: 1000, + total: 1050, + }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, + }) + await db.collection("organizations").update(org2._key, { latestSummaryId: summary2._id }) }) afterEach(async () => { await truncate() @@ -139,7 +143,7 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { FOR org IN organizations FILTER org.orgDetails.en.slug == "communications-security-establishment" LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("en", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("en", org.orgDetails)) ` const expectedOrg = await expectedCursor.next() @@ -156,7 +160,7 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { const expectedCursor = await query` FOR org IN organizations LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("en", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("en", org.orgDetails)) ` while (expectedCursor.hasMore) { @@ -193,7 +197,7 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { FOR org IN organizations FILTER org.orgDetails.fr.slug == "centre-de-la-securite-des-telecommunications" LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("fr", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("fr", org.orgDetails)) ` const expectedOrg = await expectedCursor.next() @@ -210,7 +214,7 @@ describe('given a loadVerifiedOrgByKey dataloader', () => { const expectedCursor = await query` FOR org IN organizations LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("fr", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("fr", org.orgDetails)) ` while (expectedCursor.hasMore) { diff --git a/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-slug.test.js b/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-slug.test.js index 446f68518f..80d3a353f1 100644 --- a/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-slug.test.js +++ b/api/src/verified-organizations/loaders/__tests__/load-verified-organization-by-slug.test.js @@ -10,7 +10,7 @@ import dbschema from '../../../../database.json' const { DB_PASS: rootPass, DB_URL: url } = process.env describe('given a loadVerifiedOrgBySlug dataloader', () => { - let query, drop, truncate, collections, i18n + let query, drop, truncate, collections, db, i18n const consoleOutput = [] const mockedError = (output) => consoleOutput.push(output) @@ -23,7 +23,7 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { describe('given a successful load', () => { beforeAll(async () => { - ;({ query, drop, truncate, collections } = await ensure({ + ;({ query, drop, truncate, collections, db } = await ensure({ variables: { dbname: dbNameFromFile(__filename), username: 'root', @@ -36,20 +36,8 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { })) }) beforeEach(async () => { - await collections.organizations.save({ + const org1 = await collections.organizations.save({ verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, - }, orgDetails: { en: { slug: 'communications-security-establishment', @@ -73,20 +61,22 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { }, }, }) - await collections.organizations.save({ - verified: true, - summaries: { - web: { - pass: 50, - fail: 1000, - total: 1050, - }, - mail: { - pass: 50, - fail: 1000, - total: 1050, - }, + const summary1 = await collections.organizationSummaries.save({ + organization: org1._id, + web: { + pass: 50, + fail: 1000, + total: 1050, }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, + }) + await db.collection("organizations").update(org1._key, { latestSummaryId: summary1._id }) + const org2 = await collections.organizations.save({ + verified: true, orgDetails: { en: { slug: 'treasury-board-secretariat', @@ -110,6 +100,20 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { }, }, }) + const summary2 = await collections.organizationSummaries.save({ + organization: org2._id, + web: { + pass: 50, + fail: 1000, + total: 1050, + }, + mail: { + pass: 50, + fail: 1000, + total: 1050, + }, + }) + await db.collection("organizations").update(org2._key, { latestSummaryId: summary2._id }) }) afterEach(async () => { await truncate() @@ -139,7 +143,7 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { FOR org IN organizations FILTER org.orgDetails.en.slug == "communications-security-establishment" LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("en", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("en", org.orgDetails)) ` const expectedOrg = await expectedCursor.next() @@ -156,7 +160,7 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { const expectedCursor = await query` FOR org IN organizations LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("en", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("en", org.orgDetails)) ` while (expectedCursor.hasMore) { @@ -193,7 +197,7 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { FOR org IN organizations FILTER org.orgDetails.fr.slug == "centre-de-la-securite-des-telecommunications" LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("fr", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("fr", org.orgDetails)) ` const expectedOrg = await expectedCursor.next() @@ -210,7 +214,7 @@ describe('given a loadVerifiedOrgBySlug dataloader', () => { const expectedCursor = await query` FOR org IN organizations LET domains = (FOR v, e IN 1..1 OUTBOUND org._id claims RETURN e._to) - RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.summaries }, TRANSLATE("fr", org.orgDetails)) + RETURN MERGE({ _id: org._id, _key: org._key, id: org._key, _rev: org._rev, _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(domains), summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE("fr", org.orgDetails)) ` while (expectedCursor.hasMore) { diff --git a/api/src/verified-organizations/loaders/load-verified-organization-by-key.js b/api/src/verified-organizations/loaders/load-verified-organization-by-key.js index 225af13261..c8971b6f76 100644 --- a/api/src/verified-organizations/loaders/load-verified-organization-by-key.js +++ b/api/src/verified-organizations/loaders/load-verified-organization-by-key.js @@ -21,8 +21,8 @@ export const loadVerifiedOrgByKey = ({ query, language, i18n }) => _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(orgDomains), - summaries: org.summaries - }, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null + }, TRANSLATE(${language}, org.orgDetails) ) ` diff --git a/api/src/verified-organizations/loaders/load-verified-organization-by-slug.js b/api/src/verified-organizations/loaders/load-verified-organization-by-slug.js index fc889451cf..bcee5f6069 100644 --- a/api/src/verified-organizations/loaders/load-verified-organization-by-slug.js +++ b/api/src/verified-organizations/loaders/load-verified-organization-by-slug.js @@ -21,8 +21,8 @@ export const loadVerifiedOrgBySlug = ({ query, language, i18n }) => _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(orgDomains), - summaries: org.summaries - }, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null + }, TRANSLATE(${language}, org.orgDetails) ) ` diff --git a/api/src/verified-organizations/loaders/load-verified-organization-connections-by-domain-id.js b/api/src/verified-organizations/loaders/load-verified-organization-connections-by-domain-id.js index 7ea69ddce3..239d51374d 100644 --- a/api/src/verified-organizations/loaders/load-verified-organization-connections-by-domain-id.js +++ b/api/src/verified-organizations/loaders/load-verified-organization-connections-by-domain-id.js @@ -50,23 +50,23 @@ export const loadVerifiedOrgConnectionsByDomainId = documentField = aql`afterVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`afterVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`afterVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`afterVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`afterVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`afterVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`afterVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND afterVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -127,23 +127,23 @@ export const loadVerifiedOrgConnectionsByDomainId = documentField = aql`beforeVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`beforeVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`beforeVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`beforeVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`beforeVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`beforeVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`beforeVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND beforeVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -266,27 +266,27 @@ export const loadVerifiedOrgConnectionsByDomainId = hasNextPageDocumentField = aql`LAST(retrievedOrgs).verified` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).verified` } else if (orderBy.field === 'summary-mail-pass') { - orgField = aql`org.summaries.mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - orgField = aql`org.summaries.mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.fail` } else if (orderBy.field === 'summary-mail-total') { - orgField = aql`org.summaries.mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.total` } else if (orderBy.field === 'summary-web-pass') { - orgField = aql`org.summaries.web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.pass` } else if (orderBy.field === 'summary-web-fail') { - orgField = aql`org.summaries.web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.fail` } else if (orderBy.field === 'summary-web-total') { - orgField = aql`org.summaries.web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.total` } else if (orderBy.field === 'domain-count') { @@ -329,17 +329,17 @@ export const loadVerifiedOrgConnectionsByDomainId = } else if (orderBy.field === 'verified') { sortByField = aql`org.verified ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-pass') { - sortByField = aql`org.summaries.mail.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-fail') { - sortByField = aql`org.summaries.mail.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-total') { - sortByField = aql`org.summaries.mail.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.total ${orderBy.direction},` } else if (orderBy.field === 'summary-web-pass') { - sortByField = aql`org.summaries.web.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-web-fail') { - sortByField = aql`org.summaries.web.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-web-total') { - sortByField = aql`org.summaries.web.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.total ${orderBy.direction},` } else if (orderBy.field === 'domain-count') { sortByField = aql`COUNT(domains) ${orderBy.direction},` } @@ -381,7 +381,7 @@ export const loadVerifiedOrgConnectionsByDomainId = _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(orgDomains), - summaries: org.summaries + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null }, TRANSLATE(${language}, org.orgDetails) ) diff --git a/api/src/verified-organizations/loaders/load-verified-organizations-connections.js b/api/src/verified-organizations/loaders/load-verified-organizations-connections.js index 2753c388c1..51ea6dc80e 100644 --- a/api/src/verified-organizations/loaders/load-verified-organizations-connections.js +++ b/api/src/verified-organizations/loaders/load-verified-organizations-connections.js @@ -50,23 +50,23 @@ export const loadVerifiedOrgConnections = documentField = aql`afterVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`afterVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`afterVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`afterVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`afterVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`afterVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`afterVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(afterVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND afterVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -125,23 +125,23 @@ export const loadVerifiedOrgConnections = documentField = aql`beforeVar.verified` orgField = aql`org.verified` } else if (orderBy.field === 'summary-mail-pass') { - documentField = aql`beforeVar.summaries.mail.pass` - orgField = aql`org.summaries.mail.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - documentField = aql`beforeVar.summaries.mail.fail` - orgField = aql`org.summaries.mail.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` } else if (orderBy.field === 'summary-mail-total') { - documentField = aql`beforeVar.summaries.mail.total` - orgField = aql`org.summaries.mail.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` } else if (orderBy.field === 'summary-web-pass') { - documentField = aql`beforeVar.summaries.web.pass` - orgField = aql`org.summaries.web.pass` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` } else if (orderBy.field === 'summary-web-fail') { - documentField = aql`beforeVar.summaries.web.fail` - orgField = aql`org.summaries.web.fail` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` } else if (orderBy.field === 'summary-web-total') { - documentField = aql`beforeVar.summaries.web.total` - orgField = aql`org.summaries.web.total` + documentField = aql`DOCUMENT(beforeVar.latestSummaryId).web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` } else if (orderBy.field === 'domain-count') { documentField = aql`COUNT(FOR v, e IN 1..1 OUTBOUND beforeVar._id claims RETURN e._to)` orgField = aql`COUNT(orgDomains)` @@ -264,27 +264,27 @@ export const loadVerifiedOrgConnections = hasNextPageDocumentField = aql`LAST(retrievedOrgs).verified` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).verified` } else if (orderBy.field === 'summary-mail-pass') { - orgField = aql`org.summaries.mail.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.pass` } else if (orderBy.field === 'summary-mail-fail') { - orgField = aql`org.summaries.mail.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.fail` } else if (orderBy.field === 'summary-mail-total') { - orgField = aql`org.summaries.mail.total` + orgField = aql`DOCUMENT(org.latestSummaryId).mail.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.mail.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.mail.total` } else if (orderBy.field === 'summary-web-pass') { - orgField = aql`org.summaries.web.pass` + orgField = aql`DOCUMENT(org.latestSummaryId).web.pass` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.pass` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.pass` } else if (orderBy.field === 'summary-web-fail') { - orgField = aql`org.summaries.web.fail` + orgField = aql`DOCUMENT(org.latestSummaryId).web.fail` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.fail` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.fail` } else if (orderBy.field === 'summary-web-total') { - orgField = aql`org.summaries.web.total` + orgField = aql`DOCUMENT(org.latestSummaryId).web.total` hasNextPageDocumentField = aql`LAST(retrievedOrgs).summaries.web.total` hasPreviousPageDocumentField = aql`FIRST(retrievedOrgs).summaries.web.total` } else if (orderBy.field === 'domain-count') { @@ -327,17 +327,17 @@ export const loadVerifiedOrgConnections = } else if (orderBy.field === 'verified') { sortByField = aql`org.verified ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-pass') { - sortByField = aql`org.summaries.mail.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-fail') { - sortByField = aql`org.summaries.mail.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-mail-total') { - sortByField = aql`org.summaries.mail.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).mail.total ${orderBy.direction},` } else if (orderBy.field === 'summary-web-pass') { - sortByField = aql`org.summaries.web.pass ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.pass ${orderBy.direction},` } else if (orderBy.field === 'summary-web-fail') { - sortByField = aql`org.summaries.web.fail ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.fail ${orderBy.direction},` } else if (orderBy.field === 'summary-web-total') { - sortByField = aql`org.summaries.web.total ${orderBy.direction},` + sortByField = aql`DOCUMENT(org.latestSummaryId).web.total ${orderBy.direction},` } else if (orderBy.field === 'domain-count') { sortByField = aql`COUNT(domains) ${orderBy.direction},` } @@ -381,8 +381,8 @@ export const loadVerifiedOrgConnections = _type: "verifiedOrganization", verified: org.verified, domainCount: COUNT(orgDomains), - summaries: org.summaries - }, + summaries: org.latestSummaryId ? DOCUMENT(org.latestSummaryId) : null + }, TRANSLATE(${language}, org.orgDetails) ) ) diff --git a/services/summaries/summaries.py b/services/summaries/summaries.py index e76ebd7940..bd92be6b9f 100644 --- a/services/summaries/summaries.py +++ b/services/summaries/summaries.py @@ -194,8 +194,10 @@ def update_org_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_PA # Establish DB connection client = ArangoClient(hosts=host) db = client.db(name, username=user, password=password) + org_summaries_col = db.collection("organizationSummaries") + organizations_col = db.collection("organizations") - for org in db.collection("organizations"): + for org in organizations_col: logging.info(f"Working on organization {org['orgDetails']['en']['name']}...") try: @@ -399,14 +401,26 @@ def update_org_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_PA "negative_tags": negative_tags, } - current_summary = org.get("summaries", {}) - if current_summary.get("date", "") != date.today().isoformat(): - logging.info(f"Storing previous summary for org: {org['_key']}") - db.collection("organizationSummaries").insert( - {"organization": org.get("_id"), **current_summary} - ) - org.update({"summaries": summary_data}) - db.collection("organizations").update(org, merge=False) + today_iso = date.today().isoformat() + existing_today = org_summaries_col.find( + {"organization": org["_id"], "date": today_iso} + ) + if existing_today.empty(): + inserted = org_summaries_col.insert(summary_data) + latest_summary_id = inserted["_id"] + else: + existing_doc = existing_today.next() + org_summaries_col.update({"_key": existing_doc["_key"], **summary_data}) + latest_summary_id = existing_doc["_id"] + + organizations_col.update( + { + "_key": org["_key"], + "latestSummaryId": latest_summary_id, + "summaries": None, + }, + keep_none=False, + ) except Exception as e: logging.error(f"Error processing organization {org['_id']}: {e}") continue diff --git a/services/summaries/tests/test_summaries.py b/services/summaries/tests/test_summaries.py index 7d6429575e..4d9ea6cb76 100644 --- a/services/summaries/tests/test_summaries.py +++ b/services/summaries/tests/test_summaries.py @@ -207,7 +207,12 @@ def test_update_org_summaries(self, arango_db): ) organization = arango_db.collection("organizations").get({"_key": "testorg"}) - assert organization["summaries"] == { + summary = arango_db.collection("organizationSummaries").get( + {"_id": organization["latestSummaryId"]} + ) + for k in ("_id", "_key", "_rev"): + summary.pop(k, None) + assert summary == { "organization": "organizations/testorg", "date": date.today().isoformat(), "dmarc": {"pass": 2, "fail": 1, "total": 3}, From c94f442ebcac8e4e3103d3abc97a434dd70912d5 Mon Sep 17 00:00:00 2001 From: FestiveKyle Date: Thu, 7 May 2026 13:18:59 -0300 Subject: [PATCH 2/3] Handle one-time migration for inline summaries --- services/summaries/summaries.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/services/summaries/summaries.py b/services/summaries/summaries.py index bd92be6b9f..d0718a54dc 100644 --- a/services/summaries/summaries.py +++ b/services/summaries/summaries.py @@ -201,6 +201,21 @@ def update_org_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_PA logging.info(f"Working on organization {org['orgDetails']['en']['name']}...") try: + # One-time migration: inline `summaries` -> organizationSummaries doc + if org.get("latestSummaryId") is None and org.get("summaries"): + inline = org["summaries"] + inserted = org_summaries_col.insert( + {"organization": org["_id"], **inline} + ) + organizations_col.update( + { + "_key": org["_key"], + "latestSummaryId": inserted["_id"], + "summaries": None, + }, + keep_none=False, + ) + # tier 1 https_fail = 0 https_pass = 0 From 95ba35f18d65e7d1555b112a039b5635aad74c08 Mon Sep 17 00:00:00 2001 From: FestiveKyle Date: Thu, 7 May 2026 13:19:41 -0300 Subject: [PATCH 3/3] Centralize date formatting --- services/summaries/summaries.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/services/summaries/summaries.py b/services/summaries/summaries.py index d0718a54dc..7fef173875 100644 --- a/services/summaries/summaries.py +++ b/services/summaries/summaries.py @@ -166,12 +166,12 @@ def update_chart_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_ } # Update chart summaries in DB - todayISO = date.today().isoformat() - cursor = chartSummariesCol.find({"date": todayISO}) + today_iso = date.today().isoformat() + cursor = chartSummariesCol.find({"date": today_iso}) if cursor.empty(): chartSummariesCol.insert( { - "date": todayISO, + "date": today_iso, **chartSummaries, "dmarc_phase": dmarc_phase_summary, } @@ -179,7 +179,7 @@ def update_chart_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_ else: logging.info("Chart summary from today already present. Updating summary...") chartSummariesCol.update_match( - {"date": todayISO}, + {"date": today_iso}, { **chartSummaries, "dmarc_phase": dmarc_phase_summary, @@ -197,6 +197,8 @@ def update_org_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_PA org_summaries_col = db.collection("organizationSummaries") organizations_col = db.collection("organizations") + today_iso = date.today().isoformat() + for org in organizations_col: logging.info(f"Working on organization {org['orgDetails']['en']['name']}...") @@ -361,7 +363,7 @@ def update_org_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_PA summary_data = { "organization": org["_id"], - "date": date.today().isoformat(), + "date": today_iso, "dmarc": { "pass": dmarc_pass, "fail": dmarc_fail, @@ -416,7 +418,6 @@ def update_org_summaries(host=DB_URL, name=DB_NAME, user=DB_USER, password=DB_PA "negative_tags": negative_tags, } - today_iso = date.today().isoformat() existing_today = org_summaries_col.find( {"organization": org["_id"], "date": today_iso} )