diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml
index 7c74231a0..b229996d7 100644
--- a/.github/workflows/testing.yml
+++ b/.github/workflows/testing.yml
@@ -13,22 +13,18 @@ jobs:
strategy:
fail-fast: false
matrix:
- php-versions: ['8.1', '8.2']
- drupal-core: ['10.3.x']
- phpstan: ['0']
+ # # php-versions: ['8.1', '8.2']
+ # # drupal-core: ['10.3.x']
+ # phpstan: ['0']
include:
- # Extra run to test older supported Drupal 10.1.x.
- - php-versions: '8.1'
- drupal-core: '10.1.x'
- phpstan: '0'
# Extra run to test older supported Drupal 10.2.x.
- - php-versions: '8.1'
- drupal-core: '10.2.x'
- phpstan: '0'
+ # - php-versions: '8.1'
+ # drupal-core: '10.2.x'
+ # phpstan: '0'
# We only need to run PHPStan once on the latest PHP version.
- - php-versions: '8.3'
- drupal-core: '10.3.x'
- phpstan: '1'
+ # - php-versions: '8.3'
+ # drupal-core: '10.3.x'
+ # phpstan: '1'
- php-versions: '8.3'
drupal-core: '11.0.x'
phpstan: '1'
diff --git a/graphql.info.yml b/graphql.info.yml
index 90852febe..8b43f0087 100644
--- a/graphql.info.yml
+++ b/graphql.info.yml
@@ -3,6 +3,6 @@ type: module
description: 'Base module for integrating GraphQL with Drupal.'
package: GraphQL
configure: graphql.config_page
-core_version_requirement: ^10.1 || ^11
+core_version_requirement: ^10.2 || ^11
dependencies:
- typed_data:typed_data
diff --git a/graphql.services.yml b/graphql.services.yml
index ad0c2c9a7..23c01419f 100644
--- a/graphql.services.yml
+++ b/graphql.services.yml
@@ -184,6 +184,7 @@ services:
- '@renderer'
- '@event_dispatcher'
- '@image.factory'
+ - '@file.validator'
plugin.manager.graphql.persisted_query:
class: Drupal\graphql\Plugin\PersistedQueryPluginManager
diff --git a/src/GraphQL/Response/Response.php b/src/GraphQL/Response/Response.php
index 20b2c4eff..4467445bc 100644
--- a/src/GraphQL/Response/Response.php
+++ b/src/GraphQL/Response/Response.php
@@ -27,7 +27,7 @@ public function addViolation($message, array $properties = []): void {
/**
* {@inheritdoc}
*/
- public function addViolations(array $messages, array $properties = []): void {
+ public function addViolations($messages, array $properties = []): void {
foreach ($messages as $message) {
$this->addViolation($message, $properties);
}
diff --git a/src/GraphQL/Response/ResponseInterface.php b/src/GraphQL/Response/ResponseInterface.php
index f8f050ab0..f83eda7c7 100644
--- a/src/GraphQL/Response/ResponseInterface.php
+++ b/src/GraphQL/Response/ResponseInterface.php
@@ -12,7 +12,7 @@ interface ResponseInterface {
/**
* Adds the violation.
*
- * @param string|\Drupal\Core\StringTranslation\TranslatableMarkup $message
+ * @param string|\Drupal\Core\StringTranslation\TranslatableMarkup|\Symfony\Component\Validator\ConstraintViolationListInterface $message
* Violation message.
* @param array $properties
* Other properties related to the violation.
@@ -22,12 +22,12 @@ public function addViolation($message, array $properties = []): void;
/**
* Adds multiple violations.
*
- * @param string[]|\Drupal\Core\StringTranslation\TranslatableMarkup[] $messages
+ * @param string[]|\Drupal\Core\StringTranslation\TranslatableMarkup[]|\Symfony\Component\Validator\ConstraintViolationListInterface $messages
* Violation messages.
* @param array $properties
* Other properties related to the violation.
*/
- public function addViolations(array $messages, array $properties = []): void;
+ public function addViolations(array|ConstraintViolationListInterface $messages, array $properties = []): void;
/**
* Gets the violations.
diff --git a/src/GraphQL/Utility/FileUpload.php b/src/GraphQL/Utility/FileUpload.php
index 7543ea5c7..1d6a52d2f 100644
--- a/src/GraphQL/Utility/FileUpload.php
+++ b/src/GraphQL/Utility/FileUpload.php
@@ -17,9 +17,11 @@
use Drupal\Core\Render\RenderContext;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Session\AccountProxyInterface;
+use Drupal\Core\StringTranslation\ByteSizeMarkup;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Utility\Token;
use Drupal\file\FileInterface;
+use Drupal\file\Validation\FileValidatorInterface;
use Drupal\graphql\GraphQL\Response\FileUploadResponse;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
@@ -111,6 +113,13 @@ class FileUpload {
*/
protected $imageFactory;
+ /**
+ * The file validator service.
+ *
+ * @var \Drupal\file\Validation\FileValidatorInterface
+ */
+ protected FileValidatorInterface $fileValidator;
+
/**
* Constructor.
*/
@@ -126,6 +135,7 @@ public function __construct(
RendererInterface $renderer,
EventDispatcherInterface $eventDispatcher,
ImageFactory $image_factory,
+ FileValidatorInterface $file_validator,
) {
/** @var \Drupal\file\FileStorageInterface $file_storage */
$file_storage = $entityTypeManager->getStorage('file');
@@ -140,6 +150,7 @@ public function __construct(
$this->renderer = $renderer;
$this->eventDispatcher = $eventDispatcher;
$this->imageFactory = $image_factory;
+ $this->fileValidator = $file_validator;
}
/**
@@ -193,10 +204,7 @@ public function saveFileUpload(UploadedFile $uploaded_file, array $settings): Fi
switch ($uploaded_file->getError()) {
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
- // @todo Drupal 10.1 compatibility, needs to be converted to
- // ByteSizeMarkup later.
- // @phpstan-ignore-next-line
- $maxUploadSize = format_size($this->getMaxUploadSize($settings));
+ $maxUploadSize = ByteSizeMarkup::create($this->getMaxUploadSize($settings));
$response->addViolation($this->t('The file @file could not be saved because it exceeds @maxsize, the maximum allowed size for uploads.', [
'@file' => $uploaded_file->getClientOriginalName(),
'@maxsize' => $maxUploadSize,
@@ -248,8 +256,8 @@ public function saveFileUpload(UploadedFile $uploaded_file, array $settings): Fi
$temp_file_path = $uploaded_file->getRealPath();
- // Drupal 10.2 compatibility: use the deprecated constant for now.
- // @phpstan-ignore-next-line
+ // Drupal 10.3 compatibility: use the deprecated constant for now.
+ // @phpstan-ignore-next-line as it is deprecated in D12.
$file_uri = $this->fileSystem->getDestinationFilename($file_uri, FileSystemInterface::EXISTS_RENAME);
// Lock based on the prepared file URI.
@@ -272,11 +280,9 @@ public function saveFileUpload(UploadedFile $uploaded_file, array $settings): Fi
// before it is saved.
$file->setSize(@filesize($temp_file_path));
- // Validate against file_validate() first with the temporary path.
- // @todo Drupal 10.1 compatibility, needs to be converted to file validate
- // service later.
- // @phpstan-ignore-next-line
- $errors = file_validate($file, $validators);
+ // Validate against fileValidator first with the temporary path.
+ /** @var \Symfony\Component\Validator\ConstraintViolationListInterface $errors */
+ $errors = $this->fileValidator->validate($file, $validators);
$maxResolution = $settings['max_resolution'] ?? 0;
$minResolution = $settings['min_resolution'] ?? 0;
if (!empty($maxResolution) || !empty($minResolution)) {
@@ -579,7 +585,7 @@ protected function getUploadLocation(array $settings): string {
protected function getUploadValidators(array $settings): array {
$validators = [
// Add in our check of the file name length.
- 'file_validate_name_length' => [],
+ 'FileNameLength' => [],
];
// Cap the upload size according to the PHP limit.
@@ -589,11 +595,11 @@ protected function getUploadValidators(array $settings): array {
}
// There is always a file size limit due to the PHP server limit.
- $validators['file_validate_size'] = [$max_filesize];
+ $validators['FileSizeLimit'] = ['fileLimit' => $max_filesize];
// Add the extension check if necessary.
if (!empty($settings['file_extensions'])) {
- $validators['file_validate_extensions'] = [$settings['file_extensions']];
+ $validators['FileExtension'] = ['extensions' => $settings['file_extensions']];
}
return $validators;
diff --git a/tests/src/Kernel/AlterableSchemaTest.php b/tests/src/Kernel/AlterableSchemaTest.php
index f9f97d6c8..557249b45 100644
--- a/tests/src/Kernel/AlterableSchemaTest.php
+++ b/tests/src/Kernel/AlterableSchemaTest.php
@@ -156,7 +156,6 @@ protected function mockSchema($id, $schema, array $extensions = []): void {
$extensions['graphql_alterable_schema_test']->expects(static::any())
->method('getBaseDefinition')
->willReturn('');
-
// Different extension definition for different tests.
switch ($this->getName()) {
case 'testEmptySchemaExtensionAlteredQueryResultPropertyAdded':
diff --git a/tests/src/Kernel/Framework/UploadFileServiceTest.php b/tests/src/Kernel/Framework/UploadFileServiceTest.php
index 79ddf8c2c..c0307bd6b 100644
--- a/tests/src/Kernel/Framework/UploadFileServiceTest.php
+++ b/tests/src/Kernel/Framework/UploadFileServiceTest.php
@@ -104,7 +104,7 @@ public function testPartialFile(): void {
]);
$violations = $file_upload_response->getViolations();
- $this->assertStringMatchesFormat(
+ $this->assertStringContainsString(
'The file "test.txt" could not be saved because the upload did not complete.',
$violations[0]['message']
);
@@ -140,7 +140,7 @@ public function testSizeValidation(): void {
$violations = $file_upload_response->getViolations();
// @todo Do we want HTML tags in our violations or not?
- $this->assertStringMatchesFormat(
+ $this->assertStringContainsString(
'The file is 4 bytes exceeding the maximum file size of 1 byte.',
$violations[0]['message']
);
@@ -190,7 +190,7 @@ public function testDimensionTooSmallValidation(): void {
]);
$violations = $file_upload_response->getViolations();
- $this->assertStringMatchesFormat(
+ $this->assertStringContainsString(
'The image is too small. The minimum dimensions are 15x15 pixels and the image size is 10x10 pixels.',
$violations[0]['message']
);
@@ -228,7 +228,7 @@ public function testExtensionValidation(): void {
$violations = $file_upload_response->getViolations();
// @todo Do we want HTML tags in our violations or not?
- $this->assertStringMatchesFormat(
+ $this->assertStringContainsString(
'Only files with the following extensions are allowed: odt.',
$violations[0]['message']
);
@@ -256,6 +256,7 @@ public function testLockReleased(): void {
\Drupal::service('renderer'),
\Drupal::service('event_dispatcher'),
\Drupal::service('image.factory'),
+ \Drupal::service('file.validator'),
);
// Create a Symfony dummy uploaded file in test mode.
@@ -319,7 +320,7 @@ public function testUnsuccessWithMultipleFileUploads(): void {
// There must be violation regarding forbidden file extension.
$violations = $file_upload_response->getViolations();
- $this->assertStringMatchesFormat(
+ $this->assertStringContainsString(
'Only files with the following extensions are allowed: txt.',
$violations[0]['message']
);
diff --git a/tests/src/Kernel/GraphQLTestBase.php b/tests/src/Kernel/GraphQLTestBase.php
index 20425566f..f60b5338d 100644
--- a/tests/src/Kernel/GraphQLTestBase.php
+++ b/tests/src/Kernel/GraphQLTestBase.php
@@ -50,6 +50,7 @@ abstract class GraphQLTestBase extends KernelTestBase {
'content_translation',
'entity_reference_test',
'field',
+ 'file',
'menu_link_content',
'link',
'typed_data',