From 440a45949f1bb2a68a9041173f1300e03a07d764 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 29 Jun 2026 17:06:13 +0200 Subject: [PATCH 01/11] UserListController: Add missing GET parameters --- .../Controller/User/UserListController.php | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/lib/Server/Controller/User/UserListController.php b/src/lib/Server/Controller/User/UserListController.php index 2e1ec4c4..cf621b8b 100644 --- a/src/lib/Server/Controller/User/UserListController.php +++ b/src/lib/Server/Controller/User/UserListController.php @@ -17,10 +17,52 @@ openapi: new Model\Operation( operationId: 'ibexa.rest.load_users', summary: 'List Users', - description: 'Load Users either for a given remote ID or Role.', + description: 'Load Users either for a given role ID, remote ID, login, or email. To use one of the available filter is mandatory.', tags: [ 'User', ], + parameters: [ + new Model\Parameter( + name: 'roleId', + in: 'query', + description: 'Role directly assigned to the Users to load. (If the role is assigned to a user group, its users won\'t be returned. See GET /user/groups roleId filter.)', + required: false, + schema: [ + 'type' => 'string', + 'description' => 'Reference path to the Role', + 'example' => '/api/ibexa/v2/user/roles/2', + ], + ), + new Model\Parameter( + name: 'remoteId', + in: 'query', + description: 'Remote ID of the User to load.', + required: false, + schema: [ + 'type' => 'string', + ], + ), + new Model\Parameter( + name: 'login', + in: 'query', + description: 'Username of the User to load.', + required: false, + schema: [ + 'type' => 'string', + 'example' => 'admin', + ], + ), + new Model\Parameter( + name: 'email', + in: 'query', + description: 'Email address of the User to load.', + required: false, + schema: [ + 'type' => 'string', + 'example' => 'admin@link.invalid', + ], + ), + ], responses: [ Response::HTTP_OK => [ 'description' => 'OK - Loads Users either for a given remote ID or Role.', @@ -51,7 +93,10 @@ ], ], Response::HTTP_NOT_FOUND => [ - 'description' => 'If there are no visible Users matching the filter.', + 'description' => 'If there are no visible Users matching the filter or the filter is missing.', + ], + Response::HTTP_NOT_ACCEPTABLE => [ + 'description' => 'The filter value is not acceptable.', ], ], ), From d0871b22bbd05422e24da42c4f04a7133565e122 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 29 Jun 2026 17:06:48 +0200 Subject: [PATCH 02/11] UserGroupListController: Add missing GET parameters --- .../User/UserGroupListController.php | 38 ++++++++++++++++++- .../User/UserGroupLoadByPathController.php | 2 + 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/lib/Server/Controller/User/UserGroupListController.php b/src/lib/Server/Controller/User/UserGroupListController.php index 90086c5c..f95ab5e8 100644 --- a/src/lib/Server/Controller/User/UserGroupListController.php +++ b/src/lib/Server/Controller/User/UserGroupListController.php @@ -25,10 +25,43 @@ openapi: new Model\Operation( operationId: 'ibexa.rest.load_user_groups', summary: 'Load User Groups', - description: 'Loads User Groups for either an an ID or a remote ID or a Role.', + description: 'Loads User Groups for either an ID, a remote ID, or a Role ID.', tags: [ 'User Group', ], + parameters: [ + new Model\Parameter( + name: 'id', + in: 'query', + description: 'Content ID of the User Group to load.', + required: false, + schema: [ + 'type' => 'integer', + 'description' => 'Numeral ID of the User Group', + 'example' => '12', + ], + ), + new Model\Parameter( + name: 'roleId', + in: 'query', + description: 'Role ID of the User Groups to load.', + required: false, + schema: [ + 'type' => 'integer', + 'description' => 'Numeral ID of the Role', + 'example' => '2', + ], + ), + new Model\Parameter( + name: 'remoteId', + in: 'query', + description: 'Remote ID of the User Group to load.', + required: false, + schema: [ + 'type' => 'string', + ], + ), + ], responses: [ Response::HTTP_OK => [ 'description' => 'UserGroupList - If set, the User Group List is returned in XML or JSON format. UserGroupRefList - If set, the link list of User Group is returned in XML or JSON format.', @@ -62,6 +95,9 @@ Response::HTTP_UNAUTHORIZED => [ 'description' => 'Error - the user has no permission to read User Groups.', ], + Response::HTTP_NOT_FOUND => [ + 'description' => 'Error - the remoteId doesn\'t match an existing User Group, the roleId doesn\'t match an existing Role.', + ], ], ), )] diff --git a/src/lib/Server/Controller/User/UserGroupLoadByPathController.php b/src/lib/Server/Controller/User/UserGroupLoadByPathController.php index 6cb7a50d..4b37074a 100644 --- a/src/lib/Server/Controller/User/UserGroupLoadByPathController.php +++ b/src/lib/Server/Controller/User/UserGroupLoadByPathController.php @@ -41,6 +41,8 @@ required: true, schema: [ 'type' => 'string', + 'description' => 'The Location path to the user\'s group.', + 'example' => '1/5/13', ], ), ], From 7c612b74d3d9d72e2d528f8650456782ca34c1ba Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 29 Jun 2026 17:07:41 +0200 Subject: [PATCH 03/11] UserGroupListController: Fix `id` parameter --- src/lib/Server/Controller/User/UserGroupListController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/Server/Controller/User/UserGroupListController.php b/src/lib/Server/Controller/User/UserGroupListController.php index f95ab5e8..c0102dec 100644 --- a/src/lib/Server/Controller/User/UserGroupListController.php +++ b/src/lib/Server/Controller/User/UserGroupListController.php @@ -109,7 +109,8 @@ final class UserGroupListController extends UserBaseController public function loadUserGroups(Request $request): RestValue { $restUserGroups = []; - if ($request->query->has('id') && is_int($id = $request->query->get('id'))) { + if ($request->query->has('id') && is_numeric($request->query->get('id'))) { + $id = (int) $request->query->get('id'); $userGroup = $this->userService->loadUserGroup($id, Language::ALL); $userGroupContentInfo = $userGroup->getVersionInfo()->getContentInfo(); From 4bcc78cc1486dbcc901d866d1859d3810b226968 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Tue, 30 Jun 2026 09:27:00 +0200 Subject: [PATCH 04/11] UserGroupListController: reword 404 error desc --- src/lib/Server/Controller/User/UserGroupListController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/Server/Controller/User/UserGroupListController.php b/src/lib/Server/Controller/User/UserGroupListController.php index c0102dec..30252b54 100644 --- a/src/lib/Server/Controller/User/UserGroupListController.php +++ b/src/lib/Server/Controller/User/UserGroupListController.php @@ -96,7 +96,7 @@ 'description' => 'Error - the user has no permission to read User Groups.', ], Response::HTTP_NOT_FOUND => [ - 'description' => 'Error - the remoteId doesn\'t match an existing User Group, the roleId doesn\'t match an existing Role.', + 'description' => 'Error - the id or remoteId doesn\'t match an existing User Group, or the roleId doesn\'t match an existing Role.', ], ], ), From 84b2a84f8916726a13ace6a090839fcfd84d0dbc Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Tue, 30 Jun 2026 15:36:28 +0200 Subject: [PATCH 05/11] UserTest.php: Add ?roleId= tests --- tests/bundle/Functional/UserTest.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/bundle/Functional/UserTest.php b/tests/bundle/Functional/UserTest.php index 7a1ff5a1..4935f656 100644 --- a/tests/bundle/Functional/UserTest.php +++ b/tests/bundle/Functional/UserTest.php @@ -305,6 +305,19 @@ public function testLoadUserByRemoteId(): void self::assertHttpResponseCodeEquals($response, 200); } + /** + * Covers GET /user/users?roleId={roleId} + */ + public function testLoadUserByRoleId(): void + { + $roleId = '/api/ibexa/v2/user/roles/2'; // "Administrator" + $response = $this->sendHttpRequest( + $this->createHttpRequest('GET', "/api/ibexa/v2/user/users?roleId=$roleId") + ); + + self::assertHttpResponseCodeEquals($response, 404); // Mustn't be 406 + } + /** * Covers GET /user/groups. */ @@ -332,6 +345,20 @@ public function testLoadUserGroupByRemoteId(): void self::assertHttpResponseCodeEquals($response, 200); } + /** + * Covers GET /user/groups?roleId={roleId} + */ + public function testLoadUserGroupsByRoleId(): void + { + $roleId = 2; // "Administrator" + $response = $this->sendHttpRequest( + $this->createHttpRequest('GET', "/api/ibexa/v2/user/groups?roleId=$roleId") + ); + + self::assertHttpResponseCodeEquals($response, 200); + self::assertStringContainsString('Administrator users', $response->getBody()->getContents()); + } + /** * Covers GET /user/users/{userId}/drafts. * From 3ea01ffe6db13bf087d176bebbb934996d191e85 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Tue, 30 Jun 2026 15:51:18 +0200 Subject: [PATCH 06/11] UserTest.php: Add ?roleId= tests --- tests/bundle/Functional/UserTest.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/bundle/Functional/UserTest.php b/tests/bundle/Functional/UserTest.php index 4935f656..4f3090b5 100644 --- a/tests/bundle/Functional/UserTest.php +++ b/tests/bundle/Functional/UserTest.php @@ -306,7 +306,7 @@ public function testLoadUserByRemoteId(): void } /** - * Covers GET /user/users?roleId={roleId} + * Covers GET /user/users?roleId={roleId}. */ public function testLoadUserByRoleId(): void { @@ -346,7 +346,7 @@ public function testLoadUserGroupByRemoteId(): void } /** - * Covers GET /user/groups?roleId={roleId} + * Covers GET /user/groups?roleId={roleId}. */ public function testLoadUserGroupsByRoleId(): void { @@ -356,7 +356,8 @@ public function testLoadUserGroupsByRoleId(): void ); self::assertHttpResponseCodeEquals($response, 200); - self::assertStringContainsString('Administrator users', $response->getBody()->getContents()); + // 1/5/13 = Administrator users + self::assertStringContainsString('', $response->getBody()->getContents()); } /** From 620289591177aafd315ff7441adbc4c2d0b8e389 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:29:47 +0200 Subject: [PATCH 07/11] UserTest.php: Add /user/groups?id= test --- tests/bundle/Functional/UserTest.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/bundle/Functional/UserTest.php b/tests/bundle/Functional/UserTest.php index 4f3090b5..b8ad09c5 100644 --- a/tests/bundle/Functional/UserTest.php +++ b/tests/bundle/Functional/UserTest.php @@ -330,6 +330,21 @@ public function testLoadUserGroups(): void self::assertHttpResponseCodeEquals($response, 200); } + /** + * Covers GET /user/groups?id={userGroupContentID}. + */ + public function testLoadUserGroupById(): void + { + $groupId = 12; // "Administrator users" + $response = $this->sendHttpRequest( + $this->createHttpRequest('GET', "/api/ibexa/v2/user/groups?id=$groupId") + ); + + self::assertHttpResponseCodeEquals($response, 200); + // 1/5/13 = "Administrator users" + self::assertStringContainsString('', $response->getBody()->getContents()); + } + /** * @depends testCreateUserGroup * @@ -356,7 +371,7 @@ public function testLoadUserGroupsByRoleId(): void ); self::assertHttpResponseCodeEquals($response, 200); - // 1/5/13 = Administrator users + // 1/5/13 = "Administrator users" self::assertStringContainsString('', $response->getBody()->getContents()); } From 8badc9571ba052b3548b4cf53890311ea8c0ad33 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Thu, 2 Jul 2026 10:40:10 +0200 Subject: [PATCH 08/11] ?roleId= accepting both ID and HREF --- .../Controller/User/UserBaseController.php | 5 +- .../User/UserGroupListController.php | 5 +- tests/bundle/Functional/UserTest.php | 46 +++++++++++++++---- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/lib/Server/Controller/User/UserBaseController.php b/src/lib/Server/Controller/User/UserBaseController.php index 22f813c8..e8d6a373 100644 --- a/src/lib/Server/Controller/User/UserBaseController.php +++ b/src/lib/Server/Controller/User/UserBaseController.php @@ -82,9 +82,8 @@ public function loadUsers(Request $request): Values\UserList|Values\UserRefList try { if ($request->query->has('roleId')) { - $restUsers = $this->loadUsersAssignedToRole( - (int) $this->uriParser->getAttributeFromUri($request->query->getString('roleId'), 'roleId') - ); + $roleId = is_numeric($request->query->get('roleId')) ? $request->query->getInt('roleId') : (int)$this->uriParser->getAttributeFromUri($request->query->getString('roleId'), 'roleId'); + $restUsers = $this->loadUsersAssignedToRole($roleId); } elseif ($request->query->has('remoteId')) { $restUsers = [ $this->buildRestUserObject( diff --git a/src/lib/Server/Controller/User/UserGroupListController.php b/src/lib/Server/Controller/User/UserGroupListController.php index 30252b54..10435c23 100644 --- a/src/lib/Server/Controller/User/UserGroupListController.php +++ b/src/lib/Server/Controller/User/UserGroupListController.php @@ -110,7 +110,7 @@ public function loadUserGroups(Request $request): RestValue { $restUserGroups = []; if ($request->query->has('id') && is_numeric($request->query->get('id'))) { - $id = (int) $request->query->get('id'); + $id = $request->query->getInt('id'); $userGroup = $this->userService->loadUserGroup($id, Language::ALL); $userGroupContentInfo = $userGroup->getVersionInfo()->getContentInfo(); @@ -131,7 +131,8 @@ public function loadUserGroups(Request $request): RestValue ), ]; } elseif ($request->query->has('roleId')) { - $restUserGroups = $this->loadUserGroupsAssignedToRole((int) $request->query->get('roleId')); + $roleId = is_numeric($request->query->get('roleId')) ? $request->query->getInt('roleId') : (int)$this->uriParser->getAttributeFromUri($request->query->getString('roleId'), 'roleId'); + $restUserGroups = $this->loadUserGroupsAssignedToRole($roleId); } elseif ($request->query->has('remoteId')) { $restUserGroups = [ $this->loadUserGroupByRemoteId($request), diff --git a/tests/bundle/Functional/UserTest.php b/tests/bundle/Functional/UserTest.php index b8ad09c5..7bb4ab42 100644 --- a/tests/bundle/Functional/UserTest.php +++ b/tests/bundle/Functional/UserTest.php @@ -306,16 +306,30 @@ public function testLoadUserByRemoteId(): void } /** - * Covers GET /user/users?roleId={roleId}. + * @dataProvider provideDataForTestLoadUsersByRoleId + * + * Covers GET /user/users?roleId={roleId} */ - public function testLoadUserByRoleId(): void + public function testLoadUsersByRoleId($roleId, $expectedCode, $expectedContent): void { - $roleId = '/api/ibexa/v2/user/roles/2'; // "Administrator" $response = $this->sendHttpRequest( $this->createHttpRequest('GET', "/api/ibexa/v2/user/users?roleId=$roleId") ); - self::assertHttpResponseCodeEquals($response, 404); // Mustn't be 406 + self::assertHttpResponseCodeEquals($response, 404); // Mustn't be 406 Not Acceptable + if (null !== $expectedContent) { + self::assertStringContainsString($expectedContent, $response->getBody()->getContents()); + } + } + + /** + * @return iterable{string, array{0: int|string, 1: int, 2: string|null}} + */ + public function provideDataForTestLoadUsersByRoleId(): iterable + { + yield 'Administrator by ID' => [2, 404, null]; + yield 'Administrator by Href' => ['/api/ibexa/v2/user/roles/2', 404, null]; + yield 'Not Acceptable' => ['/api/ibexa/v2/something/wrong', 406, '"None of the routers in the chain matched url \'/api/ibexa/v2/something/wrong\'"']; } /** @@ -361,18 +375,30 @@ public function testLoadUserGroupByRemoteId(): void } /** - * Covers GET /user/groups?roleId={roleId}. + * @dataProvider provideDataForTestLoadGroupsByRoleId + * + * Covers GET /user/groups?roleId={roleId} */ - public function testLoadUserGroupsByRoleId(): void + public function testLoadUserGroupsByRoleId($roleId, $expectedCode, $expectedContent): void { - $roleId = 2; // "Administrator" $response = $this->sendHttpRequest( $this->createHttpRequest('GET', "/api/ibexa/v2/user/groups?roleId=$roleId") ); - self::assertHttpResponseCodeEquals($response, 200); - // 1/5/13 = "Administrator users" - self::assertStringContainsString('', $response->getBody()->getContents()); + self::assertHttpResponseCodeEquals($response, $expectedCode); + if (null !== $expectedContent) { + self::assertStringContainsString($expectedContent, $response->getBody()->getContents()); + } + } + + /** + * @return iterable{string, array{0: int|string, 1: int, 2: string|null}} + */ + public function provideDataForTestLoadGroupsByRoleId() + { + yield 'Administrator by ID' => [2, 200, '']; + yield 'Administrator by Href' => ['/api/ibexa/v2/user/roles/2', 200, '']; + yield 'Not Acceptable' => ['/api/ibexa/v2/something/wrong', 406, '"None of the routers in the chain matched url \'/api/ibexa/v2/something/wrong\'"']; } /** From 4fa34755686609eb88bd5f28ea640f00d591ccc0 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Thu, 2 Jul 2026 10:58:30 +0200 Subject: [PATCH 09/11] ?roleId= accepting both ID and HREF --- tests/bundle/Functional/UserTest.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/bundle/Functional/UserTest.php b/tests/bundle/Functional/UserTest.php index 7bb4ab42..671d0d05 100644 --- a/tests/bundle/Functional/UserTest.php +++ b/tests/bundle/Functional/UserTest.php @@ -310,7 +310,7 @@ public function testLoadUserByRemoteId(): void * * Covers GET /user/users?roleId={roleId} */ - public function testLoadUsersByRoleId($roleId, $expectedCode, $expectedContent): void + public function testLoadUsersByRoleId(int|string $roleId, int $expectedCode, ?string $expectedContent): void { $response = $this->sendHttpRequest( $this->createHttpRequest('GET', "/api/ibexa/v2/user/users?roleId=$roleId") @@ -323,13 +323,13 @@ public function testLoadUsersByRoleId($roleId, $expectedCode, $expectedContent): } /** - * @return iterable{string, array{0: int|string, 1: int, 2: string|null}} + * @return iterable */ public function provideDataForTestLoadUsersByRoleId(): iterable { yield 'Administrator by ID' => [2, 404, null]; yield 'Administrator by Href' => ['/api/ibexa/v2/user/roles/2', 404, null]; - yield 'Not Acceptable' => ['/api/ibexa/v2/something/wrong', 406, '"None of the routers in the chain matched url \'/api/ibexa/v2/something/wrong\'"']; + yield 'Not Acceptable' => ['/api/ibexa/v2/something/wrong', 406, "None of the routers in the chain matched url '/api/ibexa/v2/something/wrong'"]; } /** @@ -379,7 +379,7 @@ public function testLoadUserGroupByRemoteId(): void * * Covers GET /user/groups?roleId={roleId} */ - public function testLoadUserGroupsByRoleId($roleId, $expectedCode, $expectedContent): void + public function testLoadUserGroupsByRoleId(int|string $roleId, int $expectedCode, ?string $expectedContent): void { $response = $this->sendHttpRequest( $this->createHttpRequest('GET', "/api/ibexa/v2/user/groups?roleId=$roleId") @@ -392,13 +392,13 @@ public function testLoadUserGroupsByRoleId($roleId, $expectedCode, $expectedCont } /** - * @return iterable{string, array{0: int|string, 1: int, 2: string|null}} + * @return iterable */ - public function provideDataForTestLoadGroupsByRoleId() + public function provideDataForTestLoadGroupsByRoleId(): iterable { yield 'Administrator by ID' => [2, 200, '']; yield 'Administrator by Href' => ['/api/ibexa/v2/user/roles/2', 200, '']; - yield 'Not Acceptable' => ['/api/ibexa/v2/something/wrong', 406, '"None of the routers in the chain matched url \'/api/ibexa/v2/something/wrong\'"']; + yield 'Not Acceptable' => ['/api/ibexa/v2/something/wrong', 406, "None of the routers in the chain matched url '/api/ibexa/v2/something/wrong'"]; } /** From b81de7b16507327521c7e630befc748a40ec8b6c Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Thu, 2 Jul 2026 11:17:10 +0200 Subject: [PATCH 10/11] ?roleId= accepting both ID and HREF --- tests/bundle/Functional/UserTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bundle/Functional/UserTest.php b/tests/bundle/Functional/UserTest.php index 671d0d05..9e03be86 100644 --- a/tests/bundle/Functional/UserTest.php +++ b/tests/bundle/Functional/UserTest.php @@ -316,7 +316,7 @@ public function testLoadUsersByRoleId(int|string $roleId, int $expectedCode, ?st $this->createHttpRequest('GET', "/api/ibexa/v2/user/users?roleId=$roleId") ); - self::assertHttpResponseCodeEquals($response, 404); // Mustn't be 406 Not Acceptable + self::assertHttpResponseCodeEquals($response, $expectedCode); if (null !== $expectedContent) { self::assertStringContainsString($expectedContent, $response->getBody()->getContents()); } From 567a220e8c6bac7b723a7a391116820d2303639c Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Thu, 2 Jul 2026 12:44:21 +0200 Subject: [PATCH 11/11] ?roleId= accepting both ID and HREF --- .../User/UserGroupListController.php | 19 ++++++++++++++----- .../Controller/User/UserListController.php | 17 +++++++++++++---- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/lib/Server/Controller/User/UserGroupListController.php b/src/lib/Server/Controller/User/UserGroupListController.php index 10435c23..7c72e81b 100644 --- a/src/lib/Server/Controller/User/UserGroupListController.php +++ b/src/lib/Server/Controller/User/UserGroupListController.php @@ -25,7 +25,7 @@ openapi: new Model\Operation( operationId: 'ibexa.rest.load_user_groups', summary: 'Load User Groups', - description: 'Loads User Groups for either an ID, a remote ID, or a Role ID.', + description: 'Loads User Groups for either an ID, a remote ID, or a Role ID. Filters can\'t be combined.', tags: [ 'User Group', ], @@ -44,13 +44,22 @@ new Model\Parameter( name: 'roleId', in: 'query', - description: 'Role ID of the User Groups to load.', + description: 'Role ID or Role Href of the User Groups to load.', required: false, schema: [ - 'type' => 'integer', - 'description' => 'Numeral ID of the Role', - 'example' => '2', + 'type' => ['integer', 'string'], + 'description' => 'Role ID or Role Href', ], + examples: new \ArrayObject([ + 'id' => [ + 'value' => 2, + 'summary' => 'Role ID', + ], + 'href' => [ + 'value' => '/api/ibexa/v2/user/roles/2', + 'summary' => 'Role Href', + ], + ]), ), new Model\Parameter( name: 'remoteId', diff --git a/src/lib/Server/Controller/User/UserListController.php b/src/lib/Server/Controller/User/UserListController.php index cf621b8b..7173dd64 100644 --- a/src/lib/Server/Controller/User/UserListController.php +++ b/src/lib/Server/Controller/User/UserListController.php @@ -17,7 +17,7 @@ openapi: new Model\Operation( operationId: 'ibexa.rest.load_users', summary: 'List Users', - description: 'Load Users either for a given role ID, remote ID, login, or email. To use one of the available filter is mandatory.', + description: 'Load Users either for a given role ID, remote ID, login, or email. To use one of the available filter is mandatory. Filters can\'t be combined.', tags: [ 'User', ], @@ -28,10 +28,19 @@ description: 'Role directly assigned to the Users to load. (If the role is assigned to a user group, its users won\'t be returned. See GET /user/groups roleId filter.)', required: false, schema: [ - 'type' => 'string', - 'description' => 'Reference path to the Role', - 'example' => '/api/ibexa/v2/user/roles/2', + 'type' => ['integer', 'string'], + 'description' => 'Role ID or Role Href', ], + examples: new \ArrayObject([ + 'id' => [ + 'value' => 2, + 'summary' => 'Role ID', + ], + 'href' => [ + 'value' => '/api/ibexa/v2/user/roles/2', + 'summary' => 'Role Href', + ], + ]), ), new Model\Parameter( name: 'remoteId',