src/WellCommerce/Bundle/AppBundle/Controller/Front/ShopDataController.php line 51

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