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
  • Loading branch information
tischsoic committed May 13, 2024
1 parent 0d22dfd commit b5aa207
Show file tree
Hide file tree
Showing 11 changed files with 92 additions and 51 deletions.
45 changes: 43 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 @@ -144,7 +150,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 @@ -244,6 +258,33 @@ 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 {
$versionNo = $content->getVersionInfo()->versionNo;

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

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

return $canPreview && !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,25 @@ public function visit(Visitor $visitor, Generator $generator, $data): void
$visitor->setStatus(Response::HTTP_OK);

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

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

/**
* @param string[]|null $previewableTranslation
*/
protected function buildPreviewableTranslationsNode(
?array $previewableTranslation,
Generator $generator
): void {
if ($previewableTranslation === null) {
return;
}

$generator->valueElement('previewableTranslationsString', implode(',', $previewableTranslation));
}

/**
* @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[]|null */
private ?array $previewableTranslation;

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

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

/**
* @return string[]|null
*/
public function getPreviewableTranslation(): ?array
{
return $this->previewableTranslation;
}
}
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 @@ -59,8 +58,6 @@ final class NodeFactory

private Repository $repository;

private SiteaccessResolverInterface $siteaccessResolver;

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

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

Expand Down Expand Up @@ -377,18 +372,14 @@ private function buildNode(
}

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

return new Node(
$depth,
$location->id,
$location->contentId,
$versionInfo->versionNo,
$translations,
$previewableTranslations,
'', // node name will be provided later by `supplyTranslatedContentName` method
$contentType ? $contentType->identifier : '',
$contentType ? $contentType->isContainer : true,
Expand All @@ -397,6 +388,7 @@ private function buildNode(
$totalChildrenCount,
$this->getReverseRelationsCount($contentInfo),
isset($bookmarkLocations[$location->id]),
$mainLanguageCode,
$children,
$location->getPathString()
);
Expand Down Expand Up @@ -445,33 +437,6 @@ private function supplyChildrenCount(Node $node, ?array $aggregationResult = nul
$this->supplyChildrenCount($child, $aggregationResult);
}
}

/**
* @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()->versionNo;

$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');
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,15 @@
"hasAccess"
]
}
},
"previewableTranslationsString": {
"type": "string"
}
},
"required": [
"_media-type",
"permissions"
"permissions",
"previewableTranslationsString"
]
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="previewableTranslationsString" type="xs:string" />
</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,7 @@
"_name": "hide",
"hasAccess": false
}
]
],
"previewableTranslationsString": ""
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,5 @@
<function name="hide">
<hasAccess>false</hasAccess>
</function>
<previewableTranslationsString />
</ContentTreeNodeExtendedInfo>
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
{
"_media-type": "application\/vnd.ibexa.api.ContentTreeNode+json",
"locationId": 2,
"mainLanguageCode": "eng-GB",
"contentId": 57,
"versionNo": 1,
"translations": "eng-GB",
"previewableTranslations": "eng-GB",
"name": "Home",
"pathString": "/1/2/",
"contentTypeIdentifier": "landing_page",
Expand All @@ -22,10 +22,10 @@
{
"_media-type": "application\/vnd.ibexa.api.ContentTreeNode+json",
"locationId": 60,
"mainLanguageCode": "eng-GB",
"contentId": 58,
"versionNo": 1,
"translations": "eng-GB",
"previewableTranslations": "eng-GB",
"name": "Contact Us",
"pathString": "/1/2/60/",
"contentTypeIdentifier": "feedback_form",
Expand Down

0 comments on commit b5aa207

Please sign in to comment.