Skip to content

Commit deb015e

Browse files
[SELC-5856] Fix add user product Role to allowed multirole (#205)
1 parent bcefe5c commit deb015e

File tree

2 files changed

+203
-27
lines changed

2 files changed

+203
-27
lines changed

Diff for: apps/user-ms/src/main/java/it/pagopa/selfcare/user/service/UserServiceImpl.java

+37-24
Original file line numberDiff line numberDiff line change
@@ -480,23 +480,36 @@ private Uni<UserInstitution> updateOrCreateUserInstitution(AddUserRoleDto userDt
480480
}
481481

482482
log.info(USER_INSTITUTION_FOUNDED, userId, userDto.getInstitutionId());
483-
//Verify if productRole already exists
484-
if(Optional.ofNullable(userInstitution.getProducts())
485-
.orElse(Collections.emptyList())
486-
.stream()
487-
.filter(onboardedProduct -> onboardedProduct.getStatus().equals(ACTIVE))
488-
.filter(onboardedProduct -> userDto.getProduct().getProductId().equals(onboardedProduct.getProductId()))
489-
.anyMatch(onboardedProduct -> userDto.getProduct().getProductRoles().contains(onboardedProduct.getProductRole()))){
490-
return Uni.createFrom().nullItem();
483+
484+
if(checkAlreadyOnboardedRole(userDto.getProduct(), userInstitution)){
485+
throw new InvalidRequestException(String.format("User already has different role on Product %s", userDto.getProduct().getProductId()));
491486
}
492487

493-
List<String> productRoleToAdd = checkAlreadyOnboardedProdcutRole(userDto.getProduct().getProductId(), userDto.getProduct().getProductRoles(), userInstitution);
488+
List<String> productRoleToAdd = checkAlreadyOnboardedProductRole(userDto.getProduct().getProductId(), userDto.getProduct().getProductRoles(), userInstitution);
494489
userDto.getProduct().setProductRoles(productRoleToAdd);
495490

496491
productRoleToAdd.forEach(productRole -> userInstitution.getProducts().add(onboardedProductMapper.toNewOnboardedProduct(userDto.getProduct(), productRole)));
497492
return Uni.createFrom().item(userInstitution);
498493
}
499494

495+
private boolean checkAlreadyOnboardedRole(AddUserRoleDto.Product product, UserInstitution userInstitution) {
496+
return Optional.ofNullable(userInstitution.getProducts())
497+
.orElse(Collections.emptyList())
498+
.stream()
499+
.filter(onboardedProduct -> onboardedProduct.getStatus().equals(ACTIVE))
500+
.filter(onboardedProduct -> onboardedProduct.getProductId().equalsIgnoreCase(product.getProductId()))
501+
.anyMatch(onboardedProduct -> !onboardedProduct.getRole().name().equalsIgnoreCase(product.getRole()));
502+
}
503+
504+
private boolean checkAlreadyOnboardedRole(CreateUserDto.Product product, UserInstitution userInstitution) {
505+
return Optional.ofNullable(userInstitution.getProducts())
506+
.orElse(Collections.emptyList())
507+
.stream()
508+
.filter(onboardedProduct -> onboardedProduct.getStatus().equals(ACTIVE))
509+
.filter(onboardedProduct -> onboardedProduct.getProductId().equalsIgnoreCase(product.getProductId()))
510+
.anyMatch(onboardedProduct -> !onboardedProduct.getRole().name().equalsIgnoreCase(product.getRole()));
511+
}
512+
500513
/**
501514
* Updates or creates a UserInstitution based on the provided data.
502515
* Return null value if UserInstitution exists in ACTIVE with the same productRole
@@ -514,17 +527,13 @@ private Uni<UserInstitution> updateOrCreateUserInstitution(CreateUserDto userDto
514527
}
515528

516529
log.info(USER_INSTITUTION_FOUNDED, userId, userDto.getInstitutionId());
517-
//Verify if productRole already exists
518-
if(Optional.ofNullable(userInstitution.getProducts())
519-
.orElse(Collections.emptyList())
520-
.stream()
521-
.filter(onboardedProduct -> onboardedProduct.getStatus().equals(ACTIVE))
522-
.filter(onboardedProduct -> userDto.getProduct().getProductId().equals(onboardedProduct.getProductId()))
523-
.anyMatch(onboardedProduct -> userDto.getProduct().getProductRoles().contains(onboardedProduct.getProductRole()))){
524-
return Uni.createFrom().nullItem();
530+
log.info(USER_INSTITUTION_FOUNDED, userId, userDto.getInstitutionId());
531+
532+
if(checkAlreadyOnboardedRole(userDto.getProduct(), userInstitution)){
533+
throw new InvalidRequestException(String.format("User already has different role on Product %s", userDto.getProduct().getProductId()));
525534
}
526535

527-
List<String> productRoleToAdd = checkAlreadyOnboardedProdcutRole(userDto.getProduct().getProductId(), userDto.getProduct().getProductRoles(), userInstitution);
536+
List<String> productRoleToAdd = checkAlreadyOnboardedProductRole(userDto.getProduct().getProductId(), userDto.getProduct().getProductRoles(), userInstitution);
528537
userDto.getProduct().setProductRoles(productRoleToAdd);
529538

530539
userInstitution.setUserMailUuid(mailUuid);
@@ -533,20 +542,24 @@ private Uni<UserInstitution> updateOrCreateUserInstitution(CreateUserDto userDto
533542
return Uni.createFrom().item(userInstitution);
534543
}
535544

536-
private List<String> checkAlreadyOnboardedProdcutRole(String productId, List<String> productRole, UserInstitution userInstitution) {
537-
List<String> productAlreadyOnboarded = Optional.ofNullable(userInstitution.getProducts())
545+
private List<String> checkAlreadyOnboardedProductRole(String productId, List<String> productRole, UserInstitution userInstitution) {
546+
547+
List<String> productAlreadyOnboarded = new ArrayList<>(Optional.ofNullable(userInstitution.getProducts())
538548
.orElse(Collections.emptyList())
539549
.stream()
540550
.filter(onboardedProduct -> onboardedProduct.getProductId().equals(productId))
541-
//.filter(onboardedProduct -> productRole.contains(onboardedProduct.getProductRole()))
551+
.filter(onboardedProduct -> productRole.contains(onboardedProduct.getProductRole()))
542552
.filter(onboardedProduct -> onboardedProduct.getStatus().equals(ACTIVE))
543553
.map(OnboardedProduct::getProductRole)
544-
.toList();
554+
.toList());
555+
556+
List<String> productRoleFinal = new ArrayList<>(productRole);
557+
productRoleFinal.removeIf(productAlreadyOnboarded::contains);
545558

546-
if (!productAlreadyOnboarded.isEmpty()) {
559+
if (!productAlreadyOnboarded.isEmpty() && CollectionUtils.isNullOrEmpty(productRoleFinal)) {
547560
throw new InvalidRequestException(String.format("User already has roles on Product %s", productId));
548561
}
549-
return productRole;
562+
return productRoleFinal;
550563
}
551564

552565

Diff for: apps/user-ms/src/test/java/it/pagopa/selfcare/user/service/UserServiceTest.java

+166-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.smallrye.mutiny.Uni;
1414
import io.smallrye.mutiny.helpers.test.AssertSubscriber;
1515
import io.smallrye.mutiny.helpers.test.UniAssertSubscriber;
16+
import it.pagopa.selfcare.onboarding.common.PartyRole;
1617
import it.pagopa.selfcare.product.entity.Product;
1718
import it.pagopa.selfcare.product.service.ProductService;
1819
import it.pagopa.selfcare.user.controller.request.AddUserRoleDto;
@@ -58,10 +59,12 @@
5859
import java.util.*;
5960

6061
import static it.pagopa.selfcare.onboarding.common.PartyRole.MANAGER;
62+
import static it.pagopa.selfcare.onboarding.common.PartyRole.OPERATOR;
6163
import static it.pagopa.selfcare.user.constant.CustomError.*;
6264
import static it.pagopa.selfcare.user.model.constants.EventsMetric.EVENTS_USER_INSTITUTION_SUCCESS;
6365
import static it.pagopa.selfcare.user.model.constants.EventsName.EVENT_USER_MS_NAME;
6466
import static it.pagopa.selfcare.user.model.constants.OnboardedProductState.ACTIVE;
67+
import static it.pagopa.selfcare.user.model.constants.OnboardedProductState.DELETED;
6568
import static it.pagopa.selfcare.user.service.UserServiceImpl.USERS_FIELD_LIST_WITHOUT_FISCAL_CODE;
6669
import static it.pagopa.selfcare.user.service.UserServiceImpl.USERS_WORKS_FIELD_LIST;
6770
import static org.junit.jupiter.api.Assertions.*;
@@ -141,6 +144,7 @@ private UserInstitution createUserInstitution(){
141144
OnboardedProduct productTest = new OnboardedProduct();
142145
productTest.setProductId("prod-test");
143146
productTest.setProductRole("operator");
147+
productTest.setRole(PartyRole.OPERATOR);
144148
productTest.setStatus(OnboardedProductState.DELETED);
145149
List<OnboardedProduct> products = new ArrayList<>();
146150
products.add(product);
@@ -807,7 +811,8 @@ void testCreateOrUpdateUser_UpdateUser_SuccessByFiscalCode_with2role() {
807811
CreateUserDto.User user = new CreateUserDto.User();
808812
user.setFiscalCode("fiscalCode");
809813
CreateUserDto.Product createUserProduct = new CreateUserDto.Product();
810-
createUserProduct.setProductId("prod-io");
814+
createUserProduct.setProductId("test");
815+
createUserProduct.setRole(MANAGER.name());
811816
createUserProduct.setProductRoles(List.of("admin2","admin3"));
812817
createUserDto.setUser(user);
813818
createUserDto.setProduct(createUserProduct);
@@ -847,6 +852,96 @@ void testCreateOrUpdateUser_UpdateUser_SuccessByFiscalCode_with2role() {
847852
verify(userNotificationService).sendCreateUserNotification(any(), any(), any(), any(), any(),any());
848853
}
849854

855+
@Test
856+
void testCreateOrUpdateUser_UpdateUser_SuccessByFiscalCode_with2role_oneAlreadyOnboarded() {
857+
UserInstitution userInstitution = createUserInstitution();
858+
// Prepare test data
859+
CreateUserDto createUserDto = new CreateUserDto();
860+
CreateUserDto.User user = new CreateUserDto.User();
861+
user.setFiscalCode("fiscalCode");
862+
CreateUserDto.Product createUserProduct = new CreateUserDto.Product();
863+
createUserProduct.setProductId("test");
864+
createUserProduct.setRole(MANAGER.name());
865+
createUserProduct.setProductRoles(List.of("admin","admin3"));
866+
createUserDto.setUser(user);
867+
createUserDto.setProduct(createUserProduct);
868+
LoggedUser loggedUser = LoggedUser.builder().build();
869+
870+
Product product = new Product();
871+
product.setDescription("description");
872+
873+
UserToNotify userToNotify = new UserToNotify();
874+
userToNotify.setUserId(userId.toString());
875+
876+
UserNotificationToSend userNotificationToSend = new UserNotificationToSend();
877+
userNotificationToSend.setUser(userToNotify);
878+
879+
// Mock external dependencies
880+
when(userRegistryApi.searchUsingPOST(any(), any())).thenReturn(Uni.createFrom().item(userResource));
881+
when(userInstitutionService.findByUserIdAndInstitutionId(any(), any())).thenReturn(Uni.createFrom().item(userInstitution));
882+
when(userRegistryApi.updateUsingPATCH(any(), any())).thenReturn(Uni.createFrom().item(Response.ok().build()));
883+
when(userInstitutionService.persistOrUpdate(any())).thenReturn(Uni.createFrom().item(userInstitution));
884+
when(productService.getProduct(any())).thenReturn(product);
885+
when(userNotificationService.sendCreateUserNotification(any(), any(), any(), any(), any(),any())).thenReturn(Uni.createFrom().voidItem());
886+
when(userUtils.buildUsersNotificationResponse(any(), any())).thenReturn(List.of(userNotificationToSend));
887+
888+
// Call the method
889+
UniAssertSubscriber<CreateOrUpdateUserByFiscalCodeResponse> subscriber = userService.createOrUpdateUserByFiscalCode(createUserDto, loggedUser)
890+
.subscribe().withSubscriber(UniAssertSubscriber.create());
891+
892+
Assertions.assertEquals(3, userInstitution.getProducts().size());
893+
// Verify the result
894+
895+
CreateOrUpdateUserByFiscalCodeResponse response = subscriber.awaitItem().getItem();
896+
897+
assertEquals(userId.toString(),response.getUserId());
898+
verify(userRegistryApi).updateUsingPATCH(any(), any());
899+
verify(userInstitutionService).persistOrUpdate(any());
900+
verify(userInstitutionService).findByUserIdAndInstitutionId(any(), any());
901+
verify(userNotificationService).sendCreateUserNotification(any(), any(), any(), any(), any(),any());
902+
}
903+
904+
@Test
905+
void testCreateOrUpdateUser_UpdateUser_SuccessByFiscalCode_with2role_oneAlreadyOnboarded_withDifferentSelcRole() {
906+
UserInstitution userInstitution = createUserInstitution();
907+
// Prepare test data
908+
CreateUserDto createUserDto = new CreateUserDto();
909+
CreateUserDto.User user = new CreateUserDto.User();
910+
user.setFiscalCode("fiscalCode");
911+
CreateUserDto.Product createUserProduct = new CreateUserDto.Product();
912+
createUserProduct.setProductId("test");
913+
createUserProduct.setRole(PartyRole.OPERATOR.name());
914+
createUserProduct.setProductRoles(List.of("admin","admin3"));
915+
createUserDto.setUser(user);
916+
createUserDto.setProduct(createUserProduct);
917+
LoggedUser loggedUser = LoggedUser.builder().build();
918+
919+
Product product = new Product();
920+
product.setDescription("description");
921+
922+
UserToNotify userToNotify = new UserToNotify();
923+
userToNotify.setUserId(userId.toString());
924+
925+
UserNotificationToSend userNotificationToSend = new UserNotificationToSend();
926+
userNotificationToSend.setUser(userToNotify);
927+
928+
// Mock external dependencies
929+
when(userRegistryApi.searchUsingPOST(any(), any())).thenReturn(Uni.createFrom().item(userResource));
930+
when(userInstitutionService.findByUserIdAndInstitutionId(any(), any())).thenReturn(Uni.createFrom().item(userInstitution));
931+
when(userRegistryApi.updateUsingPATCH(any(), any())).thenReturn(Uni.createFrom().item(Response.ok().build()));
932+
when(userInstitutionService.persistOrUpdate(any())).thenReturn(Uni.createFrom().item(userInstitution));
933+
when(productService.getProduct(any())).thenReturn(product);
934+
when(userNotificationService.sendCreateUserNotification(any(), any(), any(), any(), any(),any())).thenReturn(Uni.createFrom().voidItem());
935+
when(userUtils.buildUsersNotificationResponse(any(), any())).thenReturn(List.of(userNotificationToSend));
936+
937+
userService.createOrUpdateUserByFiscalCode(createUserDto, loggedUser)
938+
.subscribe().withSubscriber(UniAssertSubscriber.create())
939+
.assertFailedWith(InvalidRequestException.class, "User already has different role on Product test");
940+
941+
Assertions.assertEquals(2, userInstitution.getProducts().size());
942+
}
943+
944+
850945
@Test
851946
void testCreateOrUpdateUser_CreateUser_SuccessByFiscalCode() {
852947
// Prepare test data
@@ -959,20 +1054,87 @@ void testCreateOrUpdateUser_UpdateUser_ProductAlreadyOnboarded() {
9591054
AddUserRoleDto.Product addUserRoleProduct = new AddUserRoleDto.Product();
9601055
addUserRoleProduct.setProductId("test");
9611056
addUserRoleProduct.setDelegationId("delegationId");
962-
addUserRoleDto.setProduct(addUserRoleProduct);
1057+
addUserRoleProduct.setRole(MANAGER.name());
9631058
addUserRoleProduct.setProductRoles(List.of("admin"));
1059+
addUserRoleDto.setProduct(addUserRoleProduct);
9641060
LoggedUser loggedUser = LoggedUser.builder().build();
9651061

9661062
when(userRegistryApi.findByIdUsingGET(any(), eq("userId"))).thenReturn(Uni.createFrom().item(userResource));
9671063
when(userInstitutionService.findByUserIdAndInstitutionId(userResource.getId().toString(), addUserRoleDto.getInstitutionId())).thenReturn(Uni.createFrom().item(createUserInstitution()));
9681064

1065+
userService.createOrUpdateUserByUserId(addUserRoleDto, "userId", loggedUser)
1066+
.subscribe().withSubscriber(UniAssertSubscriber.create())
1067+
.assertFailedWith(InvalidRequestException.class, "User already has roles on Product test");
1068+
}
1069+
1070+
@Test
1071+
void testCreateOrUpdateUser_UpdateUser_ProductAlreadyOnboardedWithAnotherRole() {
1072+
// Prepare test data
1073+
AddUserRoleDto addUserRoleDto = new AddUserRoleDto();
1074+
addUserRoleDto.setInstitutionId("institutionId");
1075+
AddUserRoleDto.Product addUserRoleProduct = new AddUserRoleDto.Product();
1076+
addUserRoleProduct.setProductId("test");
1077+
addUserRoleProduct.setRole(OPERATOR.name());
1078+
addUserRoleProduct.setDelegationId("delegationId");
1079+
addUserRoleDto.setProduct(addUserRoleProduct);
1080+
addUserRoleProduct.setProductRoles(List.of("operatore api"));
1081+
LoggedUser loggedUser = LoggedUser.builder().build();
1082+
1083+
when(userRegistryApi.findByIdUsingGET(any(), eq("userId"))).thenReturn(Uni.createFrom().item(userResource));
1084+
when(userInstitutionService.findByUserIdAndInstitutionId(userResource.getId().toString(), addUserRoleDto.getInstitutionId())).thenReturn(Uni.createFrom().item(createUserInstitution()));
1085+
1086+
1087+
userService.createOrUpdateUserByUserId(addUserRoleDto, "userId", loggedUser)
1088+
.subscribe().withSubscriber(UniAssertSubscriber.create())
1089+
.assertFailedWith(InvalidRequestException.class, "User already has different role on Product test");
1090+
1091+
}
1092+
1093+
@Test
1094+
void testCreateOrUpdateUser_UpdateUser_ProductAlreadyOnboardedWithAnotherProductRole() {
1095+
// Prepare test data
1096+
AddUserRoleDto addUserRoleDto = new AddUserRoleDto();
1097+
addUserRoleDto.setInstitutionId("institutionId");
1098+
AddUserRoleDto.Product addUserRoleProduct = new AddUserRoleDto.Product();
1099+
addUserRoleProduct.setProductId("test");
1100+
addUserRoleProduct.setRole(OPERATOR.name());
1101+
addUserRoleProduct.setDelegationId("delegationId");
1102+
addUserRoleDto.setProduct(addUserRoleProduct);
1103+
addUserRoleProduct.setProductRoles(List.of("security"));
1104+
LoggedUser loggedUser = LoggedUser.builder().build();
1105+
UserInstitution userInstitution = createUserInstitution();
1106+
userInstitution.getProducts().get(0).setStatus(DELETED);
1107+
userInstitution.getProducts().get(1).setStatus(ACTIVE);
1108+
userInstitution.getProducts().get(1).setProductId("test");
1109+
1110+
UserToNotify userToNotify = new UserToNotify();
1111+
userToNotify.setUserId(userId.toString());
1112+
1113+
UserNotificationToSend userNotificationToSend = new UserNotificationToSend();
1114+
userNotificationToSend.setUser(userToNotify);
1115+
1116+
Product product = new Product();
1117+
product.setDescription("description");
1118+
1119+
// Mock external dependencies
1120+
when(userRegistryApi.findByIdUsingGET(any(), eq("userId"))).thenReturn(Uni.createFrom().item(userResource));
1121+
when(userInstitutionService.findByUserIdAndInstitutionId(userResource.getId().toString(), addUserRoleDto.getInstitutionId())).thenReturn(Uni.createFrom().item((userInstitution)));
1122+
when(userInstitutionService.persistOrUpdate(any())).thenReturn(Uni.createFrom().item(createUserInstitution()));
1123+
when(productService.getProduct(any())).thenReturn(product);
1124+
when(userNotificationService.sendCreateUserNotification(any(), any(), any(), any(), any(),any())).thenReturn(Uni.createFrom().voidItem());
1125+
when(userUtils.buildUsersNotificationResponse(any(), any())).thenReturn(List.of(userNotificationToSend));
1126+
when(userNotificationService.sendKafkaNotification(any())).thenReturn(Uni.createFrom().item(userNotificationToSend));
1127+
9691128

9701129
// Call the method
9711130
UniAssertSubscriber<String> subscriber = userService.createOrUpdateUserByUserId(addUserRoleDto, "userId", loggedUser)
9721131
.subscribe().withSubscriber(UniAssertSubscriber.create());
9731132

9741133
// Verify the result
975-
assertNull(subscriber.awaitItem().getItem());
1134+
subscriber.awaitItem().assertCompleted();
1135+
verify(userRegistryApi).findByIdUsingGET(any(), eq("userId"));
1136+
verify(userInstitutionService).persistOrUpdate(any());
1137+
9761138
}
9771139

9781140
@Test
@@ -982,6 +1144,7 @@ void testCreateOrUpdateUser_UpdateUser_OneOfProductRoleAlreadyOnboarded() {
9821144
addUserRoleDto.setInstitutionId("institutionId");
9831145
AddUserRoleDto.Product addUserRoleProduct = new AddUserRoleDto.Product();
9841146
addUserRoleProduct.setProductId("test");
1147+
addUserRoleProduct.setRole(MANAGER.name());
9851148
addUserRoleDto.setProduct(addUserRoleProduct);
9861149
addUserRoleProduct.setProductRoles(List.of("admin", "admin2"));
9871150
LoggedUser loggedUser = LoggedUser.builder().build();

0 commit comments

Comments
 (0)