From dd181b8903cecad0458b748b03430b0fbe0c3edc Mon Sep 17 00:00:00 2001 From: Guillaume Date: Thu, 11 Dec 2025 09:56:03 +0100 Subject: [PATCH 1/5] :alien: Support ecodev/graphql-upload v8 --- Controller/GraphQLiteController.php | 39 +++++++++---------- .../DummyResponseWithRequest.php | 27 +++++++++++++ .../RequestExtractorMiddleware.php | 21 ++++++++++ 3 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 src/UploadMiddlewareUtils/DummyResponseWithRequest.php create mode 100644 src/UploadMiddlewareUtils/RequestExtractorMiddleware.php diff --git a/Controller/GraphQLiteController.php b/Controller/GraphQLiteController.php index b359eef..d4dd037 100644 --- a/Controller/GraphQLiteController.php +++ b/Controller/GraphQLiteController.php @@ -8,16 +8,16 @@ use Laminas\Diactoros\ServerRequestFactory; use Laminas\Diactoros\StreamFactory; use Laminas\Diactoros\UploadedFileFactory; +use LogicException; use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory; +use TheCodingMachine\GraphQLite\Bundle\UploadMiddlewareUtils\DummyResponseWithRequest; +use TheCodingMachine\GraphQLite\Bundle\UploadMiddlewareUtils\RequestExtractorMiddleware; use TheCodingMachine\GraphQLite\Http\HttpCodeDecider; use TheCodingMachine\GraphQLite\Http\HttpCodeDeciderInterface; -use function array_map; use GraphQL\Executor\ExecutionResult; use GraphQL\Server\ServerConfig; use GraphQL\Server\StandardServer; use GraphQL\Upload\UploadMiddleware; -use function class_exists; -use function json_decode; use Psr\Http\Message\ServerRequestInterface; use RuntimeException; use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; @@ -28,25 +28,20 @@ use Symfony\Component\Routing\RouteCollection; use TheCodingMachine\GraphQLite\Bundle\Context\SymfonyGraphQLContext; +use function array_map; +use function class_exists; +use function get_class; +use function json_decode; + /** - * Listens to every single request and forward Graphql requests to Graphql Webonix standardServer. + * Listens to every single request and forwards GraphQL requests to Webonyx's {@see \GraphQL\Server\StandardServer}. */ class GraphQLiteController { - /** - * @var HttpMessageFactoryInterface - */ - private $httpMessageFactory; - /** @var int */ - private $debug; - /** - * @var ServerConfig - */ - private $serverConfig; - /** - * @var HttpCodeDeciderInterface - */ - private $httpCodeDecider; + private HttpMessageFactoryInterface $httpMessageFactory; + private int $debug; + private ServerConfig $serverConfig; + private HttpCodeDeciderInterface $httpCodeDecider; public function __construct(ServerConfig $serverConfig, ?HttpMessageFactoryInterface $httpMessageFactory = null, ?int $debug = null, ?HttpCodeDeciderInterface $httpCodeDecider = null) { @@ -90,10 +85,14 @@ public function handleRequest(Request $request): Response $psr7Request = $psr7Request->withParsedBody($parsedBody); } - // Let's parse the request and adapt it for file uploads. + // Let's parse the request and adapt it for file uploads by extracting it from the middleware. if (class_exists(UploadMiddleware::class)) { $uploadMiddleware = new UploadMiddleware(); - $psr7Request = $uploadMiddleware->processRequest($psr7Request); + $dummyResponseWithRequest = $uploadMiddleware->process($psr7Request, new RequestExtractorMiddleware()); + if (! $dummyResponseWithRequest instanceof DummyResponseWithRequest) { + throw new LogicException(DummyResponseWithRequest::class . ' expect, got ' . get_class($dummyResponseWithRequest)); + } + $psr7Request = $dummyResponseWithRequest->getRequest(); } return $this->handlePsr7Request($psr7Request, $request); diff --git a/src/UploadMiddlewareUtils/DummyResponseWithRequest.php b/src/UploadMiddlewareUtils/DummyResponseWithRequest.php new file mode 100644 index 0000000..a5a389b --- /dev/null +++ b/src/UploadMiddlewareUtils/DummyResponseWithRequest.php @@ -0,0 +1,27 @@ +request = $request; + } + + public function getRequest(): ServerRequestInterface + { + return $this->request; + } +} diff --git a/src/UploadMiddlewareUtils/RequestExtractorMiddleware.php b/src/UploadMiddlewareUtils/RequestExtractorMiddleware.php new file mode 100644 index 0000000..ce17ba5 --- /dev/null +++ b/src/UploadMiddlewareUtils/RequestExtractorMiddleware.php @@ -0,0 +1,21 @@ + Date: Wed, 17 Dec 2025 15:43:30 +0100 Subject: [PATCH 2/5] :package: Fix middleware utils placement to be consistent with other files --- .../DummyResponseWithRequest.php | 0 .../RequestExtractorMiddleware.php | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {src/UploadMiddlewareUtils => UploadMiddlewareUtils}/DummyResponseWithRequest.php (100%) rename {src/UploadMiddlewareUtils => UploadMiddlewareUtils}/RequestExtractorMiddleware.php (100%) diff --git a/src/UploadMiddlewareUtils/DummyResponseWithRequest.php b/UploadMiddlewareUtils/DummyResponseWithRequest.php similarity index 100% rename from src/UploadMiddlewareUtils/DummyResponseWithRequest.php rename to UploadMiddlewareUtils/DummyResponseWithRequest.php diff --git a/src/UploadMiddlewareUtils/RequestExtractorMiddleware.php b/UploadMiddlewareUtils/RequestExtractorMiddleware.php similarity index 100% rename from src/UploadMiddlewareUtils/RequestExtractorMiddleware.php rename to UploadMiddlewareUtils/RequestExtractorMiddleware.php From eb9b0a7833065dcd7c92349ab1c91024b9a0913b Mon Sep 17 00:00:00 2001 From: Andrii Dembitskyi Date: Wed, 17 Dec 2025 15:46:01 +0100 Subject: [PATCH 3/5] :package: Suggest installing `ecodev/graphql-upload` (v7/v8) --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 7491415..2287673 100644 --- a/composer.json +++ b/composer.json @@ -52,6 +52,7 @@ "phpstan": "phpstan analyse GraphQLiteBundle.php DependencyInjection/ Controller/ Resources/ Security/ -c phpstan.neon --level=7 --no-progress" }, "suggest": { + "ecodev/graphql-upload": "If you want to support file upload inside GraphQL input types (v7/v8)", "symfony/security-bundle": "To use @Logged or @Right annotations" }, "autoload" : { From 23daae41f26173b041ef054e515fcad1a1536d6f Mon Sep 17 00:00:00 2001 From: Andrii Dembitskyi Date: Wed, 17 Dec 2025 15:53:08 +0100 Subject: [PATCH 4/5] :package: Resolve phpstan issue - PHP 8.4 deprecation --- Controller/GraphQL/InvalidUserPasswordException.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Controller/GraphQL/InvalidUserPasswordException.php b/Controller/GraphQL/InvalidUserPasswordException.php index 48bdbbc..bee2b57 100644 --- a/Controller/GraphQL/InvalidUserPasswordException.php +++ b/Controller/GraphQL/InvalidUserPasswordException.php @@ -8,7 +8,7 @@ class InvalidUserPasswordException extends GraphQLException { - public static function create(Exception $previous = null): self + public static function create(?Exception $previous = null): self { return new self('The provided user / password is incorrect.', 401, $previous, 'Security'); } From 3acc055e003166e08d4738d6653fa7da4a5dd203 Mon Sep 17 00:00:00 2001 From: Andrii Dembitskyi Date: Wed, 17 Dec 2025 15:57:04 +0100 Subject: [PATCH 5/5] :package: Bump actions/cache to v5 to avoid failed CI with deprecated cache version --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 94e9a36..cbdafc3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,7 +35,7 @@ jobs: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: composer-cache - uses: actions/cache@v4.0.2 + uses: actions/cache@v5.0.1 with: path: ${{ steps.composercache.outputs.dir }} key: composer-${{ hashFiles('**/composer.json') }}-${{ matrix.install-args }} @@ -53,7 +53,7 @@ jobs: vendor/bin/simple-phpunit --no-coverage - name: phpstan-cache - uses: actions/cache@v4.0.2 + uses: actions/cache@v5.0.1 with: key: phpstan-${{ matrix.php-version }}-${{ matrix.install-args }}-${{ github.ref }}-${{ github.sha }} path: .phpstan-cache