diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalForV2ApiTest.java b/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalForV2ApiTest.java index 3e3c9e0882..1ebf32d785 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalForV2ApiTest.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalForV2ApiTest.java @@ -13,7 +13,9 @@ import uk.gov.hmcts.reform.lib.util.serenity5.SerenityTest; import uk.gov.hmcts.reform.professionalapi.controller.request.NewUserCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationByProfileIdsRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationOtherOrgsCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UsersInOrganisationsByOrganisationIdentifiersRequest; import uk.gov.hmcts.reform.professionalapi.controller.response.UsersInOrganisationsByOrganisationIdentifiersResponse; import uk.gov.hmcts.reform.professionalapi.domain.OrganisationStatus; @@ -22,17 +24,23 @@ import uk.gov.hmcts.reform.professionalapi.util.OrganisationProfileIdConstants; import uk.gov.hmcts.reform.professionalapi.util.ToggleEnable; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.http.HttpStatus.MULTI_STATUS; import static org.springframework.http.HttpStatus.NOT_FOUND; import static org.springframework.http.HttpStatus.NO_CONTENT; import static org.springframework.http.HttpStatus.OK; +import static uk.gov.hmcts.reform.professionalapi.client.ProfessionalApiClient.createOrganisationRequest; import static uk.gov.hmcts.reform.professionalapi.client.ProfessionalApiClient.createOrganisationRequestForV2; import static uk.gov.hmcts.reform.professionalapi.util.DateUtils.convertStringToLocalDate; import static uk.gov.hmcts.reform.professionalapi.util.DateUtils.generateRandomDate; @@ -529,4 +537,191 @@ private void verifyOrganisationDetailsBySinceDateV2(Map response }); } -} + + @Test + void updateOrganisationSraIdShouldReturnSuccess() { + log.info("updateOrganisationNameShouldReturnSuccess :: STARTED"); + //create organisation + String orgId1 = createActiveOrganisation(); + String orgId2 = createActiveOrganisation(); + String sraId1 = randomAlphabetic(7); + String sraId2 = randomAlphabetic(7); + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + sraId1,sraId2,orgId1,orgId2); + //call endpoint to update SraId as 'updatedSraId' + Response orgUpdatedSraResponse = professionalApiClient.updatesOrganisationSra( + organisationSraUpdateRequest, hmctsAdmin, OK); + assertNotNull(orgUpdatedSraResponse); + assertThat(orgUpdatedSraResponse.body().as(Map.class).get("status")).isEqualTo("success"); + assertThat(orgUpdatedSraResponse.body().as(Map.class).get("message")).isEqualTo( + "All sraIds updated successfully"); + //retrieve 1st saved organisation by id + verifyRetrievedOrg(orgId1,sraId1); + //retrieve 2st saved organisation by id + verifyRetrievedOrg(orgId2,sraId2); + //Delete organisation + deleteCreatedTestOrganisations(orgId1,orgId2); + log.info("updateOrganisationSraIdShouldReturnSuccess :: END"); + + } + + + @Test + void updateOrganisationSraIdShouldReturnFailureIfNoOrgId() { + log.info("updateOrganisationSraIdShouldReturnFailureIfNoOrgId :: STARTED"); + String sraId1 = randomAlphabetic(7); + String sraId2 = randomAlphabetic(7); + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + sraId1,sraId2,null,null); + //call endpoint to update empty SraId + Response orgUpdatedSraIdResponse = professionalApiClient.updatesOrganisationSra( + organisationSraUpdateRequest,hmctsAdmin, MULTI_STATUS); + assertNotNull(orgUpdatedSraIdResponse); + assertThat(orgUpdatedSraIdResponse.body().as(Map.class).get("status")).isEqualTo("failure"); + ArrayList sraIds = (ArrayList) orgUpdatedSraIdResponse.body().as(Map.class).get("sraIds"); + LinkedHashMap response1 = (LinkedHashMap) sraIds.get(0); + LinkedHashMap response2 = (LinkedHashMap) sraIds.get(1); + + assertThat(response1.get("status")).isEqualTo("failure"); + assertThat(response2.get("status")).isEqualTo("failure"); + + assertThat(response1.get("statusCode")).isEqualTo(400); + assertThat(response2.get("statusCode")).isEqualTo(400); + + assertThat(response1.get("message")).isEqualTo("Organisation id is missing"); + assertThat(response2.get("message")).isEqualTo("Organisation id is missing"); + log.info("updateOrganisationSraIdShouldReturnFailureIfNoOrgId :: END"); + } + + + @Test + void updateOrganisationSraIdShouldReturnFailureIfNoSraId() { + log.info("updateOrganisationSraIdShouldReturnFailureIfNoSraId :: STARTED"); + //create organisation + String orgId1 = createActiveOrganisation(); + String orgId2 = createActiveOrganisation(); + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + null,null,orgId1,orgId2); + //call endpoint to update empty Sra + Response orgUpdatedSraResponse = professionalApiClient.updatesOrganisationSra( + organisationSraUpdateRequest,hmctsAdmin, MULTI_STATUS); + assertNotNull(orgUpdatedSraResponse); + assertThat(orgUpdatedSraResponse.body().as(Map.class).get("status")).isEqualTo("failure"); + ArrayList sraIds = (ArrayList) orgUpdatedSraResponse.body().as(Map.class).get("sraIds"); + LinkedHashMap response1 = (LinkedHashMap) sraIds.get(0); + LinkedHashMap response2 = (LinkedHashMap) sraIds.get(1); + + assertThat(response1.get("organisationId")).isEqualTo(orgId1); + assertThat(response2.get("organisationId")).isEqualTo(orgId2); + + assertThat(response1.get("status")).isEqualTo("failure"); + assertThat(response2.get("status")).isEqualTo("failure"); + + assertThat(response1.get("statusCode")).isEqualTo(400); + assertThat(response2.get("statusCode")).isEqualTo(400); + + assertThat(response1.get("message")).isEqualTo("Organisation sraId is missing"); + assertThat(response2.get("message")).isEqualTo("Organisation sraId is missing"); + + //Delete organisation + deleteCreatedTestOrganisations(orgId1,orgId2); + log.info("updateOrganisationSraIdShouldReturnFailureIfNoSraId :: END"); + } + + @Test + void updateOrganisationSraShouldReturnPartialSuccessIfNoSraId() { + log.info("updateOrganisationSraShouldReturnPartialSuccessIfNoSraId :: STARTED"); + //create organisation + String orgId1 = createActiveOrganisation(); + String orgId2 = createActiveOrganisation(); + String sraId1 = randomAlphabetic(7); + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + null,sraId1,orgId1,orgId2); + //call endpoint to update empty Sra + Response orgUpdatedSraResponse = professionalApiClient.updatesOrganisationSra( + organisationSraUpdateRequest,hmctsAdmin, MULTI_STATUS); + assertNotNull(orgUpdatedSraResponse); + assertThat(orgUpdatedSraResponse.body().as(Map.class).get("status")).isEqualTo("partial_success"); + ArrayList sraIds = (ArrayList) orgUpdatedSraResponse.body().as(Map.class).get("sraIds"); + LinkedHashMap response1 = (LinkedHashMap) sraIds.get(0); + LinkedHashMap response2 = (LinkedHashMap) sraIds.get(1); + LinkedHashMap response3 = (LinkedHashMap) sraIds.get(2); + assertThat(response1.get("organisationId")).isEqualTo(orgId1); + assertThat(response1.get("status")).isEqualTo("failure"); + assertThat(response1.get("statusCode")).isEqualTo(400); + assertThat(response1.get("message")).isEqualTo("Organisation sraId is missing"); + + assertThat(response2.get("organisationId")).isEqualTo(orgId2); + assertThat(response2.get("status")).isEqualTo("success"); + assertThat(response2.get("statusCode")).isEqualTo(200); + assertThat(response2.get("message")).isEqualTo("Organisation Attributes updated successfully"); + + assertThat(response3.get("organisationId")).isEqualTo(orgId2); + assertThat(response3.get("status")).isEqualTo("success"); + assertThat(response3.get("statusCode")).isEqualTo(200); + assertThat(response3.get("message")).isEqualTo("SraId updated successfully"); + + + //retrieve 2st saved organisation by id + verifyRetrievedOrg(orgId2,sraId1); + //Delete organisation + deleteCreatedTestOrganisations(orgId1,orgId2); + log.info("updateOrganisationSraShouldReturnPartialSuccessIfNoSraId :: END"); + } + + + private String createActiveOrganisation() { + Map response = professionalApiClient.createOrganisation(); + String organisationIdentifier = (String) response.get("organisationIdentifier"); + assertThat(organisationIdentifier).isNotEmpty(); + OrganisationCreationRequest organisationCreationRequest = createOrganisationRequest().status("ACTIVE").build(); + professionalApiClient.updateOrganisation(organisationCreationRequest, hmctsAdmin, organisationIdentifier,OK); + return organisationIdentifier; + } + + public void deleteCreatedTestOrganisations(String orgId1, String orgId2) { + professionalApiClient.deleteOrganisation(orgId1, hmctsAdmin, NO_CONTENT);; + professionalApiClient.deleteOrganisation(orgId2, hmctsAdmin, NO_CONTENT); + } + + public OrganisationSraUpdateRequest createOrganisationSraUpdateRequest(String sraId1,String sraId2,String orgId1, + String orgId2) { + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = new OrganisationSraUpdateRequest(); + List organisationSraUpdateDataList + = new ArrayList<>(); + OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateData1 = + new OrganisationSraUpdateRequest.OrganisationSraUpdateData(orgId1,sraId1); + OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateData2 = + new OrganisationSraUpdateRequest.OrganisationSraUpdateData(orgId2,sraId2); + organisationSraUpdateDataList.add(organisationSraUpdateData1); + organisationSraUpdateDataList.add(organisationSraUpdateData2); + organisationSraUpdateRequest.setOrganisationSraUpdateDataList(organisationSraUpdateDataList); + return organisationSraUpdateRequest; + } + + public void verifyRetrievedOrg(String orgId,String sraId) { + + var orgResponse = professionalApiClient.retrieveOrganisationDetailsForV2(orgId, hmctsAdmin, OK); + assertThat(orgResponse).isNotNull(); + List organisationAttributes = (List)orgResponse.get("orgAttributes"); + assertThat(organisationAttributes).isNotNull(); + LinkedHashMap attr = (LinkedHashMap)organisationAttributes.get(0); + assertThat(attr).isNotNull(); + assertThat(attr.get("key")).isEqualTo("regulators-0"); + assertThat(attr.get("value").toString()).isEqualTo( + "{\"regulatorType\":\"Solicitor Regulation Authority " + + "(SRA)\",\"organisationRegistrationNumber\":\"" + sraId + "\"}"); + + final Object sraIdSaved = orgResponse.get("sraId"); + assertThat(sraIdSaved).isNotNull().isEqualTo(sraId); + LocalDateTime updatedDate = LocalDateTime.parse(orgResponse.get("lastUpdated").toString()); + assertThat(updatedDate.toLocalDate()).isEqualTo(LocalDate.now()); + } + + +} \ No newline at end of file diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalTest.java b/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalTest.java index 82c1179593..f2ed07347e 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalTest.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/ProfessionalInternalUserFunctionalTest.java @@ -47,6 +47,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.CONFLICT; import static org.springframework.http.HttpStatus.FORBIDDEN; import static org.springframework.http.HttpStatus.NOT_FOUND; import static org.springframework.http.HttpStatus.NO_CONTENT; @@ -245,7 +246,7 @@ public void inviteUserWithDuplicateUserShouldReturnConflict(NewUserCreationReque NewUserCreationRequest newUserCreationRequest = professionalApiClient.createNewUserRequest(); newUserCreationRequest.setEmail(existingUserCreationRequest.getEmail()); Map newUserResponse = professionalApiClient.addNewUserToAnOrganisation(intActiveOrgId, - hmctsAdmin, newUserCreationRequest, HttpStatus.CONFLICT); + hmctsAdmin, newUserCreationRequest, CONFLICT); assertThat((String) newUserResponse.get("errorDescription")).contains("409 User already exists"); log.info("inviteUserWithDuplicateUserShouldReturnConflict :: END"); } @@ -1231,4 +1232,5 @@ private static List> sortByValue(final List (String) map.get(key))) .collect(Collectors.toList()); } + } diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/client/ProfessionalApiClient.java b/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/client/ProfessionalApiClient.java index f9801c26d2..5f36238c2f 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/client/ProfessionalApiClient.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/professionalapi/client/ProfessionalApiClient.java @@ -22,6 +22,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationByProfileIdsRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationOtherOrgsCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.PbaRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UpdatePbaRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UserCreationRequest; @@ -1315,6 +1316,21 @@ public void updateOrganisation(OrganisationCreationRequest organisationCreationR .statusCode(expectedStatus.value()); } + public Response updatesOrganisationSra(OrganisationSraUpdateRequest organisationSraUpdateRequest, + String role, + HttpStatus expectedStatus) { + + Response response = getMultipleAuthHeadersInternal() + .body(organisationSraUpdateRequest) + .put("/refdata/internal/v2/organisations/sra") + .andReturn(); + + log.info("{}:: Update organisation Sra id response: {}", + loggingComponentName, response.getStatusCode()); + + return response; + } + public void updateOrganisationToReview(String organisationIdentifier, String statusMessage, String role) { OrganisationCreationRequest organisationCreationRequest = createOrganisationRequest() diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/professionalapi/UpdateOrgSraIntegrationTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/professionalapi/UpdateOrgSraIntegrationTest.java new file mode 100644 index 0000000000..899ca18017 --- /dev/null +++ b/src/integrationTest/java/uk/gov/hmcts/reform/professionalapi/UpdateOrgSraIntegrationTest.java @@ -0,0 +1,254 @@ +package uk.gov.hmcts.reform.professionalapi; + +import org.apache.commons.lang.RandomStringUtils; +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; +import uk.gov.hmcts.reform.professionalapi.util.AuthorizationEnabledIntegrationTest; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; +import static org.assertj.core.api.Assertions.assertThat; +import static uk.gov.hmcts.reform.professionalapi.helper.OrganisationFixtures.someMinimalOrganisationRequest; + + +class UpdateOrgSraIntegrationTest extends AuthorizationEnabledIntegrationTest { + + + @Test + void update_sra_of_an_active_organisation_should_return_success_if_all_requests_updated() { + //create organisation + String orgId1 = getActiveOrganisationId(); + String orgId2 = getActiveOrganisationId(); + String sraId1 = randomAlphabetic(7); + String sraId2 = randomAlphabetic(7); + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + sraId1,sraId2,orgId1,orgId2); + //updateSra + Map orgUpdatedSraResponse = professionalReferenceDataClient + .updateOrgSra(organisationSraUpdateRequest,hmctsAdmin); + + LinkedHashMap responses = (LinkedHashMap)orgUpdatedSraResponse.get("response_body"); + assertThat(responses.get("status")).isEqualTo("success"); + assertThat(responses.get("message")).isEqualTo("All sraIds updated successfully"); + + verifyRetrievedOrg(orgId1,sraId1); + verifyRetrievedOrg(orgId2,sraId2); + + deleteCreatedTestOrganisations(orgId1, orgId2); + } + + @Test + void update_Sra_of_an_active_organisation_should_return_partial_success_if_any_fail() { + //create organisation + String orgId1 = getActiveOrganisationId(); + String orgId2 = getActiveOrganisationId(); + String sraId1 = randomAlphabetic(7); + + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + sraId1,"",orgId1,orgId2); + + Map orgUpdatedSraResponse = professionalReferenceDataClient + .updateOrgSra(organisationSraUpdateRequest,hmctsAdmin); + + LinkedHashMap responses = (LinkedHashMap)orgUpdatedSraResponse.get("response_body"); + assertThat(responses.get("status")).isEqualTo("partial_success"); + + //verify successfully saved + verifyRetrievedOrg(orgId1,sraId1); + + //verify error response + ArrayList responseList = (ArrayList)responses.get("sraIds"); + LinkedHashMap result = (LinkedHashMap)responseList.get(0); + assertThat(result.get("organisationId")).isEqualTo(orgId1); + assertThat(result.get("status")).isEqualTo("success"); + assertThat(result.get("statusCode")).isEqualTo(200); + assertThat(result.get("message")).isEqualTo("Organisation Attributes updated successfully"); + LinkedHashMap result1 = (LinkedHashMap)responseList.get(1); + assertThat(result1.get("organisationId")).isEqualTo(orgId1); + assertThat(result1.get("status")).isEqualTo("success"); + assertThat(result1.get("statusCode")).isEqualTo(200); + assertThat(result1.get("message")).isEqualTo("SraId updated successfully"); + LinkedHashMap result2 = (LinkedHashMap)responseList.get(2); + assertThat(result2.get("organisationId")).isEqualTo(orgId2); + assertThat(result2.get("status")).isEqualTo("failure"); + assertThat(result2.get("statusCode")).isEqualTo(400); + assertThat(result2.get("message")).isEqualTo("Organisation sraId is missing"); + + deleteCreatedTestOrganisations(orgId1, orgId2); + } + + @Test + void update_Sra_missing_in_all_requests_should_return_failure() { + //create organisation + String orgId1 = getActiveOrganisationId(); + String orgId2 = getActiveOrganisationId(); + + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + "",null,orgId1,orgId2); + + Map orgUpdatedSraResponse = professionalReferenceDataClient + .updateOrgSra(organisationSraUpdateRequest,hmctsAdmin); + + LinkedHashMap responses = (LinkedHashMap)orgUpdatedSraResponse.get("response_body"); + + assertThat(responses.get("status")).isEqualTo("failure"); + + ArrayList responseList = (ArrayList)responses.get("sraIds"); + LinkedHashMap firstResult = (LinkedHashMap)responseList.get(0); + LinkedHashMap secondResult = (LinkedHashMap)responseList.get(1); + assertThat(secondResult.get("organisationId")).isEqualTo(orgId2); + assertThat(secondResult.get("status")).isEqualTo("failure"); + assertThat(secondResult.get("statusCode")).isEqualTo(400); + assertThat(secondResult.get("message")).isEqualTo("Organisation sraId is missing"); + + assertThat(firstResult.get("organisationId")).isEqualTo(orgId1); + assertThat(firstResult.get("status")).isEqualTo("failure"); + assertThat(firstResult.get("statusCode")).isEqualTo(400); + assertThat(firstResult.get("message")).isEqualTo("Organisation sraId is missing"); + + deleteCreatedTestOrganisations(orgId1, orgId2); + } + + @Test + void orgId_missing_in_all_requests_should_return_failure() { + String sraId1 = randomAlphabetic(7); + String sraId2 = randomAlphabetic(7); + //create request to update organisation + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + sraId1,sraId2,"1235874596555555",null); + + Map orgUpdatedSraResponse = professionalReferenceDataClient + .updateOrgSra(organisationSraUpdateRequest,hmctsAdmin); + + LinkedHashMap responses = (LinkedHashMap)orgUpdatedSraResponse.get("response_body"); + + assertThat(responses.get("status")).isEqualTo("failure"); + + ArrayList responseList = (ArrayList)responses.get("sraIds"); + LinkedHashMap firstResult = (LinkedHashMap)responseList.get(0); + LinkedHashMap secondResult = (LinkedHashMap)responseList.get(1); + assertThat(secondResult.get("organisationId")).isEqualTo(""); + assertThat(secondResult.get("status")).isEqualTo("failure"); + assertThat(secondResult.get("statusCode")).isEqualTo(400); + assertThat(secondResult.get("message")).isEqualTo("Organisation id is missing"); + + assertThat(firstResult.get("organisationId")).isEqualTo("1235874596555555"); + assertThat(firstResult.get("status")).isEqualTo("failure"); + assertThat(firstResult.get("statusCode")).isEqualTo(400); + assertThat(firstResult.get("message")).isEqualTo( + "The given organisationIdentifier must be 7 Alphanumeric Characters"); + + } + + + + @Test + void update_Sra_with_exception_during_save_returns_500_partial_success() { + //create organisation + String orgId1 = getActiveOrganisationId(); + String orgId2 = getActiveOrganisationId(); + + String sraId2 = randomAlphabetic(7); + //create request to update organisation + String organisationSraViolatingDatabaseMaxLengthConstraint = RandomStringUtils.random(296); + OrganisationSraUpdateRequest organisationSraUpdateRequest = createOrganisationSraUpdateRequest( + organisationSraViolatingDatabaseMaxLengthConstraint,sraId2,orgId1,orgId2); + //create request to update organisation + + Map orgUpdatedSraResponse = professionalReferenceDataClient + .updateOrgSra(organisationSraUpdateRequest,hmctsAdmin); + LinkedHashMap responses = (LinkedHashMap)orgUpdatedSraResponse.get("response_body"); + + assertThat(responses.get("status")).isEqualTo("partial_success"); + + ArrayList responseList = (ArrayList)responses.get("sraIds"); + LinkedHashMap result = (LinkedHashMap)responseList.get(0); + assertThat(result.get("organisationId")).isEqualTo(orgId1); + assertThat(result.get("status")).isEqualTo("failure"); + assertThat(result.get("statusCode")).isEqualTo(500); + assertThat(result.get("message").toString().contains( + "Failed to update the sraId for the given organisationIdentifier. Reason :")); + + LinkedHashMap result1 = (LinkedHashMap)responseList.get(1); + assertThat(result1.get("organisationId")).isEqualTo(orgId2); + assertThat(result1.get("status")).isEqualTo("success"); + assertThat(result1.get("statusCode")).isEqualTo(200); + assertThat(result1.get("message")).isEqualTo("Organisation Attributes updated successfully"); + verifyRetrievedOrg(orgId2,sraId2); + + LinkedHashMap result2 = (LinkedHashMap)responseList.get(2); + assertThat(result2.get("organisationId")).isEqualTo(orgId2); + assertThat(result2.get("status")).isEqualTo("success"); + assertThat(result2.get("statusCode")).isEqualTo(200); + assertThat(result2.get("message")).isEqualTo("SraId updated successfully"); + verifyRetrievedOrg(orgId2,sraId2); + + deleteCreatedTestOrganisations(orgId1, orgId2); + + } + + private String getActiveOrganisationId() { + OrganisationCreationRequest organisationCreationRequest2 = someMinimalOrganisationRequest().build(); + String organisationIdentifier = createAndActivateOrganisationWithGivenRequest(organisationCreationRequest2); + updateOrganisation(organisationIdentifier, hmctsAdmin, "ACTIVE"); + + return organisationIdentifier; + } + + public OrganisationSraUpdateRequest createOrganisationSraUpdateRequest(String sra1, String sra2, String orgId1, + String orgId2) { + OrganisationSraUpdateRequest organisationSraUpdateRequest = new OrganisationSraUpdateRequest(); + List organisationSraUpdateDataList + = new ArrayList<>(); + OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateData1 = + new OrganisationSraUpdateRequest.OrganisationSraUpdateData(orgId1,sra1); + OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateData2 = + new OrganisationSraUpdateRequest.OrganisationSraUpdateData(orgId2,sra2); + organisationSraUpdateDataList.add(organisationSraUpdateData1); + organisationSraUpdateDataList.add(organisationSraUpdateData2); + organisationSraUpdateRequest.setOrganisationSraUpdateDataList(organisationSraUpdateDataList); + + return organisationSraUpdateRequest; + } + + public void verifyRetrievedOrg(String orgId,String sraId) { + + Map responseBody = + professionalReferenceDataClient.retrieveSingleOrganisationForV2Api(orgId, hmctsAdmin); + + final Object Sra = responseBody.get("sraId"); + assertThat(Sra.toString()).isEqualTo(sraId); + List organisationAttributes = (List)responseBody.get("orgAttributes"); + assertThat(organisationAttributes).isNotNull(); + + LinkedHashMap attr = (LinkedHashMap)organisationAttributes.get(0); + assertThat(attr).isNotNull(); + assertThat(attr.get("key")).isEqualTo("regulators-0"); + assertThat(attr.get("value").toString()).isEqualTo( + "{\"regulatorType\":\"Solicitor Regulation Authority " + + "(SRA)\",\"organisationRegistrationNumber\":\"" + sraId + "\"}"); + + + + LocalDateTime updatedDate = LocalDateTime.parse(responseBody.get("lastUpdated").toString()); + assertThat(updatedDate.toLocalDate()).isEqualTo(LocalDate.now()); + } + + public void deleteCreatedTestOrganisations(String orgId1, String orgId2) { + professionalReferenceDataClient.deleteOrganisation(hmctsAdmin,orgId1); + professionalReferenceDataClient.deleteOrganisation(hmctsAdmin,orgId2); + } + + + +} diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/professionalapi/util/ProfessionalReferenceDataClient.java b/src/integrationTest/java/uk/gov/hmcts/reform/professionalapi/util/ProfessionalReferenceDataClient.java index cc701b95c8..577d2f27e4 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/professionalapi/util/ProfessionalReferenceDataClient.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/professionalapi/util/ProfessionalReferenceDataClient.java @@ -27,6 +27,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationByProfileIdsRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationOtherOrgsCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.PbaRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UpdatePbaRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UsersInOrganisationsByOrganisationIdentifiersRequest; @@ -1027,9 +1028,46 @@ public Map findOrganisationsByUserId(String userId, String role) return getResponse(responseEntity); } + public ResponseEntity updateOrgSraException( + OrganisationSraUpdateRequest organisationSraUpdateRequest, String role) { + + ResponseEntity responseEntity = null; + String urlPath = "http://localhost:" + prdApiPort + APP_INT_V2_BASE_PATH + "/sra"; + + HttpEntity requestEntity = new HttpEntity<>(organisationSraUpdateRequest, + getMultipleAuthHeaders(role)); + responseEntity = restTemplate.exchange(urlPath, HttpMethod.PUT, requestEntity, Map.class); + + return responseEntity; + } + + public Map updateOrgSra( + OrganisationSraUpdateRequest organisationSraUpdateRequest, String role) { + + + ResponseEntity responseEntity = null; + String urlPath = "http://localhost:" + prdApiPort + APP_INT_V2_BASE_PATH + "/sra"; + try { + HttpEntity requestEntity = new HttpEntity<>(organisationSraUpdateRequest, + getMultipleAuthHeaders(role)); + responseEntity = restTemplate.exchange(urlPath, HttpMethod.PUT, requestEntity, Map.class); + + } catch (RestClientResponseException ex) { + HashMap statusAndBody = new HashMap<>(2); + statusAndBody.put("http_status",String.valueOf(ex.getRawStatusCode())); + statusAndBody.put("response_body", ex.getResponseBodyAsString()); + return statusAndBody; + } + Map organisationResponse = new HashMap<>(); + organisationResponse.put("http_status", responseEntity.getStatusCodeValue()); + organisationResponse.put("response_body", responseEntity.getBody()); + return organisationResponse; + } + + public Map retrieveUsersInOrganisationsByOrganisationIdentifiers( - UsersInOrganisationsByOrganisationIdentifiersRequest request, Integer pageSize, - UUID searchAfterUser, UUID searchAfterOrganisation) { + UsersInOrganisationsByOrganisationIdentifiersRequest request, Integer pageSize, + UUID searchAfterUser, UUID searchAfterOrganisation) { StringBuilder sb = new StringBuilder(baseV2IntUrl) .append("/users?"); if (pageSize != null) { @@ -1043,5 +1081,6 @@ public Map retrieveUsersInOrganisationsByOrganisationIdentifiers } String uriPath = sb.toString(); return postRequest(uriPath, request, null, null); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalController.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalController.java index 0eb4d8b934..b682708cd8 100644 --- a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalController.java +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalController.java @@ -697,6 +697,7 @@ public ResponseEntity retrieveOrganisationByUserId( return organisationService.retrieveOrganisationByUserId(userId); } + @Operation( summary = "Retrieves Organisations by Organisation Profile IDs", description = "**Bearer token not required to access API. Only a valid s2s token**", @@ -740,9 +741,9 @@ public ResponseEntity retrieveOrganisationsByProfileIds( MultipleOrganisationsResponse response = organisationService.retrieveOrganisationsByProfileIdsWithPageable( organisationByProfileIdsRequest.getOrganisationProfileIds(), pageSize, searchAfter); - return ResponseEntity .status(HttpStatus.OK) .body(response); } + } diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2.java index 63d128b179..2bad3e8563 100644 --- a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2.java +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2.java @@ -11,6 +11,7 @@ import jakarta.validation.constraints.Pattern; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -28,10 +29,17 @@ import org.springframework.web.bind.annotation.RestController; import uk.gov.hmcts.reform.professionalapi.configuration.resolver.UserId; import uk.gov.hmcts.reform.professionalapi.controller.SuperController; +import uk.gov.hmcts.reform.professionalapi.controller.request.InvalidRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationOtherOrgsCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationPbaResponseV2; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationsDetailResponseV2; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateOrgSraResponse; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateSraResponse; + +import java.util.ArrayList; +import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import static uk.gov.hmcts.reform.professionalapi.controller.constants.ProfessionalApiConstants.ORGANISATION_IDENTIFIER_FORMAT_REGEX; @@ -240,4 +248,84 @@ public ResponseEntity updatesOrganisation( return updateOrganisationById(organisationCreationRequest, organisationIdentifier); } + + + @Operation( + summary = "Updates an Organisation's sraId", + description = "**IDAM Roles to access API** :
prd-admin", + security = { + @SecurityRequirement(name = "ServiceAuthorization"), + @SecurityRequirement(name = "Authorization") + }) + + @ApiResponse( + responseCode = "200", + description = "Organisation sraId has been updated", + content = @Content(schema = @Schema(implementation = String.class)) + ) + @ApiResponse( + responseCode = "400", + description = "If Organisation request sent with null/invalid values for mandatory fields", + content = @Content + ) + @ApiResponse( + responseCode = "403", + description = "Forbidden Error: Access denied", + content = @Content + ) + @ApiResponse( + responseCode = "404", + description = "No Organisation found with the given ID", + content = @Content + ) + @PutMapping( + value = "/sra", + consumes = APPLICATION_JSON_VALUE, + produces = APPLICATION_JSON_VALUE + ) + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @Secured({"prd-admin"}) + public UpdateSraResponse updateOrganisationSra( + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "organisationSraUpdateRequest") + @Validated @NotNull @RequestBody OrganisationSraUpdateRequest organisationSraUpdateRequest) { + + //check if request list is empty + List organisationSraUpdateDataList = + organisationSraUpdateRequest.getOrganisationSraUpdateDataList(); + + if (organisationSraUpdateDataList.isEmpty()) { + throw new InvalidRequest("Request is empty"); + } + + final List updateOrgSraResponsesList = new ArrayList<>(); + + //iterate over each name/orgid pair and update values + organisationSraUpdateDataList.forEach(organisationSraUpdateData -> { + String orgId = organisationSraUpdateData.getOrganisationId(); + String sraId = organisationSraUpdateData.getSraId(); + if (StringUtils.isEmpty(orgId)) { + updateOrgSraResponsesList.add(new UpdateOrgSraResponse("","failure", + HttpStatus.BAD_REQUEST.value(),"Organisation id is missing")); + } else { + var existingOrganisation = organisationService.getOrganisationByOrgIdentifier(orgId); + organisationIdentifierValidatorImpl.validateOrganisationId(orgId, + updateOrgSraResponsesList, existingOrganisation); + if (!updateOrgSraResponsesList.stream().filter( + updateOrg -> orgId.equalsIgnoreCase(updateOrg.getOrganisationId())).findAny().isPresent()) { + if (StringUtils.isEmpty(sraId)) { + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(orgId,"failure", + HttpStatus.BAD_REQUEST.value(),"Organisation sraId is missing")); + } else { + organisationService.updateOrganisationSra(existingOrganisation, + organisationSraUpdateData, updateOrgSraResponsesList); + } + } + } + }); + + return organisationService.generateUpdateSraResponse(updateOrgSraResponsesList); + + } + } diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/OrganisationCreationRequest.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/OrganisationCreationRequest.java index 70f468d6b4..2c75dc6253 100644 --- a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/OrganisationCreationRequest.java +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/OrganisationCreationRequest.java @@ -16,13 +16,13 @@ public class OrganisationCreationRequest { @NotNull - private final String name; + private String name; private String status; private String statusMessage; - private final String sraId; + private String sraId; private String sraRegulated; diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/OrganisationSraUpdateRequest.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/OrganisationSraUpdateRequest.java new file mode 100644 index 0000000000..985f1ed952 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/OrganisationSraUpdateRequest.java @@ -0,0 +1,45 @@ +package uk.gov.hmcts.reform.professionalapi.controller.request; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + + +@Getter +@Setter +public class OrganisationSraUpdateRequest { + + + @JsonProperty(value = "sraIds") + private List organisationSraUpdateDataList; + + public OrganisationSraUpdateRequest() { + + } + + @Getter + @Setter + public static class OrganisationSraUpdateData { + + @Valid + @NotNull(message = "SRA Id is required.") + private String sraId; + + @Valid + @NotNull(message = " organisation Id is required.") + private String organisationId; + + @JsonCreator + public OrganisationSraUpdateData( + @JsonProperty("organisationId") String organisationId, + @JsonProperty("sraId") String sraId) { + this.organisationId = organisationId; + this.sraId = sraId; + } + } +} \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/validator/impl/OrganisationIdentifierValidatorImpl.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/validator/impl/OrganisationIdentifierValidatorImpl.java index f46cb19133..1f6b1086c8 100644 --- a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/validator/impl/OrganisationIdentifierValidatorImpl.java +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/request/validator/impl/OrganisationIdentifierValidatorImpl.java @@ -10,6 +10,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.advice.ResourceNotFoundException; import uk.gov.hmcts.reform.professionalapi.controller.request.InvalidRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.validator.OrganisationIdentifierValidator; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateOrgSraResponse; import uk.gov.hmcts.reform.professionalapi.domain.Organisation; import uk.gov.hmcts.reform.professionalapi.domain.OrganisationStatus; import uk.gov.hmcts.reform.professionalapi.service.OrganisationService; @@ -159,4 +160,22 @@ private boolean isSinceInValidFormat(String since) { return true; } + + public List validateOrganisationId(String orgId,List + updateOrgSraResponsesList,Organisation existingOrganisation) { + + if (!orgId.matches("^[A-Z0-9]{7}$")) { + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(orgId, "failure", + HttpStatus.BAD_REQUEST.value(), + "The given organisationIdentifier must be 7 Alphanumeric Characters")); + } else if (Optional.ofNullable(existingOrganisation).isEmpty()) { + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(orgId, "failure", + HttpStatus.BAD_REQUEST.value(), NO_ORG_FOUND_FOR_GIVEN_ID)); + } else if (OrganisationStatus.ACTIVE != existingOrganisation.getStatus()) { + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(orgId, "failure", + HttpStatus.BAD_REQUEST.value(), ORG_NOT_ACTIVE)); + } + + return updateOrgSraResponsesList; + } } diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/response/UpdateOrgSraResponse.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/response/UpdateOrgSraResponse.java new file mode 100644 index 0000000000..e8d19c1ca9 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/response/UpdateOrgSraResponse.java @@ -0,0 +1,20 @@ +package uk.gov.hmcts.reform.professionalapi.controller.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class UpdateOrgSraResponse { + + @JsonProperty + private String organisationId; + @JsonProperty + private String status; + @JsonProperty + private int statusCode; + @JsonProperty + private String message; + +} \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/response/UpdateSraResponse.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/response/UpdateSraResponse.java new file mode 100644 index 0000000000..1423bb93e3 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/controller/response/UpdateSraResponse.java @@ -0,0 +1,30 @@ +package uk.gov.hmcts.reform.professionalapi.controller.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL; + +@Getter +@JsonPropertyOrder({"status"}) +@AllArgsConstructor +public class UpdateSraResponse { + + @JsonInclude(NON_NULL) + @JsonProperty("status") + private String status; + + @JsonInclude(NON_NULL) + @JsonProperty("message") + private String message; + + @JsonInclude(NON_NULL) + @JsonProperty(value = "sraIds") + private List updateOrgSraResponse; + +} \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/service/OrganisationService.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/service/OrganisationService.java index 93992861a1..74ee219118 100644 --- a/src/main/java/uk/gov/hmcts/reform/professionalapi/service/OrganisationService.java +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/service/OrganisationService.java @@ -5,6 +5,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.request.ContactInformationCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrgAttributeRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.PbaRequest; import uk.gov.hmcts.reform.professionalapi.controller.response.BulkCustomerOrganisationsDetailResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.DeleteOrganisationResponse; @@ -14,6 +15,8 @@ import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationsDetailResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationsDetailResponseV2; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateOrgSraResponse; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateSraResponse; import uk.gov.hmcts.reform.professionalapi.domain.Organisation; import uk.gov.hmcts.reform.professionalapi.domain.OrganisationStatus; import uk.gov.hmcts.reform.professionalapi.domain.PaymentAccount; @@ -46,8 +49,9 @@ OrganisationsDetailResponseV2 findByOrganisationStatusForV2Api(LocalDateTime for OrganisationEntityResponse retrieveOrganisation(String organisationIdentifier, boolean isPendingPbaRequired); + OrganisationResponse updateOrganisation(OrganisationCreationRequest organisationCreationRequest, - String organisationIdentifier,Boolean isOrgApprovalRequest); + String organisationIdentifier, Boolean isOrgApprovalRequest); Organisation getOrganisationByOrgIdentifier(String organisationIdentifier); @@ -81,4 +85,11 @@ void addContactInformationsToOrganisation( ResponseEntity retrieveOrganisationByUserId(String userId); + + UpdateSraResponse generateUpdateSraResponse(List updateOrgNameResponse); + + List updateOrganisationSra( + Organisation existingOrganisation, OrganisationSraUpdateRequest.OrganisationSraUpdateData + organisationNameUpdateData,List updateOrgNameResponsesList); + } diff --git a/src/main/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImpl.java b/src/main/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImpl.java index 3e56cb744f..28a611f444 100644 --- a/src/main/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImpl.java +++ b/src/main/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImpl.java @@ -27,6 +27,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.request.OrgAttributeRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationOtherOrgsCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.PbaRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.RetrieveUserProfilesRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UserCreationRequest; @@ -42,6 +43,8 @@ import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationsDetailResponseV2; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationsWithPbaStatusResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.SuperUserResponse; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateOrgSraResponse; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateSraResponse; import uk.gov.hmcts.reform.professionalapi.domain.AddPbaResponse; import uk.gov.hmcts.reform.professionalapi.domain.BulkCustomerDetails; import uk.gov.hmcts.reform.professionalapi.domain.ContactInformation; @@ -87,10 +90,12 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.Stream; import static java.lang.Boolean.TRUE; +import static java.util.stream.Collectors.toList; import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; import static org.springframework.util.CollectionUtils.isEmpty; import static uk.gov.hmcts.reform.professionalapi.controller.constants.ProfessionalApiConstants.ERROR_MSG_PARTIAL_SUCCESS; @@ -148,6 +153,9 @@ public class OrganisationServiceImpl implements OrganisationService { @Value("${loggingComponentName}") private String loggingComponentName; + + + @Override @Transactional public OrganisationResponse createOrganisationFrom( @@ -180,7 +188,6 @@ public OrganisationResponse createOrganisationFrom( if (organisationCreationRequest instanceof OrganisationOtherOrgsCreationRequest orgCreationRequestV2) { addAttributeToOrganisation(orgCreationRequestV2.getOrgAttributes(), organisation); } - return new OrganisationResponse(organisation); } @@ -879,7 +886,7 @@ public ResponseEntity getOrganisationsByPbaStatus(String pbaStatus) { LinkedHashMap> orgPbaMap = organisations .stream() .collect(Collectors.groupingBy( - Organisation::getOrganisationIdentifier, LinkedHashMap::new, Collectors.toList())); + Organisation::getOrganisationIdentifier, LinkedHashMap::new, toList())); var organisationsWithPbaStatusResponses = new ArrayList(); @@ -1056,5 +1063,85 @@ private boolean getMoreAvailable(Page pageableOrganisations) { return !pageableOrganisations.isLast(); } + public OrgAttribute saveOrganisationAttributes(Organisation existingOrganisation, + OrganisationSraUpdateRequest.OrganisationSraUpdateData + organisationSraUpdateData) { + final String attributeKey = "regulators-0"; + final String attributeValue = "{\"regulatorType\":\"Solicitor Regulation Authority (SRA)\"," + + "\"organisationRegistrationNumber\":\"" + organisationSraUpdateData.getSraId() + "\"}"; + + existingOrganisation.setSraId( + RefDataUtil.removeEmptySpaces(organisationSraUpdateData.getSraId())); + OrgAttribute attribute = new OrgAttribute(); + attribute.setKey(RefDataUtil.removeEmptySpaces(attributeKey)); + attribute.setValue(RefDataUtil + .removeEmptySpaces(attributeValue)); + attribute.setOrganisation(existingOrganisation); + + OrgAttribute savedAttribute = orgAttributeRepository.save(attribute); + List attributes = new ArrayList<>(); + attributes.add(savedAttribute); + existingOrganisation.setOrgAttributes(attributes); + + return savedAttribute; + } + + @Override + public List updateOrganisationSra( + Organisation existingOrganisation, OrganisationSraUpdateRequest.OrganisationSraUpdateData + organisationSraUpdateData, List updateOrgSraResponsesList) { + + existingOrganisation.setSraId(RefDataUtil.removeEmptySpaces(organisationSraUpdateData.getSraId())); + existingOrganisation.setLastUpdated(LocalDateTime.now()); + + + try { + OrgAttribute savedAttribute = saveOrganisationAttributes( + existingOrganisation, organisationSraUpdateData); + if (savedAttribute == null) { + log.error("{}:: error saving Organisation Attribute::", loggingComponentName); + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(existingOrganisation.getOrganisationIdentifier(), + "failure", HttpStatus.INTERNAL_SERVER_ERROR.value(), + "Failed to update Organisation Attributes for the given organisationIdentifier. Reason : " + )); + } else { + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(existingOrganisation.getOrganisationIdentifier(), + "success", HttpStatus.OK.value(), "Organisation Attributes updated successfully")); + + organisationRepository.save(existingOrganisation); + + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(existingOrganisation.getOrganisationIdentifier(), + "success", HttpStatus.OK.value(), "SraId updated successfully")); + } + } catch (Exception ex) { + updateOrgSraResponsesList.add(new UpdateOrgSraResponse(existingOrganisation.getOrganisationIdentifier(), + "failure", HttpStatus.INTERNAL_SERVER_ERROR.value(), + "Failed to update the sraId for the given organisationIdentifier. Reason : " + + ex.getMessage())); + } + return updateOrgSraResponsesList; + } + + + @Override + public UpdateSraResponse generateUpdateSraResponse(List updateOrgSraResponses) { + AtomicReference message = null; + boolean result = updateOrgSraResponses.stream().anyMatch(updateOrgNameResponse -> + updateOrgNameResponse.getStatusCode() != 200); + List responseList = updateOrgSraResponses.stream().filter(updateOrgNameResponse -> + updateOrgNameResponse.getStatusCode() == 400).collect(toList()); + + if (updateOrgSraResponses.size() == responseList.size()) { + return new UpdateSraResponse("failure",null,updateOrgSraResponses); + } else if (result) { + return new UpdateSraResponse("partial_success",null,updateOrgSraResponses); + } else { + return new UpdateSraResponse("success","All sraIds updated successfully", + null); + } + } + + + } diff --git a/src/test/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2Test.java b/src/test/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2Test.java index afe4bfc635..b772285e4c 100644 --- a/src/test/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2Test.java +++ b/src/test/java/uk/gov/hmcts/reform/professionalapi/controller/internal/OrganisationInternalControllerV2Test.java @@ -20,6 +20,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.request.NewUserCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrgAttributeRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationOtherOrgsCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UserCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UserProfileCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.validator.OrganisationCreationRequestValidator; @@ -27,6 +28,8 @@ import uk.gov.hmcts.reform.professionalapi.controller.request.validator.impl.OrganisationIdentifierValidatorImpl; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationEntityResponseV2; import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationsDetailResponseV2; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateOrgSraResponse; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateSraResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.UserProfileCreationResponse; import uk.gov.hmcts.reform.professionalapi.domain.Organisation; import uk.gov.hmcts.reform.professionalapi.domain.OrganisationStatus; @@ -47,6 +50,7 @@ import java.util.UUID; import static java.util.Collections.singletonList; +import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; @@ -88,6 +92,7 @@ class OrganisationInternalControllerV2Test { private List prdEnumList; + private OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateRequest; @InjectMocks private OrganisationInternalControllerV2 organisationInternalController; @@ -128,7 +133,6 @@ void setUp() throws Exception { prdEnumServiceMock = mock(PrdEnumServiceImpl.class); userProfileFeignClient = mock(UserProfileFeignClient.class); organisation.setOrganisationIdentifier("AK57L4T"); - organisationOtherOrgsCreationRequest = new OrganisationOtherOrgsCreationRequest("test", "PENDING", "Status message", "sra-id", "false", "number02", "company-url", @@ -335,4 +339,63 @@ void testUpdateOrganisation()throws JsonProcessingException { verify(professionalUserServiceMock, times(1)).findProfessionalUserById(any()); } + @Test + void testUpdateOrgSraId() { + String newSraId1 = randomAlphabetic(7); + String newSraId2 = randomAlphabetic(7); + Organisation organisation1 = new Organisation("Org-Name-1", OrganisationStatus.ACTIVE, "sra-id", + "companyN", false, "www.org.com"); + Organisation organisation2 = new Organisation("Org-Name-2", OrganisationStatus.ACTIVE, "sra-id-0", + "companyN", false, "www.org.com"); + + OrganisationSraUpdateRequest organisationNameUpdateRequest = new OrganisationSraUpdateRequest(); + List organisationSraUpdateDataList + = new ArrayList<>(); + OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateData1 = + new OrganisationSraUpdateRequest.OrganisationSraUpdateData( + organisation1.getOrganisationIdentifier(),newSraId1); + OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateData2 = + new OrganisationSraUpdateRequest.OrganisationSraUpdateData( + organisation2.getOrganisationIdentifier(),newSraId2); + organisationSraUpdateDataList.add(organisationSraUpdateData1); + organisationSraUpdateDataList.add(organisationSraUpdateData2); + organisationNameUpdateRequest.setOrganisationSraUpdateDataList(organisationSraUpdateDataList); + + final List updateOrgSraResponsesList = new ArrayList<>(); + + Organisation organisationMock = mock(Organisation.class); + when(organisationServiceMock.getOrganisationByOrgIdentifier(any())) + .thenReturn(organisationMock); + when(organisationIdentifierValidatorImpl.validateOrganisationId(any(), + any(),any())).thenReturn(updateOrgSraResponsesList); + + when(organisationServiceMock.updateOrganisationSra(any(),any(),any())) + .thenReturn(createResponse(updateOrgSraResponsesList,organisation1.getOrganisationIdentifier())); + UpdateSraResponse updateNameResponse = new UpdateSraResponse("success", + "All names updated successfully",null); + when(organisationServiceMock. generateUpdateSraResponse(any())) + .thenReturn(updateNameResponse); + UpdateSraResponse response = organisationInternalController.updateOrganisationSra( + organisationNameUpdateRequest); + assertThat(response).isNotNull(); + assertThat(response.getStatus()).isEqualTo("success"); + assertThat(response.getMessage()).isEqualTo("All names updated successfully"); + + verify(organisationServiceMock, times(2)).updateOrganisationSra( + any(), any(),any()); + verify(organisationServiceMock, times(2)).getOrganisationByOrgIdentifier(any()); + + } + + + private List createResponse(List responses,String orgId) { + + responses.add(new UpdateOrgSraResponse(orgId, + "success", HttpStatus.OK.value(),"Name updated successfully")); + + return responses; + } + + + } diff --git a/src/test/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImplTest.java b/src/test/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImplTest.java index 4d0a951e6a..e23ff23112 100644 --- a/src/test/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImplTest.java +++ b/src/test/java/uk/gov/hmcts/reform/professionalapi/service/impl/OrganisationServiceImplTest.java @@ -33,6 +33,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.request.OrgAttributeRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationOtherOrgsCreationRequest; +import uk.gov.hmcts.reform.professionalapi.controller.request.OrganisationSraUpdateRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.PbaRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.UserCreationRequest; import uk.gov.hmcts.reform.professionalapi.controller.request.validator.PaymentAccountValidator; @@ -49,6 +50,7 @@ import uk.gov.hmcts.reform.professionalapi.controller.response.OrganisationsWithPbaStatusResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.ProfessionalUsersEntityResponse; import uk.gov.hmcts.reform.professionalapi.controller.response.ProfessionalUsersResponse; +import uk.gov.hmcts.reform.professionalapi.controller.response.UpdateOrgSraResponse; import uk.gov.hmcts.reform.professionalapi.domain.AddPbaResponse; import uk.gov.hmcts.reform.professionalapi.domain.BulkCustomerDetails; import uk.gov.hmcts.reform.professionalapi.domain.ContactInformation; @@ -97,6 +99,7 @@ import java.util.UUID; import static java.util.Arrays.asList; +import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -181,6 +184,8 @@ class OrganisationServiceImplTest { private ContactInformationCreationRequest contactInformationCreationRequest; private OrganisationCreationRequest organisationCreationRequest; + private OrganisationSraUpdateRequest organisationSraUpdateRequest; + private OrganisationOtherOrgsCreationRequest organisationOtherOrgsCreationRequest; private List organisations; @@ -1931,6 +1936,41 @@ void test_updateStatusAndMessage() { verify(paymentAccountMock, times(1)).setStatusMessage("statusMessage"); } + + @Test + void test_updateOrganisationSra() { + String newSraId = randomAlphabetic(7); + Organisation organisation1 = new Organisation("Org-Name-1", OrganisationStatus.ACTIVE, "sra-id", + "companyN", false, "www.org.com"); + OrganisationSraUpdateRequest.OrganisationSraUpdateData organisationSraUpdateData1 = + new OrganisationSraUpdateRequest.OrganisationSraUpdateData( + organisation1.getOrganisationIdentifier(),newSraId); + final List updateOrgNameResponsesList = new ArrayList<>(); + organisation1.setName(RefDataUtil.removeEmptySpaces(organisationSraUpdateData1.getSraId())); + organisation1.setLastUpdated(LocalDateTime.now()); + + OrgAttribute orgAttributeMock = mock(OrgAttribute.class); + + when(orgAttributeRepository.save(any(OrgAttribute.class))).thenReturn(orgAttributeMock); + + Organisation organisationMock = mock(Organisation.class); + when(organisationRepository.save(organisation1)).thenReturn(organisationMock); + + List updateNameResponse = sut.updateOrganisationSra(organisation1, + organisationSraUpdateData1,updateOrgNameResponsesList); + + assertNotNull(updateNameResponse); + + verify(organisationRepository, times(1)) + .save(organisation1); + verify(orgAttributeRepository, times(1)) + .save(any(OrgAttribute.class)); + + + } + + + @Test void test_AllAttributesAddedToSuperUser() { prdEnums.add(new PrdEnum(new PrdEnumId(0, "SIDAM_ROLE"),