vendor/thecodingmachine/graphqlite-bundle/Controller/GraphQLiteController.php line 71

Open in your IDE?
  1. <?php
  2. namespace TheCodingMachine\GraphQLite\Bundle\Controller;
  3. use Laminas\Diactoros\ResponseFactory;
  4. use Laminas\Diactoros\ServerRequestFactory;
  5. use Laminas\Diactoros\StreamFactory;
  6. use Laminas\Diactoros\UploadedFileFactory;
  7. use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
  8. use TheCodingMachine\GraphQLite\Http\HttpCodeDecider;
  9. use function array_map;
  10. use GraphQL\Executor\ExecutionResult;
  11. use GraphQL\Server\ServerConfig;
  12. use GraphQL\Server\StandardServer;
  13. use GraphQL\Upload\UploadMiddleware;
  14. use function class_exists;
  15. use function json_decode;
  16. use Psr\Http\Message\ServerRequestInterface;
  17. use RuntimeException;
  18. use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Route;
  23. use Symfony\Component\Routing\RouteCollection;
  24. use TheCodingMachine\GraphQLite\Bundle\Context\SymfonyGraphQLContext;
  25. /**
  26.  * Listens to every single request and forward Graphql requests to Graphql Webonix standardServer.
  27.  */
  28. class GraphQLiteController
  29. {
  30.     /**
  31.      * @var HttpMessageFactoryInterface
  32.      */
  33.     private $httpMessageFactory;
  34.     /** @var int */
  35.     private $debug;
  36.     /**
  37.      * @var ServerConfig
  38.      */
  39.     private $serverConfig;
  40.     public function __construct(ServerConfig $serverConfigHttpMessageFactoryInterface $httpMessageFactory null, ?int $debug null)
  41.     {
  42.         $this->serverConfig $serverConfig;
  43.         $this->httpMessageFactory $httpMessageFactory ?: new PsrHttpFactory(new ServerRequestFactory(), new StreamFactory(), new UploadedFileFactory(), new ResponseFactory());
  44.         $this->debug $debug ?? $serverConfig->getDebugFlag();
  45.     }
  46.     public function loadRoutes(): RouteCollection
  47.     {
  48.         $routes = new RouteCollection();
  49.         // prepare a new route
  50.         $path '/graphql';
  51.         $defaults = [
  52.             '_controller' => self::class.'::handleRequest',
  53.         ];
  54.         $route = new Route($path$defaults);
  55.         // add the new route to the route collection
  56.         $routeName 'graphqliteRoute';
  57.         $routes->add($routeName$route);
  58.         return $routes;
  59.     }
  60.     public function handleRequest(Request $request): Response
  61.     {
  62.         $psr7Request $this->httpMessageFactory->createRequest($request);
  63.         if (strtoupper($request->getMethod()) === "POST" && empty($psr7Request->getParsedBody())) {
  64.             $content $psr7Request->getBody()->getContents();
  65.             $parsedBody json_decode($contenttrue);
  66.             if (json_last_error() !== JSON_ERROR_NONE) {
  67.                 throw new \RuntimeException('Invalid JSON received in POST body: '.json_last_error_msg());
  68.             }
  69.             $psr7Request $psr7Request->withParsedBody($parsedBody);
  70.         }
  71.         // Let's parse the request and adapt it for file uploads.
  72.         if (class_exists(UploadMiddleware::class)) {
  73.             $uploadMiddleware = new UploadMiddleware();
  74.             $psr7Request $uploadMiddleware->processRequest($psr7Request);
  75.         }
  76.         return $this->handlePsr7Request($psr7Request$request);
  77.     }
  78.     private function handlePsr7Request(ServerRequestInterface $requestRequest $symfonyRequest): JsonResponse
  79.     {
  80.         // Let's put the request in the context.
  81.         $serverConfig = clone $this->serverConfig;
  82.         $serverConfig->setContext(new SymfonyGraphQLContext($symfonyRequest));
  83.         $standardService = new StandardServer($serverConfig);
  84.         $result $standardService->executePsrRequest($request);
  85.         $httpCodeDecider = new HttpCodeDecider();
  86.         if ($result instanceof ExecutionResult) {
  87.             return new JsonResponse($result->toArray($this->debug), $httpCodeDecider->decideHttpStatusCode($result));
  88.         }
  89.         if (is_array($result)) {
  90.             $finalResult array_map(function (ExecutionResult $executionResult): array {
  91.                 return $executionResult->toArray($this->debug);
  92.             }, $result);
  93.             // Let's return the highest result.
  94.             $statuses array_map([$httpCodeDecider'decideHttpStatusCode'], $result);
  95.             $status = empty($statuses) ? 500 max($statuses);
  96.             return new JsonResponse($finalResult$status);
  97.         }
  98.         throw new RuntimeException('Only SyncPromiseAdapter is supported');
  99.     }
  100. }