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',