<?php
namespace CioSubaccounts\Subscriber;
use CioCustomerPermissionGroups\Definition\CustomerAclgroupsEntity;
use CioCustomerPermissionGroups\Event\CustomerPermissionGroupIdsLoadedEvent;
use CioCustomerPermissionGroups\Event\CustomerPermissionGroupsLoadedEvent;
use CioCustomerPermissionGroups\Service\CustomerPermissionService;
use Shopware\Core\Checkout\Customer\CustomerEntity;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SubaccountsPermissionInheritance implements EventSubscriberInterface
{
protected const ROLE_WHITELIST = [];
private ContainerInterface $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public static function getSubscribedEvents(): array
{
return [
CustomerPermissionGroupIdsLoadedEvent::class => 'onCustomerPermissionGroupIdsLoadedEvent',
CustomerPermissionGroupsLoadedEvent::class => 'onCustomerPermissionGroupsLoadedEvent'
];
}
public function onCustomerPermissionGroupIdsLoadedEvent(CustomerPermissionGroupIdsLoadedEvent $event)
{
$customer = $event->getCustomer();
$parentCustomer = $customer->getExtension('customerParent');
// ignore customers without parent
if (is_null($parentCustomer)) {
return;
}
/** @var EntityRepositoryInterface $customerRepository */
$customerRepository = $this->container->get('customer.repository');
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $parentCustomer->getParent()));
$parentCustomer = $customerRepository->search($criteria, Context::createDefaultContext())->first();
// customer has a parent for inheritance
if ($parentCustomer instanceof CustomerEntity) {
$customerPermissionService = $this->container->get('customer.cio_customer_permission_service');
if ($customerPermissionService instanceof CustomerPermissionService) {
$permissionGroupIds = $event->getPermissionGroupIds();
$event->setPermissionGroupIds(
array_unique(
array_merge(
$permissionGroupIds, // groups from user
$customerPermissionService->getCustomerPermissionGroupIds($parentCustomer) // groups from parent
)
)
);
}
}
}
public function onCustomerPermissionGroupsLoadedEvent(CustomerPermissionGroupsLoadedEvent $event)
{
$customer = $event->getCustomer();
$parentCustomer = $customer->getExtension('customerParent');
// ignore customers without parent
if (is_null($parentCustomer)) {
return;
}
/** @var EntityRepositoryInterface $customerRepository */
$customerRepository = $this->container->get('customer.repository');
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $parentCustomer->getParent()));
$parentCustomer = $customerRepository->search($criteria, Context::createDefaultContext())->first();
// customer has a parent for inheritance
if ($parentCustomer instanceof CustomerEntity) {
$customerPermissionService = $this->container->get('customer.cio_customer_permission_service');
$parentPermissionGroups = $customerPermissionService->getCustomerPermissionGroups($parentCustomer, Context::createDefaultContext());
// filter out unwanted permissions from parent
foreach ($parentPermissionGroups as $parentPermissionGroup) {
$parentPermissionRoles = $parentPermissionGroup->getRoles();
foreach ($parentPermissionRoles as $index => $parentPermissionRole) {
if (!in_array($parentPermissionRole['key'], self::ROLE_WHITELIST)) {
$parentPermissionRoles[$index]['value'] = false;
}
}
$parentPermissionGroup->setRoles($parentPermissionRoles);
}
// merge and save permissions
if ($customerPermissionService instanceof CustomerPermissionService) {
$permissionGroups = $event->getPermissionGroups();
$event->setPermissionGroups(
array_merge(
$permissionGroups, // groups from user
$parentPermissionGroups // groups from parent
)
);
}
}
}
}