Skip to content

Commit

Permalink
IBX-8280: Move previewableTranslations info to node extended info end…
Browse files Browse the repository at this point in the history
…point (#1262)
  • Loading branch information
tischsoic authored Jun 6, 2024
1 parent 2232a88 commit 49dccd1
Show file tree
Hide file tree
Showing 12 changed files with 120 additions and 52 deletions.
49 changes: 47 additions & 2 deletions src/bundle/Controller/Content/ContentTreeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@
use Ibexa\AdminUi\REST\Value\ContentTree\Node;
use Ibexa\AdminUi\REST\Value\ContentTree\NodeExtendedInfo;
use Ibexa\AdminUi\REST\Value\ContentTree\Root;
use Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface;
use Ibexa\AdminUi\Specification\ContentType\ContentTypeIsUser;
use Ibexa\AdminUi\UI\Module\ContentTree\NodeFactory;
use Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface;
use Ibexa\Contracts\Core\Limitation\Target;
use Ibexa\Contracts\Core\Repository\LocationService;
use Ibexa\Contracts\Core\Repository\PermissionResolver;
use Ibexa\Contracts\Core\Repository\Values\Content\Content;
use Ibexa\Contracts\Core\Repository\Values\Content\Location;
use Ibexa\Contracts\Core\Repository\Values\Content\Query;
use Ibexa\Contracts\Core\Repository\Values\User\Limitation;
Expand All @@ -44,20 +46,24 @@ class ContentTreeController extends RestController

private ConfigResolverInterface $configResolver;

private SiteaccessResolverInterface $siteaccessResolver;

public function __construct(
LocationService $locationService,
PermissionCheckerInterface $permissionChecker,
LookupLimitationsTransformer $lookupLimitationsTransformer,
NodeFactory $contentTreeNodeFactory,
PermissionResolver $permissionResolver,
ConfigResolverInterface $configResolver
ConfigResolverInterface $configResolver,
SiteaccessResolverInterface $siteaccessResolver
) {
$this->locationService = $locationService;
$this->permissionChecker = $permissionChecker;
$this->lookupLimitationsTransformer = $lookupLimitationsTransformer;
$this->contentTreeNodeFactory = $contentTreeNodeFactory;
$this->permissionResolver = $permissionResolver;
$this->configResolver = $configResolver;
$this->siteaccessResolver = $siteaccessResolver;
}

/**
Expand Down Expand Up @@ -145,7 +151,15 @@ public function loadNodeExtendedInfoAction(Location $location): NodeExtendedInfo
{
$locationPermissionRestrictions = $this->getLocationPermissionRestrictions($location);

return new NodeExtendedInfo($locationPermissionRestrictions);
$content = $location->getContent();
$versionInfo = $content->getVersionInfo();
$translations = $versionInfo->languageCodes;
$previewableTranslations = array_filter(
$translations,
fn (string $languageCode): bool => $this->isPreviewable($location, $content, $languageCode)
);

return new NodeExtendedInfo($locationPermissionRestrictions, $previewableTranslations);
}

/**
Expand Down Expand Up @@ -245,6 +259,37 @@ private function canUserHideContent(Location $location): bool
[$target]
);
}

/**
* @throws \Ibexa\Contracts\Core\Repository\Exceptions\BadStateException
* @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
*/
private function isPreviewable(
Location $location,
Content $content,
string $languageCode
): bool {
$canPreview = $this->permissionResolver->canUser(
'content',
'versionread',
$content,
[$location]
);

if (!$canPreview) {
return false;
}

$versionNo = $content->getVersionInfo()->getVersionNo();

$siteAccesses = $this->siteaccessResolver->getSiteAccessesListForLocation(
$location,
$versionNo,
$languageCode
);

return !empty($siteAccesses);
}
}

class_alias(ContentTreeController::class, 'EzSystems\EzPlatformAdminUiBundle\Controller\Content\ContentTreeController');
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public function visit(Visitor $visitor, Generator $generator, $data)

$generator->valueElement('translations', implode(',', $data->translations));

