<?php
declare(strict_types=1);
namespace App\Base\EventSubscriber;
use App\Base\Component\GraphQL\Parser;
use App\Base\Model\GraphQLObject;
use Pimcore\Bundle\DataHubBundle\Event\GraphQL\ExecutorEvents;
use Pimcore\Bundle\DataHubBundle\Event\GraphQL\Model\ExecutorEvent;
use Pimcore\Bundle\DataHubBundle\Event\GraphQL\Model\ExecutorResultEvent;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ExecutorSubscriber implements EventSubscriberInterface
{
protected ContainerBagInterface $params;
public function __construct(ContainerBagInterface $params)
{
$this->params = $params;
}
/**
* @return string[]
*/
public static function getSubscribedEvents()
{
return [
ExecutorEvents::PRE_EXECUTE => 'onPreExecute',
ExecutorEvents::POST_EXECUTE => 'onPostExecute',
];
}
public function onPreExecute(ExecutorEvent $event): void
{
$graphQLObject = Parser::createFromQuery($event->getQuery());
if ($graphQLObject->getOperationType() === GraphQLObject::OPERATION_TYPE_QUERY) {
$queryName = $graphQLObject->getOperationName();
if (in_array($queryName, $this->params->get('app.pimcore.graphql.skipPermissionQueryList'))) {
/** @var \Pimcore\Bundle\DataHubBundle\Configuration $configuration */
$configuration = $event->getContext()['configuration'];
$configurationList = $configuration->getConfiguration();
$configurationList['security']['skipPermissionCheck'] = true;
$configuration->setConfiguration($configurationList);
}
}
}
/**
* @param \Pimcore\Bundle\DataHubBundle\Event\GraphQL\Model\ExecutorResultEvent $event
*/
public function onPostExecute(ExecutorResultEvent $event): void
{
$result = $event->getResult();
$result->data['status'] = true;
if(!empty($result->errors)){
$error = current($result->errors);
$result->data['status'] = false;
$result->data['message'] = $error->getMessage();
$result->errors = [];
}
$event->setResult($result);
}
}