Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SELC-5420] feat: added field istatCode into onboarding #461

Merged
merged 11 commits into from
Sep 6, 2024
Merged
3 changes: 3 additions & 0 deletions apps/onboarding-ms/src/main/docs/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -1419,6 +1419,9 @@
"county" : {
"type" : "string"
},
"istatCode" : {
"type" : "string"
},
"description" : {
"type" : "string"
},
Expand Down
2 changes: 2 additions & 0 deletions apps/onboarding-ms/src/main/docs/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -998,6 +998,8 @@ components:
type: string
county:
type: string
istatCode:
type: string
description:
type: string
digitalAddress:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class Institution {
private String city;
private String country;
private String county;
private String istatCode;
private String description;
private String digitalAddress;
private String address;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
import org.openapi.quarkus.onboarding_functions_json.model.OrchestrationResponse;
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 org.openapi.quarkus.party_registry_proxy_json.model.UOResource;
import org.openapi.quarkus.user_registry_json.api.UserApi;
import org.openapi.quarkus.user_registry_json.model.*;

Expand All @@ -63,6 +65,7 @@
import java.util.function.Supplier;
import java.util.stream.Collectors;

import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.*;
import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_INTEROP;
import static it.pagopa.selfcare.onboarding.constants.CustomError.*;
import static it.pagopa.selfcare.onboarding.util.GenericError.*;
Expand Down Expand Up @@ -203,12 +206,14 @@ private Uni<OnboardingResponse> fillUsersAndOnboarding(Onboarding onboarding, Li
return getProductByOnboarding(onboarding)
.onItem().transformToUni(product -> verifyAlreadyOnboardingForProductAndProductParent(onboarding.getInstitution(), product.getId(), product.getParentId())
.replaceWith(product))
.onItem().transformToUni(product -> onboardingUtils.customValidationOnboardingData(onboarding, product)
.onItem().transformToUni(product -> getRegistryResource(onboarding)
.onItem().transformToUni(proxyResource -> onboardingUtils.customValidationOnboardingData(onboarding, product, proxyResource)
.onItem().transformToUni(ignored -> setIstatCode(onboarding, proxyResource)
.onItem().transformToUni(innerOnboarding -> addParentDescriptionForAooOrUo(onboarding, proxyResource))))
/* if institution type is PRV or SCP, request should match data from registry proxy */
.onItem().transformToUni(ignored -> onboardingUtils.validateFields(onboarding))
/* if product has some test environments, request must also onboard them (for ex. prod-interop-coll) */
.onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem().transformToUni(this::addParentDescriptionForAooOrUo)
.onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds())).onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem().transformToUni(current -> persistOnboarding(onboarding, userRequests, product))
/* Update onboarding data with users and start orchestration */
.onItem().transformToUni(currentOnboarding -> persistAndStartOrchestrationOnboarding(currentOnboarding,
Expand Down Expand Up @@ -244,10 +249,12 @@ private Uni<OnboardingResponse> fillUsersAndOnboarding(Onboarding onboarding, Li
return getProductByOnboarding(onboarding)
.onItem().transformToUni(product -> verifyAlreadyOnboardingForProductAndProductParent(onboarding.getInstitution(), product.getId(), product.getParentId())
.replaceWith(product))
.onItem().transformToUni(product -> onboardingUtils.customValidationOnboardingData(onboarding, product)
.onItem().transformToUni(product -> getRegistryResource(onboarding)
.onItem().transformToUni(proxyResource -> onboardingUtils.customValidationOnboardingData(onboarding, product, proxyResource)
.onItem().transformToUni(ignored -> setIstatCode(onboarding, proxyResource)
.onItem().transformToUni(innerOnboarding -> addParentDescriptionForAooOrUo(onboarding, proxyResource))))
/* if product has some test environments, request must also onboard them (for ex. prod-interop-coll) */
.onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem().transformToUni(this::addParentDescriptionForAooOrUo)
.onItem().transformToUni(this::setInstitutionTypeAndBillingData)
.onItem().transformToUni(current -> persistOnboarding(onboarding, userRequests, product))
.onItem().call(onboardingPersisted -> Panache.withTransaction(() -> Token.persist(getToken(onboardingPersisted, product, contractImported))))
Expand All @@ -257,6 +264,14 @@ private Uni<OnboardingResponse> fillUsersAndOnboarding(Onboarding onboarding, Li
.onItem().transform(onboardingMapper::toResponse));
}

private Uni<OnboardingUtils.ProxyResource> getRegistryResource(Onboarding onboarding) {
return switch ((onboarding.getInstitution().getSubunitType() != null) ? onboarding.getInstitution().getSubunitType() : EC) {
case AOO -> getAOO(onboarding);
case UO -> getUO(onboarding);
default -> getEC();
};
}

private Uni<Onboarding> persistOnboarding(Onboarding onboarding, List<UserRequest> userRequests, Product product) {
/* I have to retrieve onboarding id for saving reference to pdv */
return Panache.withTransaction(() -> Onboarding.persist(onboarding).replaceWith(onboarding)
Expand All @@ -265,42 +280,55 @@ private Uni<Onboarding> persistOnboarding(Onboarding onboarding, List<UserReques
.onItem().invoke(onboardingPersisted::setUsers).replaceWith(onboardingPersisted)));
}

private Uni<Onboarding> addParentDescriptionForAooOrUo(Onboarding onboarding) {
private Uni<Onboarding> addParentDescriptionForAooOrUo(Onboarding onboarding, OnboardingUtils.ProxyResource proxyResource) {

Log.infof("Adding parent description AOO/UOO for: taxCode %s, subunitCode %s, type %s",
onboarding.getInstitution().getTaxCode(),
onboarding.getInstitution().getSubunitCode(),
onboarding.getInstitution().getInstitutionType());

if (InstitutionType.PA == onboarding.getInstitution().getInstitutionType()) {
if (InstitutionPaSubunitType.AOO == onboarding.getInstitution().getSubunitType()) {
return addParentDescriptionForAOO(onboarding);
} else if (InstitutionPaSubunitType.UO == onboarding.getInstitution().getSubunitType()) {
return addParentDescriptionForUO(onboarding);
if (AOO == proxyResource.getType()) {
AOOResource resource = (AOOResource) proxyResource.getResource();
return addParentDescriptionForAOO(onboarding, resource);
} else if (UO == proxyResource.getType()) {
UOResource resource = (UOResource) proxyResource.getResource();
return addParentDescriptionForUO(onboarding, resource);
}
}
return Uni.createFrom().item(onboarding);
}

private Uni<Onboarding> addParentDescriptionForUO(Onboarding onboarding) {
return uoApi.findByUnicodeUsingGET1(onboarding.getInstitution().getSubunitCode(), null)
.onItem().invoke(uoResource -> LOG.infof("Founded parent %s for UO institution with subunitCode %s", uoResource.getDenominazioneEnte(), onboarding.getInstitution().getSubunitCode()))
.onItem().invoke(uoResource -> onboarding.getInstitution().setParentDescription(uoResource.getDenominazioneEnte()))
.onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404
? Uni.createFrom().failure(new ResourceNotFoundException(String.format(UO_NOT_FOUND.getMessage(), onboarding.getInstitution().getSubunitCode())))
: Uni.createFrom().failure(ex))
.replaceWith(onboarding);
private Uni<Onboarding> setIstatCode(Onboarding onboarding, OnboardingUtils.ProxyResource proxyResource) {
return switch (proxyResource.getType()) {
case AOO -> Uni.createFrom().item(() -> {
AOOResource resource = (AOOResource) proxyResource.getResource();
onboarding.getInstitution().setIstatCode(resource.getCodiceComuneISTAT());
return onboarding;
});
case UO -> Uni.createFrom().item(() -> {
UOResource resource = (UOResource) proxyResource.getResource();
onboarding.getInstitution().setIstatCode(resource.getCodiceComuneISTAT());
return onboarding;
});
default -> Uni.createFrom().item(onboarding);
};
}

private Uni<Onboarding> addParentDescriptionForUO(Onboarding onboarding, UOResource uoResource) {
LOG.infof("Founded parent %s for UO institution with subunitCode %s", uoResource.getDenominazioneEnte(), onboarding.getInstitution().getSubunitCode());
return Uni.createFrom().item(() -> {
onboarding.getInstitution().setParentDescription(uoResource.getDenominazioneEnte());
return onboarding;
});
}

private Uni<Onboarding> addParentDescriptionForAOO(Onboarding onboarding) {
return aooApi.findByUnicodeUsingGET(onboarding.getInstitution().getSubunitCode(), null)
.onItem().invoke(aooResource -> LOG.infof("Founded parent %s for AOO institution with subunitCode %s", aooResource.getDenominazioneEnte(), onboarding.getInstitution().getSubunitCode()))
.onItem().invoke(aooResource -> onboarding.getInstitution().setParentDescription(aooResource.getDenominazioneEnte()))
.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))
.replaceWith(onboarding);
private Uni<Onboarding> addParentDescriptionForAOO(Onboarding onboarding, AOOResource aooResource) {
LOG.infof("Founded parent %s for AOO institution with subunitCode %s", aooResource.getDenominazioneEnte(), onboarding.getInstitution().getSubunitCode());
return Uni.createFrom().item(() -> {
onboarding.getInstitution().setParentDescription(aooResource.getDenominazioneEnte());
return onboarding;
});
}

private Uni<Onboarding> addReferencedOnboardingId(Onboarding onboarding) {
Expand All @@ -316,11 +344,11 @@ private Uni<Onboarding> addReferencedOnboardingId(Onboarding onboarding) {
.invoke(previousOnboarding -> onboarding.setReferenceOnboardingId(previousOnboarding.getId()));
return current.onItem().transformToUni(ignored -> onboardings.collect().first()).onItem()
.invoke(lastOnboarding -> {
String previousManagerId = lastOnboarding.getUsers().stream()
.filter(user -> user.getRole().equals(PartyRole.MANAGER))
.map(User::getId).findFirst().orElse(null);
onboarding.setPreviousManagerId(previousManagerId);
}).replaceWith(onboarding);
String previousManagerId = lastOnboarding.getUsers().stream()
.filter(user -> user.getRole().equals(PartyRole.MANAGER))
.map(User::getId).findFirst().orElse(null);
onboarding.setPreviousManagerId(previousManagerId);
}).replaceWith(onboarding);
}

private Multi<Onboarding> getOnboardingByFilters(String taxCode, String subunitCode, String origin,
Expand Down Expand Up @@ -1040,8 +1068,8 @@ public Uni<Long> updateOnboarding(String onboardingId, Onboarding onboarding) {
return Onboarding.findById(onboardingId)
.onItem().transform(Onboarding.class::cast)
.onItem().transformToUni(onboardingGet -> Objects.isNull(onboardingGet)
? Uni.createFrom().failure(new InvalidRequestException(String.format("Onboarding with id %s is not present!", onboardingId)))
: Uni.createFrom().item(onboardingGet))
? Uni.createFrom().failure(new InvalidRequestException(String.format("Onboarding with id %s is not present!", onboardingId)))
: Uni.createFrom().item(onboardingGet))
.onItem().transformToUni(id -> updateOnboardingValues(onboardingId, onboarding));

}
Expand Down Expand Up @@ -1083,9 +1111,9 @@ public Uni<Boolean> checkManager(OnboardingUserRequest onboardingUserRequest) {
}

public Uni<CustomError> checkRecipientCode(String recipientCode, String originId) {
return onboardingUtils.getUoFromRecipientCode(recipientCode).onItem()
.transformToUni(uoResource ->
onboardingUtils.getValidationRecipientCodeError(originId, uoResource));
return onboardingUtils.getUoFromRecipientCode(recipientCode).onItem()
.transformToUni(uoResource ->
onboardingUtils.getValidationRecipientCodeError(originId, uoResource));
}

private static Uni<Long> updateOnboardingValues(String onboardingId, Onboarding onboarding) {
Expand Down Expand Up @@ -1123,4 +1151,32 @@ private List<String> getManagerIds(List<Onboarding> onboardings) {
.map(User::getId)
.findAny().orElse(null)).toList();
}

private Uni<OnboardingUtils.ProxyResource> getUO(Onboarding onboarding) {
return uoApi.findByUnicodeUsingGET1(onboarding.getInstitution().getSubunitCode(), null)
.onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404
? Uni.createFrom().failure(new ResourceNotFoundException(String.format(UO_NOT_FOUND.getMessage(), onboarding.getInstitution().getSubunitCode())))
: Uni.createFrom().failure(ex))
.onItem().transformToUni(uoResource -> Uni.createFrom().item(OnboardingUtils.ProxyResource.builder()
.resource(uoResource)
.type(UO)
.build()));
}

private Uni<OnboardingUtils.ProxyResource> getAOO(Onboarding onboarding) {
return aooApi.findByUnicodeUsingGET(onboarding.getInstitution().getSubunitCode(), null)
.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().transformToUni(aooResource -> Uni.createFrom().item(OnboardingUtils.ProxyResource.builder()
.resource(aooResource)
.type(AOO)
.build()));
}

private Uni<OnboardingUtils.ProxyResource> getEC() {
return Uni.createFrom().item(OnboardingUtils.ProxyResource.builder()
.type(EC)
.build());
}
}
Loading
Loading