Skip to content

Commit b9f99a7

Browse files
committed
feat: role filter while listing organization users
- raystack/proton#371 - a list of role name/ids are accepted as inputs, it can't be used when `with_roles` is toggled on. Signed-off-by: Kush Sharma <thekushsharma@gmail.com>
1 parent 6b4d111 commit b9f99a7

File tree

7 files changed

+4481
-4381
lines changed

7 files changed

+4481
-4381
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ TAG := $(shell git rev-list --tags --max-count=1)
44
VERSION := $(shell git describe --tags ${TAG})
55
.PHONY: build check fmt lint test test-race vet test-cover-html help install proto ui compose-up-dev
66
.DEFAULT_GOAL := build
7-
PROTON_COMMIT := "145667ee53b037d636c09df0a529c351069132dc"
7+
PROTON_COMMIT := "5666a16e7b8a8faa5def5801d81ed22776622403"
88

99
ui:
1010
@echo " > generating ui build"

core/policy/filter.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ type Filter struct {
55
ProjectID string
66
GroupID string
77
RoleID string
8+
RoleIDs []string
89

910
PrincipalType string
1011
PrincipalID string

internal/api/v1beta1/org.go

Lines changed: 63 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package v1beta1
33
import (
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,

internal/store/postgres/policy_repository.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ func applyListFilter(stmt *goqu.SelectDataset, flt policy.Filter) *goqu.SelectDa
118118
"role_id": flt.RoleID,
119119
})
120120
}
121+
if len(flt.RoleIDs) > 0 {
122+
stmt = stmt.Where(goqu.Ex{
123+
"role_id": flt.RoleIDs,
124+
})
125+
}
121126
return stmt
122127
}
123128

proto/apidocs.swagger.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3074,6 +3074,13 @@ paths:
30743074
in: query
30753075
required: false
30763076
type: boolean
3077+
- name: role_filters
3078+
in: query
3079+
required: false
3080+
type: array
3081+
items:
3082+
type: string
3083+
collectionFormat: multi
30773084
tags:
30783085
- Organization
30793086
post:

0 commit comments

Comments
 (0)