src/WellCommerce/Bundle/AppBundle/Controller/Front/GraphController.php line 49

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