33import it .pagopa .selfcare .commons .base .security .SelfCareUser ;
44import it .pagopa .selfcare .core .generated .openapi .v1 .dto .OnboardingResponse ;
55import it .pagopa .selfcare .core .generated .openapi .v1 .dto .OnboardingsResponse ;
6- import it .pagopa .selfcare .dashboard .client .CoreInstitutionApiRestClient ;
7- import it .pagopa .selfcare .dashboard .client .OnboardingRestClient ;
8- import it .pagopa .selfcare .dashboard .client .TokenRestClient ;
9- import it .pagopa .selfcare .dashboard .client .UserApiRestClient ;
6+ import it .pagopa .selfcare .dashboard .client .*;
107import it .pagopa .selfcare .dashboard .exception .ResourceNotFoundException ;
118import it .pagopa .selfcare .dashboard .model .institution .Institution ;
129import it .pagopa .selfcare .dashboard .model .institution .RelationshipState ;
1512import it .pagopa .selfcare .dashboard .model .user .OnboardedProductWithActions ;
1613import it .pagopa .selfcare .dashboard .model .user .UserInfo ;
1714import it .pagopa .selfcare .dashboard .model .user .UserInstitutionWithActionsDto ;
15+ import it .pagopa .selfcare .iam .generated .openapi .v1 .dto .ProductRolePermissions ;
16+ import it .pagopa .selfcare .iam .generated .openapi .v1 .dto .ProductRolePermissionsList ;
1817import it .pagopa .selfcare .onboarding .generated .openapi .v1 .dto .OnboardingGetResponse ;
1918import lombok .extern .slf4j .Slf4j ;
2019import org .owasp .encoder .Encode ;
@@ -46,6 +45,7 @@ public class InstitutionV2ServiceImpl implements InstitutionV2Service {
4645 private final UserApiRestClient userApiRestClient ;
4746 private final CoreInstitutionApiRestClient coreInstitutionApiRestClient ;
4847 private final OnboardingRestClient onboardingRestClient ;
48+ private final IamExternalRestClient iamExternalRestClient ;
4949 private final TokenRestClient tokenRestClient ;
5050 private final UserMapper userMapper ;
5151 private final InstitutionMapper institutionMapper ;
@@ -56,6 +56,7 @@ public InstitutionV2ServiceImpl(@Value("${dashboard.institution.getUsers.filter.
5656 UserApiRestClient userApiRestClient ,
5757 CoreInstitutionApiRestClient coreInstitutionApiRestClient ,
5858 OnboardingRestClient onboardingRestClient ,
59+ IamExternalRestClient iamExternalRestClient ,
5960 TokenRestClient tokenRestClient ,
6061 UserMapper userMapper ,
6162 InstitutionMapper institutionMapper ,
@@ -64,6 +65,7 @@ public InstitutionV2ServiceImpl(@Value("${dashboard.institution.getUsers.filter.
6465 this .userApiRestClient = userApiRestClient ;
6566 this .coreInstitutionApiRestClient = coreInstitutionApiRestClient ;
6667 this .onboardingRestClient = onboardingRestClient ;
68+ this .iamExternalRestClient = iamExternalRestClient ;
6769 this .tokenRestClient = tokenRestClient ;
6870 this .userMapper = userMapper ;
6971 this .institutionMapper = institutionMapper ;
@@ -112,14 +114,13 @@ public Institution findInstitutionById(String institutionId) {
112114 Authentication authentication = SecurityContextHolder .getContext ().getAuthentication ();
113115 SelfCareUser selfCareUser = (SelfCareUser ) authentication .getPrincipal ();
114116 String issuer = selfCareUser .getIssuer ();
117+ String userId = selfCareUser .getId ();
115118
116119 if (ISSUER_PAGOPA .equalsIgnoreCase (issuer )) {
117- log .debug ("Issuer is PAGOPA, skipping user-institution permission checks " );
118- return institution ;
120+ log .debug ("Issuer is PAGOPA, using IAM to check permissions " );
121+ return getInstitutionWithActionsIam ( institutionId , userId , institution ) ;
119122 }
120123
121- String userId = selfCareUser .getId ();
122-
123124 UserInstitutionWithActionsDto userInstitutionWithActionsDto = userMapper .toUserInstitutionWithActionsDto (userApiRestClient ._getUserInstitutionWithPermission (institutionId , userId , null ).getBody ());
124125
125126 if (Objects .isNull (userInstitutionWithActionsDto ))
@@ -143,6 +144,35 @@ public Institution findInstitutionById(String institutionId) {
143144 return institution ;
144145 }
145146
147+ private Institution getInstitutionWithActionsIam (String institutionId , String userId , Institution institution ) {
148+
149+ List <ProductRolePermissions > productRolePermissions = Optional .ofNullable (
150+ iamExternalRestClient ._getIAMProductRolePermissionsList (userId , null ).getBody ())
151+ .map (ProductRolePermissionsList ::getItems )
152+ .filter (list -> !list .isEmpty ())
153+ .orElseThrow (() -> new AccessDeniedException (
154+ String .format ("User %s has not permission on institution %s" , userId , institutionId )));
155+
156+ ProductRolePermissions globalPermission = productRolePermissions .stream ()
157+ .filter (p -> "ALL" .equals (p .getProductId ()))
158+ .findFirst ().orElse (null );
159+
160+ institution .getOnboarding ().stream ()
161+ .filter (p -> RelationshipState .ACTIVE .equals (p .getStatus ()))
162+ .forEach (p -> productRolePermissions .stream ()
163+ .filter (iam -> iam .getProductId ().equals (p .getProductId ()))
164+ .findFirst ()
165+ .or (() -> Optional .ofNullable (globalPermission ))
166+ .ifPresent (iam -> {
167+ p .setAuthorized (true );
168+ p .setUserRole (iam .getRole ());
169+ p .setUserProductActions (iam .getPermissions ());
170+ }));
171+
172+ return institution ;
173+ }
174+
175+
146176 @ Override
147177 public OnboardingsResponse getOnboardingsInfoResponse (String institutionId , List <String > products ) {
148178 log .trace ("getOnboardingsResponse start" );
0 commit comments