custom/plugins/CioSubaccounts/src/Subscriber/SubaccountsPermissionInheritance.php line 36

Open in your IDE?
  1. <?php
  2. namespace CioSubaccounts\Subscriber;
  3. use CioCustomerPermissionGroups\Definition\CustomerAclgroupsEntity;
  4. use CioCustomerPermissionGroups\Event\CustomerPermissionGroupIdsLoadedEvent;
  5. use CioCustomerPermissionGroups\Event\CustomerPermissionGroupsLoadedEvent;
  6. use CioCustomerPermissionGroups\Service\CustomerPermissionService;
  7. use Shopware\Core\Checkout\Customer\CustomerEntity;
  8. use Shopware\Core\Framework\Context;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  12. use Symfony\Component\DependencyInjection\ContainerInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. class SubaccountsPermissionInheritance implements EventSubscriberInterface
  15. {
  16.     protected const ROLE_WHITELIST = [];
  17.     private ContainerInterface $container;
  18.     public function __construct(ContainerInterface $container)
  19.     {
  20.         $this->container $container;
  21.     }
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             CustomerPermissionGroupIdsLoadedEvent::class => 'onCustomerPermissionGroupIdsLoadedEvent',
  26.             CustomerPermissionGroupsLoadedEvent::class => 'onCustomerPermissionGroupsLoadedEvent'
  27.         ];
  28.     }
  29.     public function onCustomerPermissionGroupIdsLoadedEvent(CustomerPermissionGroupIdsLoadedEvent $event)
  30.     {
  31.         $customer $event->getCustomer();
  32.         $parentCustomer $customer->getExtension('customerParent');
  33.         // ignore customers without parent
  34.         if (is_null($parentCustomer)) {
  35.             return;
  36.         }
  37.         /** @var EntityRepositoryInterface $customerRepository */
  38.         $customerRepository $this->container->get('customer.repository');
  39.         $criteria = new Criteria();
  40.         $criteria->addFilter(new EqualsFilter('id'$parentCustomer->getParent()));
  41.         $parentCustomer $customerRepository->search($criteriaContext::createDefaultContext())->first();
  42.         // customer has a parent for inheritance
  43.         if ($parentCustomer instanceof CustomerEntity) {
  44.             $customerPermissionService $this->container->get('customer.cio_customer_permission_service');
  45.             if ($customerPermissionService instanceof CustomerPermissionService) {
  46.                 $permissionGroupIds $event->getPermissionGroupIds();
  47.                 $event->setPermissionGroupIds(
  48.                     array_unique(
  49.                         array_merge(
  50.                             $permissionGroupIds// groups from user
  51.                             $customerPermissionService->getCustomerPermissionGroupIds($parentCustomer// groups from parent
  52.                         )
  53.                     )
  54.                 );
  55.             }
  56.         }
  57.     }
  58.     public function onCustomerPermissionGroupsLoadedEvent(CustomerPermissionGroupsLoadedEvent $event)
  59.     {
  60.         $customer $event->getCustomer();
  61.         $parentCustomer $customer->getExtension('customerParent');
  62.         // ignore customers without parent
  63.         if (is_null($parentCustomer)) {
  64.             return;
  65.         }
  66.         /** @var EntityRepositoryInterface $customerRepository */
  67.         $customerRepository $this->container->get('customer.repository');
  68.         $criteria = new Criteria();
  69.         $criteria->addFilter(new EqualsFilter('id'$parentCustomer->getParent()));
  70.         $parentCustomer $customerRepository->search($criteriaContext::createDefaultContext())->first();
  71.         // customer has a parent for inheritance
  72.         if ($parentCustomer instanceof CustomerEntity) {
  73.             $customerPermissionService $this->container->get('customer.cio_customer_permission_service');
  74.             $parentPermissionGroups $customerPermissionService->getCustomerPermissionGroups($parentCustomerContext::createDefaultContext());
  75.             // filter out unwanted permissions from parent
  76.             foreach ($parentPermissionGroups as $parentPermissionGroup) {
  77.                 $parentPermissionRoles $parentPermissionGroup->getRoles();
  78.                 foreach ($parentPermissionRoles as $index => $parentPermissionRole) {
  79.                     if (!in_array($parentPermissionRole['key'], self::ROLE_WHITELIST)) {
  80.                         $parentPermissionRoles[$index]['value'] = false;
  81.                     }
  82.                 }
  83.                 $parentPermissionGroup->setRoles($parentPermissionRoles);
  84.             }
  85.             // merge and save permissions
  86.             if ($customerPermissionService instanceof CustomerPermissionService) {
  87.                 $permissionGroups $event->getPermissionGroups();
  88.                 $event->setPermissionGroups(
  89.                     array_merge(
  90.                         $permissionGroups// groups from user
  91.                         $parentPermissionGroups // groups from parent
  92.                     )
  93.                 );
  94.             }
  95.         }
  96.     }
  97. }