Skip to content

Commit 674e612

Browse files
authored
IBX-4123: Added /languages and /languages/{code} endpoints
1 parent 45c5a77 commit 674e612

File tree

17 files changed

+465
-4
lines changed

17 files changed

+465
-4
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@
5454
"matthiasnoback/symfony-dependency-injection-test": "^4.1",
5555
"nyholm/psr7": "^1.1",
5656
"symfony/http-client": "^5.3",
57-
"symfony/browser-kit": "^5.3"
57+
"symfony/browser-kit": "^5.3",
58+
"justinrainbow/json-schema": "^5.2"
5859
},
5960
"config": {
6061
"allow-plugins": {

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="Ibexa REST Functional Tests">

src/bundle/Resources/config/routing.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,18 @@ ibexa.rest.set_object_states_for_content:
383383
contentId: \d+
384384

385385

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

388400

src/bundle/Resources/config/services.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ services:
9696
- '@ibexa.api.service.location'
9797
tags: [controller.service_arguments]
9898

99+
Ibexa\Rest\Server\Controller\Language:
100+
autowire: true
101+
tags: [controller.service_arguments]
102+
99103
Ibexa\Rest\Server\Controller\Location:
100104
parent: Ibexa\Rest\Server\Controller
101105
arguments:

src/bundle/Resources/config/value_object_visitors.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ services:
117117
- { name: ibexa.rest.output.value_object.visitor, type: Symfony\Component\HttpKernel\Exception\HttpException }
118118

119119
# Language
120+
Ibexa\Rest\Server\Output\ValueObjectVisitor\LanguageList:
121+
parent: Ibexa\Contracts\Rest\Output\ValueObjectVisitor
122+
tags:
123+
- { name: ibexa.rest.output.value_object.visitor, type: Ibexa\Rest\Server\Values\LanguageList }
124+
120125
Ibexa\Rest\Server\Output\ValueObjectVisitor\Language:
121126
parent: Ibexa\Contracts\Rest\Output\ValueObjectVisitor
122127
class: Ibexa\Rest\Server\Output\ValueObjectVisitor\Language
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa 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 Ibexa\Contracts\Core\Repository\LanguageService;
12+
use Ibexa\Contracts\Core\Repository\Values\Content\Language as ApiLanguage;
13+
use Ibexa\Rest\Server\Controller as RestController;
14+
use Ibexa\Rest\Server\Values\LanguageList;
15+
use Traversable;
16+
17+
final class Language extends RestController
18+
{
19+
private LanguageService $languageService;
20+
21+
public function __construct(LanguageService $languageService)
22+
{
23+
$this->languageService = $languageService;
24+
}
25+
26+
public function listLanguages(): LanguageList
27+
{
28+
$languages = $this->languageService->loadLanguages();
29+
30+
if ($languages instanceof Traversable) {
31+
$languages = iterator_to_array($languages);
32+
}
33+
34+
return new LanguageList($languages);
35+
}
36+
37+
public function loadLanguage(string $languageCode): ApiLanguage
38+
{
39+
return $this->languageService->loadLanguage($languageCode);
40+
}
41+
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,16 @@ 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
}
3643

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) Ibexa 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 Ibexa\Contracts\Rest\Output\Generator;
12+
use Ibexa\Contracts\Rest\Output\ValueObjectVisitor;
13+
use Ibexa\Contracts\Rest\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) Ibexa 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 Ibexa\Rest\Value as RestValue;
12+
13+
final class LanguageList extends RestValue
14+
{
15+
/** @var \Ibexa\Contracts\Core\Repository\Values\Content\Language[] */
16+
public array $languages;
17+
18+
/**
19+
* @param array<\Ibexa\Contracts\Core\Repository\Values\Content\Language> $languages
20+
*/
21+
public function __construct(array $languages)
22+
{
23+
$this->languages = $languages;
24+
}
25+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-04/schema#",
3+
"type": "object",
4+
"properties": {
5+
"Language": {
6+
"type": "object",
7+
"properties": {
8+
"_media-type": {
9+
"type": "string"
10+
},
11+
"_href": {
12+
"type": "string"
13+
},
14+
"languageId": {
15+
"type": "integer"
16+
},
17+
"languageCode": {
18+
"type": "string",
19+
"minLength": 1,
20+
"pattern": "^[[:alnum:]_]+"
21+
},
22+
"name": {
23+
"type": "string"
24+
}
25+
},
26+
"required": [
27+
"_media-type",
28+
"_href",
29+
"languageId",
30+
"languageCode",
31+
"name"
32+
]
33+
}
34+
},
35+
"required": [
36+
"Language"
37+
]
38+
}

0 commit comments

Comments
 (0)