Skip to content

Commit

Permalink
[SELC-5547] fix: Updated registry managers for ADE and INFOCAMERE
Browse files Browse the repository at this point in the history
  • Loading branch information
pierpaolodidato89 authored Dec 13, 2024
1 parent c58e8c4 commit dc9e26a
Show file tree
Hide file tree
Showing 11 changed files with 236 additions and 63 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package it.pagopa.selfcare.onboarding.entity.registry;


import it.pagopa.selfcare.onboarding.common.PartyRole;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.entity.User;

public abstract class BaseRegistryManager<T> implements RegistryManager<T> {

Expand All @@ -11,6 +13,7 @@ public abstract class BaseRegistryManager<T> implements RegistryManager<T> {
protected static final String ONBOARDING_NOT_ALLOWED_ERROR_MESSAGE_NOT_DELEGABLE = "Institution with external id '%s' is not allowed to onboard '%s' product because it is not delegable";
protected static final String PARENT_TAX_CODE_IS_INVALID = "The tax code of the parent entity of the request does not match the tax code of the parent entity retrieved by IPA";
protected static final String TAX_CODE_INVOICING_IS_INVALID = "The tax code invoicing of the request does not match any tax code of institutions' hierarchy";
protected static final String PNPG_INSTITUTION_REGISTRY_NOT_FOUND = "Institution with taxCode %s is not into registry";
protected static final int DURATION_TIMEOUT = 5;
protected static final int MAX_NUMBER_ATTEMPTS = 2;

Expand All @@ -33,4 +36,12 @@ public RegistryManager<T> setResource(T registryResource) {
this.registryResource = registryResource;
return this;
}

protected String getManagerIdFromOnboarding() {
return onboarding.getUsers().stream()
.filter(user -> user.getRole().equals(PartyRole.MANAGER))
.map(User::getId)
.findFirst()
.orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.smallrye.mutiny.Uni;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.entity.registry.client.ClientRegistryADE;
import it.pagopa.selfcare.onboarding.exception.InvalidRequestException;
import it.pagopa.selfcare.product.entity.Product;
import org.openapi.quarkus.party_registry_proxy_json.api.NationalRegistriesApi;
import org.openapi.quarkus.user_registry_json.api.UserApi;
Expand All @@ -12,8 +13,9 @@

public class RegistryManagerADE extends ClientRegistryADE {

public RegistryManagerADE(Onboarding onboarding, NationalRegistriesApi nationalRegistriesApi, UserApi userApi) {
super(onboarding, nationalRegistriesApi, userApi);
public RegistryManagerADE(
Onboarding onboarding, NationalRegistriesApi nationalRegistriesApi, String managerTaxCode) {
super(onboarding, nationalRegistriesApi, managerTaxCode);
}

@Override
Expand All @@ -23,6 +25,15 @@ public Uni<Onboarding> customValidation(Product product) {

@Override
public Uni<Boolean> isValid() {
Boolean result = super.registryResource;
if (Boolean.FALSE.equals(result)) {
return Uni.createFrom()
.failure(
new InvalidRequestException(
String.format(
PNPG_INSTITUTION_REGISTRY_NOT_FOUND,
onboarding.getInstitution().getTaxCode())));
}
return Uni.createFrom().item(true);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
package it.pagopa.selfcare.onboarding.entity.registry;

import io.smallrye.mutiny.Uni;
import it.pagopa.selfcare.onboarding.entity.IPAEntity;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.entity.registry.client.ClientRegistryInfocamere;
import it.pagopa.selfcare.onboarding.exception.InvalidRequestException;
import it.pagopa.selfcare.product.entity.Product;
import org.openapi.quarkus.party_registry_proxy_json.api.InfocamereApi;
import org.openapi.quarkus.party_registry_proxy_json.model.BusinessesResource;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.openapi.quarkus.party_registry_proxy_json.api.InfocamereApi;
import org.openapi.quarkus.party_registry_proxy_json.model.BusinessResource;
import org.openapi.quarkus.party_registry_proxy_json.model.BusinessesResource;
import org.openapi.quarkus.user_registry_json.api.UserApi;

public class RegistryManagerInfocamere extends ClientRegistryInfocamere {

public RegistryManagerInfocamere(Onboarding onboarding, InfocamereApi infocamereApi) {
super(onboarding, infocamereApi);
public RegistryManagerInfocamere(
Onboarding onboarding, InfocamereApi infocamereApi, String managerTaxCode) {
super(onboarding, infocamereApi, managerTaxCode);
}

@Override
Expand All @@ -24,9 +27,18 @@ public Uni<Onboarding> customValidation(Product product) {

@Override
public Uni<Boolean> isValid() {
List<BusinessResource> institutions = super.registryResource.getBusinesses();
if (institutions.isEmpty() || Objects.isNull(findByTaxCode(institutions))) {
return Uni.createFrom()
.failure(
new InvalidRequestException(
String.format(
PNPG_INSTITUTION_REGISTRY_NOT_FOUND,
onboarding.getInstitution().getTaxCode())));
}
return Uni.createFrom().item(true);
}

@Override
public RegistryManager<BusinessesResource> setResource(BusinessesResource registryResource) {
this.registryResource = registryResource;
Expand All @@ -35,4 +47,14 @@ public RegistryManager<BusinessesResource> setResource(BusinessesResource regist
}
return this;
}
private BusinessResource findByTaxCode(List<BusinessResource> businessResources) {
return businessResources.stream()
.filter(
businessResource ->
businessResource
.getBusinessTaxId()
.equals(onboarding.getInstitution().getTaxCode()))
.findFirst()
.orElse(null);
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package it.pagopa.selfcare.onboarding.entity.registry;

import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.EC;
import static it.pagopa.selfcare.onboarding.common.InstitutionType.GSP;
import static it.pagopa.selfcare.onboarding.common.InstitutionType.PT;

import it.pagopa.selfcare.onboarding.common.Origin;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.openapi.quarkus.party_registry_proxy_json.api.*;
import org.openapi.quarkus.user_registry_json.api.UserApi;

import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.EC;
import static it.pagopa.selfcare.onboarding.common.InstitutionType.GSP;
import static it.pagopa.selfcare.onboarding.common.InstitutionType.PT;

@ApplicationScoped
public class RegistryResourceFactory {
Expand All @@ -26,8 +25,6 @@ public class RegistryResourceFactory {

@RestClient @Inject UoApi uoApi;

@RestClient @Inject UserApi userApi;

@RestClient @Inject InfocamerePdndApi infocamerePdndApi;

@RestClient @Inject InsuranceCompaniesApi insuranceCompaniesApi;
Expand All @@ -36,15 +33,15 @@ public class RegistryResourceFactory {

@RestClient @Inject GeographicTaxonomiesApi geographicTaxonomiesApi;

public RegistryManager<?> create(Onboarding onboarding) {
public RegistryManager<?> create(Onboarding onboarding, String managerTaxCode) {
return switch (onboarding.getInstitution().getOrigin() != null
? onboarding.getInstitution().getOrigin()
: Origin.SELC) {
case PDND_INFOCAMERE -> new RegistryManagerPDNDInfocamere(onboarding, infocamerePdndApi);
case ANAC -> new RegistryManagerANAC(onboarding, stationsApi);
case IVASS -> new RegistryManagerIVASS(onboarding, insuranceCompaniesApi);
case INFOCAMERE -> new RegistryManagerInfocamere(onboarding, infocamereApi);
case ADE -> new RegistryManagerADE(onboarding, nationalRegistriesApi, userApi);
case INFOCAMERE -> new RegistryManagerInfocamere(onboarding, infocamereApi, managerTaxCode);
case ADE -> new RegistryManagerADE(onboarding, nationalRegistriesApi, managerTaxCode);
case IPA -> getResourceFromIPA(onboarding);
default -> getRegistryManagerSELC(onboarding);
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,29 @@
package it.pagopa.selfcare.onboarding.entity.registry.client;

import static it.pagopa.selfcare.onboarding.service.OnboardingServiceDefault.USERS_FIELD_LIST;

import io.smallrye.mutiny.Uni;
import it.pagopa.selfcare.onboarding.common.PartyRole;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.entity.User;
import it.pagopa.selfcare.onboarding.entity.registry.BaseRegistryManager;
import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException;
import jakarta.ws.rs.WebApplicationException;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.openapi.quarkus.party_registry_proxy_json.api.NationalRegistriesApi;
import org.openapi.quarkus.user_registry_json.api.UserApi;

public abstract class ClientRegistryADE extends BaseRegistryManager<Boolean> {

private final NationalRegistriesApi client;
private final UserApi userApi;
private final String managerTaxCode;

protected ClientRegistryADE(Onboarding onboarding, NationalRegistriesApi client, UserApi userApi) {
protected ClientRegistryADE(Onboarding onboarding, NationalRegistriesApi client, String managerTaxCode) {
super(onboarding);
this.client = client;
this.userApi = userApi;
this.managerTaxCode = managerTaxCode;
}

public Boolean retrieveInstitution() {
return client
.verifyLegalUsingGET(getManagerTaxCode(), onboarding.getInstitution().getTaxCode())
.verifyLegalUsingGET(managerTaxCode, onboarding.getInstitution().getTaxCode())
.onFailure()
.retry()
.atMost(MAX_NUMBER_ATTEMPTS)
Expand All @@ -46,18 +42,4 @@ public Boolean retrieveInstitution() {
.atMost(Duration.of(DURATION_TIMEOUT, ChronoUnit.SECONDS))
.getVerificationResult();
}

private String getManagerTaxCode() {
final String managerId =
onboarding.getUsers().stream()
.filter(user -> user.getRole().equals(PartyRole.MANAGER))
.map(User::getId)
.findFirst()
.orElse(null);
return userApi
.findByIdUsingGET(USERS_FIELD_LIST, managerId)
.await()
.atMost(Duration.of(DURATION_TIMEOUT, ChronoUnit.SECONDS))
.getFiscalCode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@
public abstract class ClientRegistryInfocamere extends BaseRegistryManager<BusinessesResource> {

private final InfocamereApi client;
private final String managerTaxCode;

protected ClientRegistryInfocamere(Onboarding onboarding, InfocamereApi client) {
protected ClientRegistryInfocamere(Onboarding onboarding, InfocamereApi client, String managerTaxCode) {
super(onboarding);
this.client = client;
this.managerTaxCode = managerTaxCode;
}

public BusinessesResource retrieveInstitution() {
Expand All @@ -28,7 +30,7 @@ public BusinessesResource retrieveInstitution() {
GetInstitutionsByLegalDto.builder()
.filter(
GetInstitutionsByLegalFilterDto.builder()
.legalTaxId(onboarding.getInstitution().getTaxCode())
.legalTaxId(managerTaxCode)
.build())
.build())
.onFailure()
Expand All @@ -42,7 +44,7 @@ public BusinessesResource retrieveInstitution() {
.failure(
new ResourceNotFoundException(
String.format(
"Institution with taxCode %s not found",
"Institutions' list for user with taxCode %s not found",
onboarding.getInstitution().getTaxCode())))
: Uni.createFrom().failure(ex))
.await()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.WebApplicationException;

import java.io.IOException;
import java.nio.file.Files;
import java.time.LocalDateTime;
Expand All @@ -59,7 +58,6 @@
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
Expand Down Expand Up @@ -101,12 +99,10 @@ public class OnboardingServiceDefault implements OnboardingService {
"Unable to complete the onboarding for institution with taxCode '%s' to product '%s', the product is dismissed.";
public static final String USERS_FIELD_LIST = "fiscalCode,familyName,name,workContacts";
public static final String USERS_FIELD_TAXCODE = "fiscalCode";
public static final String TIMEOUT_ORCHESTRATION_RESPONSE = "65";
public static final String TIMEOUT_ORCHESTRATION_RESPONSE = "70";
private static final String ID_MAIL_PREFIX = "ID_MAIL#";
public static final String NOT_MANAGER_OF_THE_INSTITUTION_ON_THE_REGISTRY =
"User is not manager of the institution on the registry";
protected static final String PDF_FORMAT_FILENAME = "%s_accordo_adesione.pdf";

@RestClient
@Inject
UserApi userRegistryApi;
Expand Down Expand Up @@ -321,14 +317,25 @@ private Uni<OnboardingResponse> handleOnboarding(
Product product) {

return Uni.createFrom()
.item(registryResourceFactory.create(onboarding))
.item(registryResourceFactory.create(onboarding, getManagerTaxCode(userRequests)))
.onItem()
.invoke(registryManager -> registryManager.setResource(registryManager.retrieveInstitution()))
.runSubscriptionOn(Infrastructure.getDefaultWorkerPool())
.onItem()
.transformToUni(registryManager -> validateAndPersistOnboarding(registryManager, onboarding, userRequests, aggregates, product, timeout));
}

private String getManagerTaxCode(List<UserRequest> userRequests) {
if (Objects.nonNull(userRequests)) {
return userRequests.stream()
.filter(userRequest -> userRequest.getRole().equals(PartyRole.MANAGER))
.map(UserRequest::getTaxCode)
.findFirst()
.orElse(null);
}
return null;
}

private Uni<OnboardingResponse> validateAndPersistOnboarding(
RegistryManager<?> registryManager,
Onboarding onboarding,
Expand Down Expand Up @@ -426,7 +433,7 @@ private Uni<OnboardingResponse> fillUsersAndOnboardingForImport(
.transformToUni(
product ->
Uni.createFrom()
.item(registryResourceFactory.create(onboarding))
.item(registryResourceFactory.create(onboarding, getManagerTaxCode(userRequests)))
.onItem()
.invoke(
registryManager ->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package it.pagopa.selfcare.onboarding.entity;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.helpers.test.UniAssertSubscriber;
import it.pagopa.selfcare.onboarding.common.Origin;
import it.pagopa.selfcare.onboarding.common.PartyRole;
import it.pagopa.selfcare.onboarding.entity.registry.RegistryManagerADE;
import it.pagopa.selfcare.onboarding.exception.InvalidRequestException;
import java.util.List;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.junit.jupiter.api.Test;
import org.openapi.quarkus.party_registry_proxy_json.api.NationalRegistriesApi;
import org.openapi.quarkus.party_registry_proxy_json.model.LegalVerificationResult;

@QuarkusTest
public class RegistryManagerADETest {

@InjectMock
@RestClient
NationalRegistriesApi nationalRegistriesApi;

@Test
void retrieveInstitution() {
Onboarding onboarding = createOnboarding();
RegistryManagerADE registryManagerADE = new RegistryManagerADE(onboarding, nationalRegistriesApi, "taxCode");
LegalVerificationResult legalVerificationResult = new LegalVerificationResult();
legalVerificationResult.setVerificationResult(true);
when(nationalRegistriesApi.verifyLegalUsingGET(any(), any())).thenReturn(Uni.createFrom().item(legalVerificationResult));
Boolean result = registryManagerADE.retrieveInstitution();
assertTrue(result);
}


@Test
void isNotValid() {
Onboarding onboarding = createOnboarding();
RegistryManagerADE registryManagerADE = new RegistryManagerADE(onboarding, nationalRegistriesApi, "taxCode");
registryManagerADE.setResource(false);
UniAssertSubscriber<Boolean> subscriber = registryManagerADE.isValid()
.subscribe().withSubscriber(UniAssertSubscriber.create());
subscriber.assertFailedWith(InvalidRequestException.class);
}

private Onboarding createOnboarding() {
Onboarding onboarding = new Onboarding();
User user = new User();
user.setRole(PartyRole.MANAGER);
user.setId("idManager");
onboarding.setUsers(List.of(user));
Institution institution = new Institution();
institution.setTaxCode("taxCode");
institution.setOrigin(Origin.ADE);
onboarding.setInstitution(institution);
return onboarding;
}

}
Loading

0 comments on commit dc9e26a

Please sign in to comment.