vendor/ibexa/admin-ui/src/lib/UniversalDiscovery/Event/Subscriber/ReadAllowedContentTypes.php line 78

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\User\Limitation\ContentTypeLimitation;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. final class ReadAllowedContentTypes implements EventSubscriberInterface
  15. {
  16. /** @var \Ibexa\Contracts\Core\Repository\PermissionResolver */
  17. private $permissionResolver;
  18. /** @var \Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface */
  19. private $permissionChecker;
  20. /** @var \Ibexa\Contracts\Core\Repository\ContentTypeService */
  21. private $contentTypeService;
  22. /** @var string[]|null */
  23. private $allowedContentTypesIdentifiers = null;
  24. public function __construct(
  25. PermissionResolver $permissionResolver,
  26. PermissionCheckerInterface $permissionChecker,
  27. ContentTypeService $contentTypeService
  28. ) {
  29. $this->permissionResolver = $permissionResolver;
  30. $this->permissionChecker = $permissionChecker;
  31. $this->contentTypeService = $contentTypeService;
  32. }
  33. /**
  34. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
  35. */
  36. private function getAllowedContentTypesIdentifiers(array $contentTypesAllowedViaConfig): ?array
  37. {
  38. $access = $this->permissionResolver->hasAccess('content', 'read');
  39. if (!\is_array($access)) {
  40. return $access ? ($contentTypesAllowedViaConfig ?: null) : [null];
  41. }
  42. $restrictedContentTypesIds = $this->permissionChecker->getRestrictions($access, ContentTypeLimitation::class);
  43. if (empty($restrictedContentTypesIds)) {
  44. return $contentTypesAllowedViaConfig ?: null;
  45. }
  46. $allowedContentTypesIdentifiers = [];
  47. $restrictedContentTypes = $this->contentTypeService->loadContentTypeList($restrictedContentTypesIds);
  48. foreach ($restrictedContentTypes as $contentType) {
  49. $allowedContentTypesIdentifiers[] = $contentType->identifier;
  50. }
  51. $allowedContentTypesIdentifiers = count($contentTypesAllowedViaConfig)
  52. ? array_intersect($contentTypesAllowedViaConfig, $allowedContentTypesIdentifiers)
  53. : $allowedContentTypesIdentifiers;
  54. return empty($allowedContentTypesIdentifiers) ? [null] : array_values($allowedContentTypesIdentifiers);
  55. }
  56. public static function getSubscribedEvents(): array
  57. {
  58. return [
  59. ConfigResolveEvent::NAME => ['onUdwConfigResolve', -10],
  60. ];
  61. }
  62. public function onUdwConfigResolve(ConfigResolveEvent $event): void
  63. {
  64. $config = $event->getConfig();
  65. $this->allowedContentTypesIdentifiers = $this->getAllowedContentTypesIdentifiers(
  66. $config['allowed_content_types'] ?? []
  67. );
  68. $config['allowed_content_types'] = $this->allowedContentTypesIdentifiers;
  69. $event->setConfig($config);
  70. }
  71. }
  72. class_alias(ReadAllowedContentTypes::class, 'EzSystems\EzPlatformAdminUi\UniversalDiscovery\Event\Subscriber\ReadAllowedContentTypes');