Skip to content

Commit

Permalink
Merge pull request #243 from pagopa/feature/SELC-6199
Browse files Browse the repository at this point in the history
[SELC-6199] fix: update userMailUuid on onboarding
  • Loading branch information
gaetano-miglionico authored Jan 24, 2025
2 parents 4d68335 + 119c39b commit 5130a9f
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -459,10 +459,11 @@ public Uni<String> createUserByUserId(AddUserRoleDto userDto, String userId, Log
Map<String, Object> queryParameter = userUtils.retrieveMapForFilter(userInstitutionFilters, productFilters);
return userInstitutionService.retrieveFirstFilteredUserInstitution(queryParameter)
.onItem().transformToUni(userInstitution -> {
if (Objects.nonNull(userInstitution)) {
if (Optional.ofNullable(userInstitution).isPresent()) {
log.info("User with userId: {} has already onboarded for product {}. Proceeding with check role", userId, userDto.getProduct().getProductId());
PartyRole roleOnProduct = retrieveUserRoleOnProduct(userInstitution, userDto.getProduct().getProductId());
return evaluateRoleAndCreateOrUpdateUserByUserId(userDto, userId, loggedUser, roleOnProduct);
return checkAndUpdateUserMail(userInstitution, userDto.getUserMailUuid())
.onItem().transformToUni(ignore -> evaluateRoleAndCreateOrUpdateUserByUserId(userDto, userId, loggedUser, roleOnProduct));
} else {
log.info("User with userId: {} has not onboarded for product {}. Proceeding with create", userId, userDto.getProduct().getProductId());
return createOrUpdateUserByUserId(userDto, userId, loggedUser);
Expand All @@ -471,6 +472,20 @@ public Uni<String> createUserByUserId(AddUserRoleDto userDto, String userId, Log
.onFailure().invoke(exception -> log.error("Error during createOrUpdateManagerByUserId for userId: {}, institutionId: {}: {}", userId, userDto.getInstitutionId(), exception.getMessage(), exception));
}

/**
* Check if the user's mail uuid is still the same on UserInstitution and update it if not
*/
private Uni<UserInstitution> checkAndUpdateUserMail(UserInstitution userInstitution, String userMailUuid) {
if (userMailUuid == null || userMailUuid.equals(userInstitution.getUserMailUuid())) {
log.info("UserMailUuid not changed for user {} and institution {}", userInstitution.getUserId(), userInstitution.getInstitutionId());
return Uni.createFrom().item(userInstitution);
}
userInstitution.setUserMailUuid(userMailUuid);
userInstitution.setUserMailUpdatedAt(OffsetDateTime.now());
log.info("Updating userMailUuid for user {} and institution {}", userInstitution.getUserId(), userInstitution.getInstitutionId());
return userInstitutionService.persistOrUpdate(userInstitution);
}

/**
* The evaluateRoleAndCreateOrUpdateUserByUserId method is designed to evaluate the role of a user for a specific product
* and either create or update the user's role based on certain conditions.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import it.pagopa.selfcare.user.entity.filter.OnboardedProductFilter;
import it.pagopa.selfcare.user.entity.filter.UserInstitutionFilter;
import it.pagopa.selfcare.user.exception.InvalidRequestException;
import it.pagopa.selfcare.user.exception.UserRoleAlreadyPresentException;
import it.pagopa.selfcare.user.exception.ResourceNotFoundException;
import it.pagopa.selfcare.user.exception.UserRoleAlreadyPresentException;
import it.pagopa.selfcare.user.mapper.UserMapper;
import it.pagopa.selfcare.user.model.LoggedUser;
import it.pagopa.selfcare.user.model.OnboardedProduct;
Expand All @@ -48,13 +48,7 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.openapi.quarkus.user_registry_json.model.BirthDateCertifiableSchema;
import org.openapi.quarkus.user_registry_json.model.EmailCertifiableSchema;
import org.openapi.quarkus.user_registry_json.model.FamilyNameCertifiableSchema;
import org.openapi.quarkus.user_registry_json.model.NameCertifiableSchema;
import org.openapi.quarkus.user_registry_json.model.UserResource;
import org.openapi.quarkus.user_registry_json.model.UserSearchDto;
import org.openapi.quarkus.user_registry_json.model.WorkContactResource;
import org.openapi.quarkus.user_registry_json.model.*;

import java.time.LocalDate;
import java.time.OffsetDateTime;
Expand Down Expand Up @@ -1487,6 +1481,119 @@ void createManagerByUserIdUserInstitutionNotFound() {
.assertCompleted();
}

@Test
void createUserByUserIdWithUpdatedMail() {
AddUserRoleDto addUserRoleDto = new AddUserRoleDto();
addUserRoleDto.setInstitutionId("institutionId");
addUserRoleDto.setUserMailUuid("newUserMailUuid");
AddUserRoleDto.Product addUserRoleProduct = new AddUserRoleDto.Product();
addUserRoleProduct.setProductId("test");
addUserRoleProduct.setRole(MANAGER.name());
addUserRoleDto.setProduct(addUserRoleProduct);

LoggedUser loggedUser = LoggedUser.builder().build();
OnboardedProduct product = new OnboardedProduct();
product.setProductId("test");
product.setProductRole("admin");
product.setRole(MANAGER);
product.setStatus(OnboardedProductState.ACTIVE);

UserInstitution userInstitution = new UserInstitution();
OnboardedProduct onboardedProduct = new OnboardedProduct();
onboardedProduct.setStatus(OnboardedProductState.ACTIVE);
List<OnboardedProduct> products = new ArrayList<>();
products.add(product);
products.add(onboardedProduct);
userInstitution.setProducts(products);
userInstitution.setUserMailUuid("oldUserMailUuid");

when(userInstitutionService.retrieveFirstFilteredUserInstitution(anyMap()))
.thenReturn(Uni.createFrom().item(userInstitution));
when(userInstitutionService.persistOrUpdate(userInstitution))
.thenReturn(Uni.createFrom().item(userInstitution));

userService.createUserByUserId(addUserRoleDto, "userId", loggedUser)
.subscribe().withSubscriber(UniAssertSubscriber.create())
.assertFailedWith(UserRoleAlreadyPresentException.class);
assertEquals("newUserMailUuid", userInstitution.getUserMailUuid());
assertNotNull(userInstitution.getUserMailUpdatedAt());
}

@Test
void createUserByUserIdWithoutUpdatedMail() {
AddUserRoleDto addUserRoleDto = new AddUserRoleDto();
addUserRoleDto.setInstitutionId("institutionId");
addUserRoleDto.setUserMailUuid("userMailUuid");
AddUserRoleDto.Product addUserRoleProduct = new AddUserRoleDto.Product();
addUserRoleProduct.setProductId("test");
addUserRoleProduct.setRole(MANAGER.name());
addUserRoleDto.setProduct(addUserRoleProduct);

LoggedUser loggedUser = LoggedUser.builder().build();
OnboardedProduct product = new OnboardedProduct();
product.setProductId("test");
product.setProductRole("admin");
product.setRole(MANAGER);
product.setStatus(OnboardedProductState.ACTIVE);

UserInstitution userInstitution = new UserInstitution();
OnboardedProduct onboardedProduct = new OnboardedProduct();
onboardedProduct.setStatus(OnboardedProductState.ACTIVE);
List<OnboardedProduct> products = new ArrayList<>();
products.add(product);
products.add(onboardedProduct);
userInstitution.setProducts(products);
userInstitution.setUserMailUuid("userMailUuid");

when(userInstitutionService.retrieveFirstFilteredUserInstitution(anyMap()))
.thenReturn(Uni.createFrom().item(userInstitution));
when(userInstitutionService.persistOrUpdate(userInstitution))
.thenReturn(Uni.createFrom().item(userInstitution));

userService.createUserByUserId(addUserRoleDto, "userId", loggedUser)
.subscribe().withSubscriber(UniAssertSubscriber.create())
.assertFailedWith(UserRoleAlreadyPresentException.class);
assertEquals("userMailUuid", userInstitution.getUserMailUuid());
assertNull(userInstitution.getUserMailUpdatedAt());
}

@Test
void createUserByUserIdWithNullUserMailFromRequest() {
AddUserRoleDto addUserRoleDto = new AddUserRoleDto();
addUserRoleDto.setInstitutionId("institutionId");
AddUserRoleDto.Product addUserRoleProduct = new AddUserRoleDto.Product();
addUserRoleProduct.setProductId("test");
addUserRoleProduct.setRole(MANAGER.name());
addUserRoleDto.setProduct(addUserRoleProduct);

LoggedUser loggedUser = LoggedUser.builder().build();
OnboardedProduct product = new OnboardedProduct();
product.setProductId("test");
product.setProductRole("admin");
product.setRole(MANAGER);
product.setStatus(OnboardedProductState.ACTIVE);

UserInstitution userInstitution = new UserInstitution();
OnboardedProduct onboardedProduct = new OnboardedProduct();
onboardedProduct.setStatus(OnboardedProductState.ACTIVE);
List<OnboardedProduct> products = new ArrayList<>();
products.add(product);
products.add(onboardedProduct);
userInstitution.setProducts(products);
userInstitution.setUserMailUuid("userMailUuid");

when(userInstitutionService.retrieveFirstFilteredUserInstitution(anyMap()))
.thenReturn(Uni.createFrom().item(userInstitution));
when(userInstitutionService.persistOrUpdate(userInstitution))
.thenReturn(Uni.createFrom().item(userInstitution));

userService.createUserByUserId(addUserRoleDto, "userId", loggedUser)
.subscribe().withSubscriber(UniAssertSubscriber.create())
.assertFailedWith(UserRoleAlreadyPresentException.class);
assertEquals("userMailUuid", userInstitution.getUserMailUuid());
assertNull(userInstitution.getUserMailUpdatedAt());
}

private UserInstitution createUserInstitutionWithoutManagerRole() {
UserInstitution userInstitution = new UserInstitution();
OnboardedProduct onboardedProduct = new OnboardedProduct();
Expand Down

0 comments on commit 5130a9f

Please sign in to comment.