Skip to content

Commit e8c4348

Browse files
committed
Merge branch '4.3' into main
2 parents 97377b5 + 674e612 commit e8c4348

24 files changed

+600
-14
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: 24 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

@@ -915,6 +927,11 @@ ibexa.rest.load_user:
915927
requirements:
916928
userId: \d+
917929

930+
ibexa.rest.current_user:
931+
path: /user/current
932+
controller: Ibexa\Rest\Server\Controller\User::redirectToCurrentUser
933+
methods: [GET]
934+
918935
ibexa.rest.update_user:
919936
path: /user/users/{userId}
920937
defaults:
@@ -1121,6 +1138,13 @@ ibexa.rest.create_session:
11211138
csrf_protection: false
11221139
methods: [POST]
11231140

1141+
ibexa.rest.check_session:
1142+
path: /user/sessions/current
1143+
controller: Ibexa\Rest\Server\Controller\SessionController::checkSessionAction
1144+
methods: [GET]
1145+
defaults:
1146+
csrf_protection: false
1147+
11241148
ibexa.rest.delete_session:
11251149
path: /user/sessions/{sessionId}
11261150
defaults:

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/Controller/SessionController.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,33 @@ public function refreshSessionAction($sessionId, Request $request)
138138
);
139139
}
140140

141+
/**
142+
* @return \Ibexa\Rest\Server\Values\UserSession|\Symfony\Component\HttpFoundation\Response
143+
*/
144+
public function checkSessionAction(Request $request)
145+
{
146+
$session = $request->getSession();
147+
148+
if ($session === null || !$session->isStarted()) {
149+
$response = $this->getAuthenticator()->logout($request);
150+
$response->setStatusCode(404);
151+
152+
return $response;
153+
}
154+
155+
$currentUser = $this->userService->loadUser(
156+
$this->permissionResolver->getCurrentUserReference()->getUserId()
157+
);
158+
159+
return new Values\UserSession(
160+
$currentUser,
161+
$session->getName(),
162+
$session->getId(),
163+
$request->headers->get('X-CSRF-Token'),
164+
false
165+
);
166+
}
167+
141168
/**
142169
* Deletes given session.
143170
*

src/lib/Server/Controller/User.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
use Ibexa\Rest\Server\Exceptions\ForbiddenException;
2828
use Ibexa\Rest\Server\Values;
2929
use Symfony\Component\HttpFoundation\Request;
30+
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
31+
use Symfony\Component\Security\Core\User\UserInterface;
3032
use Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface;
3133

3234
/**
@@ -215,6 +217,22 @@ function () use ($userContentInfo) {
215217
);
216218
}
217219

220+
/**
221+
* @see \Symfony\Component\Security\Http\Controller\UserValueResolver
222+
*/
223+
public function redirectToCurrentUser(?UserInterface $user): Values\TemporaryRedirect
224+
{
225+
if ($user === null) {
226+
throw new UnauthorizedHttpException('', 'Not logged in.');
227+
}
228+
229+
$userReference = $this->permissionResolver->getCurrentUserReference();
230+
231+
return new Values\TemporaryRedirect(
232+
$this->router->generate('ibexa.rest.load_user', ['userId' => $userReference->getUserId()])
233+
);
234+
}
235+
218236
/**
219237
* Create a new user group under the given parent
220238
* To create a top level group use /user/groups/1/5/subgroups.

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+
}

0 commit comments

Comments
 (0)