|
13 | 13 | import org.openapi.quarkus.user_registry_json.model.SaveUserDto; |
14 | 14 | import org.openapi.quarkus.user_registry_json.model.UserSearchDto; |
15 | 15 |
|
| 16 | +import java.util.List; |
| 17 | +import java.util.Objects; |
| 18 | +import java.util.Optional; |
| 19 | + |
| 20 | +import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_IDPAY_MERCHANT; |
| 21 | + |
16 | 22 | public class RegistryManagerPDNDInfocamere extends ClientRegistryPDNDInfocamere { |
17 | 23 |
|
18 | 24 | public static final String USERS_FIELD_TAXCODE = "fiscalCode"; |
19 | 25 |
|
20 | 26 | private final UserApi userRegistryApi; |
| 27 | + private final Optional<String> allowedAtecoCodes; |
21 | 28 |
|
22 | | - public RegistryManagerPDNDInfocamere(Onboarding onboarding, InfocamerePdndApi infocamerePdndApi, UserApi userRegistryApi) { |
| 29 | + public RegistryManagerPDNDInfocamere(Onboarding onboarding, InfocamerePdndApi infocamerePdndApi, UserApi userRegistryApi, |
| 30 | + Optional<String> allowedAtecoCodes) { |
23 | 31 | super(onboarding, infocamerePdndApi); |
24 | 32 | this.userRegistryApi = userRegistryApi; |
| 33 | + this.allowedAtecoCodes = allowedAtecoCodes; |
25 | 34 | } |
26 | 35 |
|
27 | 36 | @Override |
28 | 37 | public Uni<Onboarding> customValidation(Product product) { |
29 | | - if (InstitutionType.PRV_PF.equals(onboarding.getInstitution().getInstitutionType())) { |
30 | | - final String fiscalCode = onboarding.getInstitution().getTaxCode(); |
31 | | - final UserSearchDto searchDto = new UserSearchDto().fiscalCode(fiscalCode); |
32 | | - return userRegistryApi.searchUsingPOST(USERS_FIELD_TAXCODE, searchDto) |
33 | | - .onItem().transform(userResource -> |
34 | | - updateOnboardingWithUserId(onboarding, userResource.getId().toString()) |
35 | | - ) |
36 | | - .onFailure(WebApplicationException.class) |
37 | | - .recoverWithUni(ex -> |
38 | | - handleSearchFailure((WebApplicationException) ex, onboarding, fiscalCode) |
39 | | - ); |
| 38 | + if (isIdPayMerchantProduct(product)) { |
| 39 | + return validateAtecoCodes(); |
| 40 | + } |
| 41 | + if (isPrivatePersonInstitution()) { |
| 42 | + return manageTaxCode(); |
40 | 43 | } |
41 | 44 | return Uni.createFrom().item(onboarding); |
42 | 45 | } |
43 | 46 |
|
| 47 | + private boolean isIdPayMerchantProduct(Product product) { |
| 48 | + return Objects.nonNull(product) && PROD_IDPAY_MERCHANT.getValue().equals(product.getId()); |
| 49 | + } |
| 50 | + |
| 51 | + private boolean isPrivatePersonInstitution() { |
| 52 | + return InstitutionType.PRV_PF.equals(onboarding.getInstitution().getInstitutionType()); |
| 53 | + } |
| 54 | + |
| 55 | + private Uni<Onboarding> manageTaxCode() { |
| 56 | + final String fiscalCode = onboarding.getInstitution().getTaxCode(); |
| 57 | + final UserSearchDto searchDto = new UserSearchDto().fiscalCode(fiscalCode); |
| 58 | + return userRegistryApi.searchUsingPOST(USERS_FIELD_TAXCODE, searchDto) |
| 59 | + .onItem().transform(userResource -> |
| 60 | + updateOnboardingWithUserId(onboarding, userResource.getId().toString()) |
| 61 | + ) |
| 62 | + .onFailure(WebApplicationException.class) |
| 63 | + .recoverWithUni(ex -> |
| 64 | + handleSearchFailure((WebApplicationException) ex, onboarding, fiscalCode) |
| 65 | + ); |
| 66 | + } |
| 67 | + |
44 | 68 | /** |
45 | 69 | * Gestisce il fallimento della ricerca utente. Se l'errore è un 404 (Not Found), |
46 | 70 | * procede con la creazione di un nuovo utente. Altrimenti, propaga l'errore. |
@@ -75,6 +99,31 @@ private Onboarding updateOnboardingWithUserId(Onboarding onboarding, String user |
75 | 99 | return onboarding; |
76 | 100 | } |
77 | 101 |
|
| 102 | + /** |
| 103 | + * Valida che almeno uno dei codici ATECO dell'istituzione sia presente nella lista di codici ATECO consentiti. |
| 104 | + * @return Uni<Void> che fallisce con InvalidRequestException se la validazione fallisce |
| 105 | + */ |
| 106 | + private Uni<Onboarding> validateAtecoCodes() { |
| 107 | + List<String> institutionAtecoCodes = onboarding.getInstitution().getAtecoCodes(); |
| 108 | + |
| 109 | + if (Objects.isNull(institutionAtecoCodes) || institutionAtecoCodes.isEmpty()) { |
| 110 | + return Uni.createFrom().failure(new InvalidRequestException("Institution must have at least one ATECO code")); |
| 111 | + } |
| 112 | + |
| 113 | + List<String> allowedCodes = allowedAtecoCodes |
| 114 | + .filter(codes -> !codes.trim().isEmpty()) |
| 115 | + .map(codes -> List.of(codes.split(","))) |
| 116 | + .orElseThrow(() -> new InvalidRequestException("Allowed ATECO codes are not configured")); |
| 117 | + boolean hasValidAteco = institutionAtecoCodes.stream() |
| 118 | + .anyMatch(ateco -> allowedCodes.contains(ateco.trim())); |
| 119 | + |
| 120 | + if (!hasValidAteco) { |
| 121 | + return Uni.createFrom().failure(new InvalidRequestException("Institution ATECO codes are not allowed for this product")); |
| 122 | + } |
| 123 | + |
| 124 | + return Uni.createFrom().item(onboarding); |
| 125 | + } |
| 126 | + |
78 | 127 | @Override |
79 | 128 | public Uni<Boolean> isValid() { |
80 | 129 | /*if (!originPDNDInfocamere(onboarding, registryResource)) { |
|
0 commit comments