Skip to content

Commit

Permalink
IBX-6481: Fixed keys in array returned by VersionValidator::validate (#…
Browse files Browse the repository at this point in the history
…271)

For more details see https://issues.ibexa.co/browse/IBX-6481 and #271
---------

Co-Authored-By: Paweł Niedzielski <Steveb-p@users.noreply.github.com>
  • Loading branch information
papcio122 and Steveb-p authored Sep 27, 2023
1 parent 6c05d9f commit 0edee54
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 62 deletions.
55 changes: 5 additions & 50 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -7070,11 +7070,6 @@ parameters:
count: 1
path: src/contracts/Repository/Validator/ContentValidator.php

-
message: "#^Method Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Validator\\\\ContentValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
path: src/contracts/Repository/Validator/ContentValidator.php

-
message: "#^Class Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\Bookmark\\\\BookmarkList implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#"
count: 1
Expand Down Expand Up @@ -7500,11 +7495,6 @@ parameters:
count: 1
path: src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php

-
message: "#^Interface Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\ContentType\\\\FieldDefinitionCollection extends generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#"
count: 1
path: src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php

-
message: "#^Method Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\ContentType\\\\FieldDefinitionCollection\\:\\:map\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
Expand Down Expand Up @@ -8115,11 +8105,6 @@ parameters:
count: 1
path: src/lib/Base/Exceptions/ContentFieldValidationException.php

-
message: "#^Parameter \\#2 \\$array of function implode expects array\\<string\\>, array\\<Ibexa\\\\Core\\\\FieldType\\\\ValidationError\\|string\\> given\\.$#"
count: 1
path: src/lib/Base/Exceptions/ContentFieldValidationException.php

-
message: "#^Property Ibexa\\\\Core\\\\Base\\\\Exceptions\\\\ContentFieldValidationException\\:\\:\\$messageTemplate has no type specified\\.$#"
count: 1
Expand Down Expand Up @@ -20215,6 +20200,11 @@ parameters:
count: 1
path: src/lib/Repository/ContentService.php

-
message: "#^Parameter \\#5 \\$fieldDefinitionId of method Ibexa\\\\Core\\\\Repository\\\\Helper\\\\RelationProcessor\\:\\:appendFieldRelations\\(\\) expects string, int given\\.$#"
count: 2
path: src/lib/Repository/ContentService.php

-
message: "#^Property Ibexa\\\\Contracts\\\\Core\\\\Persistence\\\\Content\\\\MetadataUpdateStruct\\:\\:\\$publicationDate \\(int\\) does not accept int\\|null\\.$#"
count: 1
Expand Down Expand Up @@ -21405,11 +21395,6 @@ parameters:
count: 1
path: src/lib/Repository/Strategy/ContentValidator/ContentValidatorStrategy.php

-
message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Strategy\\\\ContentValidator\\\\ContentValidatorStrategy\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
path: src/lib/Repository/Strategy/ContentValidator/ContentValidatorStrategy.php

-
message: "#^Property Ibexa\\\\Core\\\\Repository\\\\Strategy\\\\ContentValidator\\\\ContentValidatorStrategy\\:\\:\\$contentValidators \\(array\\<Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Validator\\\\ContentValidator\\>\\) does not accept iterable\\.$#"
count: 1
Expand Down Expand Up @@ -21620,11 +21605,6 @@ parameters:
count: 1
path: src/lib/Repository/UserService.php

-
message: "#^Parameter \\#1 \\$errors of static method Ibexa\\\\Core\\\\Base\\\\Exceptions\\\\ContentFieldValidationException\\:\\:createNewWithMultiline\\(\\) expects array\\<array\\<string, Ibexa\\\\Core\\\\FieldType\\\\ValidationError\\>\\>, array\\<int\\|string, array\\<string, array\\<Ibexa\\\\Contracts\\\\Core\\\\FieldType\\\\ValidationError\\>\\>\\> given\\.$#"
count: 1
path: src/lib/Repository/UserService.php

