@@ -3,6 +3,8 @@ package v1beta1
33import (
44 "context"
55
6+ "github.com/raystack/frontier/core/policy"
7+
68 "github.com/raystack/frontier/core/authenticate"
79
810 "go.uber.org/zap"
@@ -259,9 +261,67 @@ func (h Handler) ListOrganizationUsers(ctx context.Context, request *frontierv1b
259261 }
260262 }
261263
262- users , err := h .userService .ListByOrg (ctx , orgResp .ID , request .GetPermissionFilter ())
263- if err != nil {
264- return nil , err
264+ var users []user.User
265+ var rolePairPBs []* frontierv1beta1.ListOrganizationUsersResponse_RolePair
266+
267+ if len (request .GetRoleFilters ()) > 0 {
268+ // convert role names to ids if needed
269+ roleIDs := request .GetRoleFilters ()
270+ for i , roleFilter := range request .GetRoleFilters () {
271+ if ! utils .IsValidUUID (roleFilter ) {
272+ role , err := h .roleService .Get (ctx , roleFilter )
273+ if err != nil {
274+ return nil , err
275+ }
276+ roleIDs [i ] = role .ID
277+ }
278+ }
279+
280+ // need to fetch users with roles assigned to them
281+ policies , err := h .policyService .List (ctx , policy.Filter {
282+ OrgID : request .GetId (),
283+ PrincipalType : schema .UserPrincipal ,
284+ ResourceType : schema .OrganizationNamespace ,
285+ RoleIDs : roleIDs ,
286+ })
287+ if err != nil {
288+ return nil , err
289+ }
290+ users = utils .Filter (utils .Map (policies , func (pol policy.Policy ) user.User {
291+ u , _ := h .userService .GetByID (ctx , pol .PrincipalID )
292+ return u
293+ }), func (u user.User ) bool {
294+ return u .ID != ""
295+ })
296+ } else {
297+ // list all users
298+ users , err = h .userService .ListByOrg (ctx , orgResp .ID , request .GetPermissionFilter ())
299+ if err != nil {
300+ return nil , err
301+ }
302+ if request .GetWithRoles () {
303+ for _ , user := range users {
304+ roles , err := h .policyService .ListRoles (ctx , schema .UserPrincipal , user .ID , schema .OrganizationNamespace , request .GetId ())
305+ if err != nil {
306+ return nil , err
307+ }
308+
309+ rolesPb := utils .Filter (utils .Map (roles , func (role role.Role ) * frontierv1beta1.Role {
310+ pb , err := transformRoleToPB (role )
311+ if err != nil {
312+ logger .Error ("failed to transform role for group" , zap .Error (err ))
313+ return nil
314+ }
315+ return & pb
316+ }), func (role * frontierv1beta1.Role ) bool {
317+ return role != nil
318+ })
319+ rolePairPBs = append (rolePairPBs , & frontierv1beta1.ListOrganizationUsersResponse_RolePair {
320+ UserId : user .ID ,
321+ Roles : rolesPb ,
322+ })
323+ }
324+ }
265325 }
266326
267327 var usersPB []* frontierv1beta1.User
@@ -270,35 +330,8 @@ func (h Handler) ListOrganizationUsers(ctx context.Context, request *frontierv1b
270330 if err != nil {
271331 return nil , err
272332 }
273-
274333 usersPB = append (usersPB , u )
275334 }
276-
277- var rolePairPBs []* frontierv1beta1.ListOrganizationUsersResponse_RolePair
278- if request .GetWithRoles () {
279- for _ , user := range users {
280- roles , err := h .policyService .ListRoles (ctx , schema .UserPrincipal , user .ID , schema .OrganizationNamespace , request .GetId ())
281- if err != nil {
282- return nil , err
283- }
284-
285- rolesPb := utils .Filter (utils .Map (roles , func (role role.Role ) * frontierv1beta1.Role {
286- pb , err := transformRoleToPB (role )
287- if err != nil {
288- logger .Error ("failed to transform role for group" , zap .Error (err ))
289- return nil
290- }
291- return & pb
292- }), func (role * frontierv1beta1.Role ) bool {
293- return role != nil
294- })
295- rolePairPBs = append (rolePairPBs , & frontierv1beta1.ListOrganizationUsersResponse_RolePair {
296- UserId : user .ID ,
297- Roles : rolesPb ,
298- })
299- }
300- }
301-
302335 return & frontierv1beta1.ListOrganizationUsersResponse {
303336 Users : usersPB ,
304337 RolePairs : rolePairPBs ,
0 commit comments