Skip to content

Commit

Permalink
[SELC-5547] feat: refactoring onboarding's logic
Browse files Browse the repository at this point in the history
  • Loading branch information
pierpaolodidato89 authored Nov 20, 2024
1 parent 82950d9 commit ff64394
Show file tree
Hide file tree
Showing 28 changed files with 1,183 additions and 889 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ public enum CustomError {

ROLES_NOT_ADMITTED_ERROR("0034","Roles %s are not admitted for this operation"),
AOO_NOT_FOUND("0000","AOO %s not found"),
STATION_NOT_FOUND("0000","Station %s not found"),
INSURANCE_NOT_FOUND("0000","Insurance %s not found"),
UO_NOT_FOUND("0000","UO %s not found"),
ONBOARDING_INFO_FILTERS_ERROR("0052", "Invalid filters parameters to retrieve onboarding info"),
INSTITUTION_NOT_ONBOARDED_BY_FILTERS("0004", "Has not been found an onboarded Institution with the provided filters"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package it.pagopa.selfcare.onboarding.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import org.openapi.quarkus.party_registry_proxy_json.model.AOOResource;
import org.openapi.quarkus.party_registry_proxy_json.model.InstitutionResource;
import org.openapi.quarkus.party_registry_proxy_json.model.UOResource;

@Data
@Builder
@AllArgsConstructor
public class IPAEntity {

private InstitutionResource institutionResource;
private UOResource uoResource;
private AOOResource aooResource;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package it.pagopa.selfcare.onboarding.entity.registry;


import it.pagopa.selfcare.onboarding.entity.Onboarding;

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

protected static final String ADDITIONAL_INFORMATION_REQUIRED = "Additional Information is required when institutionType is GSP and productId is pagopa";
protected static final String OTHER_NOTE_REQUIRED = "Other Note is required when other boolean are false";
protected static final String BILLING_OR_RECIPIENT_CODE_REQUIRED = "Billing and/or recipient code are required";
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 int DURATION_TIMEOUT = 5;
protected static final int MAX_NUMBER_ATTEMPTS = 2;

protected Onboarding onboarding;
protected T registryResource;

protected BaseRegistryManager(Onboarding onboarding) {
this.onboarding = onboarding;
}

public void setOnboarding(Onboarding onboarding) {
this.onboarding = onboarding;
}

public Onboarding getOnboarding() {
return onboarding;
}

public RegistryManager<T> setResource(T registryResource) {
this.registryResource = registryResource;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package it.pagopa.selfcare.onboarding.entity.registry;

import io.smallrye.mutiny.Uni;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.product.entity.Product;

public interface RegistryManager<T> {

T retrieveInstitution();

// Method used for additional checks
Uni<Onboarding> customValidation(Product product);

// Method used to check correspondence between registry and onboarding data
Uni<Boolean> isValid();

Onboarding getOnboarding();

RegistryManager<T> setResource(T registryResource);
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package it.pagopa.selfcare.onboarding.entity.registry;

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.product.entity.Product;
import org.openapi.quarkus.party_registry_proxy_json.api.NationalRegistriesApi;
import org.openapi.quarkus.user_registry_json.api.UserApi;

public class RegistryManagerADE extends ClientRegistryADE {

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

@Override
public Uni<Onboarding> customValidation(Product product) {
return Uni.createFrom().item(onboarding);
}

@Override
public Uni<Boolean> isValid() {
return Uni.createFrom().item(true);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package it.pagopa.selfcare.onboarding.entity.registry;

import io.smallrye.mutiny.Uni;
import it.pagopa.selfcare.onboarding.entity.registry.client.ClientRegistryANAC;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.exception.InvalidRequestException;
import it.pagopa.selfcare.product.entity.Product;
import org.openapi.quarkus.party_registry_proxy_json.api.StationsApi;
import org.openapi.quarkus.party_registry_proxy_json.model.StationResource;

public class RegistryManagerANAC extends ClientRegistryANAC {

public RegistryManagerANAC(Onboarding onboarding, StationsApi stationsApi) {
super(onboarding, stationsApi);
}

@Override
public Uni<Onboarding> customValidation(Product product) {
return Uni.createFrom().item(onboarding);
}

@Override
public Uni<Boolean> isValid() {
if (!originANAC(onboarding, registryResource)) {
return Uni.createFrom().failure(new InvalidRequestException("Field digitalAddress or description are not valid"));
}
return Uni.createFrom().item(true);
}

private boolean originANAC(Onboarding onboarding, StationResource stationResource) {
return onboarding.getInstitution().getDigitalAddress().equals(stationResource.getDigitalAddress()) &&
onboarding.getInstitution().getDescription().equals(stationResource.getDescription());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
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.exception.InvalidRequestException;
import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException;
import jakarta.ws.rs.WebApplicationException;
import org.openapi.quarkus.party_registry_proxy_json.api.InstitutionApi;
import org.openapi.quarkus.party_registry_proxy_json.api.UoApi;
import org.openapi.quarkus.party_registry_proxy_json.model.InstitutionResource;

import java.time.Duration;
import java.time.temporal.ChronoUnit;

public class RegistryManagerIPA extends RegistryManagerIPAUo {

public RegistryManagerIPA(Onboarding onboarding, UoApi uoApi, InstitutionApi institutionApi) {
super(onboarding, uoApi, institutionApi);
}

@Override
public IPAEntity retrieveInstitution() {
super.originIdEC = onboarding.getInstitution().getOriginId();
InstitutionResource institutionResource = super.institutionApi.findInstitutionUsingGET(onboarding.getInstitution().getTaxCode(), null, null)
.onFailure().retry().atMost(MAX_NUMBER_ATTEMPTS)
.onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404
? Uni.createFrom().failure(new ResourceNotFoundException(String.format("Institution with taxCode %s not found", onboarding.getInstitution().getTaxCode())))
: Uni.createFrom().failure(ex))
.await().atMost(Duration.of(DURATION_TIMEOUT, ChronoUnit.SECONDS));
return IPAEntity.builder().institutionResource(institutionResource).build();
}

@Override
public Uni<Boolean> isValid() {
if (!originIPA(onboarding, registryResource.getInstitutionResource())) {
return Uni.createFrom().failure(new InvalidRequestException("Field digitalAddress or description are not valid"));
}
return Uni.createFrom().item(true);
}

private boolean originIPA(Onboarding onboarding, InstitutionResource institutionResource) {
return onboarding.getInstitution().getDigitalAddress().equals(institutionResource.getDigitalAddress()) &&
onboarding.getInstitution().getDescription().equals(institutionResource.getDescription());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
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.exception.ResourceNotFoundException;
import jakarta.ws.rs.WebApplicationException;
import org.openapi.quarkus.party_registry_proxy_json.api.AooApi;
import org.openapi.quarkus.party_registry_proxy_json.api.UoApi;
import org.openapi.quarkus.party_registry_proxy_json.model.AOOResource;

import java.time.Duration;
import java.time.temporal.ChronoUnit;

import static it.pagopa.selfcare.onboarding.constants.CustomError.AOO_NOT_FOUND;

public class RegistryManagerIPAAoo extends RegistryManagerIPAUo {

public RegistryManagerIPAAoo(Onboarding onboarding, UoApi uoApi, AooApi aooApi) {
super(onboarding, uoApi, aooApi);
}

@Override
public IPAEntity retrieveInstitution() {
AOOResource aooResource = super.aooClient.findByUnicodeUsingGET(onboarding.getInstitution().getSubunitCode(), null)
.onFailure().retry().atMost(MAX_NUMBER_ATTEMPTS)
.onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404
? Uni.createFrom().failure(new ResourceNotFoundException(String.format(AOO_NOT_FOUND.getMessage(), onboarding.getInstitution().getSubunitCode())))
: Uni.createFrom().failure(ex))
.onItem().invoke(this::enrichOnboardingData)
.await().atMost(Duration.of(BaseRegistryManager.DURATION_TIMEOUT, ChronoUnit.SECONDS));
super.originIdEC = aooResource.getCodiceIpa();
super.resourceTaxCode = aooResource.getCodiceFiscaleEnte();
return IPAEntity.builder().aooResource(aooResource).build();
}

private void enrichOnboardingData(AOOResource aooResource) {
onboarding.getInstitution().setParentDescription(aooResource.getDenominazioneEnte());
onboarding.getInstitution().setIstatCode(aooResource.getCodiceComuneISTAT());
}

@Override
public Uni<Boolean> isValid() {
return Uni.createFrom().item(true);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package it.pagopa.selfcare.onboarding.entity.registry;

import io.smallrye.mutiny.Uni;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.exception.InvalidRequestException;
import it.pagopa.selfcare.product.entity.Product;
import org.openapi.quarkus.party_registry_proxy_json.api.UoApi;

import java.util.Objects;

import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_PAGOPA;

public class RegistryManagerIPAGps extends RegistryManagerIPAUo {

public RegistryManagerIPAGps(Onboarding onboarding, UoApi uoApi) {
super(onboarding, uoApi);
}

@Override
public Uni<Onboarding> customValidation(Product product) {
if (PROD_PAGOPA.getValue().equals(onboarding.getProductId()) && Objects.isNull(onboarding.getAdditionalInformations())) {
return Uni.createFrom().failure(new InvalidRequestException(BaseRegistryManager.ADDITIONAL_INFORMATION_REQUIRED));
} else if (PROD_PAGOPA.getValue().equals(onboarding.getProductId()) &&
!onboarding.getAdditionalInformations().isIpa() &&
!onboarding.getAdditionalInformations().isBelongRegulatedMarket() &&
!onboarding.getAdditionalInformations().isEstablishedByRegulatoryProvision() &&
!onboarding.getAdditionalInformations().isAgentOfPublicService() &&
Objects.isNull(onboarding.getAdditionalInformations().getOtherNote())) {
return Uni.createFrom().failure(new InvalidRequestException(BaseRegistryManager.OTHER_NOTE_REQUIRED));
}
return Uni.createFrom().item(onboarding);
}
}
Loading

0 comments on commit ff64394

Please sign in to comment.