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($hasAccess, ContentTypeLimitation::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($hasAccess, LanguageLimitation::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');