From fcf4e0e0b2f9081cec0438b45000986db22b1bc9 Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Fri, 7 Jul 2023 09:54:02 -0400 Subject: [PATCH 1/9] replace organization query with whoami query --- cypress/e2e/03-add_devices.cy.js | 6 +++--- cypress/e2e/09-multiplex_testing.cy.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cypress/e2e/03-add_devices.cy.js b/cypress/e2e/03-add_devices.cy.js index 02068da6a3..c1136d6103 100644 --- a/cypress/e2e/03-add_devices.cy.js +++ b/cypress/e2e/03-add_devices.cy.js @@ -67,12 +67,12 @@ describe("Adding covid only and multiplex devices", () => { context("Manage facilities - add devices", () => { beforeEach(() => { cy.makePOSTRequest({ - operationName: "GetManagedFacilities", + operationName: "WhoAmI", variables: {}, query: - "query GetManagedFacilities {\n organization {\n facilities {\n id\n name\n __typename\n }\n __typename\n }\n}", + "query WhoAmI {\n whoami {\n organization {\n facilities {\n id\n name\n __typename\n }\n __typename\n }\n} \n}", }).then((res) => { - facility = res.body.data.organization.facilities[0]; + facility = res.body.data.whoami.organization.facilities[0]; }) cy.intercept("POST", graphqlURL, (req) => { aliasGraphqlOperations(req); diff --git a/cypress/e2e/09-multiplex_testing.cy.js b/cypress/e2e/09-multiplex_testing.cy.js index 74e07204ca..69040429f1 100644 --- a/cypress/e2e/09-multiplex_testing.cy.js +++ b/cypress/e2e/09-multiplex_testing.cy.js @@ -8,10 +8,10 @@ describe("Testing with multiplex devices", () => { before(() => { cy.makePOSTRequest({ - operationName: "GetManagedFacilities", + operationName: "WhoAmI", variables: {}, query: - "query GetManagedFacilities {\n organization {\n facilities {\n id\n name\n __typename\n }\n __typename\n }\n}", + "query WhoAmI {\n whoami {\n organization {\n facilities {\n id\n name\n __typename\n }\n __typename\n }\n} \n}", }).then((res) => { facility = res.body.data.organization.facilities[0]; cy.makePOSTRequest({ From 4c5c9cb59e1614bc6a3fd061655326ac8c039bc4 Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Fri, 7 Jul 2023 09:54:02 -0400 Subject: [PATCH 2/9] replace organization query with whoami query --- cypress/e2e/09-multiplex_testing.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/09-multiplex_testing.cy.js b/cypress/e2e/09-multiplex_testing.cy.js index 69040429f1..17336101a3 100644 --- a/cypress/e2e/09-multiplex_testing.cy.js +++ b/cypress/e2e/09-multiplex_testing.cy.js @@ -13,7 +13,7 @@ describe("Testing with multiplex devices", () => { query: "query WhoAmI {\n whoami {\n organization {\n facilities {\n id\n name\n __typename\n }\n __typename\n }\n} \n}", }).then((res) => { - facility = res.body.data.organization.facilities[0]; + facility = res.body.data.whoami.organization.facilities[0]; cy.makePOSTRequest({ operationName: "GetPatientsByFacility", variables: { From 1bd36cfefdb3b04b654fd666bf2ec7b330b1a4f1 Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Mon, 10 Jul 2023 08:36:48 -0400 Subject: [PATCH 3/9] remove organization from main.graphqls --- backend/src/main/resources/graphql/main.graphqls | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/src/main/resources/graphql/main.graphqls b/backend/src/main/resources/graphql/main.graphqls index b94ccafbe7..58a0bb81a9 100644 --- a/backend/src/main/resources/graphql/main.graphqls +++ b/backend/src/main/resources/graphql/main.graphqls @@ -367,10 +367,6 @@ type UploadSubmissionPage { # Queries and mutations for everyday use type Query { - organization: Organization - @deprecated( - reason: "this information is already loaded from the 'whoami' endpoint" - ) deviceType: [DeviceType!]! @deprecated(reason: "use the pluralized form to reduce confusion") deviceTypes: [DeviceType!]! From 4c1f86be08739d6ca4ac53f643fb3197f084ee1b Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Mon, 10 Jul 2023 08:37:16 -0400 Subject: [PATCH 4/9] add organization query for admin.graphqls --- backend/src/main/resources/graphql/admin.graphqls | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/resources/graphql/admin.graphqls b/backend/src/main/resources/graphql/admin.graphqls index 151df1e352..cacd375032 100644 --- a/backend/src/main/resources/graphql/admin.graphqls +++ b/backend/src/main/resources/graphql/admin.graphqls @@ -4,6 +4,7 @@ extend type Query { organizations(identityVerified: Boolean): [Organization!]! pendingOrganizations: [PendingOrganization!]! + organization(id: ID!): Organization } extend type Mutation { resendToReportStream(testEventIds: [ID!]!, fhirOnly: Boolean!): Boolean From 1bee55f142d6633e2db4e9232517528bceca9122 Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Mon, 10 Jul 2023 08:41:40 -0400 Subject: [PATCH 5/9] update organization query to fetch by id --- .../organization/OrganizationResolver.java | 19 ++++++-------- .../OrganizationIntegrationTest.java | 26 +++++++++++++++++++ .../OrganizationResolverTest.java | 18 +++++++++++++ .../graphql-test/organization-query.graphql | 15 +++++++++++ 4 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java create mode 100644 backend/src/test/resources/graphql-test/organization-query.graphql diff --git a/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java b/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java index 6a9c35e78d..76a1a2100b 100644 --- a/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java +++ b/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java @@ -3,11 +3,11 @@ import gov.cdc.usds.simplereport.api.model.ApiFacility; import gov.cdc.usds.simplereport.api.model.ApiOrganization; import gov.cdc.usds.simplereport.api.model.ApiPendingOrganization; +import gov.cdc.usds.simplereport.config.AuthorizationConfiguration; import gov.cdc.usds.simplereport.db.model.Facility; import gov.cdc.usds.simplereport.db.model.Organization; import gov.cdc.usds.simplereport.service.OrganizationQueueService; import gov.cdc.usds.simplereport.service.OrganizationService; -import gov.cdc.usds.simplereport.service.model.OrganizationRoles; import java.util.List; import java.util.Optional; import java.util.Set; @@ -21,8 +21,8 @@ @Controller public class OrganizationResolver { - private OrganizationService _organizationService; - private OrganizationQueueService _organizationQueueService; + private final OrganizationService _organizationService; + private final OrganizationQueueService _organizationQueueService; public OrganizationResolver(OrganizationService os, OrganizationQueueService oqs) { _organizationService = os; @@ -30,14 +30,11 @@ public OrganizationResolver(OrganizationService os, OrganizationQueueService oqs } @QueryMapping - public Optional organization() { - Optional roles = _organizationService.getCurrentOrganizationRoles(); - return roles.map( - r -> { - Organization o = r.getOrganization(); - Set fs = r.getFacilities(); - return new ApiOrganization(o, fs); - }); + @AuthorizationConfiguration.RequireGlobalAdminUser + public ApiOrganization organization(@Argument UUID id) { + var org = _organizationService.getOrganizationById(id); + var facilities = _organizationService.getFacilities(org); + return new ApiOrganization(org, facilities); } /** diff --git a/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java new file mode 100644 index 0000000000..670903aaac --- /dev/null +++ b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java @@ -0,0 +1,26 @@ +package gov.cdc.usds.simplereport.api.organization; + +import static org.assertj.core.api.Assertions.assertThat; + +import gov.cdc.usds.simplereport.api.graphql.BaseGraphqlTest; +import java.util.Map; +import org.junit.jupiter.api.Test; + +class OrganizationIntegrationTest extends BaseGraphqlTest { + + @Test + void organizationQuery_asSuperUser_passes() { + var org = _orgService.getOrganizationsByName("Dis Organization").get(0); + useSuperUser(); + var result = runQuery("organization-query", Map.of("id", org.getInternalId())); + assertThat(result.get("organization").get("internalId").asText()) + .isEqualTo(org.getInternalId().toString()); + } + + @Test + void organizationQuery_asOrgAdmin_fails() { + var org = _orgService.getOrganizationsByName("Dis Organization").get(0); + useOrgAdmin(); + runQuery("organization-query", Map.of("id", org.getInternalId()), "Unauthorized"); + } +} diff --git a/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java index e7910d16a6..365acc85a1 100644 --- a/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java +++ b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java @@ -1,13 +1,17 @@ package gov.cdc.usds.simplereport.api.organization; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import gov.cdc.usds.simplereport.api.model.ApiPendingOrganization; import gov.cdc.usds.simplereport.api.model.accountrequest.OrganizationAccountRequest; +import gov.cdc.usds.simplereport.db.model.Organization; import gov.cdc.usds.simplereport.db.model.OrganizationQueueItem; import gov.cdc.usds.simplereport.service.OrganizationQueueService; +import gov.cdc.usds.simplereport.service.OrganizationService; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -18,6 +22,7 @@ @ExtendWith(SpringExtension.class) class OrganizationResolverTest { @Mock OrganizationQueueService mockedOrganizationQueueService; + @Mock OrganizationService organizationService; @InjectMocks OrganizationResolver organizationMutationResolver; @@ -40,4 +45,17 @@ void getPendingOrganizations_success() { assertThat(expected).hasSameSizeAs(result); assertThat(expected.get(0).getExternalId()).isEqualTo(result.get(0).getExternalId()); } + + @Test + void organization_success() { + var id = UUID.randomUUID(); + var org = new Organization("name", "type", "123", true); + + when(organizationService.getOrganizationById(id)).thenReturn(org); + + organizationMutationResolver.organization(id); + + verify(organizationService).getOrganizationById(id); + verify(organizationService).getFacilities(org); + } } diff --git a/backend/src/test/resources/graphql-test/organization-query.graphql b/backend/src/test/resources/graphql-test/organization-query.graphql new file mode 100644 index 0000000000..d99d1e7c81 --- /dev/null +++ b/backend/src/test/resources/graphql-test/organization-query.graphql @@ -0,0 +1,15 @@ +query organization ($id: ID!){ + organization(id: $id) { + internalId + name + type + externalId + identityVerified + patientSelfRegistrationLink + facilities{ + id + name + } + id + } +} \ No newline at end of file From e888da8e713ce09553033f6b5e0f5733b37fdd88 Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Tue, 11 Jul 2023 13:00:34 -0400 Subject: [PATCH 6/9] run codegen --- frontend/src/generated/graphql.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/generated/graphql.tsx b/frontend/src/generated/graphql.tsx index 837e6fcdec..0910b055b3 100644 --- a/frontend/src/generated/graphql.tsx +++ b/frontend/src/generated/graphql.tsx @@ -642,7 +642,6 @@ export type Query = { deviceTypes: Array; facilities?: Maybe>>; facility?: Maybe; - /** @deprecated this information is already loaded from the 'whoami' endpoint */ organization?: Maybe; organizationLevelDashboardMetrics?: Maybe; organizations: Array; @@ -677,6 +676,10 @@ export type QueryFacilityArgs = { id: Scalars["ID"]; }; +export type QueryOrganizationArgs = { + id: Scalars["ID"]; +}; + export type QueryOrganizationLevelDashboardMetricsArgs = { endDate: Scalars["DateTime"]; startDate: Scalars["DateTime"]; From 1b90f52e2dd185bb7f64dec85d2d9175ca3d878b Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Tue, 11 Jul 2023 14:00:41 -0400 Subject: [PATCH 7/9] replace another place where base organization query was used --- .../api/graphql/BaseGraphqlTest.java | 6 ++- .../graphql-test/org-settings-query.graphql | 46 ++++++++++--------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/backend/src/test/java/gov/cdc/usds/simplereport/api/graphql/BaseGraphqlTest.java b/backend/src/test/java/gov/cdc/usds/simplereport/api/graphql/BaseGraphqlTest.java index 45580b1d85..1836d5a63a 100644 --- a/backend/src/test/java/gov/cdc/usds/simplereport/api/graphql/BaseGraphqlTest.java +++ b/backend/src/test/java/gov/cdc/usds/simplereport/api/graphql/BaseGraphqlTest.java @@ -248,7 +248,11 @@ protected Map extractAllFacilitiesInOrg() { String originalUsername = getUsername(); useOrgAdmin(); Iterator facilitiesIter = - runQuery("org-settings-query").get("organization").get("testingFacility").elements(); + runQuery("org-settings-query") + .get("whoami") + .get("organization") + .get("testingFacility") + .elements(); Map facilities = new HashMap<>(); while (facilitiesIter.hasNext()) { JsonNode facility = facilitiesIter.next(); diff --git a/backend/src/test/resources/graphql-test/org-settings-query.graphql b/backend/src/test/resources/graphql-test/org-settings-query.graphql index d0f3dfd1fd..d002362cb7 100644 --- a/backend/src/test/resources/graphql-test/org-settings-query.graphql +++ b/backend/src/test/resources/graphql-test/org-settings-query.graphql @@ -1,26 +1,13 @@ { - organization { - internalId - name - externalId - testingFacility { - id - cliaNumber + whoami { + organization { + internalId name - street - streetTwo - city - county - state - zipCode - phone - email - orderingProvider { - firstName - middleName - lastName - suffix - NPI + externalId + testingFacility { + id + cliaNumber + name street streetTwo city @@ -28,9 +15,24 @@ state zipCode phone + email + orderingProvider { + firstName + middleName + lastName + suffix + NPI + street + streetTwo + city + county + state + zipCode + phone + __typename + } __typename } - __typename } } } From 4e83fbb766322bca025d5ffaa4c050c1c0cd66df Mon Sep 17 00:00:00 2001 From: Bob Zhao Date: Tue, 11 Jul 2023 15:33:27 -0400 Subject: [PATCH 8/9] switch type file back to a module --- frontend/src/app/Settings/{types.ts => types.d.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frontend/src/app/Settings/{types.ts => types.d.ts} (100%) diff --git a/frontend/src/app/Settings/types.ts b/frontend/src/app/Settings/types.d.ts similarity index 100% rename from frontend/src/app/Settings/types.ts rename to frontend/src/app/Settings/types.d.ts From 88907657211526ccbc6eb7d6228c062867eff34a Mon Sep 17 00:00:00 2001 From: Boban Ljuljdjurovic Date: Wed, 12 Jul 2023 12:01:15 -0400 Subject: [PATCH 9/9] return null if organization is not found --- .../api/organization/OrganizationResolver.java | 8 +++++++- .../OrganizationIntegrationTest.java | 8 ++++++++ .../organization/OrganizationResolverTest.java | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java b/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java index 9cc7712af2..6d558f8e1a 100644 --- a/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java +++ b/backend/src/main/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolver.java @@ -3,6 +3,7 @@ import gov.cdc.usds.simplereport.api.model.ApiFacility; import gov.cdc.usds.simplereport.api.model.ApiOrganization; import gov.cdc.usds.simplereport.api.model.ApiPendingOrganization; +import gov.cdc.usds.simplereport.api.model.errors.IllegalGraphqlArgumentException; import gov.cdc.usds.simplereport.config.AuthorizationConfiguration; import gov.cdc.usds.simplereport.db.model.Facility; import gov.cdc.usds.simplereport.db.model.Organization; @@ -32,7 +33,12 @@ public OrganizationResolver(OrganizationService os, OrganizationQueueService oqs @QueryMapping @AuthorizationConfiguration.RequireGlobalAdminUser public ApiOrganization organization(@Argument UUID id) { - var org = _organizationService.getOrganizationById(id); + Organization org; + try { + org = _organizationService.getOrganizationById(id); + } catch (IllegalGraphqlArgumentException e) { + return null; + } var facilities = _organizationService.getFacilities(org); return new ApiOrganization(org, facilities); } diff --git a/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java index 670903aaac..c32b750d49 100644 --- a/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java +++ b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationIntegrationTest.java @@ -4,6 +4,7 @@ import gov.cdc.usds.simplereport.api.graphql.BaseGraphqlTest; import java.util.Map; +import java.util.UUID; import org.junit.jupiter.api.Test; class OrganizationIntegrationTest extends BaseGraphqlTest { @@ -17,6 +18,13 @@ void organizationQuery_asSuperUser_passes() { .isEqualTo(org.getInternalId().toString()); } + @Test + void organizationQuery_invalidID_returnsNull() { + useSuperUser(); + var result = runQuery("organization-query", Map.of("id", UUID.randomUUID())); + assertThat(result.get("organization").isNull()).isTrue(); + } + @Test void organizationQuery_asOrgAdmin_fails() { var org = _orgService.getOrganizationsByName("Dis Organization").get(0); diff --git a/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java index 365acc85a1..ed5e3d32f5 100644 --- a/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java +++ b/backend/src/test/java/gov/cdc/usds/simplereport/api/organization/OrganizationResolverTest.java @@ -1,11 +1,13 @@ package gov.cdc.usds.simplereport.api.organization; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import gov.cdc.usds.simplereport.api.model.ApiPendingOrganization; import gov.cdc.usds.simplereport.api.model.accountrequest.OrganizationAccountRequest; +import gov.cdc.usds.simplereport.api.model.errors.IllegalGraphqlArgumentException; import gov.cdc.usds.simplereport.db.model.Organization; import gov.cdc.usds.simplereport.db.model.OrganizationQueueItem; import gov.cdc.usds.simplereport.service.OrganizationQueueService; @@ -58,4 +60,19 @@ void organization_success() { verify(organizationService).getOrganizationById(id); verify(organizationService).getFacilities(org); } + + @Test + void organization_null() { + var id = UUID.randomUUID(); + var org = new Organization("name", "type", "123", true); + + when(organizationService.getOrganizationById(id)) + .thenThrow(new IllegalGraphqlArgumentException("error")); + + var actual = organizationMutationResolver.organization(id); + + assertThat(actual).isNull(); + verify(organizationService).getOrganizationById(id); + verify(organizationService, times(0)).getFacilities(org); + } }