Skip to content

Commit 0eca890

Browse files
[SELC-6300] feat: new permission actions management by role and product (#247)
1 parent a5f61a8 commit 0eca890

File tree

5 files changed

+222
-94
lines changed

5 files changed

+222
-94
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,7 +824,11 @@ private List<OnboardedProductWithActions> filterProductAndAddActions(UserInstitu
824824
.filter(onboardedProductWithActions -> ACTIVE.equals(onboardedProductWithActions.getStatus()))
825825
.filter(onboardedProductWithActions -> Objects.isNull(productId) || productId.equalsIgnoreCase(onboardedProductWithActions.getProductId()))
826826
.filter(onboardedProductWithActions -> StringUtils.isNotBlank(onboardedProductWithActions.getRole()))
827-
.peek(onboardedProductWithActions -> onboardedProductWithActions.setUserProductActions(actionMapRetriever.getUserActionsMap().get(onboardedProductWithActions.getRole())))
827+
.peek(onboardedProductWithActions -> {
828+
Map<String, List<String>> roleActions = actionMapRetriever.getUserActionsMap().get(onboardedProductWithActions.getRole());
829+
List<String> productActions = roleActions.getOrDefault(onboardedProductWithActions.getProductId(), roleActions.get("default"));
830+
onboardedProductWithActions.setUserProductActions(productActions);
831+
})
828832
.toList();
829833
}
830834

apps/user-ms/src/main/java/it/pagopa/selfcare/user/util/ActionMapRetriever.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.fasterxml.jackson.core.type.TypeReference;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import io.quarkus.runtime.Startup;
6-
import it.pagopa.selfcare.onboarding.common.PartyRole;
76
import it.pagopa.selfcare.user.exception.InvalidRequestException;
87
import jakarta.enterprise.context.ApplicationScoped;
98
import lombok.Getter;
@@ -19,14 +18,14 @@
1918
@Startup
2019
public class ActionMapRetriever {
2120

22-
private Map<String, List<String>> userActionsMap;
21+
private Map<String, Map<String, List<String>>> userActionsMap;
2322
private static final String ACTIONS_FILE_PATH = "role_action_mapping.json";
2423

2524
public ActionMapRetriever() {
2625
this.userActionsMap = retrieveActionsMap();
2726
}
2827

29-
private Map<String, List<String>> retrieveActionsMap() {
28+
private Map<String, Map<String, List<String>>> retrieveActionsMap() {
3029
try (InputStream actionsFile = getClass().getClassLoader().getResourceAsStream(ACTIONS_FILE_PATH)) {
3130
assert actionsFile != null;
3231
byte[] jsonFile = actionsFile.readAllBytes();
Lines changed: 106 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,108 @@
11
{
2-
"MANAGER": [
3-
"Selc:UploadLogo",
4-
"Selc:ViewBilling",
5-
"Selc:RequestProductAccess",
6-
"Selc:ListAvailableProducts",
7-
"Selc:ListActiveProducts",
8-
"Selc:AccessProductBackoffice",
9-
"Selc:ViewManagedInstitutions",
10-
"Selc:ViewDelegations",
11-
"Selc:ManageProductUsers",
12-
"Selc:ListProductUsers",
13-
"Selc:ManageProductGroups",
14-
"Selc:CreateDelegation",
15-
"Selc:ViewInstitutionData",
16-
"Selc:UpdateInstitutionData"
17-
],
18-
"DELEGATE": [
19-
"Selc:UploadLogo",
20-
"Selc:ViewBilling",
21-
"Selc:RequestProductAccess",
22-
"Selc:ListAvailableProducts",
23-
"Selc:ListActiveProducts",
24-
"Selc:AccessProductBackoffice",
25-
"Selc:ViewManagedInstitutions",
26-
"Selc:ViewDelegations",
27-
"Selc:ManageProductUsers",
28-
"Selc:ListProductUsers",
29-
"Selc:ManageProductGroups",
30-
"Selc:CreateDelegation",
31-
"Selc:ViewInstitutionData",
32-
"Selc:UpdateInstitutionData"
33-
],
34-
"SUB_DELEGATE": [
35-
"Selc:UploadLogo",
36-
"Selc:ViewBilling",
37-
"Selc:RequestProductAccess",
38-
"Selc:ListAvailableProducts",
39-
"Selc:ListActiveProducts",
40-
"Selc:AccessProductBackoffice",
41-
"Selc:ViewManagedInstitutions",
42-
"Selc:ViewDelegations",
43-
"Selc:ManageProductUsers",
44-
"Selc:ListProductUsers",
45-
"Selc:ManageProductGroups",
46-
"Selc:CreateDelegation",
47-
"Selc:ViewInstitutionData",
48-
"Selc:UpdateInstitutionData"
49-
],
50-
"ADMIN_EA": [
51-
"Selc:UploadLogo",
52-
"Selc:ViewBilling",
53-
"Selc:RequestProductAccess",
54-
"Selc:ListActiveProducts",
55-
"Selc:AccessProductBackoffice",
56-
"Selc:ViewManagedInstitutions",
57-
"Selc:ViewDelegations",
58-
"Selc:ListProductUsers",
59-
"Selc:ManageProductGroups",
60-
"Selc:ViewInstitutionData",
61-
"Selc:UpdateInstitutionData"
62-
],
63-
"OPERATOR": [
64-
"Selc:ViewBilling",
65-
"Selc:AccessProductBackoffice",
66-
"Selc:ViewInstitutionData",
67-
"Selc:ListActiveProducts"
68-
]
2+
"MANAGER": {
3+
"default": [
4+
"Selc:UploadLogo",
5+
"Selc:ViewBilling",
6+
"Selc:RequestProductAccess",
7+
"Selc:ListAvailableProducts",
8+
"Selc:ListActiveProducts",
9+
"Selc:AccessProductBackoffice",
10+
"Selc:ViewManagedInstitutions",
11+
"Selc:ViewDelegations",
12+
"Selc:ManageProductUsers",
13+
"Selc:ListProductUsers",
14+
"Selc:ManageProductGroups",
15+
"Selc:CreateDelegation",
16+
"Selc:ViewInstitutionData",
17+
"Selc:UpdateInstitutionData"
18+
]
19+
},
20+
"DELEGATE": {
21+
"default": [
22+
"Selc:UploadLogo",
23+
"Selc:ViewBilling",
24+
"Selc:RequestProductAccess",
25+
"Selc:ListAvailableProducts",
26+
"Selc:ListActiveProducts",
27+
"Selc:AccessProductBackoffice",
28+
"Selc:ViewManagedInstitutions",
29+
"Selc:ViewDelegations",
30+
"Selc:ManageProductUsers",
31+
"Selc:ListProductUsers",
32+
"Selc:ManageProductGroups",
33+
"Selc:CreateDelegation",
34+
"Selc:ViewInstitutionData",
35+
"Selc:UpdateInstitutionData"
36+
]
37+
},
38+
"SUB_DELEGATE": {
39+
"default": [
40+
"Selc:UploadLogo",
41+
"Selc:ViewBilling",
42+
"Selc:RequestProductAccess",
43+
"Selc:ListAvailableProducts",
44+
"Selc:ListActiveProducts",
45+
"Selc:AccessProductBackoffice",
46+
"Selc:ViewManagedInstitutions",
47+
"Selc:ViewDelegations",
48+
"Selc:ManageProductUsers",
49+
"Selc:ListProductUsers",
50+
"Selc:ManageProductGroups",
51+
"Selc:CreateDelegation",
52+
"Selc:ViewInstitutionData",
53+
"Selc:UpdateInstitutionData"
54+
]
55+
},
56+
"ADMIN_EA": {
57+
"prod-io": [
58+
"Selc:UploadLogo",
59+
"Selc:ViewBilling",
60+
"Selc:ListActiveProducts",
61+
"Selc:AccessProductBackoffice",
62+
"Selc:ViewManagedInstitutions",
63+
"Selc:ViewDelegations",
64+
"Selc:ManageProductUsers",
65+
"Selc:ListProductUsers",
66+
"Selc:ManageProductGroups",
67+
"Selc:CreateDelegation",
68+
"Selc:ViewInstitutionData",
69+
"Selc:UpdateInstitutionData"
70+
],
71+
"prod-pagopa": [
72+
"Selc:UploadLogo",
73+
"Selc:ViewBilling",
74+
"Selc:RequestProductAccess",
75+
"Selc:ListAvailableProducts",
76+
"Selc:ListActiveProducts",
77+
"Selc:AccessProductBackoffice",
78+
"Selc:ViewManagedInstitutions",
79+
"Selc:ViewDelegations",
80+
"Selc:ListProductUsers",
81+
"Selc:ManageProductGroups",
82+
"Selc:ViewInstitutionData",
83+
"Selc:UpdateInstitutionData"
84+
],
85+
"default": [
86+
"Selc:UploadLogo",
87+
"Selc:ViewBilling",
88+
"Selc:RequestProductAccess",
89+
"Selc:ListAvailableProducts",
90+
"Selc:ListActiveProducts",
91+
"Selc:AccessProductBackoffice",
92+
"Selc:ViewManagedInstitutions",
93+
"Selc:ViewDelegations",
94+
"Selc:ListProductUsers",
95+
"Selc:ManageProductGroups",
96+
"Selc:ViewInstitutionData",
97+
"Selc:UpdateInstitutionData"
98+
]
99+
},
100+
"OPERATOR": {
101+
"default": [
102+
"Selc:ViewBilling",
103+
"Selc:AccessProductBackoffice",
104+
"Selc:ViewInstitutionData",
105+
"Selc:ListActiveProducts"
106+
]
107+
}
69108
}

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

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,26 @@ private UserInstitution createUserInstitution(){
150150
return userInstitution;
151151
}
152152

153+
private UserInstitution createUserInstitution_ADMIN_EA_IO(){
154+
UserInstitution userInstitution = new UserInstitution();
155+
userInstitution.setId(ObjectId.get());
156+
userInstitution.setUserId(userId.toString());
157+
userInstitution.setInstitutionId("institutionId");
158+
userInstitution.setUserMailUuid(workContractsKey);
159+
userInstitution.setInstitutionRootName("institutionRootName");
160+
161+
OnboardedProduct product = new OnboardedProduct();
162+
product.setProductId("prod-io");
163+
product.setProductRole("admin");
164+
product.setRole(ADMIN_EA);
165+
product.setStatus(OnboardedProductState.ACTIVE);
166+
167+
List<OnboardedProduct> products = new ArrayList<>();
168+
products.add(product);
169+
userInstitution.setProducts(products);
170+
return userInstitution;
171+
}
172+
153173
@Test
154174
void getUsersEmailsTest() {
155175

@@ -1909,6 +1929,27 @@ void testGetUserInstitutionWithPermissionQueryWithoutProductId() {
19091929

19101930
}
19111931

1932+
@Test
1933+
void testGetUserInstitutionWithPermissionQueryWithoutProductId_ADMIN_EA_IO() {
1934+
String institutionId = "institutionId";
1935+
String userId = "userId";
1936+
1937+
Map<String, Object> queryParameter;
1938+
queryParameter = UserInstitutionFilter.builder().userId(userId).institutionId(institutionId).build().constructMap();
1939+
1940+
when(userInstitutionService.retrieveFirstFilteredUserInstitution(queryParameter))
1941+
.thenReturn(Uni.createFrom().item(createUserInstitution_ADMIN_EA_IO()));
1942+
1943+
userService.getUserInstitutionWithPermission(userId, institutionId, null)
1944+
.subscribe()
1945+
.withSubscriber(UniAssertSubscriber.create())
1946+
.assertItem(getUserInstitutionWithAction_ADMIN_EA_IO())
1947+
.assertCompleted();
1948+
1949+
verify(userInstitutionService).retrieveFirstFilteredUserInstitution(queryParameter);
1950+
1951+
}
1952+
19121953
private UserInstitutionWithActions getUserInstitutionWithAction() {
19131954
UserInstitutionWithActions userInstitutionWithActions = new UserInstitutionWithActions();
19141955
OnboardedProductWithActions product = new OnboardedProductWithActions();
@@ -1938,6 +1979,33 @@ private UserInstitutionWithActions getUserInstitutionWithAction() {
19381979
return userInstitutionWithActions;
19391980
}
19401981

1982+
private UserInstitutionWithActions getUserInstitutionWithAction_ADMIN_EA_IO() {
1983+
UserInstitutionWithActions userInstitutionWithActions = new UserInstitutionWithActions();
1984+
OnboardedProductWithActions product = new OnboardedProductWithActions();
1985+
product.setRole(ADMIN_EA.name());
1986+
product.setProductId("prod-io");
1987+
product.setProductRole("admin");
1988+
product.setStatus(ACTIVE);
1989+
product.setUserProductActions(List.of("Selc:UploadLogo",
1990+
"Selc:ViewBilling",
1991+
"Selc:ListActiveProducts",
1992+
"Selc:AccessProductBackoffice",
1993+
"Selc:ViewManagedInstitutions",
1994+
"Selc:ViewDelegations",
1995+
"Selc:ManageProductUsers",
1996+
"Selc:ListProductUsers",
1997+
"Selc:ManageProductGroups",
1998+
"Selc:CreateDelegation",
1999+
"Selc:ViewInstitutionData",
2000+
"Selc:UpdateInstitutionData"));
2001+
userInstitutionWithActions.setInstitutionRootName("institutionRootName");
2002+
userInstitutionWithActions.setUserMailUuid(workContractsKey);
2003+
userInstitutionWithActions.setInstitutionId("institutionId");
2004+
userInstitutionWithActions.setUserId(userId.toString());
2005+
userInstitutionWithActions.setProducts(List.of(product));
2006+
return userInstitutionWithActions;
2007+
}
2008+
19412009
@Test
19422010
void testGetUserInstitutionWithPermissionQueryWithProductId() {
19432011
String productId = "productId";
Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,43 @@
11
{
2-
"MANAGER": [
3-
"Selc:UploadLogo",
4-
"Selc:ViewBilling",
5-
"Selc:RequestProductAccess"
6-
],
7-
"DELEGATE": [
8-
"Selc:UploadLogo",
9-
"Selc:ViewBilling",
10-
"Selc:RequestProductAccess"
11-
],
12-
"SUB_DELEGATE": [
13-
"Selc:UploadLogo",
14-
"Selc:ViewBilling",
15-
"Selc:RequestProductAccess"
16-
],
17-
"ADMIN_EA": [
18-
"Selc:UploadLogo",
19-
"Selc:ViewBilling",
20-
"Selc:RequestProductAccess"
21-
],
22-
"OPERATOR": [
23-
"Selc:ViewBilling"
24-
]
2+
"MANAGER": {
3+
"default": [
4+
"Selc:UploadLogo",
5+
"Selc:ViewBilling",
6+
"Selc:RequestProductAccess"
7+
]
8+
},
9+
"DELEGATE": {
10+
"default": [
11+
"Selc:UploadLogo",
12+
"Selc:ViewBilling",
13+
"Selc:RequestProductAccess"
14+
]
15+
},
16+
"SUB_DELEGATE": {
17+
"default": [
18+
"Selc:UploadLogo",
19+
"Selc:ViewBilling",
20+
"Selc:RequestProductAccess"
21+
]
22+
},
23+
"ADMIN_EA": {
24+
"prod-io": [
25+
"Selc:UploadLogo",
26+
"Selc:ViewBilling"
27+
],
28+
"prod-pagopa": [
29+
"Selc:ViewBilling",
30+
"Selc:RequestProductAccess"
31+
],
32+
"default": [
33+
"Selc:UploadLogo",
34+
"Selc:ViewBilling",
35+
"Selc:RequestProductAccess"
36+
]
37+
},
38+
"OPERATOR": {
39+
"default": [
40+
"Selc:ViewBilling"
41+
]
42+
}
2543
}

0 commit comments

Comments
 (0)