graph: Initial support for $filter in /users (#5533)

This adds some initial support for using $filter (as defined in the
odata spec) on the /users endpoint. Currently the following filters are
supported:

A single filter on `id` property of the `memberOf` relation of users.
To list all users that are members of a specific group:

```
curl 'https://localhost:9200/graph/v1.0/users?$filter=memberOf/any(m:m/id eq '262982c1-2362-4afa-bfdf-8cbfef64a06e')
```

A logical AND filteri on the `id` property of the `memberOf` relation of users.

`$filter=memberOf/any(m:m/id eq 262982c1-2362-4afa-bfdf-8cbfef64a06e) and memberOf/any(m:m/id eq 6040aa17-9c64-4fef-9bd0-77234d71bad0)`

This will cause at least two queries on the identity backend. The `and`
operation is performed locally.

Closes: #5487
This commit is contained in:
Ralf Haferkamp
2023-02-14 10:32:32 +01:00
committed by GitHub
parent 93c2844585
commit b7ec7c92c4
8 changed files with 241 additions and 14 deletions

View File

@@ -130,13 +130,13 @@ func (_m *Backend) GetGroup(ctx context.Context, nameOrID string, queryParam url
return r0, r1
}
// GetGroupMembers provides a mock function with given fields: ctx, id
func (_m *Backend) GetGroupMembers(ctx context.Context, id string) ([]*libregraph.User, error) {
ret := _m.Called(ctx, id)
// GetGroupMembers provides a mock function with given fields: ctx, id, oreq
func (_m *Backend) GetGroupMembers(ctx context.Context, id string, oreq *godata.GoDataRequest) ([]*libregraph.User, error) {
ret := _m.Called(ctx, id, oreq)
var r0 []*libregraph.User
if rf, ok := ret.Get(0).(func(context.Context, string) []*libregraph.User); ok {
r0 = rf(ctx, id)
if rf, ok := ret.Get(0).(func(context.Context, string, *godata.GoDataRequest) []*libregraph.User); ok {
r0 = rf(ctx, id, oreq)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).([]*libregraph.User)
@@ -144,8 +144,8 @@ func (_m *Backend) GetGroupMembers(ctx context.Context, id string) ([]*libregrap
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
r1 = rf(ctx, id)
if rf, ok := ret.Get(1).(func(context.Context, string, *godata.GoDataRequest) error); ok {
r1 = rf(ctx, id, oreq)
} else {
r1 = ret.Error(1)
}