diff --git a/app/src/main/resources/swagger/api-docs.json b/app/src/main/resources/swagger/api-docs.json index ce10b7a0..8164c044 100644 --- a/app/src/main/resources/swagger/api-docs.json +++ b/app/src/main/resources/swagger/api-docs.json @@ -1285,6 +1285,15 @@ "summary" : "verifyManager", "description" : "The service allows to verify the legal representative on external registries and retrieve the company name", "operationId" : "verifyManagerUsingPOST", + "parameters" : [ { + "name" : "name", + "in" : "query", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string" + } + } ], "requestBody" : { "content" : { "application/json" : { @@ -4751,10 +4760,6 @@ "companyTaxCode" : { "type" : "string", "description" : "Institution's taxCode" - }, - "userTaxCode" : { - "type" : "string", - "description" : "User's fiscal code" } } }, diff --git a/core/src/main/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImpl.java b/core/src/main/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImpl.java index b4907015..34d073ec 100644 --- a/core/src/main/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImpl.java +++ b/core/src/main/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImpl.java @@ -32,6 +32,7 @@ import it.pagopa.selfcare.onboarding.core.exception.UpdateNotAllowedException; import it.pagopa.selfcare.onboarding.core.mapper.InstitutionInfoMapper; import it.pagopa.selfcare.onboarding.core.strategy.OnboardingValidationStrategy; +import it.pagopa.selfcare.onboarding.core.utils.PgManagerVerifier; import it.pagopa.selfcare.product.entity.Product; import it.pagopa.selfcare.product.entity.ProductRoleInfo; import it.pagopa.selfcare.product.entity.ProductStatus; @@ -82,6 +83,7 @@ class InstitutionServiceImpl implements InstitutionService { private final OnboardingValidationStrategy onboardingValidationStrategy; private final PartyRegistryProxyConnector partyRegistryProxyConnector; private final InstitutionInfoMapper institutionMapper; + private final PgManagerVerifier pgManagerVerifier; @Autowired InstitutionServiceImpl(OnboardingMsConnector onboardingMsConnector, PartyConnector partyConnector, ProductsConnector productsConnector, @@ -89,7 +91,8 @@ class InstitutionServiceImpl implements InstitutionService { OnboardingFunctionsConnector onboardingFunctionsConnector, PartyRegistryProxyConnector partyRegistryProxyConnector, OnboardingValidationStrategy onboardingValidationStrategy, - InstitutionInfoMapper institutionMapper + InstitutionInfoMapper institutionMapper, + PgManagerVerifier pgManagerVerifier ) { this.onboardingMsConnector = onboardingMsConnector; this.partyConnector = partyConnector; @@ -99,6 +102,7 @@ class InstitutionServiceImpl implements InstitutionService { this.userConnector = userConnector; this.onboardingValidationStrategy = onboardingValidationStrategy; this.institutionMapper = institutionMapper; + this.pgManagerVerifier = pgManagerVerifier; } @@ -628,29 +632,12 @@ public void onboardingUsersPgFromIcAndAde(OnboardingData onboardingData) { public ManagerVerification verifyManager(String userTaxCode, String institutionTaxCode) { log.trace("verifyManager start"); - log.debug(LogUtils.CONFIDENTIAL_MARKER, "Checking if user with taxCode {} is manager of institution with taxCode {} on INFOCAMERE", Encode.forJava(userTaxCode), Encode.forJava(institutionTaxCode)); - InstitutionInfoIC institutionInfoIC = partyRegistryProxyConnector.getInstitutionsByUserFiscalCode(userTaxCode); - if (Objects.nonNull(institutionInfoIC) && Objects.nonNull(institutionInfoIC.getBusinesses())){ - for (BusinessInfoIC business : institutionInfoIC.getBusinesses()) { - if (institutionTaxCode.equals(business.getBusinessTaxId())) { - log.debug("User found as manager in INFOCAMERE for business with name = {}", business.getBusinessName()); - return new ManagerVerification(Origin.INFOCAMERE.getValue(), business.getBusinessName()); - } - } + ManagerVerification result = pgManagerVerifier.doVerify(userTaxCode, institutionTaxCode); + if(!result.isVerified()) { + throw new ResourceNotFoundException(String.format("User with userTaxCode %s is not the legal representative of the institution", userTaxCode)); } - try { - log.debug(LogUtils.CONFIDENTIAL_MARKER, "Checking if user with taxCode {} is manager of institution with taxCode {} on ADE", Encode.forJava(userTaxCode), Encode.forJava(institutionTaxCode)); - MatchInfoResult matchInfoResult = partyRegistryProxyConnector.matchInstitutionAndUser(institutionTaxCode, userTaxCode); - if (Objects.nonNull(matchInfoResult) && matchInfoResult.isVerificationResult()) { - log.debug("User found as manager in ADE, response = {}", matchInfoResult); - return new ManagerVerification(Origin.ADE.getValue(), null); - } - } catch (InvalidRequestException e) { - throw new ResourceNotFoundException(String.format("User with taxCode %s is not the legal representative of the institution", userTaxCode)); - } - - throw new ResourceNotFoundException(String.format("User with userTaxCode %s is not the legal representative of the institution", userTaxCode)); + return result; } @Override diff --git a/core/src/test/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImplTest.java b/core/src/test/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImplTest.java index 4ec65897..893950cb 100644 --- a/core/src/test/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImplTest.java +++ b/core/src/test/java/it/pagopa/selfcare/onboarding/core/InstitutionServiceImplTest.java @@ -25,6 +25,7 @@ import it.pagopa.selfcare.onboarding.core.mapper.InstitutionInfoMapper; import it.pagopa.selfcare.onboarding.core.mapper.InstitutionInfoMapperImpl; import it.pagopa.selfcare.onboarding.core.strategy.OnboardingValidationStrategy; +import it.pagopa.selfcare.onboarding.core.utils.PgManagerVerifier; import it.pagopa.selfcare.product.entity.Product; import it.pagopa.selfcare.product.entity.ProductRole; import it.pagopa.selfcare.product.entity.ProductRoleInfo; @@ -84,6 +85,9 @@ class InstitutionServiceImplTest { @Mock private OnboardingValidationStrategy onboardingValidationStrategyMock; + @Mock + private PgManagerVerifier pgManagerVerifierMock; + @Captor private ArgumentCaptor onboardingDataCaptor; @@ -1004,124 +1008,39 @@ void shouldOnboardingProductInstitutionIpaUO() { } @Test - void verifyManager_userIsManagerOnInfocamere() { + void verifyManager_shouldReturnManagerVerificationWhenVerified() { // given - String taxCode = "validTaxCode"; - String companyTaxCode = "validCompanyTaxCode"; - InstitutionInfoIC institutionInfoIC = new InstitutionInfoIC(); - BusinessInfoIC businessInfoIC = new BusinessInfoIC(); - businessInfoIC.setBusinessTaxId("otherCompanyTaxCode"); - businessInfoIC.setBusinessName("CompanyName 2"); - BusinessInfoIC businessInfoIC2 = new BusinessInfoIC(); - businessInfoIC2.setBusinessTaxId(companyTaxCode); - businessInfoIC2.setBusinessName("CompanyName 1"); - institutionInfoIC.setBusinesses(List.of(businessInfoIC, businessInfoIC2)); - when(partyRegistryProxyConnectorMock.getInstitutionsByUserFiscalCode(taxCode)).thenReturn(institutionInfoIC); + String userTaxCode = "userTaxCode"; + String institutionTaxCode = "institutionTaxCode"; + ManagerVerification expectedVerification = new ManagerVerification(); + expectedVerification.setVerified(true); + when(pgManagerVerifierMock.doVerify(userTaxCode, institutionTaxCode)).thenReturn(expectedVerification); // when - ManagerVerification result = institutionService.verifyManager(taxCode, companyTaxCode); + ManagerVerification result = institutionService.verifyManager(userTaxCode, institutionTaxCode); // then assertNotNull(result); - assertEquals(Origin.INFOCAMERE.getValue(), result.getOrigin()); - assertEquals("CompanyName 1", result.getCompanyName()); + assertTrue(result.isVerified()); + verify(pgManagerVerifierMock, times(1)).doVerify(userTaxCode, institutionTaxCode); } @Test - void verifyManager_userIsManagerOnAde() { + void verifyManager_shouldThrowResourceNotFoundExceptionWhenNotVerified() { // given - String taxCode = "validTaxCode"; - String companyTaxCode = "validCompanyTaxCode"; - InstitutionInfoIC institutionInfoIC = new InstitutionInfoIC(); - institutionInfoIC.setBusinesses(Collections.emptyList()); - when(partyRegistryProxyConnectorMock.getInstitutionsByUserFiscalCode(taxCode)).thenReturn(institutionInfoIC); - MatchInfoResult matchInfoResult = new MatchInfoResult(); - matchInfoResult.setVerificationResult(true); - when(partyRegistryProxyConnectorMock.matchInstitutionAndUser(companyTaxCode, taxCode)).thenReturn(matchInfoResult); + String userTaxCode = "userTaxCode"; + String institutionTaxCode = "institutionTaxCode"; + ManagerVerification expectedVerification = new ManagerVerification(); + expectedVerification.setVerified(false); + when(pgManagerVerifierMock.doVerify(userTaxCode, institutionTaxCode)).thenReturn(expectedVerification); // when - ManagerVerification result = institutionService.verifyManager(taxCode, companyTaxCode); - - // then - assertNotNull(result); - assertEquals(Origin.ADE.getValue(), result.getOrigin()); - } - - @Test - void verifyManager_userAdeIsNull() { - // given - String taxCode = "validTaxCode"; - String companyTaxCode = "validCompanyTaxCode"; - - //when - InstitutionInfoIC institutionInfoIC = new InstitutionInfoIC(); - institutionInfoIC.setBusinesses(Collections.emptyList()); - when(partyRegistryProxyConnectorMock.getInstitutionsByUserFiscalCode(taxCode)).thenReturn(institutionInfoIC); - when(partyRegistryProxyConnectorMock.matchInstitutionAndUser(companyTaxCode, taxCode)).thenReturn(null); - - // then - assertThrows(ResourceNotFoundException.class, () -> institutionService.verifyManager(taxCode, companyTaxCode)); - } - - @Test - void verifyManager_userAdeIsFalse() { - // given - String taxCode = "validTaxCode"; - String companyTaxCode = "validCompanyTaxCode"; - - //when - InstitutionInfoIC institutionInfoIC = new InstitutionInfoIC(); - institutionInfoIC.setBusinesses(Collections.emptyList()); - when(partyRegistryProxyConnectorMock.getInstitutionsByUserFiscalCode(taxCode)).thenReturn(institutionInfoIC); - MatchInfoResult matchInfoResult = new MatchInfoResult(); - matchInfoResult.setVerificationResult(false); - when(partyRegistryProxyConnectorMock.matchInstitutionAndUser(companyTaxCode, taxCode)).thenReturn(matchInfoResult); + Executable executable = () -> institutionService.verifyManager(userTaxCode, institutionTaxCode); // then - assertThrows(ResourceNotFoundException.class, () -> institutionService.verifyManager(taxCode, companyTaxCode)); - } - - @Test - void verifyManager_businessNull() { - // given - String taxCode = "validTaxCode"; - String companyTaxCode = "validCompanyTaxCode"; - - when(partyRegistryProxyConnectorMock.getInstitutionsByUserFiscalCode(anyString())).thenReturn(null); - when(partyRegistryProxyConnectorMock.matchInstitutionAndUser(anyString(), anyString())).thenReturn(null); - - // when & then - assertThrows(ResourceNotFoundException.class, () -> institutionService.verifyManager(taxCode, companyTaxCode)); - } - - @Test - void verifyManager_noBusinessFound() { - // given - String taxCode = "validTaxCode"; - String companyTaxCode = "validCompanyTaxCode"; - InstitutionInfoIC institutionInfoIC = new InstitutionInfoIC(); - institutionInfoIC.setBusinesses(Collections.emptyList()); - - when(partyRegistryProxyConnectorMock.getInstitutionsByUserFiscalCode(anyString())).thenReturn(institutionInfoIC); - when(partyRegistryProxyConnectorMock.matchInstitutionAndUser(anyString(), anyString())).thenReturn(null); - - // when & then - assertThrows(ResourceNotFoundException.class, () -> institutionService.verifyManager(taxCode, companyTaxCode)); - } - - @Test - void verifyManager_invalidRequestException() { - // given - String taxCode = "validTaxCode"; - String companyTaxCode = "validCompanyTaxCode"; - InstitutionInfoIC institutionInfoIC = new InstitutionInfoIC(); - institutionInfoIC.setBusinesses(Collections.emptyList()); - - when(partyRegistryProxyConnectorMock.getInstitutionsByUserFiscalCode(anyString())).thenReturn(institutionInfoIC); - when(partyRegistryProxyConnectorMock.matchInstitutionAndUser(anyString(), anyString())).thenThrow(new InvalidRequestException("Invalid request")); - - // when & then - assertThrows(ResourceNotFoundException.class, () -> institutionService.verifyManager(taxCode, companyTaxCode)); + ResourceNotFoundException exception = assertThrows(ResourceNotFoundException.class, executable); + assertEquals("User with userTaxCode userTaxCode is not the legal representative of the institution", exception.getMessage()); + verify(pgManagerVerifierMock, times(1)).doVerify(userTaxCode, institutionTaxCode); } @Test diff --git a/web/src/main/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2Controller.java b/web/src/main/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2Controller.java index a5ce9f2a..132000b4 100644 --- a/web/src/main/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2Controller.java +++ b/web/src/main/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2Controller.java @@ -136,9 +136,15 @@ public VerifyAggregatesResponse verifyAggregatesCsv(@RequestParam("aggregates") @PostMapping(value = "/company/verify-manager") @ResponseStatus(HttpStatus.OK) @ApiOperation(value = "", notes = "${swagger.onboarding.institutions.api.onboarding.verifyManager}") - public VerifyManagerResponse verifyManager(@RequestBody @Valid VerifyManagerRequest request) { + public VerifyManagerResponse verifyManager( + @RequestBody @Valid VerifyManagerRequest request, + Principal principal + ) { log.trace("verifyManager start"); - VerifyManagerResponse response = onboardingResourceMapper.toManagerVerification(institutionService.verifyManager(request.getUserTaxCode(), request.getCompanyTaxCode())); + JwtAuthenticationToken jwtAuthenticationToken = (JwtAuthenticationToken) principal; + SelfCareUser selfCareUser = (SelfCareUser) jwtAuthenticationToken.getPrincipal(); + + VerifyManagerResponse response = onboardingResourceMapper.toManagerVerification(institutionService.verifyManager(selfCareUser.getFiscalCode(), request.getCompanyTaxCode())); log.trace("verifyManager end"); return response; } diff --git a/web/src/main/java/it/pagopa/selfcare/onboarding/web/model/VerifyManagerRequest.java b/web/src/main/java/it/pagopa/selfcare/onboarding/web/model/VerifyManagerRequest.java index 6df185e1..5ce4e592 100644 --- a/web/src/main/java/it/pagopa/selfcare/onboarding/web/model/VerifyManagerRequest.java +++ b/web/src/main/java/it/pagopa/selfcare/onboarding/web/model/VerifyManagerRequest.java @@ -8,11 +8,6 @@ @Data public class VerifyManagerRequest { - @ApiModelProperty(value = "${swagger.onboarding.user.model.fiscalCode}") - @JsonProperty(required = true) - @NotBlank - private String userTaxCode; - @ApiModelProperty(value = "${swagger.onboarding.institutions.model.taxCode}") @JsonProperty(required = true) @NotBlank diff --git a/web/src/test/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2ControllerTest.java b/web/src/test/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2ControllerTest.java index f9117f76..161d18ee 100644 --- a/web/src/test/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2ControllerTest.java +++ b/web/src/test/java/it/pagopa/selfcare/onboarding/web/controller/InstitutionV2ControllerTest.java @@ -198,9 +198,15 @@ void verifyAggregatesCsvSuccess() throws Exception { @Test void verifyManager_success() throws Exception { // given - VerifyManagerRequest request = new VerifyManagerRequest(); - request.setUserTaxCode("validUserTaxCode"); - request.setCompanyTaxCode("validCompanyTaxCode"); + JwtAuthenticationToken mockPrincipal = Mockito.mock(JwtAuthenticationToken.class); + SelfCareUser selfCareUser = SelfCareUser.builder("example") + .fiscalCode("fiscalCode") + .build(); + Mockito.when(mockPrincipal.getPrincipal()).thenReturn(selfCareUser); + + VerifyManagerRequest verifyManagerRequest = new VerifyManagerRequest(); + verifyManagerRequest.setCompanyTaxCode("taxCode"); + ManagerVerification managerVerification = new ManagerVerification(); managerVerification.setOrigin("INFOCAMERE"); managerVerification.setCompanyName("CompanyName"); @@ -209,7 +215,8 @@ void verifyManager_success() throws Exception { // when MvcResult result = mvc.perform(MockMvcRequestBuilders .post(BASE_URL + "/company/verify-manager") - .content(objectMapper.writeValueAsString(request)) + .content(objectMapper.writeValueAsString(verifyManagerRequest)) + .principal(mockPrincipal) .contentType(APPLICATION_JSON_VALUE) .accept(APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) @@ -227,12 +234,18 @@ void verifyManager_success() throws Exception { @Test void verifyManager_invalidRequest() throws Exception { // given + JwtAuthenticationToken mockPrincipal = Mockito.mock(JwtAuthenticationToken.class); + SelfCareUser selfCareUser = SelfCareUser.builder("example") + .fiscalCode("fiscalCode") + .build(); + Mockito.when(mockPrincipal.getPrincipal()).thenReturn(selfCareUser); + VerifyManagerRequest request = new VerifyManagerRequest(); - request.setCompanyTaxCode("validCompanyTaxCode"); // when mvc.perform(MockMvcRequestBuilders .post(BASE_URL + "/company/verify-manager") + .principal(mockPrincipal) .content(objectMapper.writeValueAsString(request)) .contentType(APPLICATION_JSON_VALUE) .accept(APPLICATION_JSON_VALUE))