diff --git a/src/bundle/Controller/SiteAccess/SiteAccessController.php b/src/bundle/Controller/SiteAccess/SiteAccessController.php
new file mode 100644
index 0000000000..8c88eddcce
--- /dev/null
+++ b/src/bundle/Controller/SiteAccess/SiteAccessController.php
@@ -0,0 +1,31 @@
+nonAdminSiteAccessResolver = $nonAdminSiteAccessResolver;
+ }
+
+ public function loadNonAdminSiteAccessesForLocation(Location $location): SiteAccessesList
+ {
+ return new SiteAccessesList(
+ $this->nonAdminSiteAccessResolver->getSiteAccessesListForLocation($location)
+ );
+ }
+}
diff --git a/src/bundle/Resources/config/routing_rest.yaml b/src/bundle/Resources/config/routing_rest.yaml
index 20113ea6d4..cf69dbdaed 100644
--- a/src/bundle/Resources/config/routing_rest.yaml
+++ b/src/bundle/Resources/config/routing_rest.yaml
@@ -137,3 +137,14 @@ ibexa.rest.content_type.load_field_definitions_from_expression:
methods: [POST]
options:
expose: true
+
+#
+# Site Access
+#
+
+ibexa.rest.site_access.load_for_location:
+ path: /site-access/load-non-admin-for-location/{locationId}
+ controller: 'Ibexa\Bundle\AdminUi\Controller\SiteAccess\SiteAccessController::loadNonAdminSiteAccessesForLocation'
+ methods: [GET]
+ options:
+ expose: true
diff --git a/src/bundle/Resources/config/services/controllers.yaml b/src/bundle/Resources/config/services/controllers.yaml
index ab509005ec..af48618886 100644
--- a/src/bundle/Resources/config/services/controllers.yaml
+++ b/src/bundle/Resources/config/services/controllers.yaml
@@ -265,3 +265,11 @@ services:
$fieldsByExpressionService: '@Ibexa\Contracts\AdminUi\ContentType\ContentTypeFieldsByExpressionServiceInterface'
tags:
- controller.service_arguments
+
+ Ibexa\Bundle\AdminUi\Controller\SiteAccess\SiteAccessController:
+ parent: Ibexa\Rest\Server\Controller
+ autowire: true
+ arguments:
+ $nonAdminSiteAccessResolver: '@Ibexa\AdminUi\Siteaccess\NonAdminSiteaccessResolver'
+ tags:
+ - controller.service_arguments
diff --git a/src/bundle/Resources/config/services/rest.yaml b/src/bundle/Resources/config/services/rest.yaml
index 0cbc65fd13..98ebcdb3d3 100644
--- a/src/bundle/Resources/config/services/rest.yaml
+++ b/src/bundle/Resources/config/services/rest.yaml
@@ -108,3 +108,10 @@ services:
parent: Ibexa\Contracts\Rest\Output\ValueObjectVisitor
tags:
- { name: ibexa.rest.output.value_object.visitor, type: Ibexa\AdminUi\REST\Value\ContentType\FieldDefinitionInfoList }
+ #
+ # Site Accesses
+ #
+ Ibexa\AdminUi\REST\Output\ValueObjectVisitor\SiteAccess\SiteAccessesListVisitor:
+ parent: Ibexa\Contracts\Rest\Output\ValueObjectVisitor
+ tags:
+ - { name: ibexa.rest.output.value_object.visitor, type: Ibexa\AdminUi\REST\Value\SiteAccess\SiteAccessesList }
diff --git a/src/lib/REST/Output/ValueObjectVisitor/SiteAccess/SiteAccessesListVisitor.php b/src/lib/REST/Output/ValueObjectVisitor/SiteAccess/SiteAccessesListVisitor.php
new file mode 100644
index 0000000000..0a00ee75d7
--- /dev/null
+++ b/src/lib/REST/Output/ValueObjectVisitor/SiteAccess/SiteAccessesListVisitor.php
@@ -0,0 +1,38 @@
+startObjectElement('SiteAccessesList');
+ $visitor->setHeader('Content-Type', $generator->getMediaType('SiteAccessesList'));
+
+ $generator->startList('values');
+ foreach ($data->getSiteAccesses() as $siteAccess) {
+ $generator->startObjectElement('SiteAccess');
+
+ $generator->startValueElement('name', $siteAccess->name);
+ $generator->endValueElement('name');
+
+ $generator->endObjectElement('SiteAccess');
+ }
+ $generator->endList('values');
+
+ $generator->endObjectElement('SiteAccessesList');
+ }
+}
diff --git a/src/lib/REST/Value/SiteAccess/SiteAccessesList.php b/src/lib/REST/Value/SiteAccess/SiteAccessesList.php
new file mode 100644
index 0000000000..bd8ab6d1de
--- /dev/null
+++ b/src/lib/REST/Value/SiteAccess/SiteAccessesList.php
@@ -0,0 +1,33 @@
+siteAccesses = $siteAccesses;
+ }
+
+ /**
+ * @return \Ibexa\Core\MVC\Symfony\SiteAccess[]
+ */
+ public function getSiteAccesses(): array
+ {
+ return $this->siteAccesses;
+ }
+}
diff --git a/tests/integration/REST/GetSiteAccessesListTest.php b/tests/integration/REST/GetSiteAccessesListTest.php
new file mode 100644
index 0000000000..c967e18d99
--- /dev/null
+++ b/tests/integration/REST/GetSiteAccessesListTest.php
@@ -0,0 +1,57 @@
+getIbexaTestCore()->setAdministratorUser();
+
+ $this->loginAsUser(
+ $this->createUserWithPolicies(
+ 'editor',
+ [
+ 'user/login' => [],
+ 'content/read' => [],
+ 'content/versionread' => [],
+ ]
+ )
+ );
+ }
+
+ protected static function getEndpointsToTest(): iterable
+ {
+ foreach (self::REQUIRED_FORMATS as $format) {
+ yield new EndpointRequestDefinition(
+ 'GET',
+ '/api/ibexa/v2/site-access/load-non-admin-for-location/2',
+ 'SiteAccessesList',
+ "application/vnd.ibexa.api.SiteAccessesList+$format",
+ ['HTTP_X-SiteAccess' => 'admin'],
+ null,
+ null,
+ 'SiteAccessesList'
+ );
+ }
+ }
+}
diff --git a/tests/integration/Resources/REST/Schemas/SiteAccessesList.json b/tests/integration/Resources/REST/Schemas/SiteAccessesList.json
new file mode 100644
index 0000000000..c99d90396c
--- /dev/null
+++ b/tests/integration/Resources/REST/Schemas/SiteAccessesList.json
@@ -0,0 +1,41 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "type": "object",
+ "properties": {
+ "SiteAccessesList": {
+ "type": "object",
+ "properties": {
+ "_media-type": {
+ "type": "string"
+ },
+ "values": {
+ "type": "array",
+ "items": [
+ {
+ "type": "object",
+ "properties": {
+ "_media-type": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "_media-type",
+ "name"
+ ]
+ }
+ ]
+ }
+ },
+ "required": [
+ "_media-type",
+ "values"
+ ]
+ }
+ },
+ "required": [
+ "SiteAccessesList"
+ ]
+}
diff --git a/tests/integration/Resources/REST/Schemas/SiteAccessesList.xsd b/tests/integration/Resources/REST/Schemas/SiteAccessesList.xsd
new file mode 100644
index 0000000000..0210f9c2a2
--- /dev/null
+++ b/tests/integration/Resources/REST/Schemas/SiteAccessesList.xsd
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/integration/Resources/REST/Snapshots/SiteAccessesList.json b/tests/integration/Resources/REST/Snapshots/SiteAccessesList.json
new file mode 100644
index 0000000000..fbf576070d
--- /dev/null
+++ b/tests/integration/Resources/REST/Snapshots/SiteAccessesList.json
@@ -0,0 +1,27 @@
+{
+ "SiteAccessesList": {
+ "_media-type": "application/vnd.ibexa.api.SiteAccessesList+json",
+ "values": [
+ {
+ "_media-type": "application/vnd.ibexa.api.SiteAccess+json",
+ "name": "__default_site_access__"
+ },
+ {
+ "_media-type": "application/vnd.ibexa.api.SiteAccess+json",
+ "name": "__second_site_access__"
+ },
+ {
+ "_media-type": "application/vnd.ibexa.api.SiteAccess+json",
+ "name": "ger"
+ },
+ {
+ "_media-type": "application/vnd.ibexa.api.SiteAccess+json",
+ "name": "eng"
+ },
+ {
+ "_media-type": "application/vnd.ibexa.api.SiteAccess+json",
+ "name": "ku6\"H"
+ }
+ ]
+ }
+}
diff --git a/tests/integration/Resources/REST/Snapshots/SiteAccessesList.xml b/tests/integration/Resources/REST/Snapshots/SiteAccessesList.xml
new file mode 100644
index 0000000000..c03df4e75e
--- /dev/null
+++ b/tests/integration/Resources/REST/Snapshots/SiteAccessesList.xml
@@ -0,0 +1,18 @@
+
+
+
+ __default_site_access__
+
+
+ __second_site_access__
+
+
+ ger
+
+
+ eng
+
+
+ ku6"H
+
+