QueryRouteEnhancer.php in GraphQL 8.3
File
src/Routing/QueryRouteEnhancer.php
View source
<?php
namespace Drupal\graphql\Routing;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Routing\EnhancerInterface;
use Drupal\graphql\Utility\JsonHelper;
use GraphQL\Server\Helper;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
class QueryRouteEnhancer implements EnhancerInterface {
public function enhance(array $defaults, Request $request) {
$route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
if (!$route
->hasDefault('_graphql')) {
return $defaults;
}
$helper = new Helper();
$method = $request
->getMethod();
$body = $this
->extractBody($request);
$query = $this
->extractQuery($request);
$operations = $helper
->parseRequestParams($method, $body, $query);
return $defaults + [
'_controller' => $defaults['_graphql']['single'],
'operations' => $operations,
];
}
protected function extractQuery(Request $request) {
return JsonHelper::decodeParams($request->query
->all());
}
protected function extractBody(Request $request) {
$values = [];
if ($content = json_decode($request
->getContent(), TRUE)) {
$values = array_merge($values, JsonHelper::decodeParams($content));
}
if (stripos($request->headers
->get('content-type'), 'multipart/form-data') !== FALSE) {
return $this
->extractMultipart($request, $values);
}
return $values;
}
protected function extractMultipart(Request $request, $values) {
if ($body = JsonHelper::decodeParams($request->request
->all())) {
$operations = isset($body['operations']) && is_array($body['operations']) ? $body['operations'] : [];
$values = array_merge($values, $body, $operations);
}
if (!empty($values['map']) && is_array($values['map']) && ($files = $request->files
->all())) {
foreach ($files as $key => $file) {
if (!isset($values['map'][$key])) {
continue;
}
$paths = (array) $values['map'][$key];
foreach ($paths as $path) {
$path = explode('.', $path);
if (NestedArray::keyExists($values, $path)) {
NestedArray::setValue($values, $path, $file);
}
}
}
}
return $values;
}
}