mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-09-25 08:05:00 +00:00
Remove empty PersonIdentifier
values during denormalization and add isEmpty
logic to PersonIdentifierWorker
. Include tests for empty value handling.
This commit is contained in:
@@ -38,4 +38,9 @@ final readonly class StringIdentifier implements PersonIdentifierEngineInterface
|
|||||||
{
|
{
|
||||||
return $identifier?->getValue()['content'] ?? '';
|
return $identifier?->getValue()['content'] ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isEmpty(PersonIdentifier $identifier): bool
|
||||||
|
{
|
||||||
|
return '' !== trim($identifier->getValue()['content'] ?? '');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,4 +24,12 @@ interface PersonIdentifierEngineInterface
|
|||||||
public function buildForm(FormBuilderInterface $builder, PersonIdentifierDefinition $personIdentifierDefinition): void;
|
public function buildForm(FormBuilderInterface $builder, PersonIdentifierDefinition $personIdentifierDefinition): void;
|
||||||
|
|
||||||
public function renderAsString(?PersonIdentifier $identifier, PersonIdentifierDefinition $definition): string;
|
public function renderAsString(?PersonIdentifier $identifier, PersonIdentifierDefinition $definition): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the identifier must be considered as empty.
|
||||||
|
*
|
||||||
|
* This is in use when the identifier is validated and must be required. If the identifier is empty and is required
|
||||||
|
* by the definition, the validation will fails.
|
||||||
|
*/
|
||||||
|
public function isEmpty(PersonIdentifier $identifier): bool;
|
||||||
}
|
}
|
||||||
|
@@ -46,4 +46,12 @@ final readonly class PersonIdentifierWorker
|
|||||||
{
|
{
|
||||||
return $this->identifierEngine->renderAsString($identifier, $this->definition);
|
return $this->identifierEngine->renderAsString($identifier, $this->definition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the identifier must be considered as empty.
|
||||||
|
*/
|
||||||
|
public function isEmpty(PersonIdentifier $identifier): bool
|
||||||
|
{
|
||||||
|
return $this->identifierEngine->isEmpty($identifier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -129,6 +129,10 @@ final class PersonJsonDenormalizer implements DenormalizerInterface, Denormalize
|
|||||||
|
|
||||||
$personIdentifier->setValue($value);
|
$personIdentifier->setValue($value);
|
||||||
$personIdentifier->setCanonical($worker->canonicalizeValue($value));
|
$personIdentifier->setCanonical($worker->canonicalizeValue($value));
|
||||||
|
|
||||||
|
if ($worker->isEmpty($personIdentifier)) {
|
||||||
|
$person->removeIdentifier($personIdentifier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -14,6 +14,7 @@ namespace Chill\PersonBundle\Tests\Serializer\Normalizer;
|
|||||||
use Chill\MainBundle\Entity\Center;
|
use Chill\MainBundle\Entity\Center;
|
||||||
use Chill\MainBundle\Entity\Civility;
|
use Chill\MainBundle\Entity\Civility;
|
||||||
use Chill\MainBundle\Entity\Gender;
|
use Chill\MainBundle\Entity\Gender;
|
||||||
|
use Chill\PersonBundle\Entity\Identifier\PersonIdentifier;
|
||||||
use Chill\PersonBundle\Entity\Identifier\PersonIdentifierDefinition;
|
use Chill\PersonBundle\Entity\Identifier\PersonIdentifierDefinition;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Chill\PersonBundle\PersonIdentifier\PersonIdentifierEngineInterface;
|
use Chill\PersonBundle\PersonIdentifier\PersonIdentifierEngineInterface;
|
||||||
@@ -23,6 +24,7 @@ use Chill\PersonBundle\Serializer\Normalizer\PersonJsonDenormalizer;
|
|||||||
use libphonenumber\PhoneNumber;
|
use libphonenumber\PhoneNumber;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
@@ -65,10 +67,18 @@ final class PersonJsonDenormalizerTest extends TestCase
|
|||||||
|
|
||||||
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, PersonIdentifierDefinition $personIdentifierDefinition): void {}
|
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, PersonIdentifierDefinition $personIdentifierDefinition): void {}
|
||||||
|
|
||||||
public function renderAsString(?\Chill\PersonBundle\Entity\Identifier\PersonIdentifier $identifier, PersonIdentifierDefinition $definition): string
|
public function renderAsString(?PersonIdentifier $identifier, PersonIdentifierDefinition $definition): string
|
||||||
{
|
{
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isEmpty(PersonIdentifier $identifier): bool
|
||||||
|
{
|
||||||
|
$value = $identifier->getValue();
|
||||||
|
$content = isset($value['content']) ? trim((string) $value['content']) : '';
|
||||||
|
|
||||||
|
return '' === $content;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return new PersonIdentifierWorker($engine, $definition);
|
return new PersonIdentifierWorker($engine, $definition);
|
||||||
@@ -225,4 +235,68 @@ final class PersonJsonDenormalizerTest extends TestCase
|
|||||||
}
|
}
|
||||||
self::assertTrue($found, 'Expected identifiers with definition id 5');
|
self::assertTrue($found, 'Expected identifiers with definition id 5');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testDenormalizeRemovesEmptyIdentifier(): void
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'type' => 'person',
|
||||||
|
'firstName' => 'Alice',
|
||||||
|
'lastName' => 'Smith',
|
||||||
|
'identifiers' => [
|
||||||
|
[
|
||||||
|
'type' => 'person_identifier',
|
||||||
|
'value' => ['content' => ''],
|
||||||
|
'definition_id' => 7,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$denormalizer = new PersonJsonDenormalizer($this->createIdentifierManager());
|
||||||
|
|
||||||
|
$person = $denormalizer->denormalize($data, Person::class);
|
||||||
|
|
||||||
|
// The identifier with empty content must be considered empty and removed
|
||||||
|
self::assertSame(0, $person->getIdentifiers()->count(), 'Expected no identifiers to remain on the person');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDenormalizeRemovesPreviouslyExistingIdentifierWhenIncomingValueIsEmpty(): void
|
||||||
|
{
|
||||||
|
// Prepare an existing Person with a pre-existing identifier (definition id = 9)
|
||||||
|
$definition = new PersonIdentifierDefinition(['en' => 'Test'], 'dummy');
|
||||||
|
$ref = new \ReflectionProperty(PersonIdentifierDefinition::class, 'id');
|
||||||
|
$ref->setValue($definition, 9);
|
||||||
|
|
||||||
|
$existingIdentifier = new PersonIdentifier($definition);
|
||||||
|
$existingIdentifier->setValue(['content' => 'ABC']);
|
||||||
|
|
||||||
|
$person = new Person();
|
||||||
|
$person->addIdentifier($existingIdentifier);
|
||||||
|
|
||||||
|
// Also set the identifier's own id = 9 so that the denormalizer logic matches it
|
||||||
|
// (the current denormalizer matches by PersonIdentifier->getId() === definition_id)
|
||||||
|
$refId = new \ReflectionProperty(PersonIdentifier::class, 'id');
|
||||||
|
$refId->setValue($existingIdentifier, 9);
|
||||||
|
|
||||||
|
// Incoming payload sets the same definition id with an empty value
|
||||||
|
$data = [
|
||||||
|
'type' => 'person',
|
||||||
|
'identifiers' => [
|
||||||
|
[
|
||||||
|
'type' => 'person_identifier',
|
||||||
|
'value' => ['content' => ''],
|
||||||
|
'definition_id' => 9,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$denormalizer = new PersonJsonDenormalizer($this->createIdentifierManager());
|
||||||
|
|
||||||
|
// Use AbstractNormalizer::OBJECT_TO_POPULATE to update the existing person
|
||||||
|
$result = $denormalizer->denormalize($data, Person::class, null, [
|
||||||
|
AbstractNormalizer::OBJECT_TO_POPULATE => $person,
|
||||||
|
]);
|
||||||
|
|
||||||
|
self::assertSame($person, $result, 'Denormalizer should update and return the provided Person instance');
|
||||||
|
self::assertSame(0, $person->getIdentifiers()->count(), 'The previously existing identifier should be removed when incoming value is empty');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user