From b3cf5655b0680d74ba804838a9e4aeafa677ce99 Mon Sep 17 00:00:00 2001 From: flaminiaScarciofolo Date: Wed, 27 Mar 2024 09:26:51 +0100 Subject: [PATCH] [SELC-4483] fix for change request --- app/src/main/resources/swagger/api-docs.json | 8 ++-- .../connector/api/UserApiConnector.java | 4 +- .../connector/rest/UserConnectorImpl.java | 40 ++++++++++++------- .../connector/rest/UserConnectorImplTest.java | 8 +++- .../dashboard/core/UserV2ServiceImpl.java | 19 ++++++--- .../dashboard/core/UserV2ServiceImplTest.java | 8 ++-- .../controller/InstitutionV2Controller.java | 8 ++-- 7 files changed, 59 insertions(+), 36 deletions(-) diff --git a/app/src/main/resources/swagger/api-docs.json b/app/src/main/resources/swagger/api-docs.json index 09fe4590..05eef6da 100644 --- a/app/src/main/resources/swagger/api-docs.json +++ b/app/src/main/resources/swagger/api-docs.json @@ -1286,7 +1286,7 @@ "tags" : [ "institutions" ], "summary" : "getInstitutions", "description" : "Service to get all the institutions related to logged user", - "operationId" : "getInstitutionsUsingGET_1", + "operationId" : "v2RetrieveUserInstitutions", "parameters" : [ { "name" : "authenticated", "in" : "query", @@ -1393,7 +1393,7 @@ "tags" : [ "institutions" ], "summary" : "createInstitutionProductUser", "description" : "Service to Create a user related to a specific pair of institution-product", - "operationId" : "createInstitutionProductUserUsingPOST_1", + "operationId" : "v2PostCreateInstitutionProductUser", "parameters" : [ { "name" : "institutionId", "in" : "path", @@ -1474,7 +1474,7 @@ "tags" : [ "institutions" ], "summary" : "addUserProductRoles", "description" : "Service to add a new role/product to a specific user", - "operationId" : "addUserProductRolesUsingPUT_1", + "operationId" : "v2AddUserProductRole", "parameters" : [ { "name" : "institutionId", "in" : "path", @@ -1557,7 +1557,7 @@ "tags" : [ "institutions" ], "summary" : "getInstitutionUser", "description" : "Service to get the users with the given user id related to a specific institution", - "operationId" : "getInstitutionUserUsingGET_1", + "operationId" : "v2RetrieveInstitutionUser", "parameters" : [ { "name" : "authenticated", "in" : "query", diff --git a/connector-api/src/main/java/it/pagopa/selfcare/dashboard/connector/api/UserApiConnector.java b/connector-api/src/main/java/it/pagopa/selfcare/dashboard/connector/api/UserApiConnector.java index a630f09c..2b3705af 100644 --- a/connector-api/src/main/java/it/pagopa/selfcare/dashboard/connector/api/UserApiConnector.java +++ b/connector-api/src/main/java/it/pagopa/selfcare/dashboard/connector/api/UserApiConnector.java @@ -29,8 +29,8 @@ public interface UserApiConnector { List retrieveFilteredUser(String userId, String institutionId, String productId); - String createOrUpdateUserByFiscalCode(String institutionId, String productId, UserToCreate userDto, CreateUserDto.Role role); + String createOrUpdateUserByFiscalCode(String institutionId, String productId, UserToCreate userDto, List role); - void createOrUpdateUserByUserId(String institutionId, String productId, String userId, CreateUserDto.Role role); + void createOrUpdateUserByUserId(String institutionId, String productId, String userId, List role); } diff --git a/connector/rest/src/main/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImpl.java b/connector/rest/src/main/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImpl.java index 1f2f4ee1..4dbb950d 100644 --- a/connector/rest/src/main/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImpl.java +++ b/connector/rest/src/main/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImpl.java @@ -169,29 +169,41 @@ private List getValidUserStates() { } @Override - public String createOrUpdateUserByFiscalCode(String institutionId, String productId, UserToCreate userDto, it.pagopa.selfcare.dashboard.connector.model.user.CreateUserDto.Role role) { + public String createOrUpdateUserByFiscalCode(String institutionId, String productId, UserToCreate userDto, List roles) { log.trace("createOrUpdateUserByFiscalCode start"); log.debug("createOrUpdateUserByFiscalCode userDto = {}", userDto); - CreateUserDto createUserDto = buildCreateUserDto(institutionId, productId, userDto, role); - String userId = userApiRestClient._usersPost(createUserDto).getBody(); + List finalRole = new ArrayList<>(roles); + String userId = roles.stream() + .findFirst() + .map(role -> { + CreateUserDto createUserDto = buildCreateUserDto(institutionId, productId, userDto, role); + finalRole.remove(role); + return userApiRestClient._usersPost(createUserDto).getBody(); + }) + .orElseThrow(() -> new IllegalArgumentException("Role list cannot be empty")); + + + createOrUpdateUserByUserId(institutionId, productId, userId, finalRole); + log.trace("createOrUpdateUserByFiscalCode end"); return userId; } @Override - public void createOrUpdateUserByUserId(String institutionId, String productId, String userId, it.pagopa.selfcare.dashboard.connector.model.user.CreateUserDto.Role role) { + public void createOrUpdateUserByUserId(String institutionId, String productId, String userId, List roles) { log.trace("createOrUpdateUserByUserId start"); log.debug("createOrUpdateUserByUserId userId = {}", userId); - AddUserRoleDto addUserRoleDto = AddUserRoleDto.builder() - .institutionId(institutionId) - .product(Product.builder() - .productRole(role.getProductRole()) - .role(it.pagopa.selfcare.user.generated.openapi.v1.dto.PartyRole.valueOf(role.getPartyRole().name())) - .productId(productId) - .build()) - .build(); - - userApiRestClient._usersUserIdPost(userId, addUserRoleDto); + roles.forEach(role -> { + AddUserRoleDto addUserRoleDto = AddUserRoleDto.builder() + .institutionId(institutionId) + .product(Product.builder() + .productRole(role.getProductRole()) + .role(it.pagopa.selfcare.user.generated.openapi.v1.dto.PartyRole.valueOf(role.getPartyRole().name())) + .productId(productId) + .build()) + .build(); + userApiRestClient._usersUserIdPost(userId, addUserRoleDto); + }); log.trace("createOrUpdateUserByUserId end"); } diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java index b1f8b709..8bab1846 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java @@ -294,8 +294,12 @@ void testCreateOrUpdateUserByFiscalCode() { CreateUserDto.Role role = new CreateUserDto.Role(); role.setPartyRole(it.pagopa.selfcare.commons.base.security.PartyRole.MANAGER); role.setProductRole("admin"); + + CreateUserDto.Role role2 = new CreateUserDto.Role(); + role2.setPartyRole(it.pagopa.selfcare.commons.base.security.PartyRole.MANAGER); + role2.setProductRole("admin2"); // Act - userConnector.createOrUpdateUserByFiscalCode("institutionId", "productId", userDto, role); + userConnector.createOrUpdateUserByFiscalCode("institutionId", "productId", userDto, List.of(role, role2)); // Assert that nothing has changed verify(userApiRestClient)._usersPost(Mockito.any()); @@ -316,7 +320,7 @@ void testCreateOrUpdateUserByUserId() { role.setProductRole("admin"); // Act - userConnector.createOrUpdateUserByUserId("institutionId", "productId", "userId", role); + userConnector.createOrUpdateUserByUserId("institutionId", "productId", "userId", List.of(role)); // Assert that nothing has changed verify(userApiRestClient)._usersUserIdPost(eq("userId"), any()); diff --git a/core/src/main/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImpl.java b/core/src/main/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImpl.java index 42db9a7f..f37be82b 100644 --- a/core/src/main/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImpl.java +++ b/core/src/main/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImpl.java @@ -19,6 +19,7 @@ import java.lang.reflect.Executable; import java.util.*; +import java.util.stream.Collectors; @Slf4j @@ -119,7 +120,7 @@ public Collection getUsersByInstitutionId(String institutionId, String public String createUsers(String institutionId, String productId, UserToCreate userDto) { log.trace("createOrUpdateUserByFiscalCode start"); log.debug("createOrUpdateUserByFiscalCode userDto = {}", userDto); - CreateUserDto.Role role = retrieveRole(productId, userDto.getProductRoles()); + List role = retrieveRole(productId, userDto.getProductRoles()); String userId = userApiConnector.createOrUpdateUserByFiscalCode(institutionId, productId, userDto, role); log.trace("createOrUpdateUserByFiscalCode end"); return userId; @@ -129,14 +130,20 @@ public String createUsers(String institutionId, String productId, UserToCreate u public void addUserProductRoles(String institutionId, String productId, String userId, Set productRoles) { log.trace("createOrUpdateUserByUserId start"); log.debug("createOrUpdateUserByUserId userId = {}", userId); - CreateUserDto.Role role = retrieveRole(productId, productRoles); + List role = retrieveRole(productId, productRoles); userApiConnector.createOrUpdateUserByUserId(institutionId, productId, userId, role); log.trace("createOrUpdateUserByUserId end"); } - - private CreateUserDto.Role retrieveRole(String productId, Set productRoles) { + /** + * This method is used to retrieve a list of roles for a given product. + * It maps each product role to a CreateUserDto.Role object, which includes the label and party role. + * To retrieve the party role, it uses the roleMappings of the product filtering by a white list of party roles (Only SUB_DELEGATE and OPERATOR are allowed + * as Role to be assigned to a user in add Users ProductRoles operation). + * If the party role is not valid, it throws an InvalidProductRoleException. + */ + private List retrieveRole(String productId, Set productRoles) { Product product = productsConnector.getProduct(productId); - return productRoles.stream().findFirst().map(productRole -> { + return productRoles.stream().map(productRole -> { EnumMap roleMappings = product.getRoleMappings(); CreateUserDto.Role role = new CreateUserDto.Role(); role.setLabel(Product.getLabel(productRole, roleMappings).orElse(null)); @@ -144,7 +151,7 @@ private CreateUserDto.Role retrieveRole(String productId, Set productRol role.setPartyRole(partyRole.orElseThrow(() -> new InvalidProductRoleException(String.format("Product role '%s' is not valid", productRole)))); return role; - }).orElse(null); + }).toList(); } } diff --git a/core/src/test/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImplTest.java b/core/src/test/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImplTest.java index b09c33dd..cdc65698 100644 --- a/core/src/test/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImplTest.java +++ b/core/src/test/java/it/pagopa/selfcare/dashboard/core/UserV2ServiceImplTest.java @@ -223,14 +223,14 @@ void addUserProductRoles_ok() { Set productRoles = new HashSet<>(List.of("operator")); Product product = getProduct(); when(productsConnector.getProduct(productId)).thenReturn(product); - doNothing().when(userApiConnector).createOrUpdateUserByUserId(eq(institutionId), eq(productId), eq(userId), any(CreateUserDto.Role.class)); + doNothing().when(userApiConnector).createOrUpdateUserByUserId(eq(institutionId), eq(productId), eq(userId), anyList()); // when userService.addUserProductRoles(institutionId, productId, userId, productRoles); // then verify(userApiConnector, times(1)) - .createOrUpdateUserByUserId(eq(institutionId), eq(productId), eq(userId), any(CreateUserDto.Role.class)); + .createOrUpdateUserByUserId(eq(institutionId), eq(productId), eq(userId), anyList()); verifyNoMoreInteractions(userApiConnector); } @@ -264,14 +264,14 @@ void createUsersByFiscalCode() { when(productsConnector.getProduct(productId)).thenReturn(product); - when(userApiConnector.createOrUpdateUserByFiscalCode(eq(institutionId), eq(productId), eq(userToCreate), any(CreateUserDto.Role.class))).thenReturn("userId"); + when(userApiConnector.createOrUpdateUserByFiscalCode(eq(institutionId), eq(productId), eq(userToCreate), anyList())).thenReturn("userId"); // when String userId = userService.createUsers(institutionId, productId, userToCreate); // then assertNotNull(userId); verify(userApiConnector, times(1)) - .createOrUpdateUserByFiscalCode(eq(institutionId), eq(productId), eq(userToCreate), any(CreateUserDto.Role.class)); + .createOrUpdateUserByFiscalCode(eq(institutionId), eq(productId), eq(userToCreate), anyList()); verifyNoMoreInteractions(userApiConnector); } diff --git a/web/src/main/java/it/pagopa/selfcare/dashboard/web/controller/InstitutionV2Controller.java b/web/src/main/java/it/pagopa/selfcare/dashboard/web/controller/InstitutionV2Controller.java index 80baf481..9abedd2d 100644 --- a/web/src/main/java/it/pagopa/selfcare/dashboard/web/controller/InstitutionV2Controller.java +++ b/web/src/main/java/it/pagopa/selfcare/dashboard/web/controller/InstitutionV2Controller.java @@ -45,7 +45,7 @@ public class InstitutionV2Controller { @GetMapping(value = "/{institutionId}/users/{userId}") @ResponseStatus(HttpStatus.OK) - @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.getInstitutionUser}") + @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.getInstitutionUser}", nickname = "v2RetrieveInstitutionUser") @PreAuthorize("hasPermission(#institutionId, 'InstitutionResource', 'ANY')") public InstitutionUserDetailsResource getInstitutionUser(@ApiParam("${swagger.dashboard.institutions.model.id}") @PathVariable("institutionId") @@ -68,7 +68,7 @@ public InstitutionUserDetailsResource getInstitutionUser(@ApiParam("${swagger.da @GetMapping @ResponseStatus(HttpStatus.OK) - @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.getInstitutions}") + @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.getInstitutions}", nickname = "v2RetrieveUserInstitutions") public List getInstitutions(Authentication authentication) { log.trace("getInstitutions start"); @@ -86,7 +86,7 @@ public List getInstitutions(Authentication authenticati @PostMapping(value = "/{institutionId}/products/{productId}/users") @ResponseStatus(HttpStatus.CREATED) - @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.createInstitutionProductUser}") + @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.createInstitutionProductUser}", nickname = "v2PostCreateInstitutionProductUser") @PreAuthorize("hasPermission(new it.pagopa.selfcare.dashboard.web.security.ProductAclDomain(#institutionId, #productId), 'ADMIN')") public UserIdResource createInstitutionProductUser(@ApiParam("${swagger.dashboard.institutions.model.id}") @PathVariable("institutionId") @@ -111,7 +111,7 @@ public UserIdResource createInstitutionProductUser(@ApiParam("${swagger.dashboar @PutMapping(value = "/{institutionId}/products/{productId}/users/{userId}") @ResponseStatus(HttpStatus.CREATED) - @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.addUserProductRoles}") + @ApiOperation(value = "", notes = "${swagger.dashboard.institutions.api.addUserProductRoles}", nickname = "v2AddUserProductRole") @PreAuthorize("hasPermission(new it.pagopa.selfcare.dashboard.web.security.ProductAclDomain(#institutionId, #productId), 'ADMIN')") public void addUserProductRoles(@ApiParam("${swagger.dashboard.institutions.model.id}") @PathVariable("institutionId")