Skip to content

Commit

Permalink
[SELC-5420] feat: added field istatCode into onboarding
Browse files Browse the repository at this point in the history
  • Loading branch information
pierpaolodidato89 authored Sep 6, 2024
1 parent 0363c0a commit 0898d73
Show file tree
Hide file tree
Showing 6 changed files with 233 additions and 65 deletions.
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

0 comments on commit 0898d73

Please sign in to comment.