$generator->valueElement('previewableTranslations', implode(',', $data->previewableTranslations));
$generator->valueElement('mainLanguageCode', $data->mainLanguageCode);

$generator->startValueElement('name', $data->name);
$generator->endValueElement('name');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,27 @@ public function visit(Visitor $visitor, Generator $generator, $data): void
$visitor->setStatus(Response::HTTP_OK);

$this->buildPermissionNode($data->getPermissionRestrictions(), $generator);
$this->buildPreviewableTranslationsNode($data->getPreviewableTranslations(), $generator);

$generator->endObjectElement(self::MAIN_ELEMENT);
}

/**
* @param string[] $previewableTranslations
*/
protected function buildPreviewableTranslationsNode(
array $previewableTranslations,
Generator $generator
): void {
$generator->startHashElement('previewableTranslations');
$generator->startList('values');
foreach ($previewableTranslations as $value) {
$generator->valueElement('value', $value);
}
$generator->endList('values');
$generator->endHashElement('previewableTranslations');
}

/**
* @phpstan-param TPermissionRestrictions $permissionRestrictions
*/
Expand Down
10 changes: 4 additions & 6 deletions src/lib/REST/Value/ContentTree/Node.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,6 @@ class Node extends RestValue
/** @var string[] */
public array $translations;

/** @var string[] */
public array $previewableTranslations;

/** @var string */
public $name;

Expand Down Expand Up @@ -56,12 +53,13 @@ class Node extends RestValue

public string $pathString;

public string $mainLanguageCode;

/**
* @param int $depth
* @param int $locationId
* @param int $contentId
* @param string[] $translations
* @param string[] $previewableTranslations
* @param string $name
* @param string $contentTypeIdentifier
* @param bool $isContainer
Expand All @@ -76,7 +74,6 @@ public function __construct(
int $contentId,
int $versionNo,
array $translations,
array $previewableTranslations,
string $name,
string $contentTypeIdentifier,
bool $isContainer,
Expand All @@ -85,6 +82,7 @@ public function __construct(
int $totalChildrenCount,
int $reverseRelationsCount,
bool $isBookmarked,
string $mainLanguageCode,
array $children = [],
string $pathString = ''
) {
Expand All @@ -93,7 +91,6 @@ public function __construct(
$this->contentId = $contentId;
$this->versionNo = $versionNo;
$this->translations = $translations;
$this->previewableTranslations = $previewableTranslations;
$this->name = $name;
$this->isInvisible = $isInvisible;
$this->contentTypeIdentifier = $contentTypeIdentifier;
Expand All @@ -104,6 +101,7 @@ public function __construct(
$this->isBookmarked = $isBookmarked;
$this->children = $children;
$this->pathString = $pathString;
$this->mainLanguageCode = $mainLanguageCode;
}
}

Expand Down
17 changes: 16 additions & 1 deletion src/lib/REST/Value/ContentTree/NodeExtendedInfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,20 @@ final class NodeExtendedInfo extends RestValue
/** @phpstan-var TPermissionRestrictions|null */
private ?array $permissions;

/** @var string[] */
private array $previewableTranslations;

/**
* @phpstan-param TPermissionRestrictions|null $permissions
*
* @param string[] $previewableTranslation
*/
public function __construct(
?array $permissions = null
?array $permissions = null,
array $previewableTranslation = []
) {
$this->permissions = $permissions;
$this->previewableTranslations = $previewableTranslation;
}

/**
Expand All @@ -44,4 +51,12 @@ public function getPermissionRestrictions(): ?array
{
return $this->permissions;
}

/**
* @return string[]
*/
public function getPreviewableTranslations(): array
{
return $this->previewableTranslations;
}
}
39 changes: 2 additions & 37 deletions src/lib/UI/Module/ContentTree/NodeFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

use Ibexa\AdminUi\REST\Value\ContentTree\LoadSubtreeRequestNode;
use Ibexa\AdminUi\REST\Value\ContentTree\Node;
use Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface;
use Ibexa\Contracts\Core\Repository\BookmarkService;
use Ibexa\Contracts\Core\Repository\ContentService;
use Ibexa\Contracts\Core\Repository\Exceptions\NotImplementedException;
Expand Down Expand Up @@ -63,8 +62,6 @@ final class NodeFactory

