Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IBX-6481: Fixed keys in array returned by VersionValidator::validate #271

Merged
merged 8 commits into from
Sep 27, 2023
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;
alongosz marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
Expand Down