vendor/nellapp/sdk-bundle/src/Permission/ChannelUserPermissionManager.php line 109

Open in your IDE?
  1. <?php
  2. namespace Nellapp\Bundle\SDKBundle\Permission;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Nellapp\Bundle\SDKBundle\Channel\Entity\ChannelInterface;
  5. use Nellapp\Bundle\SDKBundle\Permission\Entity\ChannelPermissionResourceInterface;
  6. use Nellapp\Bundle\SDKBundle\Permission\Entity\ChannelResourceInterface;
  7. use Nellapp\Bundle\SDKBundle\Permission\Enum\ChannelUserPermissionEnumInterface;
  8. use Nellapp\Bundle\SDKBundle\Permission\Enum\ChannelUserPermissionEnumManager;
  9. use Nellapp\Bundle\SDKBundle\Permission\Enum\ChannelUserPermissionForFormEnumInterface;
  10. use Nellapp\Bundle\SDKBundle\Permission\Repository\ChannelResourceRepositoryInterface;
  11. use Nellapp\Bundle\SDKBundle\Permission\Repository\ChannelUserPermissionRepositoryInterface;
  12. use Nellapp\Bundle\SDKBundle\Permission\Security\Hierarchy\ChannelUserPermissionHierarchyManager;
  13. use Symfony\Contracts\Cache\CacheInterface;
  14. class ChannelUserPermissionManager
  15. {
  16.     public function __construct(
  17.         private EntityManagerInterface                $entityManager,
  18.         private ChannelUserPermissionHierarchyManager $channelUserPermissionHierarchyManager,
  19.         private ChannelUserPermissionEnumManager      $channelUserPermissionEnumManager,
  20.         private CacheInterface                        $sdkCache,
  21.         private bool                                  $debug false,
  22.     )
  23.     {
  24.     }
  25.     /**
  26.      * @return string[]
  27.      *
  28.      * Return list of classname for channel permission resources
  29.      */
  30.     public function getChannelPermissionResourceClasses(): array
  31.     {
  32.         return array_map(function (array $info) {
  33.             return $info['resource_class'];
  34.         }, $this->getResourcesInfo());
  35.     }
  36.     private function getResourcesInfo(): array
  37.     {
  38.         if ($this->debug) {
  39.             return $this->loadChannelPermissionResourceClasses();
  40.         }
  41.         return $this->sdkCache->get('channel_permission_resources', function () {
  42.             return $this->loadChannelPermissionResourceClasses();
  43.         });
  44.     }
  45.     private function loadChannelPermissionResourceClasses(): array
  46.     {
  47.         $classes = [];
  48.         foreach ($this->entityManager->getMetadataFactory()->getAllMetadata() as $metadata) {
  49.             $ref $metadata->getReflectionClass();
  50.             if ($ref->implementsInterface(ChannelPermissionResourceInterface::class) && !$ref->isAbstract()) {
  51.                 $channelResourceClass $metadata->getAssociationTargetClass('resource');
  52.                 $channelPermissionResourceRepository $this->entityManager->getRepository($metadata->getName());
  53.                 $channelResourceRepository $this->entityManager->getRepository($channelResourceClass);
  54.                 if (!is_subclass_of($channelPermissionResourceRepositoryChannelUserPermissionRepositoryInterface::class)) {
  55.                     throw new \LogicException(sprintf(
  56.                         'The repository for "%s" must implements "%s"',
  57.                         $metadata->getName(),
  58.                         ChannelUserPermissionRepositoryInterface::class
  59.                     ));
  60.                 }
  61.                 if (!is_subclass_of($channelResourceRepositoryChannelResourceRepositoryInterface::class)) {
  62.                     throw new \LogicException(sprintf(
  63.                         'The repository for "%s" must implements "%s"',
  64.                         $channelResourceClass,
  65.                         ChannelResourceRepositoryInterface::class
  66.                     ));
  67.                 }
  68.                 $classes[$channelResourceClass] = [
  69.                     'resource_class' => $metadata->getName(),
  70.                 ];
  71.             }
  72.         }
  73.         return $classes;
  74.     }
  75.     public function getChannelResourceRepository(string $channelUserResourcePermissionClass): ChannelResourceRepositoryInterface
  76.     {
  77.         foreach ($this->getChannelPermissionResourceClasses() as $channelResourceClass => $channelResourcePermissionClass) {
  78.             if ($channelUserResourcePermissionClass === $channelResourcePermissionClass) {
  79.                 return $this->entityManager->getRepository($channelResourceClass);
  80.             }
  81.         }
  82.         throw new \LogicException(sprintf(
  83.             'Cannot find any channel resource repository for user resource permission class "%s".',
  84.             $channelUserResourcePermissionClass,
  85.         ));
  86.     }
  87.     public function getChannelPermissionResourceRepository(?string $channelUserPermissionResourceClass): ?ChannelUserPermissionRepositoryInterface
  88.     {
  89.         if ($channelUserPermissionResourceClass === null) {
  90.             return null;
  91.         }
  92.         foreach ($this->getChannelPermissionResourceClasses() as $channelResourcePermissionClass) {
  93.             if ($channelUserPermissionResourceClass === $channelResourcePermissionClass) {
  94.                 return $this->entityManager->getRepository($channelResourcePermissionClass);
  95.             }
  96.         }
  97.         return null;
  98.     }
  99.     public function getChannelUserPermissionHierarchies(ChannelInterface|ChannelResourceInterface|null $subject): array
  100.     {
  101.         return $this->channelUserPermissionHierarchyManager->getChannelUserPermissionHierarchies($subject::class);
  102.     }
  103.     /**
  104.      * @param ChannelInterface|ChannelResourceInterface|null $subject
  105.      * @return ChannelUserPermissionEnumInterface[]
  106.      */
  107.     public function getChannelUserPermissionEnums(ChannelInterface|ChannelResourceInterface|null $subject): array
  108.     {
  109.         return $this->channelUserPermissionEnumManager->getChannelUserPermissionEnums($subject);
  110.     }
  111. }