From 3449632d211fd579f89c7c665732965d004c7677 Mon Sep 17 00:00:00 2001 From: manuraf Date: Thu, 8 Feb 2024 18:17:48 +0100 Subject: [PATCH 1/8] added userMailUuid to model --- .../it/pagopa/selfcare/onboarding/entity/User.java | 10 ++++++++++ .../it/pagopa/selfcare/onboarding/entity/User.java | 1 + 2 files changed, 11 insertions(+) diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java index b9969eaf3..f5fc2fb11 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java @@ -9,6 +9,8 @@ public class User { private PartyRole role; private String productRole; + private String userMailUuid; + public String getId() { return id; } @@ -32,4 +34,12 @@ public String getProductRole() { public void setProductRole(String productRole) { this.productRole = productRole; } + + public String getUserMailUuid() { + return userMailUuid; + } + + public void setUserMailUuid(String userMailUuid) { + this.userMailUuid = userMailUuid; + } } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java index 14c267d63..5fdf63855 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/User.java @@ -16,4 +16,5 @@ public class User { private String id; private PartyRole role; private String productRole; + private String userMailUuid; } From bfaefe000ae3bc64bcdd41c85f8a43130c02fafa Mon Sep 17 00:00:00 2001 From: manuraf Date: Thu, 8 Feb 2024 18:18:39 +0100 Subject: [PATCH 2/8] using userMailUuid on ms --- .../onboarding/mapper/UserMapper.java | 3 + .../service/OnboardingServiceDefault.java | 71 ++++++++++++------- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/UserMapper.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/UserMapper.java index 75e4695b2..e00d8c65e 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/UserMapper.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/UserMapper.java @@ -1,6 +1,7 @@ package it.pagopa.selfcare.onboarding.mapper; import it.pagopa.selfcare.onboarding.controller.response.UserResponse; +import it.pagopa.selfcare.onboarding.entity.User; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; @@ -15,4 +16,6 @@ public interface UserMapper { @Mapping(source = "fiscalCode", target = "taxCode") void fillUserResponse(UserResource userResource, @MappingTarget UserResponse userResponse); + UserResponse toUserResponse(User user); + } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java index 8f6b1eb20..9b52634de 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java @@ -60,7 +60,6 @@ import java.time.OffsetDateTime; import java.util.*; import java.util.function.Function; -import java.util.function.UnaryOperator; import java.util.stream.Collectors; import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_INTEROP; @@ -79,9 +78,7 @@ public class OnboardingServiceDefault implements OnboardingService { public static final String USERS_FIELD_TAXCODE = "fiscalCode"; public static final String UNABLE_TO_COMPLETE_THE_ONBOARDING_FOR_INSTITUTION_ALREADY_ONBOARDED = "Unable to complete the onboarding for institution with taxCode '%s' to product '%s' because is already onboarded."; - - public static final UnaryOperator workContactsKey = onboardingId -> String.format("obg_%s", onboardingId); - public static final String TIMEOUT_ORCHESTRATION_RESPONSE = "60"; + public static final String TIMEOUT_ORCHESTRATION_RESPONSE = "60"; @RestClient @Inject @@ -334,29 +331,32 @@ public Uni> validationRoleAndRetrieveUsers(List users, S ? product.getParent().getRoleMappings() : product.getRoleMappings(); + final String userMailRandomUuid = UUID.randomUUID().toString(); + return Multi.createFrom().iterable(users) .onItem().transformToUni(user -> userRegistryApi .searchUsingPOST(USERS_FIELD_LIST, new UserSearchDto().fiscalCode(user.getTaxCode())) /* retrieve userId, if found will eventually update some fields */ - .onItem().transformToUni(userResource -> createUpdateUserRequest(user, userResource, onboardingId) + .onItem().transformToUni(userResource -> createUpdateUserRequest(user, userResource, userMailRandomUuid) .map(userUpdateRequest -> userRegistryApi.updateUsingPATCH(userResource.getId().toString(), userUpdateRequest) .replaceWith(userResource.getId())) .orElse(Uni.createFrom().item(userResource.getId()))) /* if not found 404, will create new user */ .onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException)ex).getResponse().getStatus() == 404 - ? userRegistryApi.saveUsingPATCH(createSaveUserDto(user, onboardingId)).onItem().transform(UserId::getId) + ? userRegistryApi.saveUsingPATCH(createSaveUserDto(user, userMailRandomUuid)).onItem().transform(UserId::getId) : Uni.createFrom().failure(ex)) .onItem().transform(userResourceId -> User.builder() .id(userResourceId.toString()) .role(user.getRole()) + .userMailUuid(userMailRandomUuid) .productRole(retrieveProductRole(user, roleMappings)) .build()) ) .concatenate().collect().asList(); } - private SaveUserDto createSaveUserDto(UserRequest model, String onboardingId) { + private SaveUserDto createSaveUserDto(UserRequest model, String userMailRandomUuid) { SaveUserDto resource = new SaveUserDto(); resource.setFiscalCode(model.getTaxCode()); resource.setName(new CertifiableFieldResourceOfstring() @@ -366,17 +366,17 @@ private SaveUserDto createSaveUserDto(UserRequest model, String onboardingId) { .value(model.getSurname()) .certification(CertifiableFieldResourceOfstring.CertificationEnum.NONE)); - if (Objects.nonNull(onboardingId)) { + if (Objects.nonNull(userMailRandomUuid)) { WorkContactResource contact = new WorkContactResource(); contact.setEmail(new CertifiableFieldResourceOfstring() .value(model.getEmail()) .certification(CertifiableFieldResourceOfstring.CertificationEnum.NONE)); - resource.setWorkContacts(Map.of(workContactsKey.apply(onboardingId), contact)); + resource.setWorkContacts(Map.of(userMailRandomUuid, contact)); } return resource; } - protected static Optional createUpdateUserRequest(UserRequest user, UserResource foundUser, String onboardingId) { + protected static Optional createUpdateUserRequest(UserRequest user, UserResource foundUser, String userMailRandomUuid) { Optional mutableUserFieldsDto = Optional.empty(); if (isFieldToUpdate(foundUser.getName(), user.getName())) { MutableUserFieldsDto dto = new MutableUserFieldsDto(); @@ -393,15 +393,19 @@ protected static Optional createUpdateUserRequest(UserRequ mutableUserFieldsDto = Optional.of(dto); } - if (foundUser.getWorkContacts() == null - || !foundUser.getWorkContacts().containsKey(onboardingId) - || isFieldToUpdate(foundUser.getWorkContacts().get(onboardingId).getEmail(), user.getEmail())) { + Optional> entryMail = Objects.nonNull(foundUser.getWorkContacts()) + ? foundUser.getWorkContacts().entrySet().stream() + .filter(entry -> entry.getValue().getEmail().getValue().equals(user.getEmail())) + .findFirst() + : Optional.empty(); + + if (entryMail.isEmpty()) { MutableUserFieldsDto dto = mutableUserFieldsDto.orElseGet(MutableUserFieldsDto::new); final WorkContactResource workContact = new WorkContactResource(); workContact.setEmail(new CertifiableFieldResourceOfstring() .value(user.getEmail()) .certification(CertifiableFieldResourceOfstring.CertificationEnum.NONE)); - dto.setWorkContacts(Map.of(workContactsKey.apply(onboardingId), workContact)); + dto.setWorkContacts(Map.of(userMailRandomUuid, workContact)); mutableUserFieldsDto = Optional.of(dto); } return mutableUserFieldsDto; @@ -637,22 +641,35 @@ public Uni onboardingGet(String onboardingId) { @Override public Uni onboardingGetWithUserInfo(String onboardingId) { - return onboardingGet(onboardingId) - .flatMap(onboardingGet -> fillOnboardingWithUserInfo(onboardingGet.getUsers(), workContactsKey.apply(onboardingId)) - .replaceWith(onboardingGet)); + return Onboarding.findByIdOptional(new ObjectId(onboardingId)) + .onItem().transformToUni(opt -> opt + //I must cast to Onboarding because findByIdOptional return a generic ReactiveEntity + .map(Onboarding.class::cast) + .map(onboardingGet -> Uni.createFrom().item(onboardingGet)) + .orElse(Uni.createFrom().failure(new ResourceNotFoundException(String.format("Onboarding with id %s not found!",onboardingId))))) + .flatMap(onboarding -> toUserResponseWithUserInfo(onboarding.getUsers()) + .onItem().transform(userResponses -> { + OnboardingGet onboardingGet = onboardingMapper.toGetResponse(onboarding); + onboardingGet.setUsers(userResponses); + return onboardingGet; + })); } - private Uni> fillOnboardingWithUserInfo(List users, String workContractId) { + private Uni> toUserResponseWithUserInfo(List users) { return Multi.createFrom().iterable(users) - .onItem().transformToUni(userResponse -> userRegistryApi.findByIdUsingGET(USERS_FIELD_LIST ,userResponse.getId()) - .onItem().invoke(userResource -> userMapper.fillUserResponse(userResource, userResponse)) - .onItem().invoke(userResource -> Optional.ofNullable(userResource.getWorkContacts()) - .filter(map -> map.containsKey(workContractId)) - .map(map -> map.get(workContractId)) - .filter(workContract -> StringUtils.isNotBlank(workContract.getEmail().getValue())) - .map(workContract -> workContract.getEmail().getValue()) - .ifPresent(userResponse::setEmail)) - .replaceWith(userResponse) + .onItem().transformToUni(user -> userRegistryApi.findByIdUsingGET(USERS_FIELD_LIST, user.getId()) + .onItem().transform(userResource -> { + UserResponse userResponse = userMapper.toUserResponse(user); + userMapper.fillUserResponse(userResource, userResponse); + + Optional.ofNullable(userResource.getWorkContacts()) + .filter(map -> map.containsKey(user.getUserMailUuid())) + .map(map -> map.get(user.getUserMailUuid())) + .filter(workContract -> StringUtils.isNotBlank(workContract.getEmail().getValue())) + .map(workContract -> workContract.getEmail().getValue()) + .ifPresent(userResponse::setEmail); + return userResponse; + }) ) .merge().collect().asList(); } From 050372e533b98c9899e9ff4accc63147078cf5af Mon Sep 17 00:00:00 2001 From: manuraf Date: Thu, 8 Feb 2024 18:19:03 +0100 Subject: [PATCH 3/8] using userMailUuid on functions --- .../service/CompletionServiceDefault.java | 24 +++++----- .../selfcare/onboarding/utils/PdfMapper.java | 45 ++++++++++--------- .../service/CompletionServiceDefaultTest.java | 8 ++-- .../service/ContractServiceDefaultTest.java | 5 +-- 4 files changed, 42 insertions(+), 40 deletions(-) diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java index 4dc3e8eb5..5483781bf 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java @@ -23,9 +23,7 @@ import org.openapi.quarkus.party_registry_proxy_json.api.AooApi; import org.openapi.quarkus.party_registry_proxy_json.api.UoApi; import org.openapi.quarkus.user_registry_json.api.UserApi; -import org.openapi.quarkus.user_registry_json.model.CertifiableFieldResourceOfstring; import org.openapi.quarkus.user_registry_json.model.UserResource; -import org.openapi.quarkus.user_registry_json.model.WorkContactResource; import java.util.ArrayList; import java.util.List; @@ -36,7 +34,6 @@ import static it.pagopa.selfcare.onboarding.common.PartyRole.MANAGER; import static it.pagopa.selfcare.onboarding.service.OnboardingService.USERS_FIELD_LIST; import static it.pagopa.selfcare.onboarding.service.OnboardingService.USERS_WORKS_FIELD_LIST; -import static it.pagopa.selfcare.onboarding.utils.PdfMapper.workContactsKey; @ApplicationScoped public class CompletionServiceDefault implements CompletionService { @@ -159,14 +156,15 @@ private boolean isInstitutionPresentOnIpa(Institution institution) { @Override public void sendCompletedEmail(Onboarding onboarding) { - String workContractId = workContactsKey.apply(onboarding.getOnboardingId()); - List destinationMails = onboarding.getUsers().stream() - .filter(user -> MANAGER.equals(user.getRole())) - .map(userToOnboard -> userRegistryApi.findByIdUsingGET(USERS_FIELD_LIST, userToOnboard.getId())) - .filter(user -> Objects.nonNull(user.getWorkContacts()) - && user.getWorkContacts().containsKey(workContractId)) - .map(user -> user.getWorkContacts().get(workContractId)) + .filter(userToOnboard -> MANAGER.equals(userToOnboard.getRole())) + .map(userToOnboard -> Optional.ofNullable(userRegistryApi.findByIdUsingGET(USERS_FIELD_LIST, userToOnboard.getId())) + .filter(userResource -> Objects.nonNull(userResource.getWorkContacts()) + && userResource.getWorkContacts().containsKey(userToOnboard.getUserMailUuid())) + .map(user -> user.getWorkContacts().get(userToOnboard.getUserMailUuid())) + ) + .filter(Optional::isPresent) + .map(Optional::get) .filter(workContract -> StringUtils.isNotBlank(workContract.getEmail().getValue())) .map(workContract -> workContract.getEmail().getValue()) .collect(Collectors.toList()); @@ -198,9 +196,9 @@ public void persistOnboarding(Onboarding onboarding) { .map(user -> { UserResource userResource = userRegistryApi.findByIdUsingGET(USERS_WORKS_FIELD_LIST, user.getId()); String mailWork = Optional.ofNullable(userResource.getWorkContacts()) - .map(worksContract -> worksContract.get(workContactsKey.apply(onboarding.getOnboardingId()))) - .map(WorkContactResource::getEmail) - .map(CertifiableFieldResourceOfstring::getValue) + .map(worksContract -> worksContract.get(user.getUserMailUuid())) + .map(workContactResource -> workContactResource.getEmail()) + .map(certifiable -> certifiable.getValue()) .orElseThrow(() -> new GenericOnboardingException("Work contract not found!")); Person person = userMapper.toPerson(userResource); person.setEmail(mailWork); diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java index 2612ba2f9..08622a40a 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java @@ -3,16 +3,12 @@ import it.pagopa.selfcare.onboarding.common.InstitutionType; import it.pagopa.selfcare.onboarding.common.Origin; import it.pagopa.selfcare.onboarding.common.PricingPlan; -import it.pagopa.selfcare.onboarding.entity.Billing; -import it.pagopa.selfcare.onboarding.entity.GeographicTaxonomy; -import it.pagopa.selfcare.onboarding.entity.Institution; -import it.pagopa.selfcare.onboarding.entity.Onboarding; +import it.pagopa.selfcare.onboarding.entity.*; import it.pagopa.selfcare.onboarding.exception.GenericOnboardingException; import org.openapi.quarkus.user_registry_json.model.CertifiableFieldResourceOfstring; import org.openapi.quarkus.user_registry_json.model.UserResource; import java.util.*; -import java.util.function.Function; import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_IO; import static it.pagopa.selfcare.onboarding.utils.GenericError.MANAGER_EMAIL_NOT_FOUND; @@ -31,8 +27,6 @@ public class PdfMapper { public static final String PRICING_PLAN_BASE_CHECKBOX = "pricingPlanBaseCheckbox"; public static final String PRICING_PLAN = "pricingPlan"; public static final String INSTITUTION_REGISTER_LABEL_VALUE = "institutionRegisterLabelValue"; - - public static final Function workContactsKey = onboardingId -> String.format("obg_%s", onboardingId); public static final String ORIGIN_ID_LABEL = "
  • codice di iscrizione all’Indice delle Pubbliche Amministrazioni e dei gestori di pubblici servizi (I.P.A.) ${originId}
  • "; @@ -60,7 +54,7 @@ public static Map setUpCommonData(UserResource manager, List setUpCommonData(UserResource manager, List map, UserResource validManag map.put("dataProtectionOfficerPec", institution.getDataProtectionOfficer().getPec()); } - Optional.ofNullable(getMailManager(validManager, onboarding.getOnboardingId())) + /* set manager PEC */ + onboarding.getUsers().stream() + .filter(user -> validManager.getId().toString().equals(user.getId())) + .map(User::getUserMailUuid) + .findFirst() + .map(userMailUuid -> getMailManager(validManager, userMailUuid)) .ifPresent(mail -> map.put("managerPEC", mail)); } @@ -218,25 +217,31 @@ private static String decodeInstitutionType(InstitutionType institutionType) { } } - private static String delegatesToText(List users, String workContractId) { + private static String delegatesToText(List userResources, List users) { StringBuilder builder = new StringBuilder(); - users.forEach(user -> { + userResources.forEach(userResource -> { builder .append("
    ") .append("

    Nome e Cognome: ") - .append(getStringValue(user.getName())).append(" ") - .append(getStringValue(user.getFamilyName())) + .append(getStringValue(userResource.getName())).append(" ") + .append(getStringValue(userResource.getFamilyName())) .append(" 

    \n") .append("

    Codice Fiscale: ") - .append(user.getFiscalCode()) + .append(userResource.getFiscalCode()) .append("

    \n") .append("

    Amm.ne/Ente/Società:

    \n") .append("

    Qualifica/Posizione:

    \n") .append("

    e-mail: "); - if (Objects.nonNull(user.getWorkContacts()) && user.getWorkContacts().containsKey(workContractId)) { - builder.append(getStringValue(user.getWorkContacts().get(workContractId).getEmail())); - } + users.stream() + .filter(user -> userResource.getId().toString().equals(user.getId())) + .map(User::getUserMailUuid) + .findFirst() + .filter(userMailUuid -> Objects.nonNull(userResource.getWorkContacts()) && + userResource.getWorkContacts().containsKey(userMailUuid)) + .ifPresent(userMailUuid -> + builder.append(getStringValue(userResource.getWorkContacts().get(userMailUuid).getEmail()))); + builder.append(" 

    \n") .append("

    PEC:  

    \n") diff --git a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java index ed5b6dfc9..bf9208489 100644 --- a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java +++ b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java @@ -39,7 +39,6 @@ import java.util.*; import static it.pagopa.selfcare.onboarding.service.OnboardingService.USERS_WORKS_FIELD_LIST; -import static it.pagopa.selfcare.onboarding.utils.PdfMapper.workContactsKey; import static it.pagopa.selfcare.onboarding.service.OnboardingService.USERS_FIELD_LIST; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -333,9 +332,10 @@ void persistOnboarding() { User manager = new User(); manager.setId("id"); manager.setRole(PartyRole.MANAGER); + manager.setUserMailUuid(UUID.randomUUID().toString()); onboarding.setUsers(List.of(manager)); - UserResource userResource = dummyUserResource(onboarding.getOnboardingId()); + UserResource userResource = dummyUserResource(manager.getUserMailUuid()); when(userRegistryApi.findByIdUsingGET(USERS_WORKS_FIELD_LIST, manager.getId())) .thenReturn(userResource); @@ -446,7 +446,7 @@ private Product createDummyProduct() { return product; } - private UserResource dummyUserResource(String onboardingId){ + private UserResource dummyUserResource(String userMailUuid){ UserResource userResource = new UserResource(); userResource.setId(UUID.randomUUID()); @@ -468,7 +468,7 @@ private UserResource dummyUserResource(String onboardingId){ workContactResource.email(resourceOfMail); Map map = new HashMap<>(); - map.put(workContactsKey.apply(onboardingId), workContactResource); + map.put(userMailUuid, workContactResource); userResource.setWorkContacts(map); return userResource; } diff --git a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java index a29a7efca..198c29fd0 100644 --- a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java +++ b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.Objects; -import static it.pagopa.selfcare.onboarding.utils.PdfMapper.workContactsKey; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @@ -74,7 +73,7 @@ private Onboarding createOnboarding() { return onboarding; } - UserResource createDummyUserResource(String onboardingId) { + UserResource createDummyUserResource(String userMailUuid) { UserResource validManager = new UserResource(); CertifiableFieldResourceOfstring emailCert = new CertifiableFieldResourceOfstring(); @@ -82,7 +81,7 @@ UserResource createDummyUserResource(String onboardingId) { WorkContactResource workContact = new WorkContactResource(); workContact.setEmail(emailCert); Map map = new HashMap<>(); - map.put(workContactsKey.apply(onboardingId), workContact); + map.put(userMailUuid, workContact); validManager.setWorkContacts(map); return validManager; From b5c2aa742d2b19fed892abfc2b73076ec3b16c49 Mon Sep 17 00:00:00 2001 From: manuraf Date: Fri, 9 Feb 2024 09:16:38 +0100 Subject: [PATCH 4/8] fix save usermailuuid --- .../service/OnboardingServiceDefault.java | 87 +++++++++++++------ 1 file changed, 61 insertions(+), 26 deletions(-) diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java index 9b52634de..b34259ad1 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java @@ -160,8 +160,9 @@ private Uni fillUsersAndOnboarding(Onboarding onboarding, Li .onItem().transformToUni(this::addParentDescriptionForAooOrUo) /* I have to retrieve onboarding id for saving reference to pdv */ .onItem().transformToUni(current -> Panache.withTransaction(() -> Onboarding.persist(onboarding).replaceWith(onboarding) - .onItem().transformToUni(onboardingPersisted -> validationRoleAndRetrieveUsers(userRequests, onboardingPersisted.id.toHexString(), product) - .onItem().invoke(onboardingPersisted::setUsers).replaceWith(onboardingPersisted)))) + .onItem().transformToUni(onboardingPersisted -> validationRole(userRequests) + .onItem().transformToUni(ignore -> retrieveUserResources(userRequests, product)) + .onItem().invoke(onboardingPersisted::setUsers).replaceWith(onboardingPersisted)))) /* Update onboarding data with users and start orchestration */ .onItem().transformToUni(currentOnboarding -> persistAndStartOrchestrationOnboarding(currentOnboarding, orchestrationApi.apiStartOnboardingOrchestrationGet(currentOnboarding.getId().toHexString(), timeout))) @@ -312,46 +313,66 @@ private String retrieveProductRole(UserRequest userInfo, Map> validationRoleAndRetrieveUsers(List users, String onboardingId, Product product) { + private Uni> validationRole(List users) { List validRoles = List.of(PartyRole.MANAGER, PartyRole.DELEGATE); - List usersNotValidRole = users.stream() + List usersNotValidRole = users.stream() .filter(user -> !validRoles.contains(user.getRole())) .toList(); if (!usersNotValidRole.isEmpty()) { String usersNotValidRoleString = usersNotValidRole.stream() .map(user -> user.getRole().toString()) .collect(Collectors.joining(",")); - return Uni.createFrom().failure( new InvalidRequestException(String.format(CustomError.ROLES_NOT_ADMITTED_ERROR.getMessage(), usersNotValidRoleString), + return Uni.createFrom().failure(new InvalidRequestException(String.format(CustomError.ROLES_NOT_ADMITTED_ERROR.getMessage(), usersNotValidRoleString), CustomError.ROLES_NOT_ADMITTED_ERROR.getCode())); } + return Uni.createFrom().item(users); + } + + private Uni> retrieveUserResources(List users, Product product) { + Map roleMappings = Objects.nonNull(product.getParent()) ? product.getParent().getRoleMappings() : product.getRoleMappings(); - final String userMailRandomUuid = UUID.randomUUID().toString(); - return Multi.createFrom().iterable(users) - .onItem().transformToUni(user -> userRegistryApi - .searchUsingPOST(USERS_FIELD_LIST, new UserSearchDto().fiscalCode(user.getTaxCode())) - - /* retrieve userId, if found will eventually update some fields */ - .onItem().transformToUni(userResource -> createUpdateUserRequest(user, userResource, userMailRandomUuid) - .map(userUpdateRequest -> userRegistryApi.updateUsingPATCH(userResource.getId().toString(), userUpdateRequest) - .replaceWith(userResource.getId())) - .orElse(Uni.createFrom().item(userResource.getId()))) - /* if not found 404, will create new user */ - .onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException)ex).getResponse().getStatus() == 404 - ? userRegistryApi.saveUsingPATCH(createSaveUserDto(user, userMailRandomUuid)).onItem().transform(UserId::getId) - : Uni.createFrom().failure(ex)) - .onItem().transform(userResourceId -> User.builder() - .id(userResourceId.toString()) - .role(user.getRole()) - .userMailUuid(userMailRandomUuid) - .productRole(retrieveProductRole(user, roleMappings)) - .build()) + .onItem().transformToUni(user -> userRegistryApi + /* search user by tax code */ + .searchUsingPOST(USERS_FIELD_LIST, new UserSearchDto().fiscalCode(user.getTaxCode())) + + /* retrieve userId, if found will eventually update some fields */ + .onItem().transformToUni(userResource -> { + String userMailRandomUuid = retrieveUserMailUuid(userResource, user.getEmail()); + Optional optUserFieldsDto = toUpdateUserRequest(user, userResource, userMailRandomUuid); + return optUserFieldsDto + .map(userUpdateRequest -> userRegistryApi.updateUsingPATCH(userResource.getId().toString(), userUpdateRequest) + .replaceWith(userResource.getId())) + .orElse(Uni.createFrom().item(userResource.getId())) + .map(userResourceId -> User.builder() + .id(userResourceId.toString()) + .role(user.getRole()) + .userMailUuid(userMailRandomUuid) + .productRole(retrieveProductRole(user, roleMappings)) + .build()); + } + ) + /* if not found 404, will create new user */ + .onFailure(WebApplicationException.class).recoverWithUni(ex -> { + if(((WebApplicationException) ex).getResponse().getStatus() != 404) { + return Uni.createFrom().failure(ex); + } + + String userMailRandomUuid = UUID.randomUUID().toString(); + return userRegistryApi.saveUsingPATCH(createSaveUserDto(user, userMailRandomUuid)) + .onItem().transform(userId -> User.builder() + .id(userId.getId().toString()) + .role(user.getRole()) + .userMailUuid(userMailRandomUuid) + .productRole(retrieveProductRole(user, roleMappings)) + .build()); + }) ) .concatenate().collect().asList(); } @@ -376,7 +397,20 @@ private SaveUserDto createSaveUserDto(UserRequest model, String userMailRandomUu return resource; } - protected static Optional createUpdateUserRequest(UserRequest user, UserResource foundUser, String userMailRandomUuid) { + private String retrieveUserMailUuid(UserResource foundUser, String userMail) { + if(Objects.isNull(foundUser.getWorkContacts())) { + return UUID.randomUUID().toString(); + } + + return foundUser.getWorkContacts().entrySet().stream() + .filter(entry -> Objects.nonNull(entry.getValue()) && Objects.nonNull(entry.getValue().getEmail())) + .filter(entry -> entry.getValue().getEmail().getValue().equals(userMail)) + .findFirst() + .map(Map.Entry::getKey) + .orElse(UUID.randomUUID().toString()); + } + + protected static Optional toUpdateUserRequest(UserRequest user, UserResource foundUser, String userMailRandomUuid) { Optional mutableUserFieldsDto = Optional.empty(); if (isFieldToUpdate(foundUser.getName(), user.getName())) { MutableUserFieldsDto dto = new MutableUserFieldsDto(); @@ -395,6 +429,7 @@ protected static Optional createUpdateUserRequest(UserRequ Optional> entryMail = Objects.nonNull(foundUser.getWorkContacts()) ? foundUser.getWorkContacts().entrySet().stream() + .filter(entry -> Objects.nonNull(entry.getValue()) && Objects.nonNull(entry.getValue().getEmail())) .filter(entry -> entry.getValue().getEmail().getValue().equals(user.getEmail())) .findFirst() : Optional.empty(); From 072c480ba23fcf9b02a2513f1e33d8a1c9afff52 Mon Sep 17 00:00:00 2001 From: manuraf Date: Fri, 9 Feb 2024 09:16:49 +0100 Subject: [PATCH 5/8] fix get mail manager --- .../it/pagopa/selfcare/onboarding/utils/PdfMapper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java index 08622a40a..80c7973d6 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/utils/PdfMapper.java @@ -34,11 +34,16 @@ public static Map setUpCommonData(UserResource manager, List user.getId().equals(manager.getId().toString())) + .findFirst() + .orElseThrow(); + List geographicTaxonomies = Optional.ofNullable(onboarding.getInstitution().getGeographicTaxonomies()) .map(geoTaxonomies -> geoTaxonomies.stream().map(GeographicTaxonomy::getDesc).toList()) .orElse(List.of()); - String mailManager = getMailManager(manager, onboarding.getOnboardingId()); + String mailManager = getMailManager(manager, userManager.getUserMailUuid()); if (Objects.isNull(mailManager)) { throw new GenericOnboardingException(MANAGER_EMAIL_NOT_FOUND.getMessage(), MANAGER_EMAIL_NOT_FOUND.getCode()); } From 8d24472064dafadd68734ef3d95997e9e7600c2c Mon Sep 17 00:00:00 2001 From: manuraf Date: Fri, 9 Feb 2024 09:41:36 +0100 Subject: [PATCH 6/8] unit test --- .../service/ContractServiceDefaultTest.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java index 198c29fd0..500849014 100644 --- a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java +++ b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/ContractServiceDefaultTest.java @@ -9,6 +9,7 @@ import it.pagopa.selfcare.onboarding.crypto.PadesSignService; import it.pagopa.selfcare.onboarding.entity.Institution; import it.pagopa.selfcare.onboarding.entity.Onboarding; +import it.pagopa.selfcare.onboarding.entity.User; import jakarta.inject.Inject; import org.bson.types.ObjectId; import org.junit.jupiter.api.BeforeEach; @@ -20,10 +21,7 @@ import org.openapi.quarkus.user_registry_json.model.WorkContactResource; import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; @@ -70,12 +68,17 @@ private Onboarding createOnboarding() { institution.setBusinessRegisterPlace("place"); institution.setShareCapital("10000"); onboarding.setInstitution(institution); + + User user = new User(); + user.setId(UUID.randomUUID().toString()); + user.setUserMailUuid("setUserMailUuid"); + onboarding.setUsers(List.of(user)); return onboarding; } - UserResource createDummyUserResource(String userMailUuid) { + UserResource createDummyUserResource(String id, String userMailUuid) { UserResource validManager = new UserResource(); - + validManager.setId(UUID.fromString(id)); CertifiableFieldResourceOfstring emailCert = new CertifiableFieldResourceOfstring(); emailCert.setValue("email"); WorkContactResource workContact = new WorkContactResource(); @@ -94,7 +97,8 @@ void createContractPDF() { final String productNameAccent = "Interoperabilità"; Onboarding onboarding = createOnboarding(); - UserResource manager = createDummyUserResource(onboarding.getOnboardingId()); + User userManager = onboarding.getUsers().get(0); + UserResource manager = createDummyUserResource(userManager.getId(), userManager.getUserMailUuid()); Mockito.when(azureBlobClient.getFileAsText(contractFilepath)).thenReturn(contractHtml); @@ -116,7 +120,8 @@ void createContractPDFSA() { final String contractHtml = "contract"; Onboarding onboarding = createOnboarding(); - UserResource manager = createDummyUserResource(onboarding.getOnboardingId()); + User userManager = onboarding.getUsers().get(0); + UserResource manager = createDummyUserResource(userManager.getId(), userManager.getUserMailUuid()); onboarding.getInstitution().setInstitutionType(InstitutionType.SA); Mockito.when(azureBlobClient.getFileAsText(contractFilepath)).thenReturn(contractHtml); @@ -132,7 +137,8 @@ void createContractPDFAndSigned() { final String contractHtml = "contract"; Onboarding onboarding = createOnboarding(); - UserResource manager = createDummyUserResource(onboarding.getOnboardingId()); + User userManager = onboarding.getUsers().get(0); + UserResource manager = createDummyUserResource(userManager.getId(), userManager.getUserMailUuid()); PagoPaSignatureConfig pagoPaSignatureConfig = Mockito.spy(this.pagoPaSignatureConfig); when(pagoPaSignatureConfig.source()).thenReturn("local"); From 4886d34f25a0f62e75f33e0e48dd33ed7ecb044b Mon Sep 17 00:00:00 2001 From: manuraf Date: Fri, 9 Feb 2024 10:52:16 +0100 Subject: [PATCH 7/8] remove unused productid --- .../selfcare/onboarding/service/CompletionServiceDefault.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java index 5483781bf..649056889 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java @@ -83,7 +83,7 @@ public String createInstitutionAndPersistInstitutionId(Onboarding onboarding) { InstitutionResponse institutionResponse = Objects.isNull(institutionsResponse.getInstitutions()) || institutionsResponse.getInstitutions().isEmpty() - ? createInstitution(institution, onboarding.getProductId()) + ? createInstitution(institution) : institutionsResponse.getInstitutions().get(0); onboardingRepository @@ -98,7 +98,7 @@ public String createInstitutionAndPersistInstitutionId(Onboarding onboarding) { * Origin indicates which is the indexes where data come from, for ex. IPA comes from index of Pubbliche Amministrazioni * Look at https://pagopa.atlassian.net/wiki/spaces/SCP/pages/708804909/Glossario for more information about institution type and indexes */ - private InstitutionResponse createInstitution(Institution institution, String productId) { + private InstitutionResponse createInstitution(Institution institution) { if(InstitutionType.SA.equals(institution.getInstitutionType()) && Origin.ANAC.equals(institution.getOrigin())) { From 53848a38542cf0a58463ca58fa51e197182fbb71 Mon Sep 17 00:00:00 2001 From: manuraf Date: Fri, 9 Feb 2024 10:52:23 +0100 Subject: [PATCH 8/8] unit test --- .../service/OnboardingServiceDefaultTest.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java index 4fba57f3a..9c5abf5e8 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java @@ -55,6 +55,7 @@ import org.openapi.quarkus.user_registry_json.model.CertifiableFieldResourceOfstring; import org.openapi.quarkus.user_registry_json.model.UserId; import org.openapi.quarkus.user_registry_json.model.UserResource; +import org.openapi.quarkus.user_registry_json.model.WorkContactResource; import java.io.File; import java.time.LocalDateTime; @@ -115,6 +116,7 @@ class OnboardingServiceDefaultTest { .build(); final static UserResource managerResource; + final static UserResource managerResourceWk; final static File testFile = new File("src/test/resources/application.properties"); @@ -127,6 +129,23 @@ class OnboardingServiceDefaultTest { managerResource.setFamilyName(new CertifiableFieldResourceOfstring() .value(manager.getSurname()) .certification(CertifiableFieldResourceOfstring.CertificationEnum.NONE)); + + managerResourceWk = new UserResource(); + managerResourceWk.setId(UUID.randomUUID()); + managerResourceWk.setName(new CertifiableFieldResourceOfstring() + .value(manager.getName()) + .certification(CertifiableFieldResourceOfstring.CertificationEnum.NONE)); + managerResourceWk.setFamilyName(new CertifiableFieldResourceOfstring() + .value(manager.getSurname()) + .certification(CertifiableFieldResourceOfstring.CertificationEnum.NONE)); + + Map map = new HashMap<>(); + WorkContactResource workContactResource = new WorkContactResource(); + workContactResource.setEmail(new CertifiableFieldResourceOfstring() + .value("mail@live.it") + .certification(CertifiableFieldResourceOfstring.CertificationEnum.NONE)); + map.put(UUID.randomUUID().toString(), workContactResource); + managerResourceWk.setWorkContacts(map); } @Test @@ -640,7 +659,7 @@ void onboarding_whenUserFoundedAndWillNotUpdate(UniAsserter asserter) { void onboarding_whenUserFoundedAndWillUpdate(UniAsserter asserter) { UserRequest manager = UserRequest.builder() .name("name") - .taxCode(managerResource.getFiscalCode()) + .taxCode(managerResourceWk.getFiscalCode()) .role(PartyRole.MANAGER) .build(); @@ -651,14 +670,21 @@ void onboarding_whenUserFoundedAndWillUpdate(UniAsserter asserter) { institutionPspRequest.setInstitutionType(InstitutionType.GSP); request.setInstitution(institutionPspRequest); - mockPersistOnboarding(asserter); + mockSimpleProductValidAssert(request.getProductId(), false, asserter); + mockVerifyOnboardingNotFound(asserter); + + asserter.execute(() -> PanacheMock.mock(Onboarding.class)); + + asserter.execute(() -> when(userRegistryApi.searchUsingPOST(any(),any())) + .thenReturn(Uni.createFrom().item(managerResourceWk))); asserter.execute(() -> when(userRegistryApi.updateUsingPATCH(any(),any())) .thenReturn(Uni.createFrom().item(Response.noContent().build()))); - mockSimpleSearchPOSTAndPersist(asserter); - mockSimpleProductValidAssert(request.getProductId(), false, asserter); - mockVerifyOnboardingNotFound(asserter); + mockPersistOnboarding(asserter); + + asserter.execute(() -> when(orchestrationApi.apiStartOnboardingOrchestrationGet(any(), any())) + .thenReturn(Uni.createFrom().item(new OrchestrationResponse()))); asserter.assertThat(() -> onboardingService.onboarding(request, users), Assertions::assertNotNull);