Olivier Massot 2 лет назад
Родитель
Сommit
393e1eabcd
3 измененных файлов с 14 добавлено и 4 удалено
  1. 2 0
      src/Entity/Access/Access.php
  2. 1 0
      src/Entity/Person/Person.php
  3. 11 4
      src/Filter/Utils/InFilter.php

+ 2 - 0
src/Entity/Access/Access.php

@@ -8,6 +8,7 @@ use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter;
 use ApiPlatform\Metadata\ApiFilter;
 use ApiPlatform\Metadata\Get;
 use ApiPlatform\Metadata\Put;
+use ApiPlatform\Serializer\Filter\GroupFilter;
 use App\Entity\AccessWish\AccessWish;
 use App\Entity\Billing\AccessBilling;
 use App\Entity\Billing\AccessFictionalIntangible;
@@ -78,6 +79,7 @@ use Symfony\Component\Serializer\Annotation\Groups;
 #[ApiFilter(filterClass: BooleanFilter::class, properties: ['person.isPhysical'])]
 #[ApiFilter(filterClass: FullNameFilter::class)]
 #[ApiFilter(filterClass: InFilter::class, properties: ['id'])]
+#[ApiFilter(GroupFilter::class, arguments: ['whitelist' => ['access_people_ref']])]
 class Access implements UserInterface, PasswordAuthenticatedUserInterface
 {
     #[ORM\Id]

+ 1 - 0
src/Entity/Person/Person.php

@@ -40,6 +40,7 @@ class Person implements UserInterface, PasswordAuthenticatedUserInterface
     #[ORM\Id]
     #[ORM\Column]
     #[ORM\GeneratedValue]
+    #[Groups(["access_people_ref"])]
     private ?int $id = null;
 
     #[ORM\Column(length: 180, unique: true, nullable: true)]

+ 11 - 4
src/Filter/Utils/InFilter.php

@@ -11,6 +11,10 @@ use Symfony\Component\PropertyInfo\Type;
 
 /**
  * Is property included in the given CSV array
+ *
+ * Ex:
+ *
+ *    /api/accesses?id[in]=123,124,125
  */
 final class InFilter extends AbstractFilter {
     /**
@@ -39,11 +43,14 @@ final class InFilter extends AbstractFilter {
             return;
         }
 
+        if (!isset($value['in'])) {
+            return;
+        }
+
         $alias = $queryBuilder->getRootAliases()[0];
         $parameterName = $queryNameGenerator->generateParameterName($property); // Generate a unique parameter name to avoid collisions with other filters
         $queryBuilder
-            ->andWhere(sprintf('%s.%s IN (:%s)', $alias, $property, $parameterName))
-            ->setParameter($parameterName, explode(',', $value));
+            ->andWhere(sprintf('%s.%s IN (%s)', $alias, $property, $value['in']));
     }
 
     /**
@@ -59,12 +66,12 @@ final class InFilter extends AbstractFilter {
 
         $description = [];
         foreach ($this->properties as $property => $strategy) {
-            $description["$property"] = [
+            $description[$property . "[in]"] = [
                 'property' => $property,
                 'type' => Type::BUILTIN_TYPE_STRING,
                 'required' => false,
                 'swagger' => [
-                    'description' => 'Filtre permettant d\'utiliser les IN',
+                    'description' => 'Filtre permettant d\'utiliser les IN. (usage: `id[in]=1,2,3`)',
                     'name' => 'In Filter',
                     'type' => 'Utils Filter',
                 ],