diff --git a/src/lib/FieldTypeProcessor/BaseRelationProcessor.php b/src/lib/FieldTypeProcessor/BaseRelationProcessor.php index 3ce80b98..cec5eea7 100644 --- a/src/lib/FieldTypeProcessor/BaseRelationProcessor.php +++ b/src/lib/FieldTypeProcessor/BaseRelationProcessor.php @@ -6,6 +6,8 @@ */ namespace Ibexa\Rest\FieldTypeProcessor; +use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException; +use Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException; use Ibexa\Contracts\Core\Repository\LocationService; use Ibexa\Contracts\Rest\FieldTypeProcessor; use Ibexa\Core\FieldType\Relation\Type; @@ -64,8 +66,14 @@ public function mapToContentHref($contentId) */ public function mapToLocationHref($locationId) { + try { + $location = $this->locationService->loadLocation($locationId); + } catch (UnauthorizedException | NotFoundException $e) { + return ''; + } + return $this->router->generate('ibexa.rest.load_location', [ - 'locationPath' => implode('/', $this->locationService->loadLocation($locationId)->path), + 'locationPath' => implode('/', $location->path), ]); } diff --git a/tests/lib/FieldTypeProcessor/RelationProcessorTest.php b/tests/lib/FieldTypeProcessor/RelationProcessorTest.php index 3944f402..b06a2483 100644 --- a/tests/lib/FieldTypeProcessor/RelationProcessorTest.php +++ b/tests/lib/FieldTypeProcessor/RelationProcessorTest.php @@ -7,6 +7,7 @@ namespace Ibexa\Tests\Rest\FieldTypeProcessor; use Ibexa\Contracts\Core\Repository\LocationService; +use Ibexa\Core\Base\Exceptions\NotFoundException; use Ibexa\Core\Repository\Values\Content\Location; use Ibexa\Rest\FieldTypeProcessor\RelationProcessor; use PHPUnit\Framework\TestCase; @@ -127,6 +128,33 @@ public function testPostProcessFieldValueHashNullValue() $this->assertArrayNotHasKey('destinationContentHref', $hash); } + public function testPostProcessFieldValueHashNotAccessibleLocation(): void + { + $processor = $this->getProcessor(); + + $serviceLocationMock = $this->createMock(LocationService::class); + $processor->setLocationService($serviceLocationMock); + + $serviceLocationMock + ->method('loadLocation') + ->with('-1') + ->willThrowException(new NotFoundException('', '')); + + $routerMock = $this->createMock(RouterInterface::class); + $processor->setRouter($routerMock); + + $routerMock + ->expects(self::never()) + ->method('generate'); + + $hash = $processor->postProcessFieldSettingsHash(['selectionRoot' => -1]); + + self::assertSame([ + 'selectionRoot' => -1, + 'selectionRootHref' => '', + ], $hash); + } + /** * @return \Ibexa\Rest\FieldTypeProcessor\RelationProcessor */