Skip to content

Commit

Permalink
feat: Uid normalizer (#131)
Browse files Browse the repository at this point in the history
* Add Uid normalizer

* Install symfony/uid + Fix tests

* Add php 7.2 limit on UUID tests + add test

* Remove service if class doesn't exist

* Remove php < 8 support + support php 8.3

* Revert symfony 7 support

* Conflict with symfony/doctrine-bridge >= 7.0.0

---------

Co-authored-by: Jérémy Leherpeur <[email protected]>
  • Loading branch information
amenophis and Jérémy Leherpeur authored Nov 29, 2023
1 parent 6a1f189 commit 18a4d61
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 21 deletions.
14 changes: 2 additions & 12 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,14 @@ jobs:
strategy:
matrix:
php-version:
- "7.1"
- "7.2"
- "7.3"
- "7.4"
- "8.0"
- "8.1"
- "8.2"
- "8.3"
dependencies:
- highest
include:
- php-version: "8.2"
- php-version: "8.3"
dependencies: lowest
fail-fast: false

Expand All @@ -38,13 +35,6 @@ jobs:
MYSQL_PASSWORD: odm

steps:
- name: Use legacy password hashing in MySQL
if: ${{ contains(fromJson('["7.1", "7.2", "7.3"]'), matrix.php-version) }}
env:
MYSQL_PWD: odmroot
run: |
mysql -h127.0.0.1 -uroot -e "ALTER USER odm IDENTIFIED WITH mysql_native_password BY 'odm'"
- name: Start PostgreSQL
run: |
sudo systemctl start postgresql.service
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,14 @@ use Dunglas\DoctrineJsonOdm\Type\JsonDocumentType;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer;
use Symfony\Component\Serializer\Normalizer\UidNormalizer;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

if (!Type::hasType('json_document')) {
Type::addType('json_document', JsonDocumentType::class);
Type::getType('json_document')->setSerializer(
new Serializer([new BackedEnumNormalizer(), new DateTimeNormalizer(), new ArrayDenormalizer(), new ObjectNormalizer()], [new JsonEncoder()])
new Serializer([new BackedEnumNormalizer(), new UidNormalizer(), new DateTimeNormalizer(), new ArrayDenormalizer(), new ObjectNormalizer()], [new JsonEncoder()])
);
}

Expand Down Expand Up @@ -301,7 +302,7 @@ As an example we inject a custom normalizer service. Be aware that the order of
dunglas_doctrine_json_odm.serializer:
class: Dunglas\DoctrineJsonOdm\Serializer
arguments:
- ['@App\MyCustom\Normalizer', '@?dunglas_doctrine_json_odm.normalizer.backed_enum', '@dunglas_doctrine_json_odm.normalizer.datetime', '@dunglas_doctrine_json_odm.normalizer.array', '@dunglas_doctrine_json_odm.normalizer.object']
- ['@App\MyCustom\Normalizer', '@?dunglas_doctrine_json_odm.normalizer.backed_enum', '@?dunglas_doctrine_json_odm.normalizer.uid', '@dunglas_doctrine_json_odm.normalizer.datetime', '@dunglas_doctrine_json_odm.normalizer.array', '@dunglas_doctrine_json_odm.normalizer.object']
- ['@serializer.encoder.json']
- '@?dunglas_doctrine_json_odm.type_mapper'
public: true
Expand Down
18 changes: 11 additions & 7 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,23 @@
}
],
"require": {
"php": ">=7.1",
"php": ">=8.0",
"doctrine/orm": "^2.6.3",
"symfony/property-access": "^4.4 || ^5.4 || ^6.0 || ^7.0",
"symfony/property-info": "^4.4 || ^5.4 || ^6.0 || ^7.0",
"symfony/serializer": "^4.4 || ^5.4 || ^6.0 || ^7.0"
"symfony/property-access": "^4.4 || ^5.4 || ^6.0",
"symfony/property-info": "^4.4 || ^5.4 || ^6.0",
"symfony/serializer": "^4.4 || ^5.4 || ^6.0"
},
"require-dev": {
"doctrine/annotations": "^1.0",
"doctrine/doctrine-bundle": "^1.12.13 || ^2.2",
"doctrine/dbal": "^2.7 || ^3.3",
"symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0",
"symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0 || ^7.0",
"symfony/phpunit-bridge": "^6.0 || ^7.0"
"symfony/finder": "^4.4 || ^5.4 || ^6.0",
"symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0",
"symfony/phpunit-bridge": "^6.0",
"symfony/uid": "^5.4 || ^6.0"
},
"conflict": {
"symfony/doctrine-bridge": ">=7.0.0"
},
"suggest": {
"symfony/framework-bundle": "To use the provided bundle.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer;
use Symfony\Component\Serializer\Normalizer\UidNormalizer;

/**
* @author Kévin Dunglas <[email protected]>
Expand Down Expand Up @@ -51,6 +52,10 @@ public function load(array $configs, ContainerBuilder $container): void
$container->removeDefinition('dunglas_doctrine_json_odm.normalizer.backed_enum');
}

if (!class_exists(UidNormalizer::class)) {
$container->removeDefinition('dunglas_doctrine_json_odm.normalizer.uid');
}

$config = $this->processConfiguration(new Configuration(), $configs);

if ($config['type_map'] ?? []) {
Expand Down
3 changes: 3 additions & 0 deletions src/Bundle/Resources/config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

<service id="dunglas_doctrine_json_odm.normalizer.backed_enum" class="Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer" public="false" />

<service id="dunglas_doctrine_json_odm.normalizer.uid" class="Symfony\Component\Serializer\Normalizer\UidNormalizer" public="false" />

<service id="dunglas_doctrine_json_odm.normalizer.datetime" class="Symfony\Component\Serializer\Normalizer\DateTimeNormalizer" public="false" />

<service id="dunglas_doctrine_json_odm.normalizer.array" class="Symfony\Component\Serializer\Normalizer\ArrayDenormalizer" public="false" />
Expand All @@ -25,6 +27,7 @@
<service id="dunglas_doctrine_json_odm.serializer" class="Dunglas\DoctrineJsonOdm\Serializer" public="true">
<argument type="collection">
<argument type="service" id="dunglas_doctrine_json_odm.normalizer.backed_enum" on-invalid="ignore" />
<argument type="service" id="dunglas_doctrine_json_odm.normalizer.uid" on-invalid="ignore" />
<argument type="service" id="dunglas_doctrine_json_odm.normalizer.datetime" />
<argument type="service" id="dunglas_doctrine_json_odm.normalizer.array" />
<argument type="service" id="dunglas_doctrine_json_odm.normalizer.object" />
Expand Down
28 changes: 28 additions & 0 deletions tests/FunctionalTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use Dunglas\DoctrineJsonOdm\Tests\Fixtures\TestBundle\Entity\Product;
use Dunglas\DoctrineJsonOdm\Tests\Fixtures\TestBundle\Enum\InputMode;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Uid\Uuid;

/**
* @author Kévin Dunglas <[email protected]>
Expand Down Expand Up @@ -218,4 +219,31 @@ public function testStoreAndRetrieveEnum(): void

$this->assertSame(InputMode::EMAIL, $retrievedProduct->attributes[0]->value);
}

/**
* @requires function \Symfony\Component\Serializer\Normalizer\UidNormalizer::normalize
*/
public function testStoreAndRetrieveUid(): void
{
$uuid = '1a87e1f2-1569-4493-a4a8-bc1915ca5631';

$attribute = new Attribute();
$attribute->key = 'uid';
$attribute->value = Uuid::fromString($uuid);

$product = new Product();
$product->name = 'My product';
$product->attributes = [$attribute];

$manager = self::$kernel->getContainer()->get('doctrine')->getManagerForClass(Product::class);
$manager->persist($product);
$manager->flush();

$manager->clear();

$retrievedProduct = $manager->find(Product::class, $product->id);

$this->assertInstanceOf(Uuid::class, $retrievedProduct->attributes[0]->value);
$this->assertEquals($uuid, (string) $retrievedProduct->attributes[0]->value);
}
}
18 changes: 18 additions & 0 deletions tests/SerializerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Dunglas\DoctrineJsonOdm\Tests\Fixtures\TestBundle\Document\WithMappedType;
use Dunglas\DoctrineJsonOdm\Tests\Fixtures\TestBundle\Entity\Foo;
use Dunglas\DoctrineJsonOdm\Tests\Fixtures\TestBundle\Enum\InputMode;
use Symfony\Component\Uid\UuidV4;

/**
* @author Kévin Dunglas <[email protected]>
Expand Down Expand Up @@ -223,4 +224,21 @@ public function testSerializeEnum(): void

$this->assertEquals($value, $restoredValue);
}

/**
* @requires function \Symfony\Component\Serializer\Normalizer\UidNormalizer::normalize
*/
public function testSerializeUid(): void
{
$serializer = self::$kernel->getContainer()->get('dunglas_doctrine_json_odm.serializer');

$value = new UuidV4('4a7ba820-c806-4579-a907-193a2493863b');
$data = $serializer->serialize($value, 'json');
$decodeData = json_decode($data, true);
$this->assertArrayHasKey('#type', $decodeData);
$this->assertSame(UuidV4::class, $decodeData['#type']);
$restoredValue = $serializer->deserialize($data, '', 'json');

$this->assertEquals($value, $restoredValue);
}
}

0 comments on commit 18a4d61

Please sign in to comment.