22
33import apu .saerok_admin .infra .role .AdminRoleClient ;
44import apu .saerok_admin .infra .role .dto .AdminMyRoleResponse ;
5+ import apu .saerok_admin .infra .role .dto .AdminPermissionListResponse ;
56import apu .saerok_admin .infra .role .dto .AdminRoleListResponse ;
67import apu .saerok_admin .infra .role .dto .AdminRoleUserListResponse ;
78import apu .saerok_admin .infra .role .dto .AdminUserRoleResponse ;
1314import apu .saerok_admin .infra .role .dto .UpdateRolePermissionsRequest ;
1415import apu .saerok_admin .web .view .Breadcrumb ;
1516import apu .saerok_admin .web .view .CurrentAdminProfile ;
16- import apu .saerok_admin .web .view .role .PermissionCatalog ;
1717import apu .saerok_admin .web .view .role .PermissionOptionView ;
1818import apu .saerok_admin .web .view .role .PermissionView ;
1919import apu .saerok_admin .web .view .role .RoleDisplay ;
@@ -104,7 +104,6 @@ public String index(@ModelAttribute("currentAdminProfile") CurrentAdminProfile c
104104 (left , right ) -> left ,
105105 LinkedHashMap ::new
106106 ));
107- permissionOptions = buildPermissionOptions (roleTemplates );
108107 } catch (RestClientResponseException exception ) {
109108 log .warn ("Failed to load role templates. status={}, body={}" ,
110109 exception .getStatusCode (), exception .getResponseBodyAsString (), exception );
@@ -115,6 +114,32 @@ public String index(@ModelAttribute("currentAdminProfile") CurrentAdminProfile c
115114 }
116115 }
117116
117+ if (canManageRoles ) {
118+ try {
119+ AdminPermissionListResponse response = adminRoleClient .listPermissions ();
120+ permissionOptions = Optional .ofNullable (response )
121+ .map (AdminPermissionListResponse ::permissions )
122+ .orElseGet (List ::of )
123+ .stream ()
124+ .map (permission -> new PermissionOptionView (permission .key (), permission .description ()))
125+ .collect (Collectors .toMap (
126+ PermissionOptionView ::key ,
127+ option -> option ,
128+ (left , right ) -> left ,
129+ LinkedHashMap ::new
130+ ))
131+ .values ()
132+ .stream ()
133+ .sorted (permissionOptionComparator ())
134+ .toList ();
135+ } catch (RestClientResponseException exception ) {
136+ log .warn ("Failed to load permissions. status={}, body={}" ,
137+ exception .getStatusCode (), exception .getResponseBodyAsString (), exception );
138+ } catch (RestClientException | IllegalStateException exception ) {
139+ log .warn ("Failed to load permissions." , exception );
140+ }
141+ }
142+
118143 String normalizedRoleCode = normalizeRoleCode (selectedRoleCode );
119144 RoleTemplateView selectedRoleTemplate = roleTemplatesByCode .get (normalizedRoleCode );
120145 if (selectedRoleTemplate == null && !roleTemplates .isEmpty ()) {
@@ -566,20 +591,10 @@ private TeamMemberView toTeamMemberView(AdminUserRoleResponse response) {
566591 );
567592 }
568593
569- private List <PermissionOptionView > buildPermissionOptions (List <RoleTemplateView > templates ) {
570- Map <String , PermissionOptionView > deduplicated = new LinkedHashMap <>();
571- for (RoleTemplateView template : templates ) {
572- for (PermissionView permission : template .permissions ()) {
573- deduplicated .put (permission .key (), new PermissionOptionView (permission .key (), permission .description ()));
574- }
575- }
576- for (PermissionOptionView builtin : PermissionCatalog .builtinPermissions ()) {
577- deduplicated .putIfAbsent (builtin .key (), builtin );
578- }
579- Comparator <PermissionOptionView > comparator = Comparator
594+ private Comparator <PermissionOptionView > permissionOptionComparator () {
595+ return Comparator
580596 .comparing (PermissionOptionView ::label , String .CASE_INSENSITIVE_ORDER )
581597 .thenComparing (PermissionOptionView ::key , String .CASE_INSENSITIVE_ORDER );
582- return deduplicated .values ().stream ().sorted (comparator ).toList ();
583598 }
584599
585600 private String normalizeTab (String requestedTab , boolean canViewTeamRoles , boolean canManageRoles ) {
0 commit comments