Skip to content

Commit d289068

Browse files
authored
IBX-4123: [Backport] Added /languages and /languages/{code} endpoints
1 parent eacb8b8 commit d289068

File tree

18 files changed

+456
-6
lines changed

18 files changed

+456
-6
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@
5454
"phpstan/phpstan": "^1.10",
5555
"phpstan/phpstan-symfony": "^1.3",
5656
"phpstan/phpstan-phpunit": "^1.3",
57-
"phpstan/phpstan-webmozart-assert": "^1.2"
57+
"phpstan/phpstan-webmozart-assert": "^1.2",
58+
"justinrainbow/json-schema": "^5.2"
5859
},
5960
"config": {
6061
"allow-plugins": {

phpstan-baseline.neon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ parameters:
437437

438438
-
439439
message: "#^Cannot access offset mixed on EzSystems\\\\EzPlatformRest\\\\Input\\\\Parser\\.$#"
440-
count: 2
440+
count: 1
441441
path: src/lib/Input/ParsingDispatcher.php
442442

443443
-

phpunit-integration-rest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<php>
1212
<env name="EZP_TEST_REST_HOST" value="localhost"/>
1313
<env name="EZP_TEST_REST_AUTH" value="admin:publish"/>
14+
<env name="IBEXA_REST_GENERATE_SNAPSHOTS" value="0"/>
1415
</php>
1516
<testsuites>
1617
<testsuite name="eZ Publish REST Functional Tests">

src/bundle/Resources/config/routing.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,17 @@ ezpublish_rest_setObjectStatesForContent:
383383
contentId: \d+
384384

385385

386+
# Languages
387+
ibexa.rest.languages.list:
388+
path: /languages
389+
methods: [GET]
390+
controller: Ibexa\Rest\Server\Controller\Language::listLanguages
391+
392+
ibexa.rest.languages.view:
393+
path: /languages/{languageCode}
394+
methods: [GET]
395+
controller: Ibexa\Rest\Server\Controller\Language::loadLanguage
396+
386397
# Locations
387398

388399

@@ -583,7 +594,7 @@ ezpublish_rest_loadContentTypeFieldDefinition:
583594
requirements:
584595
contentTypeId: \d+
585596
fieldDefinitionId: \d+
586-
597+
587598
ibexa.rest.load_content_type_field_definition_by_identifier:
588599
path: /content/types/{contentTypeId}/fieldDefinition/{fieldDefinitionIdentifier}
589600
controller: ezpublish_rest.controller.content_type:loadContentTypeFieldDefinitionByIdentifier

src/bundle/Resources/config/services.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ services:
177177
- "@ezpublish.api.service.location"
178178
tags: [controller.service_arguments]
179179

180+
Ibexa\Rest\Server\Controller\Language:
181+
autowire: true
182+
tags: [ controller.service_arguments ]
183+
180184
ezpublish_rest.controller.location:
181185
class: "%ezpublish_rest.controller.location.class%"
182186
parent: ezpublish_rest.controller.base

src/bundle/Resources/config/value_object_visitors.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ services:
206206
- { name: ezpublish_rest.output.value_object_visitor, type: Symfony\Component\HttpKernel\Exception\HttpException }
207207

208208
# Language
209+
Ibexa\Rest\Server\Output\ValueObjectVisitor\LanguageList:
210+
parent: ezpublish_rest.output.value_object_visitor.base
211+
tags:
212+
- { name: ezpublish_rest.output.value_object_visitor, type: Ibexa\Rest\Server\Values\LanguageList }
213+
209214
ezpublish_rest.output.value_object_visitor.Language:
210215
parent: ezpublish_rest.output.value_object_visitor.base
211216
class: EzSystems\EzPlatformRest\Server\Output\ValueObjectVisitor\Language
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Rest\Server\Controller;
10+
11+
use eZ\Publish\API\Repository\LanguageService;
12+
use eZ\Publish\API\Repository\Values\Content\Language as ApiLanguage;
13+
use EzSystems\EzPlatformRest\Server\Controller as RestController;
14+
use Ibexa\Rest\Server\Values\LanguageList;
15+
use Traversable;
16+
17+
final class Language extends RestController
18+
{
19+
/** @var \eZ\Publish\API\Repository\LanguageService */
20+
private $languageService;
21+
22+
public function __construct(LanguageService $languageService)
23+
{
24+
$this->languageService = $languageService;
25+
}
26+
27+
public function listLanguages(): LanguageList
28+
{
29+
$languages = $this->languageService->loadLanguages();
30+
31+
if ($languages instanceof Traversable) {
32+
$languages = iterator_to_array($languages);
33+
}
34+
35+
return new LanguageList($languages);
36+
}
37+
38+
public function loadLanguage(string $languageCode): ApiLanguage
39+
{
40+
return $this->languageService->loadLanguage($languageCode);
41+
}
42+
}

src/lib/Server/Output/ValueObjectVisitor/Language.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,15 @@ public function visit(Visitor $visitor, Generator $generator, $data): void
2828

2929
private function visitLanguageAttributes(Visitor $visitor, Generator $generator, LanguageValue $language): void
3030
{
31-
$generator->valueElement('languageId', $language->id);
32-
$generator->valueElement('languageCode', $language->languageCode);
33-
$generator->valueElement('name', $language->name);
31+
$generator->attribute(
32+
'href',
33+
$this->router->generate(
34+
'ibexa.rest.languages.view',
35+
['languageCode' => $language->getLanguageCode()],
36+
),
37+
);
38+
$generator->valueElement('languageId', $language->getId());
39+
$generator->valueElement('languageCode', $language->getLanguageCode());
40+
$generator->valueElement('name', $language->getName());
3441
}
3542
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Rest\Server\Output\ValueObjectVisitor;
10+
11+
use EzSystems\EzPlatformRest\Output\Generator;
12+
use EzSystems\EzPlatformRest\Output\ValueObjectVisitor;
13+
use EzSystems\EzPlatformRest\Output\Visitor;
14+
15+
final class LanguageList extends ValueObjectVisitor
16+
{
17+
/**
18+
* @param \Ibexa\Rest\Server\Values\LanguageList $data
19+
*/
20+
public function visit(Visitor $visitor, Generator $generator, $data): void
21+
{
22+
$generator->startObjectElement('LanguageList');
23+
$visitor->setHeader('Content-Type', $generator->getMediaType('LanguageList'));
24+
25+
$generator->attribute('href', $this->router->generate('ibexa.rest.languages.list'));
26+
27+
$generator->startList('Language');
28+
foreach ($data->languages as $language) {
29+
$visitor->visitValueObject($language);
30+
}
31+
$generator->endList('Language');
32+
33+
$generator->endObjectElement('LanguageList');
34+
}
35+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Rest\Server\Values;
10+
11+
use EzSystems\EzPlatformRest\Value as RestValue;
12+
13+
final class LanguageList extends RestValue
14+
{
15+
/** @var \eZ\Publish\API\Repository\Values\Content\Language[] */
16+
public $languages;
17+
18+
/**
19+
* @param array<\eZ\Publish\API\Repository\Values\Content\Language> $languages
20+
*/
21+
public function __construct(array $languages)
22+
{
23+
$this->languages = $languages;
24+
}
25+
}

0 commit comments

Comments
 (0)