vendor/ibexa/admin-ui/src/lib/UniversalDiscovery/Event/Subscriber/ContentCreate.php line 67

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\AdminUi\UniversalDiscovery\Event\Subscriber;
  8. use Ibexa\AdminUi\UniversalDiscovery\Event\ConfigResolveEvent;
  9. use Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface;
  10. use Ibexa\Contracts\Core\Repository\ContentTypeService;
  11. use Ibexa\Contracts\Core\Repository\PermissionResolver;
  12. use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType;
  13. use Ibexa\Contracts\Core\Repository\Values\User\Limitation\ContentTypeLimitation;
  14. use Ibexa\Contracts\Core\Repository\Values\User\Limitation\LanguageLimitation;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. class ContentCreate implements EventSubscriberInterface
  17. {
  18.     /** @var array */
  19.     private $restrictedContentTypesIdentifiers;
  20.     /** @var array */
  21.     private $restrictedLanguagesCodes;
  22.     /** @var \Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface */
  23.     private $permissionChecker;
  24.     /** @var \Ibexa\Contracts\Core\Repository\ContentTypeService */
  25.     private $contentTypeService;
  26.     /**
  27.      * @param \Ibexa\Contracts\Core\Repository\PermissionResolver $permissionResolver
  28.      * @param \Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface $permissionChecker
  29.      * @param \Ibexa\Contracts\Core\Repository\ContentTypeService $contentTypeService
  30.      *
  31.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
  32.      */
  33.     public function __construct(
  34.         PermissionResolver $permissionResolver,
  35.         PermissionCheckerInterface $permissionChecker,
  36.         ContentTypeService $contentTypeService
  37.     ) {
  38.         $this->contentTypeService $contentTypeService;
  39.         $this->permissionChecker $permissionChecker;
  40.         $hasAccess $permissionResolver->hasAccess('content''create');
  41.         $this->restrictedContentTypesIdentifiers $this->getRestrictedContentTypesIdentifiers($hasAccess);
  42.         $this->restrictedLanguagesCodes $this->getRestrictedLanguagesCodes($hasAccess);
  43.     }
  44.     /**
  45.      * {@inheritdoc}
  46.      */
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             ConfigResolveEvent::NAME => ['onUdwConfigResolve'],
  51.         ];
  52.     }
  53.     /**
  54.      * @param \Ibexa\AdminUi\UniversalDiscovery\Event\ConfigResolveEvent $event
  55.      */
  56.     public function onUdwConfigResolve(ConfigResolveEvent $event): void
  57.     {
  58.         if ($event->getConfigName() !== 'create') {
  59.             return;
  60.         }
  61.         $config $event->getConfig();
  62.         if ($this->hasContentTypeRestrictions()) {
  63.             $config['allowed_content_types'] = $this->restrictedContentTypesIdentifiers;
  64.             $event->setConfig($config);
  65.         }
  66.         if ($this->hasLanguagesRestrictions()) {
  67.             $config['content_on_the_fly']['allowed_languages'] = $this->restrictedLanguagesCodes;
  68.             $event->setConfig($config);
  69.         }
  70.     }
  71.     /**
  72.      * @param array|bool $hasAccess
  73.      *
  74.      * @return array
  75.      */
  76.     private function getRestrictedContentTypesIdentifiers($hasAccess): array
  77.     {
  78.         if (!\is_array($hasAccess)) {
  79.             return [];
  80.         }
  81.         $restrictedContentTypesIds $this->permissionChecker->getRestrictions($hasAccessContentTypeLimitation::class);
  82.         if (empty($restrictedContentTypesIds)) {
  83.             return [];
  84.         }
  85.         $restrictedContentTypes $this->contentTypeService->loadContentTypeList($restrictedContentTypesIds);
  86.         return array_values(array_map(static function (ContentType $contentType): string {
  87.             return $contentType->identifier;
  88.         }, (array)$restrictedContentTypes));
  89.     }
  90.     /**
  91.      * @return bool
  92.      */
  93.     private function hasContentTypeRestrictions(): bool
  94.     {
  95.         return !empty($this->restrictedContentTypesIdentifiers);
  96.     }
  97.     /**
  98.      * @param $hasAccess
  99.      *
  100.      * @return string[]
  101.      */
  102.     private function getRestrictedLanguagesCodes($hasAccess): array
  103.     {
  104.         if (!\is_array($hasAccess)) {
  105.             return [];
  106.         }
  107.         $restrictedLanguagesCodes $this->permissionChecker->getRestrictions($hasAccessLanguageLimitation::class);
  108.         if (empty($restrictedLanguagesCodes)) {
  109.             return [];
  110.         }
  111.         return $restrictedLanguagesCodes;
  112.     }
  113.     /**
  114.      * @return bool
  115.      */
  116.     private function hasLanguagesRestrictions(): bool
  117.     {
  118.         return !empty($this->restrictedLanguagesCodes);
  119.     }
  120. }
  121. class_alias(ContentCreate::class, 'EzSystems\EzPlatformAdminUi\UniversalDiscovery\Event\Subscriber\ContentCreate');