Skip to content

Commit

Permalink
Merge branch 'main' into feature/SELC-6373
Browse files Browse the repository at this point in the history
# Conflicts:
#	apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java
#	apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java
  • Loading branch information
giulia-tremolada committed Feb 4, 2025
2 parents 55d2f8e + dbaf99b commit 4a53c90
Show file tree
Hide file tree
Showing 4 changed files with 202 additions and 132 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package it.pagopa.selfcare.onboarding.entity.registry;


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.exception.InvalidRequestException;
import it.pagopa.selfcare.product.entity.Product;

import java.util.Objects;

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

Expand All @@ -15,6 +20,7 @@ public abstract class BaseRegistryManager<T> implements RegistryManager<T> {
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 String NOT_ALLOWED_PRICING_PLAN = "onboarding pricing plan for io-premium is not allowed";
protected static final String NOT_ALLOWED_INSTITUTION_TYPE = "institution with institution type %s is not allowed to onboard product %s";
protected static final int DURATION_TIMEOUT = 5;
protected static final int MAX_NUMBER_ATTEMPTS = 2;

Expand All @@ -38,6 +44,20 @@ public RegistryManager<T> setResource(T registryResource) {
return this;
}

public Uni<Onboarding> validateInstitutionType(Product product) {
if (Objects.nonNull(product.getInstitutionTypesAllowed()) && !product.getInstitutionTypesAllowed().isEmpty()) {
return product.getInstitutionTypesAllowed().stream()
.anyMatch(type -> type.equals(onboarding.getInstitution().getInstitutionType().name()))
? Uni.createFrom().item(onboarding)
: Uni.createFrom().failure(new InvalidRequestException(
String.format(NOT_ALLOWED_INSTITUTION_TYPE,
onboarding.getInstitution().getInstitutionType().name(),
product.getId())
));
}
return Uni.createFrom().item(onboarding);
}

protected String getManagerIdFromOnboarding() {
return onboarding.getUsers().stream()
.filter(user -> user.getRole().equals(PartyRole.MANAGER))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,7 @@ public interface RegistryManager<T> {
Onboarding getOnboarding();

RegistryManager<T> setResource(T registryResource);

Uni<Onboarding> validateInstitutionType(Product product);
}

Original file line number Diff line number Diff line change
Expand Up @@ -266,15 +266,15 @@ public Uni<OnboardingResponse> onboardingAggregationCompletion(

@Override
public Uni<OnboardingResponse> onboardingAggregationImport(
Onboarding onboarding,
OnboardingImportContract contractImported,
List<UserRequest> userRequests,
List<AggregateInstitutionRequest> aggregates) {
Onboarding onboarding,
OnboardingImportContract contractImported,
List<UserRequest> userRequests,
List<AggregateInstitutionRequest> aggregates) {
onboarding.setWorkflowType(WorkflowType.IMPORT_AGGREGATION);
onboarding.setStatus(OnboardingStatus.PENDING);

return fillUsersAndOnboardingForImport(
onboarding, userRequests, aggregates, contractImported);
onboarding, userRequests, aggregates, contractImported);
}


Expand All @@ -283,13 +283,13 @@ public Uni<OnboardingResponse> onboardingAggregationImport(
*/
@Override
public Uni<OnboardingResponse> onboardingImport(
Onboarding onboarding,
List<UserRequest> userRequests,
OnboardingImportContract contractImported) {
Onboarding onboarding,
List<UserRequest> userRequests,
OnboardingImportContract contractImported) {
onboarding.setWorkflowType(WorkflowType.IMPORT);
onboarding.setStatus(OnboardingStatus.PENDING);
return fillUsersAndOnboardingForImport(
onboarding, userRequests, null, contractImported);
onboarding, userRequests, null, contractImported);
}

/**
Expand Down Expand Up @@ -360,6 +360,8 @@ private Uni<OnboardingResponse> validateAndPersistOnboarding(
String timeout) {

return registryManager.isValid()
.onItem()
.transformToUni(ignored -> registryManager.validateInstitutionType(product))
.onItem()
.transformToUni(ignored -> registryManager.customValidation(product))
.onItem()
Expand Down Expand Up @@ -426,69 +428,68 @@ private Uni<OnboardingResponse> verifyExistingOnboarding(
}

/**
*
* @param onboarding
* @param userRequests
* @param aggregateRequests
* @param contractImported
* @return OnboardingResponse
*/
private Uni<OnboardingResponse> fillUsersAndOnboardingForImport(
Onboarding onboarding,
List<UserRequest> userRequests,
List<AggregateInstitutionRequest> aggregateRequests,
OnboardingImportContract contractImported) {
Onboarding onboarding,
List<UserRequest> userRequests,
List<AggregateInstitutionRequest> aggregateRequests,
OnboardingImportContract contractImported) {

onboarding.setCreatedAt(LocalDateTime.now());

return getProductByOnboarding(onboarding)
.onItem()
.transformToUni(
product ->
verifyAlreadyOnboardingForProductAndProductParent(
onboarding.getInstitution(), product.getId(), product.getParentId())
.replaceWith(product))
.onItem()
.transformToUni(
product ->
Uni.createFrom()
.item(registryResourceFactory.create(onboarding, getManagerTaxCode(userRequests)))
.onItem()
.invoke(
registryManager ->
registryManager.setResource(registryManager.retrieveInstitution()))
.runSubscriptionOn(Infrastructure.getDefaultWorkerPool())
.onItem()
.transformToUni(
registryManager ->
registryManager
.isValid()
.onItem()
.transformToUni(
ignored -> registryManager.customValidation(product)))
/* if product has some test environments, request must also onboard them (for ex. prod-interop-coll) */
.onItem()
.invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem()
.transformToUni(
current -> persistOnboarding(onboarding, userRequests, product, aggregateRequests))
.onItem()
.call(
onboardingPersisted ->
Panache.withTransaction(
() ->
Token.persist(
getToken(onboardingPersisted, product, contractImported))))
/* Update onboarding data with users and start orchestration */
.onItem()
.transformToUni(
currentOnboarding ->
persistAndStartOrchestrationOnboarding(
currentOnboarding,
orchestrationApi.apiStartOnboardingOrchestrationGet(
currentOnboarding.getId(), TIMEOUT_ORCHESTRATION_RESPONSE)))
.onItem()
.transform(onboardingMapper::toResponse));
.onItem()
.transformToUni(
product ->
verifyAlreadyOnboardingForProductAndProductParent(
onboarding.getInstitution(), product.getId(), product.getParentId())
.replaceWith(product))
.onItem()
.transformToUni(
product ->
Uni.createFrom()
.item(registryResourceFactory.create(onboarding, getManagerTaxCode(userRequests)))
.onItem()
.invoke(
registryManager ->
registryManager.setResource(registryManager.retrieveInstitution()))
.runSubscriptionOn(Infrastructure.getDefaultWorkerPool())
.onItem()
.transformToUni(
registryManager ->
registryManager
.isValid()
.onItem()
.transformToUni(
ignored -> registryManager.customValidation(product)))
/* if product has some test environments, request must also onboard them (for ex. prod-interop-coll) */
.onItem()
.invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem()
.transformToUni(
current -> persistOnboarding(onboarding, userRequests, product, aggregateRequests))
.onItem()
.call(
onboardingPersisted ->
Panache.withTransaction(
() ->
Token.persist(
getToken(onboardingPersisted, product, contractImported))))
/* Update onboarding data with users and start orchestration */
.onItem()
.transformToUni(
currentOnboarding ->
persistAndStartOrchestrationOnboarding(
currentOnboarding,
orchestrationApi.apiStartOnboardingOrchestrationGet(
currentOnboarding.getId(), TIMEOUT_ORCHESTRATION_RESPONSE)))
.onItem()
.transform(onboardingMapper::toResponse));
}

private Uni<Onboarding> persistOnboarding(
Expand Down Expand Up @@ -1705,70 +1706,70 @@ public Uni<CheckManagerResponse> checkManager(OnboardingUserRequest onboardingUs
.orElseThrow(
() -> new InvalidRequestException("At least one user should have role MANAGER"));

return userRegistryApi
.searchUsingPOST(USERS_FIELD_LIST, new UserSearchDto().fiscalCode(taxCodeManager))
.onItem()
.transform(UserResource::getId)
.flatMap(
uuid ->
findOnboardingsByFilters(onboardingUserRequest)
.flatMap(
onboardings -> {
if (CollectionUtils.isEmpty(onboardings)) {
LOG.debugf(
"Onboarding for taxCode %s, origin %s, originId %s, productId %s, subunitCode %s not found",
onboardingUserRequest.getTaxCode(),
onboardingUserRequest.getOrigin(),
onboardingUserRequest.getOriginId(),
onboardingUserRequest.getProductId(),
onboardingUserRequest.getSubunitCode());

response.setResponse(false);
return Uni.createFrom().item(response);
}

// If the list of onboardings filtered by manager's role is empty, the
// response is 404
if (onboardings.stream()
.noneMatch(
onboarding ->
onboarding.getUsers().stream()
.map(User::getRole)
.toList()
.contains(PartyRole.MANAGER))) {
return Uni.createFrom()
.failure(
new ResourceNotFoundException(
"No manager found for the data in input"));
}

String institutionId = onboardings.get(0).getInstitution().getId();
return isUserActiveManager(
institutionId,
onboardingUserRequest.getProductId(),
String.valueOf(uuid))
.map(
isActiveManager -> {
LOG.debugf(
"User with uuid %s is active manager: %s",
uuid, isActiveManager);
response.setResponse(isActiveManager);
return response;
});
}))
.onFailure()
.recoverWithUni(
ex -> {
if (ex instanceof WebApplicationException
&& ((WebApplicationException) ex).getResponse().getStatus() == 404) {
LOG.debugf("User not found on user-registry", taxCodeManager);
response.setResponse(false);
return Uni.createFrom().item(response);
}

// If the exception raised is for a different status code, let it propagate
return Uni.createFrom().failure(ex);
});
return userRegistryApi
.searchUsingPOST(USERS_FIELD_LIST, new UserSearchDto().fiscalCode(taxCodeManager))
.onItem()
.transform(UserResource::getId)
.flatMap(
uuid ->
findOnboardingsByFilters(onboardingUserRequest)
.flatMap(
onboardings -> {
if (CollectionUtils.isEmpty(onboardings)) {
LOG.debugf(
"Onboarding for taxCode %s, origin %s, originId %s, productId %s, subunitCode %s not found",
onboardingUserRequest.getTaxCode(),
onboardingUserRequest.getOrigin(),
onboardingUserRequest.getOriginId(),
onboardingUserRequest.getProductId(),
onboardingUserRequest.getSubunitCode());

response.setResponse(false);
return Uni.createFrom().item(response);
}

// If the list of onboardings filtered by manager's role is empty, the
// response is 404
if (onboardings.stream()
.noneMatch(
onboarding ->
onboarding.getUsers().stream()
.map(User::getRole)
.toList()
.contains(PartyRole.MANAGER))) {
return Uni.createFrom()
.failure(
new ResourceNotFoundException(
"No manager found for the data in input"));
}

String institutionId = onboardings.get(0).getInstitution().getId();
return isUserActiveManager(
institutionId,
onboardingUserRequest.getProductId(),
String.valueOf(uuid))
.map(
isActiveManager -> {
LOG.debugf(
"User with uuid %s is active manager: %s",
uuid, isActiveManager);
response.setResponse(isActiveManager);
return response;
});
}))
.onFailure()
.recoverWithUni(
ex -> {
if (ex instanceof WebApplicationException
&& ((WebApplicationException) ex).getResponse().getStatus() == 404) {
LOG.debugf("User not found on user-registry", taxCodeManager);
response.setResponse(false);
return Uni.createFrom().item(response);
}

// If the exception raised is for a different status code, let it propagate
return Uni.createFrom().failure(ex);
});
}

/**
Expand Down
Loading

0 comments on commit 4a53c90

Please sign in to comment.