-
message: "#^Parameter \\#1 \\$identifier of method Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\ContentTypeService\\:\\:loadContentTypeByIdentifier\\(\\) expects string, string\\|false given\\.$#"
count: 2
Expand Down Expand Up @@ -21670,11 +21650,6 @@ parameters:
count: 1
path: src/lib/Repository/Validator/ContentCreateStructValidator.php

-
message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\ContentCreateStructValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
path: src/lib/Repository/Validator/ContentCreateStructValidator.php

-
message: "#^Cannot access property \\$value on Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\Content\\\\Field\\|null\\.$#"
count: 2
Expand All @@ -21685,11 +21660,6 @@ parameters:
count: 1
path: src/lib/Repository/Validator/ContentUpdateStructValidator.php

-
message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\ContentUpdateStructValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
path: src/lib/Repository/Validator/ContentUpdateStructValidator.php

-
message: "#^Property Ibexa\\\\Core\\\\Repository\\\\Validator\\\\ContentUpdateStructValidator\\:\\:\\$contentLanguageHandler \\(Ibexa\\\\Core\\\\Persistence\\\\Legacy\\\\Content\\\\Language\\\\Handler\\) does not accept Ibexa\\\\Contracts\\\\Core\\\\Persistence\\\\Content\\\\Language\\\\Handler\\.$#"
count: 1
Expand Down Expand Up @@ -21720,16 +21690,6 @@ parameters:
count: 1
path: src/lib/Repository/Validator/UserPasswordValidator.php

-
message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\VersionValidator\\:\\:validate\\(\\) has parameter \\$context with no value type specified in iterable type array\\.$#"
count: 1
path: src/lib/Repository/Validator/VersionValidator.php

-
message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\VersionValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
path: src/lib/Repository/Validator/VersionValidator.php

-
message: "#^Call to method getValue\\(\\) on an unknown class eZ\\\\Publish\\\\API\\\\Repository\\\\Values\\\\Content\\\\Field\\.$#"
count: 1
Expand Down Expand Up @@ -56730,11 +56690,6 @@ parameters:
count: 1
path: tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest.php

-
message: "#^Method class@anonymous/tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest\\.php\\:87\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
path: tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest.php

-
message: "#^Property class@anonymous/tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest\\.php\\:87\\:\\:\\$validationReturn type has no value type specified in iterable type array\\.$#"
count: 1
Expand Down
12 changes: 10 additions & 2 deletions src/contracts/Repository/Validator/ContentValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,16 @@ public function supports(ValueObject $object): bool;
* @param string[]|null $fieldIdentifiers List of field identifiers for partial validation or null for
* case of full validation. Empty identifiers array is equal to no validation.
*
* @return array Grouped validation errors by field definition and language code, in format:
* $returnValue[string|int $fieldDefinitionId][string $languageCode] = $fieldErrors;
* @phpstan-return array<
* int,
* array<
* string,
* \Ibexa\Contracts\Core\FieldType\ValidationError|\Ibexa\Contracts\Core\FieldType\ValidationError[]
* >
* >
*
* @return array Grouped validation errors by field definition ID and language code, in format:
* $returnValue[int $fieldDefinitionId][string $languageCode] = $fieldErrors;
*
* @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*
* @property-read array $fieldSettings calls getFieldSettings()
* @property-read array $validatorConfiguration calls getValidatorConfiguration()
* @property-read mixed $id the id of the field definition
* @property-read int $id the id of the field definition
* @property-read string $identifier the identifier of the field definition
* @property-read string $fieldGroup the field group name
* @property-read int $position the position of the field definition in the content type
Expand All @@ -35,7 +35,7 @@ abstract class FieldDefinition extends ValueObject implements MultiLanguageName,
/**
* the unique id of this field definition.
*
* @var mixed
* @var int
*/
protected $id;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
use Countable;
use IteratorAggregate;

