Skip to content

Commit 2d511a5

Browse files
committed
fix(search-filter): authorize binary uuid
1 parent bf4b0e4 commit 2d511a5

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

src/Doctrine/Orm/Filter/SearchFilter.php

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
2222
use ApiPlatform\Exception\InvalidArgumentException;
2323
use ApiPlatform\Metadata\Operation;
24+
use Doctrine\DBAL\Types\Type;
2425
use Doctrine\DBAL\Types\Types;
2526
use Doctrine\ORM\Query\Expr\Join;
2627
use Doctrine\ORM\QueryBuilder;
@@ -102,15 +103,17 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
102103
$values = array_map($this->getIdFromValue(...), $values);
103104
}
104105

105-
if (!$this->hasValidValues($values, $this->getDoctrineFieldType($property, $resourceClass))) {
106+
$doctrineTypeField = $this->getDoctrineFieldType($property, $resourceClass);
107+
108+
if (!$this->hasValidValues($values, $doctrineTypeField)) {
106109
$this->logger->notice('Invalid filter ignored', [
107110
'exception' => new InvalidArgumentException(sprintf('Values for field "%s" are not valid according to the doctrine type.', $field)),
108111
]);
109112

110113
return;
111114
}
112115

113-
$this->addWhereByStrategy($strategy, $queryBuilder, $queryNameGenerator, $alias, $field, $values, $caseSensitive);
116+
$this->addWhereByStrategy($strategy, $queryBuilder, $queryNameGenerator, $alias, $field, $values, $caseSensitive, $doctrineTypeField);
114117

115118
return;
116119
}
@@ -141,15 +144,15 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
141144
$associationField = $associationFieldIdentifier;
142145
}
143146

144-
$this->addWhereByStrategy($strategy, $queryBuilder, $queryNameGenerator, $associationAlias, $associationField, $values, $caseSensitive);
147+
$this->addWhereByStrategy($strategy, $queryBuilder, $queryNameGenerator, $associationAlias, $associationField, $values, $caseSensitive, $doctrineTypeField);
145148
}
146149

147150
/**
148151
* Adds where clause according to the strategy.
149152
*
150153
* @throws InvalidArgumentException If strategy does not exist
151154
*/
152-
protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, mixed $values, bool $caseSensitive): void
155+
protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, mixed $values, bool $caseSensitive, ?string $doctrineTypeField): void
153156
{
154157
if (!\is_array($values)) {
155158
$values = [$values];
@@ -163,14 +166,25 @@ protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuild
163166
if (1 === \count($values)) {
164167
$queryBuilder
165168
->andWhere($queryBuilder->expr()->eq($wrapCase($aliasedField), $wrapCase($valueParameter)))
166-
->setParameter($valueParameter, $values[0]);
169+
->setParameter($valueParameter, $values[0], $doctrineTypeField);
167170

168171
return;
169172
}
170173

171174
$queryBuilder
172175
->andWhere($queryBuilder->expr()->in($wrapCase($aliasedField), $valueParameter))
173-
->setParameter($valueParameter, $caseSensitive ? $values : array_map('strtolower', $values));
176+
->setParameter($valueParameter, array_map(static function ($value) use ($caseSensitive, $queryBuilder, $doctrineTypeField) {
177+
178+
if ($doctrineTypeField !== null) {
179+
$type = Type::getType($doctrineTypeField);
180+
181+
if ($type instanceof Type) {
182+
$value = $type->convertToDatabaseValue($value, $queryBuilder->getEntityManager()->getConnection()->getDatabasePlatform());
183+
}
184+
}
185+
186+
return $caseSensitive ? $value : strtolower($value);
187+
}, $values));
174188

175189
return;
176190
}
@@ -210,7 +224,7 @@ protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuild
210224

211225
$queryBuilder->andWhere($queryBuilder->expr()->orX(...$ors));
212226
foreach ($parameters as $parameter) {
213-
$queryBuilder->setParameter($parameter[1], $parameter[0]);
227+
$queryBuilder->setParameter($parameter[1], $parameter[0], $doctrineTypeField);
214228
}
215229
}
216230

0 commit comments

Comments
 (0)