private Repository $repository;

private SiteaccessResolverInterface $siteaccessResolver;

/** @var int */
private $maxLocationIdsInSingleAggregation;

Expand All @@ -76,7 +73,6 @@ public function __construct(
ConfigResolverInterface $configResolver,
PermissionResolver $permissionResolver,
Repository $repository,
SiteaccessResolverInterface $siteaccessResolver,
int $maxLocationIdsInSingleAggregation
) {
$this->bookmarkService = $bookmarkService;
Expand All @@ -86,7 +82,6 @@ public function __construct(
$this->configResolver = $configResolver;
$this->permissionResolver = $permissionResolver;
$this->repository = $repository;
$this->siteaccessResolver = $siteaccessResolver;
$this->maxLocationIdsInSingleAggregation = $maxLocationIdsInSingleAggregation;
}

Expand Down Expand Up @@ -397,18 +392,14 @@ private function buildNode(
}

$translations = $versionInfo->getLanguageCodes();
$previewableTranslations = array_filter(
$translations,
fn (string $languageCode): bool => $this->isPreviewable($location, $content, $languageCode)
);
$mainLanguageCode = $versionInfo->getContentInfo()->getMainLanguageCode();

return new Node(
$depth,
$location->getId(),
$location->getContentId(),
$versionInfo->getVersionNo(),
$translations,
$previewableTranslations,
'', // node name will be provided later by `supplyTranslatedContentName` method
null !== $contentType ? $contentType->getIdentifier() : '',
null === $contentType || $contentType->isContainer(),
Expand All @@ -417,6 +408,7 @@ private function buildNode(
$totalChildrenCount,
$this->getReverseRelationsCount($contentInfo),
isset($bookmarkLocations[$location->getId()]),
$mainLanguageCode,
$children,
$location->getPathString()
);
Expand Down Expand Up @@ -468,33 +460,6 @@ private function supplyChildrenCount(
$this->supplyChildrenCount($child, $aggregationResult, $requestFilter);
}
}

/**
* @throws \Ibexa\Contracts\Core\Repository\Exceptions\BadStateException
* @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
*/
private function isPreviewable(
Location $location,
Content $content,
string $languageCode
): bool {
$versionNo = $content->getVersionInfo()->getVersionNo();

$siteAccesses = $this->siteaccessResolver->getSiteAccessesListForLocation(
$location,
$versionNo,
$languageCode
);

$canPreview = $this->permissionResolver->canUser(
'content',
'versionread',
$content,
[$location]
);

return $canPreview && !empty($siteAccesses);
}
}

class_alias(NodeFactory::class, 'EzSystems\EzPlatformAdminUi\UI\Module\ContentTree\NodeFactory');
1 change: 1 addition & 0 deletions tests/integration/REST/GetContentTreeExtendedInfoTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ protected function setUp(): void
[
'user/login' => [],
'content/read' => [],
'content/versionread' => [],
'content/create' => [
new ContentTypeLimitation(
['limitationValues' => ['1', '16']]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,25 @@
"hasAccess"
]
}
}
},
"previewableTranslations": {
"type": "object",
"properties": {
"values": {
"type": "array",
"items": [
{
"type": "string"
}
]
}
}
}
},
"required": [
"_media-type",
"permissions"
"permissions",
"previewableTranslations"
]
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="previewableTranslations">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="value" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="media-type" type="xs:string" use="required" />
</xs:complexType>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@
"_name": "hide",
"hasAccess": false
}
]
],
"previewableTranslations": {
"values": ["eng-GB"]
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,7 @@
<function name="hide">
<hasAccess>false</hasAccess>
</function>
<previewableTranslations>
<value>eng-GB</value>
</previewableTranslations>
</ContentTreeNodeExtendedInfo>
Loading

0 comments on commit 49dccd1

Please sign in to comment.