vendor/ibexa/admin-ui/src/lib/UniversalDiscovery/Event/Subscriber/SectionAssign.php line 60

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. class SectionAssign implements EventSubscriberInterface
  15. {
  16. /** @var array */
  17. private $restrictedContentTypes;
  18. /** @var \Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface */
  19. private $permissionChecker;
  20. /** @var \Ibexa\Contracts\Core\Repository\ContentTypeService */
  21. private $contentTypeService;
  22. /**
  23. * @param \Ibexa\Contracts\Core\Repository\PermissionResolver $permissionResolver
  24. * @param \Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface $permissionChecker
  25. * @param \Ibexa\Contracts\Core\Repository\ContentTypeService $contentTypeService
  26. *
  27. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
  28. */
  29. public function __construct(
  30. PermissionResolver $permissionResolver,
  31. PermissionCheckerInterface $permissionChecker,
  32. ContentTypeService $contentTypeService
  33. ) {
  34. $this->permissionChecker = $permissionChecker;
  35. $this->contentTypeService = $contentTypeService;
  36. $hasAccess = $permissionResolver->hasAccess('section', 'assign');
  37. $this->restrictedContentTypes = is_array($hasAccess) ? $this->getRestrictedContentTypes($hasAccess) : [];
  38. }
  39. /**
  40. * @return array
  41. */
  42. public static function getSubscribedEvents(): array
  43. {
  44. return [
  45. ConfigResolveEvent::NAME => ['onUdwConfigResolve'],
  46. ];
  47. }
  48. /**
  49. * @param \Ibexa\AdminUi\UniversalDiscovery\Event\ConfigResolveEvent $event
  50. */
  51. public function onUdwConfigResolve(ConfigResolveEvent $event): void
  52. {
  53. $configName = $event->getConfigName();
  54. if ('multiple' !== $configName) {
  55. return;
  56. }
  57. $context = $event->getContext();
  58. if (
  59. !isset($context['type'])
  60. || 'section_assign' !== $context['type']
  61. ) {
  62. return;
  63. }
  64. if ($this->hasContentTypeRestrictions()) {
  65. $config = $event->getConfig();
  66. $config['allowed_content_types'] = $this->restrictedContentTypes;
  67. $event->setConfig($config);
  68. }
  69. }
  70. /**
  71. * @param array $hasAccess
  72. *
  73. * @return array
  74. */
  75. private function getRestrictedContentTypes(array $hasAccess): array
  76. {
  77. $restrictedContentTypesIds = $this->permissionChecker->getRestrictions($hasAccess, ContentTypeLimitation::class);
  78. if (empty($restrictedContentTypesIds)) {
  79. return [];
  80. }
  81. $restrictedContentTypesIdentifiers = [];
  82. $restrictedContentTypes = $this->contentTypeService->loadContentTypeList($restrictedContentTypesIds);
  83. foreach ($restrictedContentTypes as $restrictedContentType) {
  84. $restrictedContentTypesIdentifiers[] = $restrictedContentType->identifier;
  85. }
  86. return $restrictedContentTypesIdentifiers;
  87. }
  88. /**
  89. * @return bool
  90. */
  91. private function hasContentTypeRestrictions(): bool
  92. {
  93. return !empty($this->restrictedContentTypes);
  94. }
  95. }
  96. class_alias(SectionAssign::class, 'EzSystems\EzPlatformAdminUi\UniversalDiscovery\Event\Subscriber\SectionAssign');