/**
* @phpstan-extends \IteratorAggregate<\Ibexa\Contracts\Core\Repository\Values\ContentType\FieldDefinition>
*/
interface FieldDefinitionCollection extends Countable, IteratorAggregate, ArrayAccess
{
/**
Expand Down
18 changes: 12 additions & 6 deletions src/lib/Base/Exceptions/ContentFieldValidationException.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ class ContentFieldValidationException extends APIContentFieldValidationException
* Example:
* <code>
* $fieldErrors = $exception->getFieldErrors();
* $fieldErrors["43"]["eng-GB"]->getTranslatableMessage();
* $fieldErrors[43]["eng-GB"]->getTranslatableMessage();
* </code>
*
* @var array<array-key, array<string, \Ibexa\Core\FieldType\ValidationError>>
* @var array<int, array<string, \Ibexa\Contracts\Core\FieldType\ValidationError|\Ibexa\Contracts\Core\FieldType\ValidationError[]>>
*/
protected $errors;

Expand All @@ -40,7 +40,7 @@ class ContentFieldValidationException extends APIContentFieldValidationException
*
* Also sets the given $fieldErrors to the internal property, retrievable by getFieldErrors()
*
* @param array<array-key, array<string, \Ibexa\Core\FieldType\ValidationError>> $errors
* @param array<int, array<string, \Ibexa\Contracts\Core\FieldType\ValidationError|\Ibexa\Contracts\Core\FieldType\ValidationError[]>> $errors
*/
public function __construct(array $errors)
{
Expand All @@ -52,7 +52,7 @@ public function __construct(array $errors)
/**
* Generates: Content fields did not validate exception with additional information on affected fields.
*
* @param array<array-key, array<string, \Ibexa\Core\FieldType\ValidationError>> $errors
* @param array<int, array<string, \Ibexa\Contracts\Core\FieldType\ValidationError|\Ibexa\Contracts\Core\FieldType\ValidationError[]>> $errors
*/
public static function createNewWithMultiline(array $errors, ?string $contentName = null): self
{
Expand All @@ -72,7 +72,7 @@ public static function createNewWithMultiline(array $errors, ?string $contentNam
/**
* Returns an array of field validation error messages.
*
* @return array<array-key, array<string, \Ibexa\Core\FieldType\ValidationError>>
* @return array<int, array<string, \Ibexa\Contracts\Core\FieldType\ValidationError|\Ibexa\Contracts\Core\FieldType\ValidationError[]>>
*/
public function getFieldErrors()
{
Expand All @@ -89,11 +89,17 @@ private function generateValidationErrorsMessages(): string
$validationErrors[] = sprintf('Limit: %d of validation errors has been exceeded.', $maxMessagesNumber);
}

/** @var callable(string|\Ibexa\Contracts\Core\Repository\Values\Translation): string $convertToString */
$convertToString = static function ($error): string {
return (string)$error;
};
$validationErrors = array_map($convertToString, $validationErrors);

return "\n- " . implode("\n- ", $validationErrors);
}

/**
* @return array<\Ibexa\Core\FieldType\ValidationError>
* @return array<\Ibexa\Contracts\Core\Repository\Values\Translation>
*/
private function collectValidationErrors(): array
{
Expand Down
10 changes: 8 additions & 2 deletions src/lib/Repository/Validator/VersionValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ public function supports(ValueObject $object): bool
return $object instanceof VersionInfo;
}

/**
* @phpstan-param array{
* content?: \Ibexa\Contracts\Core\Repository\Values\Content\Content,
* translations?: string[],
* } $context
*/
public function validate(
ValueObject $object,
array $context = [],
Expand Down Expand Up @@ -73,7 +79,7 @@ public function validate(

if ($fieldType->isEmptyValue($fieldValue)) {
if ($fieldDefinition->isRequired) {
$allFieldErrors[$fieldDefinition->identifier][$languageCode] = new ValidationError(
$allFieldErrors[$fieldDefinition->id][$languageCode] = new ValidationError(
"Value for required field definition '%identifier%' with language '%languageCode%' is empty",
null,
['%identifier%' => $fieldDefinition->identifier, '%languageCode%' => $languageCode],
Expand All @@ -86,7 +92,7 @@ public function validate(
$fieldValue
);
if (!empty($fieldErrors)) {
$allFieldErrors[$fieldDefinition->identifier][$languageCode] = $fieldErrors;
$allFieldErrors[$fieldDefinition->id][$languageCode] = $fieldErrors;
}
}
}
Expand Down

0 comments on commit 0edee54

Please sign in to comment.