From a0085892357aaed439db2ca4b6cf46688b04550d Mon Sep 17 00:00:00 2001 From: Jean-Pascal Devierne Date: Tue, 5 Jan 2021 09:22:39 +0100 Subject: [PATCH 1/4] Add mongodb date_immutable filter support --- features/doctrine/date_filter.feature | 1 - .../Doctrine/MongoDbOdm/Filter/DateFilter.php | 1 + .../PropertyInfo/DoctrineExtractor.php | 2 + tests/Behat/DoctrineContext.php | 11 +++- .../PropertyInfo/DoctrineExtractorTest.php | 2 + .../PropertyInfo/Fixtures/DoctrineDummy.php | 5 ++ .../Document/DummyImmutableDate.php | 53 +++++++++++++++++++ tests/Fixtures/app/config/config_mongodb.yml | 4 ++ 8 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 tests/Fixtures/TestBundle/Document/DummyImmutableDate.php diff --git a/features/doctrine/date_filter.feature b/features/doctrine/date_filter.feature index 067fbb14745..7d8d1a906f8 100644 --- a/features/doctrine/date_filter.feature +++ b/features/doctrine/date_filter.feature @@ -506,7 +506,6 @@ Feature: Date filter on collections And the JSON node "hydra:member[0].dateIncludeNullBeforeAndAfter" should be equal to "2015-04-02T00:00:00+00:00" And the JSON node "hydra:member[1].dateIncludeNullBeforeAndAfter" should be null - @!mongodb @createSchema Scenario: Get collection filtered by date that is an immutable date variant Given there are 30 dummyimmutabledate objects with dummyDate diff --git a/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php b/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php index 275a153e369..8904bf570b7 100644 --- a/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php +++ b/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php @@ -34,6 +34,7 @@ class DateFilter extends AbstractFilter implements DateFilterInterface public const DOCTRINE_DATE_TYPES = [ MongoDbType::DATE => true, + MongoDbType::DATE_IMMUTABLE => true, ]; /** diff --git a/src/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractor.php b/src/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractor.php index 3325392b5da..6538bce9cf0 100644 --- a/src/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractor.php +++ b/src/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractor.php @@ -92,6 +92,8 @@ public function getTypes($class, $property, array $context = []) switch ($typeOfField) { case MongoDbType::DATE: return [new Type(Type::BUILTIN_TYPE_OBJECT, $nullable, 'DateTime')]; + case MongoDbType::DATE_IMMUTABLE: + return [new Type(Type::BUILTIN_TYPE_OBJECT, $nullable, 'DateTimeImmutable')]; case MongoDbType::HASH: return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true)]; case MongoDbType::COLLECTION: diff --git a/tests/Behat/DoctrineContext.php b/tests/Behat/DoctrineContext.php index 3d5754c4f34..b332cab9bd9 100644 --- a/tests/Behat/DoctrineContext.php +++ b/tests/Behat/DoctrineContext.php @@ -45,6 +45,7 @@ use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoOutputSameClass as DummyDtoOutputSameClassDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyFriend as DummyFriendDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyGroup as DummyGroupDocument; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyImmutableDate as DummyDateImmutableDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyMercure as DummyMercureDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyOffer as DummyOfferDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyProduct as DummyProductDocument; @@ -1270,7 +1271,7 @@ public function thereAreDummyImmutableDateObjectsWithDummyDate(int $nb) { for ($i = 1; $i <= $nb; ++$i) { $date = new \DateTimeImmutable(sprintf('2015-04-%d', $i), new \DateTimeZone('UTC')); - $dummy = new DummyImmutableDate(); + $dummy = $this->buildDummyImmutableDate(); $dummy->dummyDate = $date; $this->manager->persist($dummy); @@ -1801,6 +1802,14 @@ private function buildDummyDate() return $this->isOrm() ? new DummyDate() : new DummyDateDocument(); } + /** + * @return DummyImmutableDate|DummyDateImmutableDocument + */ + private function buildDummyImmutableDate() + { + return $this->isOrm() ? new DummyImmutableDate() : new DummyDateImmutableDocument(); + } + /** * @return DummyDifferentGraphQlSerializationGroup|DummyDifferentGraphQlSerializationGroupDocument */ diff --git a/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractorTest.php b/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractorTest.php index 36505c4dc9c..1638b933ea9 100644 --- a/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractorTest.php +++ b/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/DoctrineExtractorTest.php @@ -52,6 +52,7 @@ public function testGetProperties(): void 'binUuidRfc4122', 'timestamp', 'date', + 'dateImmutable', 'float', 'bool', 'boolean', @@ -141,6 +142,7 @@ public function typesProvider(): array ['binUuidRfc4122', [new Type(Type::BUILTIN_TYPE_STRING)]], ['timestamp', [new Type(Type::BUILTIN_TYPE_STRING)]], ['date', [new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')]], + ['dateImmutable', [new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTimeImmutable')]], ['float', [new Type(Type::BUILTIN_TYPE_FLOAT)]], ['bool', [new Type(Type::BUILTIN_TYPE_BOOL)]], ['boolean', [new Type(Type::BUILTIN_TYPE_BOOL)]], diff --git a/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/Fixtures/DoctrineDummy.php b/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/Fixtures/DoctrineDummy.php index 64a34ed4f65..e54438a4190 100644 --- a/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/Fixtures/DoctrineDummy.php +++ b/tests/Bridge/Doctrine/MongoDbOdm/PropertyInfo/Fixtures/DoctrineDummy.php @@ -91,6 +91,11 @@ class DoctrineDummy */ private $date; + /** + * @Field(type="date_immutable") + */ + private $dateImmutable; + /** * @Field(type="float") */ diff --git a/tests/Fixtures/TestBundle/Document/DummyImmutableDate.php b/tests/Fixtures/TestBundle/Document/DummyImmutableDate.php new file mode 100644 index 00000000000..6bc16ea97c4 --- /dev/null +++ b/tests/Fixtures/TestBundle/Document/DummyImmutableDate.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Document; + +use ApiPlatform\Core\Annotation\ApiResource; +use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; + +/** + * Dummy Date Immutable. + * + * @ApiResource(attributes={ + * "filters"={"my_dummy_immutable_date.mongodb.date"} + * }) + * + * @ODM\Document + */ +class DummyImmutableDate +{ + /** + * @var int The id + * + * @ODM\Id(strategy="INCREMENT", type="integer") + */ + private $id; + + /** + * @var \DateTimeImmutable The dummy date + * + * @ODM\Field(type="date_immutable") + */ + public $dummyDate; + + /** + * Get id. + * + * @return int + */ + public function getId() + { + return $this->id; + } +} diff --git a/tests/Fixtures/app/config/config_mongodb.yml b/tests/Fixtures/app/config/config_mongodb.yml index 15565a806d3..747bd44724e 100644 --- a/tests/Fixtures/app/config/config_mongodb.yml +++ b/tests/Fixtures/app/config/config_mongodb.yml @@ -60,6 +60,10 @@ services: parent: 'api_platform.doctrine_mongodb.odm.date_filter' arguments: [ { 'dummyDate': ~ } ] tags: [ { name: 'api_platform.filter', id: 'my_dummy_date.mongodb.date' } ] + app.my_dummy_immutable_date_resource.mongodb.date_filter: + parent: 'api_platform.doctrine_mongodb.odm.date_filter' + arguments: [ { 'dummyDate': ~ } ] + tags: [ { name: 'api_platform.filter', id: 'my_dummy_immutable_date.mongodb.date' } ] app.related_dummy_to_friend_resource.mongodb.search_filter: parent: 'api_platform.doctrine_mongodb.odm.search_filter' arguments: [ { 'name': 'ipartial', 'description': 'ipartial' } ] From babf30b0dd3e3a44fe561470f92d8e7af39d694b Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Tue, 5 Jan 2021 10:59:00 +0100 Subject: [PATCH 2/4] Add conflict for MongoDB ODM < 2.1 and update SearchFilter too --- CHANGELOG.md | 4 ++++ composer.json | 4 ++-- src/Bridge/Doctrine/MongoDbOdm/Filter/SearchFilter.php | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e4e2ed20f5..5145a3c46e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2.7.0 + +* MongoDB: `date_immutable` support (#3940) + ## 2.6.1 * Fix defaults when using attributes (#3978) diff --git a/composer.json b/composer.json index a4a2e4fa763..93f236ea7ad 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "doctrine/common": "^2.11 || ^3.0", "doctrine/data-fixtures": "^1.2.2", "doctrine/doctrine-bundle": "^1.12 || ^2.0", - "doctrine/mongodb-odm": "^2.0", + "doctrine/mongodb-odm": "^2.1", "doctrine/mongodb-odm-bundle": "^4.0", "doctrine/orm": "^2.6.4 || ^3.0", "elasticsearch/elasticsearch": "^6.0 || ^7.0", @@ -86,7 +86,7 @@ }, "conflict": { "doctrine/common": "<2.7", - "doctrine/mongodb-odm": "<2.0", + "doctrine/mongodb-odm": "<2.1", "doctrine/persistence": "<1.3" }, "suggest": { diff --git a/src/Bridge/Doctrine/MongoDbOdm/Filter/SearchFilter.php b/src/Bridge/Doctrine/MongoDbOdm/Filter/SearchFilter.php index 91cb23dc3cf..b75b2b310ea 100644 --- a/src/Bridge/Doctrine/MongoDbOdm/Filter/SearchFilter.php +++ b/src/Bridge/Doctrine/MongoDbOdm/Filter/SearchFilter.php @@ -202,6 +202,7 @@ protected function getType(string $doctrineType): string case MongoDbType::BOOLEAN: return 'bool'; case MongoDbType::DATE: + case MongoDbType::DATE_IMMUTABLE: return \DateTimeInterface::class; case MongoDbType::FLOAT: return 'float'; From ae31877e3be63ccc8feb808d1b6c5618e5898040 Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Tue, 5 Jan 2021 11:01:26 +0100 Subject: [PATCH 3/4] Fix DummyImmutableDateDocument name in DoctrineContext --- tests/Behat/DoctrineContext.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Behat/DoctrineContext.php b/tests/Behat/DoctrineContext.php index b332cab9bd9..db2405e5daa 100644 --- a/tests/Behat/DoctrineContext.php +++ b/tests/Behat/DoctrineContext.php @@ -45,7 +45,7 @@ use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoOutputSameClass as DummyDtoOutputSameClassDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyFriend as DummyFriendDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyGroup as DummyGroupDocument; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyImmutableDate as DummyDateImmutableDocument; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyImmutableDate as DummyImmutableDateDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyMercure as DummyMercureDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyOffer as DummyOfferDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyProduct as DummyProductDocument; @@ -1803,11 +1803,11 @@ private function buildDummyDate() } /** - * @return DummyImmutableDate|DummyDateImmutableDocument + * @return DummyImmutableDate|DummyImmutableDateDocument */ private function buildDummyImmutableDate() { - return $this->isOrm() ? new DummyImmutableDate() : new DummyDateImmutableDocument(); + return $this->isOrm() ? new DummyImmutableDate() : new DummyImmutableDateDocument(); } /** From fe7be2423fb0b671ba186abed6233ec905949a3f Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Thu, 11 Feb 2021 11:15:01 +0100 Subject: [PATCH 4/4] ci: remove why doctrine/reflection --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d268056ee9..ab21915d65f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -522,7 +522,6 @@ jobs: - name: Update project dependencies run: | composer update --no-interaction --no-progress --ansi - composer why doctrine/reflection # - name: Require Symfony Uid # run: composer require symfony/uid --dev --no-interaction --no-progress --ansi - name: Install PHPUnit