<?php
namespace App\EventSubscriber;
use App\Service\BuildReportService;
use GraphQL\Type\Definition\Type;
use Pimcore\Bundle\DataHubBundle\Event\GraphQL\Model\MutationTypeEvent;
use Pimcore\Bundle\DataHubBundle\Event\GraphQL\Model\QueryTypeEvent;
use Pimcore\Bundle\DataHubBundle\Event\GraphQL\MutationEvents;
use Pimcore\Bundle\DataHubBundle\Event\GraphQL\QueryEvents;
use Pimcore\Bundle\DataHubBundle\GraphQL\ElementDescriptor;
use Pimcore\Bundle\DataHubBundle\GraphQL\FieldHelper\DataObjectFieldHelper;
use Pimcore\Model\DataObject\ClassDefinition;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class BuildReportRangQuerySubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
QueryEvents::PRE_BUILD => 'onPreBuild',
];
}
/**
* @param MutationTypeEvent $event
*
* @throws \Exception
*/
public function onPreBuild(QueryTypeEvent $event)
{
$config = $event->getConfig();
$outputType = new \GraphQL\Type\Definition\ObjectType([
'name' => "BuildReportRank",
'fields' => [
'Rank' => [
'type' => \GraphQL\Type\Definition\Type::string(),
'resolve' => function ($source, $args, $context, \GraphQL\Type\Definition\ResolveInfo $info) {
$db = \Pimcore\Db::get();
$rank = $db->fetchAll(
'SELECT o_id, TotalScore, FIND_IN_SET( TotalScore, (
SELECT GROUP_CONCAT( TotalScore
ORDER BY TotalScore DESC )
FROM object_BuildReport )
) AS LeaderBoardPosition
FROM object_BuildReport
WHERE o_id = ?',
[$source['buildReportId']]
);
if (empty($rank)) {
return null;
}
return $rank[0]['LeaderBoardPosition'];
}
]
]
]
);
$operation = [
'type' => $outputType,
'args' => ['id' => ['type' => Type::nonNull(Type::int())]],
'resolve' => function ($source, $args, $context, \GraphQL\Type\Definition\ResolveInfo $info) {
return ['buildReportId' => $args['id']];
}
];
$config['fields']['getBuildReportRank'] = $operation;
$event->setConfig($config);
}
}