From 02fd4563cee1557c5aec12daa325757fa8cecd66 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Thu, 3 Dec 2020 00:03:12 +0700 Subject: [PATCH 1/4] Allow mixed type value when apply to DateFilter. --- src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php | 4 ++-- src/Bridge/Doctrine/Orm/Filter/DateFilter.php | 4 ++-- tests/Bridge/Doctrine/Common/Filter/DateFilterTestTrait.php | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php b/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php index 8904bf570b7..3d0e1d2ff2f 100644 --- a/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php +++ b/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php @@ -108,11 +108,11 @@ protected function filterProperty(string $property, $values, Builder $aggregatio /** * Adds the match stage according to the chosen null management. */ - private function addMatch(Builder $aggregationBuilder, string $field, string $operator, string $value, string $nullManagement = null): void + private function addMatch(Builder $aggregationBuilder, string $field, string $operator, $value, string $nullManagement = null): void { try { $value = new \DateTime($value); - } catch (\Exception $e) { + } catch (\Throwable $e) { // Silently ignore this filter if it can not be transformed to a \DateTime $this->logger->notice('Invalid filter ignored', [ 'exception' => new InvalidArgumentException(sprintf('The field "%s" has a wrong date format. Use one accepted by the \DateTime constructor', $field)), diff --git a/src/Bridge/Doctrine/Orm/Filter/DateFilter.php b/src/Bridge/Doctrine/Orm/Filter/DateFilter.php index 0b619be243e..dbbe370eb85 100644 --- a/src/Bridge/Doctrine/Orm/Filter/DateFilter.php +++ b/src/Bridge/Doctrine/Orm/Filter/DateFilter.php @@ -128,12 +128,12 @@ protected function filterProperty(string $property, $values, QueryBuilder $query * * @param string|DBALType $type */ - protected function addWhere(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, string $operator, string $value, string $nullManagement = null, $type = null) + protected function addWhere(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, string $operator, $value, string $nullManagement = null, $type = null) { $type = (string) $type; try { $value = false === strpos($type, '_immutable') ? new \DateTime($value) : new \DateTimeImmutable($value); - } catch (\Exception $e) { + } catch (\Throwable $e) { // Silently ignore this filter if it can not be transformed to a \DateTime $this->logger->notice('Invalid filter ignored', [ 'exception' => new InvalidArgumentException(sprintf('The field "%s" has a wrong date format. Use one accepted by the \DateTime constructor', $field)), diff --git a/tests/Bridge/Doctrine/Common/Filter/DateFilterTestTrait.php b/tests/Bridge/Doctrine/Common/Filter/DateFilterTestTrait.php index 490960d9bb8..7d680d26d54 100644 --- a/tests/Bridge/Doctrine/Common/Filter/DateFilterTestTrait.php +++ b/tests/Bridge/Doctrine/Common/Filter/DateFilterTestTrait.php @@ -220,6 +220,7 @@ private function provideApplyTestArguments(): array [ 'dummyDate' => [ 'after' => '1932iur123ufqe', + 'before' => [], ], ], ], From d7120b9b314643e54dab70ac4c24039abf347ae5 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Thu, 3 Dec 2020 14:05:40 +0700 Subject: [PATCH 2/4] Normalize date time value filter --- .../Doctrine/Common/Filter/DateFilterTrait.php | 17 +++++++++++++++++ .../Doctrine/MongoDbOdm/Filter/DateFilter.php | 8 +++++++- src/Bridge/Doctrine/Orm/Filter/DateFilter.php | 8 +++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php b/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php index 82e5db681f4..a2ef995cc75 100644 --- a/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php +++ b/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php @@ -14,6 +14,7 @@ namespace ApiPlatform\Core\Bridge\Doctrine\Common\Filter; use ApiPlatform\Core\Bridge\Doctrine\Common\PropertyHelperTrait; +use ApiPlatform\Core\Exception\InvalidArgumentException; /** * Trait for filtering the collection by date intervals. @@ -79,4 +80,20 @@ protected function getFilterDescription(string $property, string $period): array ], ]; } + + /** + * Normalize the value. + */ + private function normalizeValue($value, string $operator): ?string + { + if (!\is_string($value)) { + $this->getLogger()->notice('Invalid filter ignored', [ + 'exception' => new InvalidArgumentException(sprintf('Invalid value for "[%s]", expected string', $operator)), + ]); + + return null; + } + + return $value; + } } diff --git a/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php b/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php index 3d0e1d2ff2f..6c6abf3ccf7 100644 --- a/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php +++ b/src/Bridge/Doctrine/MongoDbOdm/Filter/DateFilter.php @@ -110,9 +110,15 @@ protected function filterProperty(string $property, $values, Builder $aggregatio */ private function addMatch(Builder $aggregationBuilder, string $field, string $operator, $value, string $nullManagement = null): void { + $value = $this->normalizeValue($value, $operator); + + if (null === $value) { + return; + } + try { $value = new \DateTime($value); - } catch (\Throwable $e) { + } catch (\Exception $e) { // Silently ignore this filter if it can not be transformed to a \DateTime $this->logger->notice('Invalid filter ignored', [ 'exception' => new InvalidArgumentException(sprintf('The field "%s" has a wrong date format. Use one accepted by the \DateTime constructor', $field)), diff --git a/src/Bridge/Doctrine/Orm/Filter/DateFilter.php b/src/Bridge/Doctrine/Orm/Filter/DateFilter.php index dbbe370eb85..9970eadf3b4 100644 --- a/src/Bridge/Doctrine/Orm/Filter/DateFilter.php +++ b/src/Bridge/Doctrine/Orm/Filter/DateFilter.php @@ -131,9 +131,15 @@ protected function filterProperty(string $property, $values, QueryBuilder $query protected function addWhere(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, string $operator, $value, string $nullManagement = null, $type = null) { $type = (string) $type; + $value = $this->normalizeValue($value, $operator); + + if (null === $value) { + return; + } + try { $value = false === strpos($type, '_immutable') ? new \DateTime($value) : new \DateTimeImmutable($value); - } catch (\Throwable $e) { + } catch (\Exception $e) { // Silently ignore this filter if it can not be transformed to a \DateTime $this->logger->notice('Invalid filter ignored', [ 'exception' => new InvalidArgumentException(sprintf('The field "%s" has a wrong date format. Use one accepted by the \DateTime constructor', $field)), From 08413abb3b61a3c258cabc0019e51986c64af694 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 4 Dec 2020 01:14:31 +0700 Subject: [PATCH 3/4] Update DateFilterTrait.php --- src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php b/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php index a2ef995cc75..fbbd3bf7f2e 100644 --- a/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php +++ b/src/Bridge/Doctrine/Common/Filter/DateFilterTrait.php @@ -81,12 +81,9 @@ protected function getFilterDescription(string $property, string $period): array ]; } - /** - * Normalize the value. - */ private function normalizeValue($value, string $operator): ?string { - if (!\is_string($value)) { + if (false === \is_string($value)) { $this->getLogger()->notice('Invalid filter ignored', [ 'exception' => new InvalidArgumentException(sprintf('Invalid value for "[%s]", expected string', $operator)), ]); From bceff5a5dba0b741acae8de57d1ce0c9780380f7 Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Tue, 16 Feb 2021 16:04:19 +0100 Subject: [PATCH 4/4] chore: add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a645b4e61b..129c0dadcf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2.7.0 * Doctrine: Better exception to find which resource is linked to an exception (#3965) +* Doctrine: Allow mixed type value for date filter (notice if invalid) (#3870) * MongoDB: `date_immutable` support (#3940) ## 2.6.3