diff --git a/config/services.yaml b/config/services.yaml index 0c84e27f7a..7115608ef1 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -766,13 +766,6 @@ services: public: true class: AppBundle\Service\Routing\OsrmWithFallback - AppBundle\Api\Filter\DeliveryOrderFilter: - autowire: false - autoconfigure: false - public: true - parent: 'api_platform.doctrine.orm.date_filter' - arguments: - $properties: [] coopcycle.web_success_handler: class: AppBundle\EventListener\AuthenticationWebSuccessHandler @@ -1631,11 +1624,6 @@ services: AppBundle\Utils\Defaults: ~ - AppBundle\Api\Filter\AssignedFilter: - arguments: - $properties: { assigned: ~ } - $security: '@security.helper' - tags: [ 'api_platform.filter' ] AppBundle\Fixtures\DatabasePurger: ~ diff --git a/src/Api/Filter/AssignedFilter.php b/src/Api/Filter/AssignedFilter.php index e3550cfc65..7a0f0c0061 100644 --- a/src/Api/Filter/AssignedFilter.php +++ b/src/Api/Filter/AssignedFilter.php @@ -2,68 +2,54 @@ namespace AppBundle\Api\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; -use Doctrine\Persistence\ManagerRegistry; -use Psr\Log\LoggerInterface; use Symfony\Component\Security\Core\Security; -use Symfony\Component\Serializer\NameConverter\NameConverterInterface; -final class AssignedFilter extends AbstractFilter +final class AssignedFilter implements FilterInterface { - private $security; - public function __construct( - ManagerRegistry $managerRegistry, - Security $security, - ?LoggerInterface $logger = null, - ?array $properties = null, - ?NameConverterInterface $nameConverter = null) - { - $this->security = $security; - - parent::__construct($managerRegistry, $logger, $properties, $nameConverter); + private readonly Security $security + ) { } - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { - // otherwise filter is applied to order and page as well - if (!$this->isPropertyEnabled($property, $resourceClass)) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } $user = $this->security->getUser(); + if (!$user) { + return; + } + + // Only admin/dispatcher can filter by assignment status if ($user->hasRole('ROLE_ADMIN') || $user->hasRole('ROLE_DISPATCHER')) { $isAssigned = filter_var($value, FILTER_VALIDATE_BOOLEAN); + $alias = $queryBuilder->getRootAliases()[0]; if (false === $isAssigned) { $queryBuilder - ->andWhere(sprintf('o.%s IS NULL', 'assignedTo')); + ->andWhere(sprintf('%s.%s IS NULL', $alias, 'assignedTo')); } else { $queryBuilder - ->andWhere(sprintf('o.%s IS NOT NULL', 'assignedTo')); + ->andWhere(sprintf('%s.%s IS NOT NULL', $alias, 'assignedTo')); } } } public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/DateFilter.php b/src/Api/Filter/DateFilter.php index 500edebf8c..5f5100f841 100644 --- a/src/Api/Filter/DateFilter.php +++ b/src/Api/Filter/DateFilter.php @@ -2,44 +2,38 @@ namespace AppBundle\Api\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; -final class DateFilter extends AbstractFilter +final class DateFilter implements FilterInterface { - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { - // otherwise filter is applied to order and page as well - if ( - !$this->isPropertyEnabled($property, $resourceClass) || - !$this->isPropertyMapped($property, $resourceClass) - ) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } + // Get the property from the parameter + $property = $parameter->getProperty() ?? $parameter->getKey() ?? 'date'; + + $alias = $queryBuilder->getRootAliases()[0]; $parameterName = $queryNameGenerator->generateParameterName($property); + $queryBuilder - ->andWhere(sprintf('DATE(o.%s) = :%s', $property, $parameterName)) + ->andWhere(sprintf('DATE(%s.%s) = :%s', $alias, $property, $parameterName)) ->setParameter($parameterName, $value); } public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/DeliveryOrderFilter.php b/src/Api/Filter/DeliveryOrderFilter.php index 18b6b0ba1f..ff83289778 100644 --- a/src/Api/Filter/DeliveryOrderFilter.php +++ b/src/Api/Filter/DeliveryOrderFilter.php @@ -4,25 +4,31 @@ use AppBundle\Entity\Delivery; use AppBundle\Entity\Task; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\Expr\Join; -class DeliveryOrderFilter extends AbstractFilter +class DeliveryOrderFilter implements FilterInterface { - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { if (Delivery::class !== $resourceClass) { return; } - if (!in_array('dropoff.before', array_keys($context['filters'][$property]))) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } - $direction = $context['filters'][$property]['dropoff.before']; + // Value should be the direction (asc/desc) + $direction = $value; $rootAlias = $queryBuilder->getRootAliases()[0]; @@ -97,19 +103,7 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/DeliveryTaskDateFilter.php b/src/Api/Filter/DeliveryTaskDateFilter.php index 7f6e79f65c..a622d032d1 100644 --- a/src/Api/Filter/DeliveryTaskDateFilter.php +++ b/src/Api/Filter/DeliveryTaskDateFilter.php @@ -2,22 +2,26 @@ namespace AppBundle\Api\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; -class DeliveryTaskDateFilter extends AbstractFilter +class DeliveryTaskDateFilter implements FilterInterface { - protected function filterProperty( - string $property, - $value, - QueryBuilder $queryBuilder, - QueryNameGeneratorInterface $queryNameGenerator, - string $resourceClass, - ?Operation $operation = null, - array $context = [] - ): void { + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { + return; + } + + $property = $parameter->getKey(); + if (!in_array($property, ['pickup.before', 'pickup.after', 'dropoff.before', 'dropoff.after'])) { return; } diff --git a/src/Api/Filter/OrderDateFilter.php b/src/Api/Filter/OrderDateFilter.php index 4f2b079096..0e7eae611e 100644 --- a/src/Api/Filter/OrderDateFilter.php +++ b/src/Api/Filter/OrderDateFilter.php @@ -3,18 +3,22 @@ namespace AppBundle\Api\Filter; use ApiPlatform\Doctrine\Common\Filter\DateFilterInterface; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; use Sylius\Component\Order\Model\OrderInterface; -final class OrderDateFilter extends AbstractFilter +final class OrderDateFilter implements FilterInterface { - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { - // Do not use isPropertyMapped(), because this is a "virtual" property - if (!$this->isPropertyEnabled($property, $resourceClass)) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } @@ -30,29 +34,19 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB $rangeEnd = $dateTime; } + $alias = $queryBuilder->getRootAliases()[0]; + $queryBuilder - ->andWhere('OVERLAPS(o.shippingTimeRange, CAST(:range AS tsrange)) = TRUE') + ->andWhere(sprintf('OVERLAPS(%s.shippingTimeRange, CAST(:range AS tsrange)) = TRUE', $alias)) // FIXME Move this to another filter? - ->andWhere('o.state != :state_cart') + ->andWhere(sprintf('%s.state != :state_cart', $alias)) ->setParameter('range', sprintf('[%s, %s]', $rangeStart->format('Y-m-d 00:00:00'), $rangeEnd->format('Y-m-d 23:59:59'))) ->setParameter('state_cart', OrderInterface::STATE_CART); } public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/OrderStoreFilter.php b/src/Api/Filter/OrderStoreFilter.php index 36f4f06254..adab597cce 100644 --- a/src/Api/Filter/OrderStoreFilter.php +++ b/src/Api/Filter/OrderStoreFilter.php @@ -2,68 +2,95 @@ namespace AppBundle\Api\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use AppBundle\Entity\Sylius\Order; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\Expr\Join; -use Doctrine\Persistence\ManagerRegistry; -use Psr\Log\LoggerInterface; -use Symfony\Component\PropertyAccess\PropertyAccessorInterface; -use Symfony\Component\Serializer\NameConverter\NameConverterInterface; -use Symfony\Component\PropertyInfo\Type; -final class OrderStoreFilter extends AbstractFilter +final class OrderStoreFilter implements FilterInterface { private string $storeIdProperty = 'delivery.store.id'; - private string $storeIdAlias = 'store'; - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { if ($resourceClass !== Order::class) { return; } - // expose alias in the API instead of a path to a nested property - if ($this->storeIdAlias === $property) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); - $alias = $queryBuilder->getRootAliases()[0]; + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { + return; + } + + $alias = $queryBuilder->getRootAliases()[0]; + + // Add joins for nested property delivery.store.id + [$joinAlias, $field] = $this->addJoinsForNestedProperty($this->storeIdProperty, $alias, $queryBuilder, $queryNameGenerator, $resourceClass, Join::INNER_JOIN); + + $valueParameter = $queryNameGenerator->generateParameterName($field); + + if (is_array($value)) { + $queryBuilder + ->andWhere($queryBuilder->expr()->in(sprintf('%s.%s', $joinAlias, $field), sprintf(':%s', $valueParameter))) + ->setParameter($valueParameter, $value); + + return; + } + + $queryBuilder + ->andWhere(\sprintf('%s.%s = :%s', $joinAlias, $field, $valueParameter)) + ->setParameter($valueParameter, $value); + } - [$alias, $field] = $this->addJoinsForNestedProperty($this->storeIdProperty, $alias, $queryBuilder, $queryNameGenerator, $resourceClass, Join::INNER_JOIN); + /** + * Helper method to add joins for nested properties (copied from AbstractFilter for compatibility) + */ + private function addJoinsForNestedProperty(string $property, string $rootAlias, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $joinType): array + { + $propertyParts = explode('.', $property); + $parentAlias = $rootAlias; + $alias = null; - $valueParameter = $queryNameGenerator->generateParameterName($field); + while (count($propertyParts) > 1) { + $part = array_shift($propertyParts); + $alias = $queryNameGenerator->generateJoinAlias($part); - if (is_array($value)) { + $parts = $queryBuilder->getDQLPart('join'); + $joinExists = false; - $queryBuilder - ->andWhere($queryBuilder->expr()->in(sprintf('%s.%s', $alias, $field), sprintf(':%s', $valueParameter))) - ->setParameter($valueParameter, $value); + if (isset($parts[$parentAlias])) { + foreach ($parts[$parentAlias] as $join) { + if ($join->getJoin() === sprintf('%s.%s', $parentAlias, $part)) { + $alias = $join->getAlias(); + $joinExists = true; + break; + } + } + } - return; + if (!$joinExists) { + if ($joinType === Join::INNER_JOIN) { + $queryBuilder->innerJoin(sprintf('%s.%s', $parentAlias, $part), $alias); + } else { + $queryBuilder->leftJoin(sprintf('%s.%s', $parentAlias, $part), $alias); + } } - $queryBuilder - ->andWhere(\sprintf('%s.%s = :%s', $alias, $field, $valueParameter)) - ->setParameter($valueParameter, $value, (string) $this->getDoctrineFieldType($property, $resourceClass)); + $parentAlias = $alias; } + + return [$parentAlias, $propertyParts[0]]; } public function getDescription(string $resourceClass): array { - return [ - 'store' => [ - 'property' => $this->storeIdAlias, - 'type' => Type::BUILTIN_TYPE_INT, - 'required' => false, - 'is_collection' => false, - ], - 'store[]'=> [ - 'property' => $this->storeIdAlias, - 'type' => Type::BUILTIN_TYPE_INT, - 'required' => false, - 'is_collection' => true, - ] - ]; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/OrganizationFilter.php b/src/Api/Filter/OrganizationFilter.php index 824da644fb..48cff4a377 100644 --- a/src/Api/Filter/OrganizationFilter.php +++ b/src/Api/Filter/OrganizationFilter.php @@ -2,68 +2,53 @@ namespace AppBundle\Api\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use AppBundle\Entity\Organization; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\Expr; -use Doctrine\Persistence\ManagerRegistry; -use Psr\Log\LoggerInterface; use Symfony\Component\Security\Core\Security; -use Symfony\Component\Serializer\NameConverter\NameConverterInterface; -final class OrganizationFilter extends AbstractFilter +final class OrganizationFilter implements FilterInterface { - private $security; - public function __construct( - ManagerRegistry $managerRegistry, - Security $security, - ?LoggerInterface $logger = null, - ?array $properties = null, - ?NameConverterInterface $nameConverter = null) - { - $this->security = $security; - - parent::__construct($managerRegistry, $logger, $properties, $nameConverter); + private readonly Security $security + ) { } - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { - // otherwise filter is applied to order and page as well - if (!$this->isPropertyEnabled($property, $resourceClass)) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } $user = $this->security->getUser(); + if (!$user) { + return; + } + + // Only admin can filter by organization if ($user->hasRole('ROLE_ADMIN')) { $orgName = filter_var($value); - + $alias = $queryBuilder->getRootAliases()[0]; $valueParameter = $queryNameGenerator->generateParameterName('org_name'); $queryBuilder->andWhere(sprintf('org.name = :%s', $valueParameter)); $queryBuilder->setParameter($valueParameter, $orgName); - $queryBuilder->innerJoin(Organization::class, 'org', Expr\Join::WITH, 'o.organization = org.id'); + $queryBuilder->innerJoin(Organization::class, 'org', Expr\Join::WITH, sprintf('%s.organization = org.id', $alias)); } } public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/TaskDateFilter.php b/src/Api/Filter/TaskDateFilter.php index a6310e52e8..14cfa54ab7 100644 --- a/src/Api/Filter/TaskDateFilter.php +++ b/src/Api/Filter/TaskDateFilter.php @@ -3,50 +3,43 @@ namespace AppBundle\Api\Filter; use AppBundle\Entity\Task; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; -final class TaskDateFilter extends AbstractFilter +final class TaskDateFilter implements FilterInterface { - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { // Only works on Task class if ($resourceClass !== Task::class) { return; } - // otherwise filter is applied to order and page as well - if (!$this->isPropertyEnabled($property, $resourceClass)) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } + $alias = $queryBuilder->getRootAliases()[0]; $afterParameterName = $queryNameGenerator->generateParameterName('doneAfter'); $beforeParameterName = $queryNameGenerator->generateParameterName('doneBefore'); $queryBuilder - ->andWhere(sprintf(':%s >= DATE(o.%s)', $afterParameterName, 'doneAfter')) - ->andWhere(sprintf(':%s <= DATE(o.%s)', $beforeParameterName, 'doneBefore')) + ->andWhere(sprintf(':%s >= DATE(%s.%s)', $afterParameterName, $alias, 'doneAfter')) + ->andWhere(sprintf(':%s <= DATE(%s.%s)', $beforeParameterName, $alias, 'doneBefore')) ->setParameter($afterParameterName, $value) ->setParameter($beforeParameterName, $value); } public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/TaskFilter.php b/src/Api/Filter/TaskFilter.php index d5fdf83fd9..f7ede1fb1f 100644 --- a/src/Api/Filter/TaskFilter.php +++ b/src/Api/Filter/TaskFilter.php @@ -2,65 +2,51 @@ namespace AppBundle\Api\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; -use Doctrine\Persistence\ManagerRegistry; -use Psr\Log\LoggerInterface; use Symfony\Component\Security\Core\Security; -use Symfony\Component\Serializer\NameConverter\NameConverterInterface; -final class TaskFilter extends AbstractFilter +final class TaskFilter implements FilterInterface { - private $security; - public function __construct( - ManagerRegistry $managerRegistry, - Security $security, - ?LoggerInterface $logger = null, - ?array $properties = null, - ?NameConverterInterface $nameConverter = null) - { - $this->security = $security; - - parent::__construct($managerRegistry, $logger, $properties, $nameConverter); + private readonly Security $security + ) { } - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { + return; + } + $user = $this->security->getUser(); - // otherwise filter is applied to order and page as well - if (!$this->isPropertyEnabled($property, $resourceClass)) { + if (!$user) { return; } + // If user is a courier (but not admin/dispatcher), restrict to assigned tasks if (!($user->hasRole('ROLE_ADMIN') || $user->hasRole('ROLE_DISPATCHER')) && $user->hasRole('ROLE_COURIER')) { - + $alias = $queryBuilder->getRootAliases()[0]; $parameterName = $queryNameGenerator->generateParameterName('user'); + $queryBuilder - ->andWhere(sprintf('o.%s IS NOT NULL', 'assignedTo')) - ->andWhere(sprintf('o.%s = :%s', 'assignedTo', $parameterName)) + ->andWhere(sprintf('%s.%s IS NOT NULL', $alias, 'assignedTo')) + ->andWhere(sprintf('%s.%s = :%s', $alias, 'assignedTo', $parameterName)) ->setParameter($parameterName, $user); } } public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/TaskOrderFilter.php b/src/Api/Filter/TaskOrderFilter.php index bb052f5e4a..12c4cb3573 100644 --- a/src/Api/Filter/TaskOrderFilter.php +++ b/src/Api/Filter/TaskOrderFilter.php @@ -3,51 +3,46 @@ namespace AppBundle\Api\Filter; use AppBundle\Entity\Task; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; -final class TaskOrderFilter extends AbstractFilter +final class TaskOrderFilter implements FilterInterface { - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { // Only works on Task class if ($resourceClass !== Task::class) { return; } - // otherwise filter is applied to order and page as well - if (!$this->isPropertyEnabled($property, $resourceClass)) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } - $parameterName = $queryNameGenerator->generateParameterName($property); // Generate a unique parameter name to avoid collisions with other filters - $fieldName = $queryNameGenerator->generateParameterName($property); // Generate a unique parameter name to avoid collisions with other filters + $alias = $queryBuilder->getRootAliases()[0]; + $property = $parameter->getProperty() ?? $parameter->getKey() ?? 'order'; + + $parameterName = $queryNameGenerator->generateParameterName($property); + $fieldName = $queryNameGenerator->generateParameterName($property); $queryBuilder - ->addSelect(sprintf('CASE WHEN o.type = :%s THEN 1 ELSE 0 END AS HIDDEN %s', $parameterName, $fieldName)) - ->orderBy('o.doneBefore', 'ASC') + ->addSelect(sprintf('CASE WHEN %s.type = :%s THEN 1 ELSE 0 END AS HIDDEN %s', $alias, $parameterName, $fieldName)) + ->orderBy(sprintf('%s.doneBefore', $alias), 'ASC') ->addOrderBy($fieldName, 'ASC') - ->addOrderBy('o.id', 'ASC') + ->addOrderBy(sprintf('%s.id', $alias), 'ASC') ->setParameter($parameterName, Task::TYPE_DROPOFF); } public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Filter/UserRoleFilter.php b/src/Api/Filter/UserRoleFilter.php index 51a598a964..037d3388d7 100644 --- a/src/Api/Filter/UserRoleFilter.php +++ b/src/Api/Filter/UserRoleFilter.php @@ -2,24 +2,26 @@ namespace AppBundle\Api\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Doctrine\Orm\Filter\FilterInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use ApiPlatform\State\ParameterNotFound; use Doctrine\ORM\QueryBuilder; -final class UserRoleFilter extends AbstractFilter +final class UserRoleFilter implements FilterInterface { - protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void { - // otherwise filter is applied to order and page as well - if ( - !$this->isPropertyEnabled($property, $resourceClass) || - !$this->isPropertyMapped($property, $resourceClass) - ) { + $parameter = $context['parameter'] ?? null; + $value = $parameter?->getValue(); + + // The parameter may not be present + if ($value instanceof ParameterNotFound || null === $value) { return; } - $queryNameGenerator->generateParameterName($property); + $property = $parameter->getProperty() ?? $parameter->getKey() ?? 'roles'; + $alias = $queryBuilder->getRootAliases()[0]; $roles = []; if (!is_array($value)) { @@ -31,7 +33,7 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB if (count($roles) > 0) { $rolesClause = $queryBuilder->expr()->orX(); foreach ($roles as $role) { - $fieldName = sprintf('o.%s', $property); + $fieldName = sprintf('%s.%s', $alias, $property); $fieldValue = $queryBuilder->expr()->literal('%' . $role . '%'); $rolesClause->add($queryBuilder->expr()->like($fieldName, $fieldValue)); @@ -42,19 +44,7 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB public function getDescription(string $resourceClass): array { - if (!$this->properties) { - return []; - } - - $description = []; - foreach ($this->properties as $property => $strategy) { - $description[$property] = [ - 'property' => $property, - 'type' => 'string', - 'required' => false, - ]; - } - - return $description; + // For BC, this function is not useful anymore when documentation occurs on the Parameter + return []; } } diff --git a/src/Api/Resource/CartSession.php b/src/Api/Resource/CartSession.php index 25395034df..30f8ce0c94 100644 --- a/src/Api/Resource/CartSession.php +++ b/src/Api/Resource/CartSession.php @@ -5,7 +5,6 @@ use ApiPlatform\Metadata\Post; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Api\Dto\CartSessionInput; use AppBundle\Api\State\CartSessionProcessor; use Symfony\Component\Serializer\Annotation\Groups; diff --git a/src/Api/Resource/Centrifugo.php b/src/Api/Resource/Centrifugo.php index 8919d38fb9..10ecefae00 100644 --- a/src/Api/Resource/Centrifugo.php +++ b/src/Api/Resource/Centrifugo.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Action\CentrifugoToken as TokenController; use Symfony\Component\Serializer\Annotation\Groups; diff --git a/src/Api/Resource/Me.php b/src/Api/Resource/Me.php index e1992a134a..7fbf18e249 100644 --- a/src/Api/Resource/Me.php +++ b/src/Api/Resource/Me.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Me as MeController; use AppBundle\Action\DeleteMe; diff --git a/src/Api/Resource/OrderAdhoc.php b/src/Api/Resource/OrderAdhoc.php index 66f98cee82..18b931ede7 100644 --- a/src/Api/Resource/OrderAdhoc.php +++ b/src/Api/Resource/OrderAdhoc.php @@ -8,7 +8,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Order\Adhoc as AdhocOrderController; use AppBundle\Action\Order\AdhocUpdate as UpdateAdhocOrderController; use AppBundle\Action\Order\SearchAdhoc as SearchAdhocOrdersController; diff --git a/src/Api/Resource/Search.php b/src/Api/Resource/Search.php index 1771c1b10f..b10d1e2132 100644 --- a/src/Api/Resource/Search.php +++ b/src/Api/Resource/Search.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Action\Search\ShopsProducts as SearchShopsProducts; diff --git a/src/Api/Resource/TaxRate.php b/src/Api/Resource/TaxRate.php index 8952f9948a..5282cb019b 100644 --- a/src/Api/Resource/TaxRate.php +++ b/src/Api/Resource/TaxRate.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Api\State\TaxRateProvider; use AppBundle\Entity\Sylius\TaxRate as BaseTaxRate; diff --git a/src/Api/Resource/TimeSlotChoice.php b/src/Api/Resource/TimeSlotChoice.php index 5d6e4f6126..59de68091f 100644 --- a/src/Api/Resource/TimeSlotChoice.php +++ b/src/Api/Resource/TimeSlotChoice.php @@ -5,7 +5,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use Carbon\Carbon; use Ramsey\Uuid\Uuid; diff --git a/src/Api/Resource/UrbantzWebhook.php b/src/Api/Resource/UrbantzWebhook.php index 93a68a1090..2ac4cfa9e8 100644 --- a/src/Api/Resource/UrbantzWebhook.php +++ b/src/Api/Resource/UrbantzWebhook.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Api\State\UrbantzWebhookProvider; use AppBundle\Api\State\UrbantzWebhookProcessor; diff --git a/src/Entity/Address.php b/src/Entity/Address.php index e9715ee0dc..b5be258cb7 100644 --- a/src/Entity/Address.php +++ b/src/Entity/Address.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\CreateAddress; use AppBundle\Api\State\StoreAddressesProvider; use AppBundle\Entity\Base\BaseAddress; diff --git a/src/Entity/ApiApp.php b/src/Entity/ApiApp.php index eefff65c59..a9e0cff3ac 100644 --- a/src/Entity/ApiApp.php +++ b/src/Entity/ApiApp.php @@ -5,7 +5,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Entity\LocalBusiness; use AppBundle\Entity\Store; use Gedmo\Timestampable\Traits\Timestampable; diff --git a/src/Entity/ClosingRule.php b/src/Entity/ClosingRule.php index 69b6588414..f74b951bc9 100644 --- a/src/Entity/ClosingRule.php +++ b/src/Entity/ClosingRule.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Restaurant\DeleteClosingRule; use Symfony\Component\Serializer\Annotation\Groups; diff --git a/src/Entity/Delivery.php b/src/Entity/Delivery.php index b0a0e5848a..c7e43d0684 100644 --- a/src/Entity/Delivery.php +++ b/src/Entity/Delivery.php @@ -10,7 +10,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Doctrine\Orm\Filter\OrderFilter; -use ApiPlatform\Metadata\ApiFilter; +use ApiPlatform\Metadata\QueryParameter; use AppBundle\Action\Delivery\Cancel as CancelDelivery; use AppBundle\Action\Delivery\Drop as DropDelivery; use AppBundle\Action\Delivery\Pick as PickDelivery; @@ -183,13 +183,30 @@ )] #[AssertDelivery] #[AssertCheckDelivery(groups: ['delivery_check'])] -#[ApiFilter(filterClass: OrderFilter::class, properties: ['createdAt'])] -#[ApiFilter(filterClass: DeliveryOrderFilter::class, properties: ['dropoff.before'])] -#[ApiFilter(filterClass: DeliveryTaskDateFilter::class)] #[ApiResource( uriTemplate: '/stores/{id}/deliveries', types: ['http://schema.org/ParcelDelivery'], - operations: [new GetCollection()], + operations: [ + new GetCollection( + parameters: [ + 'createdAt' => new QueryParameter( + filter: 'api_platform.doctrine.orm.order_filter' + ), + 'dropoff.before' => new QueryParameter( + filter: 'AppBundle\Api\Filter\DeliveryOrderFilter' + ), + 'pickup.before' => new QueryParameter( + filter: 'AppBundle\Api\Filter\DeliveryTaskDateFilter' + ), + 'pickup.after' => new QueryParameter( + filter: 'AppBundle\Api\Filter\DeliveryTaskDateFilter' + ), + 'dropoff.after' => new QueryParameter( + filter: 'AppBundle\Api\Filter\DeliveryTaskDateFilter' + ) + ] + ) + ], uriVariables: [ 'id' => new Link(fromClass: Store::class, toProperty: 'store') ], diff --git a/src/Entity/Delivery/ImportQueue.php b/src/Entity/Delivery/ImportQueue.php index 829418d3cd..a7405ed45a 100644 --- a/src/Entity/Delivery/ImportQueue.php +++ b/src/Entity/Delivery/ImportQueue.php @@ -5,7 +5,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Entity\Store; use AppBundle\Action\Delivery\ImportQueueCsv as CsvController; use AppBundle\Action\Delivery\ImportQueueRedownload as RedownloadController; diff --git a/src/Entity/Delivery/PricingRuleSet.php b/src/Entity/Delivery/PricingRuleSet.php index fdd1f4a86e..50f67df75a 100644 --- a/src/Entity/Delivery/PricingRuleSet.php +++ b/src/Entity/Delivery/PricingRuleSet.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Put; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Action\PricingRuleSet\Applications; use AppBundle\Api\State\PricingRuleSetProcessor; diff --git a/src/Entity/DeliveryForm.php b/src/Entity/DeliveryForm.php index 4360293ed3..c8bfb9e4e7 100644 --- a/src/Entity/DeliveryForm.php +++ b/src/Entity/DeliveryForm.php @@ -7,7 +7,6 @@ use ApiPlatform\Metadata\Delete; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Doctrine\Common\Collections\ArrayCollection; use Gedmo\Timestampable\Traits\Timestampable; diff --git a/src/Entity/DeliveryQuote.php b/src/Entity/DeliveryQuote.php index 9cddea4ec2..1e74e146d4 100644 --- a/src/Entity/DeliveryQuote.php +++ b/src/Entity/DeliveryQuote.php @@ -7,7 +7,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Action\Delivery\ConfirmQuote as ConfirmDeliveryQuoteController; use AppBundle\Api\Dto\DeliveryInputDto; diff --git a/src/Entity/Hub.php b/src/Entity/Hub.php index 2800d6d20c..d6b7a88497 100644 --- a/src/Entity/Hub.php +++ b/src/Entity/Hub.php @@ -5,7 +5,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; + #[ApiResource(operations: [new Get()])] class Hub extends LocalBusinessGroup { diff --git a/src/Entity/Incident/Incident.php b/src/Entity/Incident/Incident.php index 41863d5778..e1cb8e6b30 100644 --- a/src/Entity/Incident/Incident.php +++ b/src/Entity/Incident/Incident.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Entity\Model\TaggableInterface; use AppBundle\Entity\Model\TaggableTrait; use AppBundle\Entity\Task; diff --git a/src/Entity/Incident/IncidentImage.php b/src/Entity/Incident/IncidentImage.php index 25f3c3bcc7..6705ecabf9 100644 --- a/src/Entity/Incident/IncidentImage.php +++ b/src/Entity/Incident/IncidentImage.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Incident\CreateImage; use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\HttpFoundation\File\UploadedFile; diff --git a/src/Entity/LocalBusiness.php b/src/Entity/LocalBusiness.php index c01cb9d57a..3e20e71f1f 100644 --- a/src/Entity/LocalBusiness.php +++ b/src/Entity/LocalBusiness.php @@ -8,7 +8,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\MyRestaurants; use AppBundle\Action\Restaurant\Close as CloseController; use AppBundle\Action\Restaurant\Menu; diff --git a/src/Entity/Nonprofit.php b/src/Entity/Nonprofit.php index 3df3e89e53..3f480f4ada 100644 --- a/src/Entity/Nonprofit.php +++ b/src/Entity/Nonprofit.php @@ -10,7 +10,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Entity\Model\TaggableInterface; use AppBundle\Entity\Model\TaggableTrait; use Doctrine\ORM\Mapping as ORM; diff --git a/src/Entity/OptinConsent.php b/src/Entity/OptinConsent.php index 920fc0db6b..79610cb4de 100644 --- a/src/Entity/OptinConsent.php +++ b/src/Entity/OptinConsent.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\MyOptinConsents; use AppBundle\Action\UpdateOptinConsent; diff --git a/src/Entity/Organization.php b/src/Entity/Organization.php index 07e2f3f2b0..b159d07a38 100644 --- a/src/Entity/Organization.php +++ b/src/Entity/Organization.php @@ -10,7 +10,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Gedmo\SoftDeleteable\SoftDeleteable as SoftDeleteableInterface; use Gedmo\SoftDeleteable\Traits\SoftDeleteable; use Symfony\Component\Serializer\Annotation\Groups; diff --git a/src/Entity/Package.php b/src/Entity/Package.php index b1fcd6cd6c..d70e3c6c01 100644 --- a/src/Entity/Package.php +++ b/src/Entity/Package.php @@ -10,7 +10,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Entity\Model\TaggableInterface; use AppBundle\Entity\Model\TaggableTrait; use Gedmo\SoftDeleteable\Traits\SoftDeleteable; diff --git a/src/Entity/PackageSet.php b/src/Entity/PackageSet.php index f4c72c8289..7bddd742ba 100644 --- a/src/Entity/PackageSet.php +++ b/src/Entity/PackageSet.php @@ -8,7 +8,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Action\PackageSet\Applications; use AppBundle\Api\State\ValidationAwareRemoveProcessor; diff --git a/src/Entity/RemotePushToken.php b/src/Entity/RemotePushToken.php index 465b7a7be1..156f127bb8 100644 --- a/src/Entity/RemotePushToken.php +++ b/src/Entity/RemotePushToken.php @@ -7,7 +7,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Api\Dto\CreateRemotePushTokenRequest; use AppBundle\Api\State\RemotePushTokenProcessor; use AppBundle\Api\State\RemotePushTokenProvider; diff --git a/src/Entity/Store.php b/src/Entity/Store.php index 8792091d44..cd5ceda4d0 100644 --- a/src/Entity/Store.php +++ b/src/Entity/Store.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Api\State\StoreAddressProcessor; use AppBundle\Action\MyStores; use AppBundle\Action\Store\AddAddress; diff --git a/src/Entity/StoreTimeSlot.php b/src/Entity/StoreTimeSlot.php index a3fa41b2eb..6031659521 100644 --- a/src/Entity/StoreTimeSlot.php +++ b/src/Entity/StoreTimeSlot.php @@ -7,7 +7,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; + #[ApiResource(operations: [new Get(), new Post(), new GetCollection()])] class StoreTimeSlot { private int $id; diff --git a/src/Entity/Sylius/Customer.php b/src/Entity/Sylius/Customer.php index 95d335d945..2e5dc1889a 100644 --- a/src/Entity/Sylius/Customer.php +++ b/src/Entity/Sylius/Customer.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Entity\Address; use AppBundle\Entity\Dabba\CustomerCredentials as DabbaCustomerCredentials; use AppBundle\Entity\LoopEat\CustomerCredentials; diff --git a/src/Entity/Sylius/Order.php b/src/Entity/Sylius/Order.php index 9a61ccff07..d8850ca9d4 100644 --- a/src/Entity/Sylius/Order.php +++ b/src/Entity/Sylius/Order.php @@ -11,7 +11,7 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Doctrine\Orm\Filter\ExistsFilter; use ApiPlatform\Doctrine\Orm\Filter\SearchFilter; -use ApiPlatform\Metadata\ApiFilter; +use ApiPlatform\Metadata\QueryParameter; use AppBundle\Action\Order\Accept as OrderAccept; use AppBundle\Action\Order\AddPlayer; use AppBundle\Action\Order\Assign as OrderAssign; @@ -333,7 +333,23 @@ validate: false, processor: ConfigurePaymentProcessor::class ), - new GetCollection(security: 'is_granted(\'ROLE_ADMIN\')'), + new GetCollection( + security: 'is_granted(\'ROLE_ADMIN\')', + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderDateFilter' + ), + 'state' => new QueryParameter( + filter: 'api_platform.doctrine.orm.search_filter' + ), + 'exports' => new QueryParameter( + filter: 'api_platform.doctrine.orm.exists_filter' + ), + 'delivery.store.id' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderStoreFilter' + ) + ] + ), new Post( denormalizationContext: ['groups' => ['order_create', 'address_create']] ), @@ -383,7 +399,21 @@ ], normalizationContext: ['groups' => ['default_invoice_line_item']], security: 'is_granted(\'ROLE_ADMIN\')', - provider: InvoiceLineItemsGroupedByOrganizationProvider::class + provider: InvoiceLineItemsGroupedByOrganizationProvider::class, + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderDateFilter' + ), + 'state' => new QueryParameter( + filter: 'api_platform.doctrine.orm.search_filter' + ), + 'exports' => new QueryParameter( + filter: 'api_platform.doctrine.orm.exists_filter' + ), + 'delivery.store.id' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderStoreFilter' + ) + ] ), new GetCollection( uriTemplate: '/invoice_line_items', @@ -393,7 +423,21 @@ ], normalizationContext: ['groups' => ['default_invoice_line_item']], security: 'is_granted(\'ROLE_ADMIN\')', - provider: InvoiceLineItemsProvider::class + provider: InvoiceLineItemsProvider::class, + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderDateFilter' + ), + 'state' => new QueryParameter( + filter: 'api_platform.doctrine.orm.search_filter' + ), + 'exports' => new QueryParameter( + filter: 'api_platform.doctrine.orm.exists_filter' + ), + 'delivery.store.id' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderStoreFilter' + ) + ] ), new GetCollection( uriTemplate: '/invoice_line_items/export', @@ -401,7 +445,21 @@ paginationEnabled: false, normalizationContext: ['groups' => ['export_invoice_line_item']], security: 'is_granted(\'ROLE_ADMIN\')', - provider: InvoiceLineItemsProvider::class + provider: InvoiceLineItemsProvider::class, + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderDateFilter' + ), + 'state' => new QueryParameter( + filter: 'api_platform.doctrine.orm.search_filter' + ), + 'exports' => new QueryParameter( + filter: 'api_platform.doctrine.orm.exists_filter' + ), + 'delivery.store.id' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderStoreFilter' + ) + ] ), new GetCollection( uriTemplate: '/invoice_line_items/export/odoo', @@ -409,7 +467,21 @@ paginationEnabled: false, normalizationContext: ['groups' => ['odoo_export_invoice_line_item']], security: 'is_granted(\'ROLE_ADMIN\')', - provider: InvoiceLineItemsProvider::class + provider: InvoiceLineItemsProvider::class, + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderDateFilter' + ), + 'state' => new QueryParameter( + filter: 'api_platform.doctrine.orm.search_filter' + ), + 'exports' => new QueryParameter( + filter: 'api_platform.doctrine.orm.exists_filter' + ), + 'delivery.store.id' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrderStoreFilter' + ) + ] ) ], normalizationContext: ['groups' => ['order', 'address']], @@ -419,10 +491,6 @@ #[AssertOrderIsModifiable(groups: ['cart'])] #[AssertLoopEatOrder(groups: ['loopeat'])] #[AssertDabbaOrder(groups: ['dabba'])] -#[ApiFilter(filterClass: OrderDateFilter::class, properties: ['date' => 'exact'])] -#[ApiFilter(filterClass: SearchFilter::class, properties: ['state' => 'exact'])] -#[ApiFilter(filterClass: ExistsFilter::class, properties: ['exports'])] -#[ApiFilter(filterClass: OrderStoreFilter::class)] class Order extends BaseOrder implements OrderInterface { use VytalCodeAwareTrait; diff --git a/src/Entity/Sylius/OrderItem.php b/src/Entity/Sylius/OrderItem.php index 9653a92e4f..42123c217a 100644 --- a/src/Entity/Sylius/OrderItem.php +++ b/src/Entity/Sylius/OrderItem.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Put; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Api\Dto\CartItemInput; use AppBundle\Api\State\CartItemProcessor; use AppBundle\Api\State\DeleteCartItemProcessor; diff --git a/src/Entity/Sylius/Product.php b/src/Entity/Sylius/Product.php index 8c79afe840..f6eea53342 100644 --- a/src/Entity/Sylius/Product.php +++ b/src/Entity/Sylius/Product.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Entity\LocalBusiness; use AppBundle\Entity\ReusablePackaging; use AppBundle\Entity\ReusablePackagings; diff --git a/src/Entity/Sylius/ProductOption.php b/src/Entity/Sylius/ProductOption.php index d54445adac..b0242cf17a 100644 --- a/src/Entity/Sylius/ProductOption.php +++ b/src/Entity/Sylius/ProductOption.php @@ -7,7 +7,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\DataType\NumRange; use AppBundle\Entity\LocalBusiness; use AppBundle\Sylius\Product\ProductOptionInterface; diff --git a/src/Entity/Sylius/Taxon.php b/src/Entity/Sylius/Taxon.php index b7f103ec21..ce15312f1a 100644 --- a/src/Entity/Sylius/Taxon.php +++ b/src/Entity/Sylius/Taxon.php @@ -5,7 +5,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\Common\Comparable; diff --git a/src/Entity/Tag.php b/src/Entity/Tag.php index 2b5fd251e6..4e7027a67a 100644 --- a/src/Entity/Tag.php +++ b/src/Entity/Tag.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Symfony\Component\Serializer\Annotation\Groups; use Gedmo\Timestampable\Traits\Timestampable; use Symfony\Component\Validator\Constraints as Assert; diff --git a/src/Entity/Task.php b/src/Entity/Task.php index 59cbdac5ad..4e91d086c7 100644 --- a/src/Entity/Task.php +++ b/src/Entity/Task.php @@ -9,7 +9,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; +use ApiPlatform\Metadata\QueryParameter; use AppBundle\Action\Task\AddImagesToTasks; use AppBundle\Action\Task\Assign as TaskAssign; use AppBundle\Action\Task\Cancel as TaskCancel; @@ -242,7 +242,27 @@ paginationEnabled: false, paginationClientEnabled: true, security: 'is_granted(\'ROLE_DISPATCHER\') or is_granted(\'ROLE_COURIER\')', - provider: TasksProvider::class + provider: TasksProvider::class, + parameters: [ + 'order' => new QueryParameter( + filter: 'AppBundle\Api\Filter\TaskOrderFilter' + ), + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\TaskDateFilter' + ), + 'assigned' => new QueryParameter( + filter: 'AppBundle\Api\Filter\AssignedFilter' + ), + 'organization' => new QueryParameter( + filter: 'AppBundle\Api\Filter\OrganizationFilter' + ), + 'type' => new QueryParameter( + filter: 'AppBundle\Api\Filter\TaskFilter' + ), + 'status' => new QueryParameter( + filter: 'AppBundle\Api\Filter\TaskFilter' + ) + ] ), new Post( denormalizationContext: ['groups' => ['task_create']], @@ -323,11 +343,6 @@ ], normalizationContext: ['groups' => ['task', 'delivery', 'address']] )] -#[ApiFilter(filterClass: TaskOrderFilter::class)] -#[ApiFilter(filterClass: TaskDateFilter::class, properties: ['date'])] -#[ApiFilter(filterClass: TaskFilter::class)] -#[ApiFilter(filterClass: AssignedFilter::class, properties: ['assigned'])] -#[ApiFilter(filterClass: OrganizationFilter::class, properties: ['organization'])] #[UniqueEntity(fields: ['organization', 'ref'], errorPath: 'ref')] #[AssertTask] class Task implements TaggableInterface, OrganizationAwareInterface, PackagesAwareInterface, TimeSlotAwareInterface diff --git a/src/Entity/Task/Group.php b/src/Entity/Task/Group.php index 7e5b39b449..1cb165e303 100644 --- a/src/Entity/Task/Group.php +++ b/src/Entity/Task/Group.php @@ -8,7 +8,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Task\Bulk as TaskBulk; use AppBundle\Action\Task\BulkAsync as TaskBulkAsync; use AppBundle\Action\Task\DeleteGroup as DeleteGroupController; diff --git a/src/Entity/Task/ImportQueue.php b/src/Entity/Task/ImportQueue.php index 18ee5be764..fab60caeaf 100644 --- a/src/Entity/Task/ImportQueue.php +++ b/src/Entity/Task/ImportQueue.php @@ -5,7 +5,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Gedmo\Timestampable\Traits\Timestampable; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\SerializedName; diff --git a/src/Entity/Task/RecurrenceRule.php b/src/Entity/Task/RecurrenceRule.php index 45b0d37dc1..76f1ac1893 100644 --- a/src/Entity/Task/RecurrenceRule.php +++ b/src/Entity/Task/RecurrenceRule.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Task\RecurrenceRuleBetween as BetweenController; use AppBundle\Action\Task\GenerateOrders; use AppBundle\Entity\Store; diff --git a/src/Entity/TaskEvent.php b/src/Entity/TaskEvent.php index 4f3831ad0d..25a5eaf502 100644 --- a/src/Entity/TaskEvent.php +++ b/src/Entity/TaskEvent.php @@ -5,7 +5,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Symfony\Component\Serializer\Annotation\Groups; #[ApiResource(operations: [new Get(security: 'is_granted(\'view\', object.getTask())')])] diff --git a/src/Entity/TaskImage.php b/src/Entity/TaskImage.php index 4e6fcd644b..c9ed53a04b 100644 --- a/src/Entity/TaskImage.php +++ b/src/Entity/TaskImage.php @@ -6,7 +6,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Task\CreateImage; use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\HttpFoundation\File\UploadedFile; diff --git a/src/Entity/TaskList.php b/src/Entity/TaskList.php index 62cdf8a601..59304ec45b 100644 --- a/src/Entity/TaskList.php +++ b/src/Entity/TaskList.php @@ -9,7 +9,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; +use ApiPlatform\Metadata\QueryParameter; use AppBundle\Action\TaskList\Create as CreateTaskListController; use AppBundle\Action\TaskList\Optimize as OptimizeController; use AppBundle\Action\TaskList\SetItems as SetTaskListItemsController; @@ -84,7 +84,12 @@ ] ], security: 'is_granted(\'ROLE_DISPATCHER\') or is_granted(\'ROLE_OAUTH2_TASKS\')', - provider: TaskListProvider::class + provider: TaskListProvider::class, + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\DateFilter' + ) + ] ), new Post( controller: CreateTaskListController::class, @@ -94,12 +99,16 @@ uriTemplate: '/task_lists/v2', openapiContext: ['summary' => 'Retrieves TaskLists as lists of tours and tasks.'], security: 'is_granted(\'ROLE_DISPATCHER\') or is_granted(\'ROLE_OAUTH2_TASKS\')', - provider: TaskListProvider::class + provider: TaskListProvider::class, + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\DateFilter' + ) + ] ) ], normalizationContext: ['groups' => ['task_list']] )] -#[ApiFilter(filterClass: DateFilter::class, properties: ['date'])] class TaskList implements TaskCollectionInterface { use TaskCollectionTrait; diff --git a/src/Entity/TimeSlot.php b/src/Entity/TimeSlot.php index 4488fa10e8..7a12704170 100644 --- a/src/Entity/TimeSlot.php +++ b/src/Entity/TimeSlot.php @@ -7,7 +7,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\TimeSlot\Choices as ChoicesController; use AppBundle\Action\TimeSlot\StoreOpeningHours as OpeningHours; use AppBundle\Api\State\ValidationAwareRemoveProcessor; diff --git a/src/Entity/Tour.php b/src/Entity/Tour.php index 64f0b9cb2c..2e8b5c65ea 100644 --- a/src/Entity/Tour.php +++ b/src/Entity/Tour.php @@ -9,7 +9,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; +use ApiPlatform\Metadata\QueryParameter; use AppBundle\Api\Dto\TourInput; use AppBundle\Api\State\TourProcessor; use AppBundle\Entity\Sylius\Order; @@ -30,7 +30,15 @@ processor: TourProcessor::class ), new Delete(security: 'is_granted(\'ROLE_DISPATCHER\')'), - new GetCollection(security: 'is_granted(\'ROLE_DISPATCHER\')', paginationEnabled: false), + new GetCollection( + security: 'is_granted(\'ROLE_DISPATCHER\')', + paginationEnabled: false, + parameters: [ + 'date' => new QueryParameter( + filter: 'AppBundle\Api\Filter\DateFilter' + ) + ] + ), new Post( security: 'is_granted(\'ROLE_DISPATCHER\')', input: TourInput::class, @@ -40,7 +48,6 @@ normalizationContext: ['groups' => ['task_collection', 'tour']], denormalizationContext: ['groups' => ['tour']] )] -#[ApiFilter(filterClass: DateFilter::class, properties: ['date'])] class Tour extends TaskCollection implements TaskCollectionInterface { private $date; diff --git a/src/Entity/Trailer.php b/src/Entity/Trailer.php index 595ecf05d3..713d500b2c 100644 --- a/src/Entity/Trailer.php +++ b/src/Entity/Trailer.php @@ -10,7 +10,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Symfony\Component\Serializer\Annotation\Groups; use AppBundle\Api\Dto\CompatibleVehiclesInput; use AppBundle\Api\State\CompatibleVehiclesProcessor; diff --git a/src/Entity/User.php b/src/Entity/User.php index 6fd27ab47b..8dedbaa7d9 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -7,7 +7,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; +use ApiPlatform\Metadata\QueryParameter; use libphonenumber\NumberParseException; use libphonenumber\PhoneNumber; use libphonenumber\PhoneNumberUtil; @@ -38,7 +38,12 @@ new GetCollection( paginationEnabled: false, paginationClientEnabled: false, - security: 'is_granted(\'ROLE_DISPATCHER\')' + security: 'is_granted(\'ROLE_DISPATCHER\')', + parameters: [ + 'roles' => new QueryParameter( + filter: 'AppBundle\Api\Filter\UserRoleFilter' + ) + ] ), new Get( uriTemplate: '/me/stripe-payment-methods', @@ -50,7 +55,6 @@ normalizationContext: ['groups' => ['user', 'order']] )] #[UniqueEntity('facebookId')] -#[ApiFilter(filterClass: UserRoleFilter::class, properties: ['roles'])] class User extends BaseUser implements JWTUserInterface, ChannelAwareInterface, LegacyPasswordAuthenticatedUserInterface, Serializable { use Timestampable; diff --git a/src/Entity/Vehicle.php b/src/Entity/Vehicle.php index bf66d8db73..99a3af950b 100644 --- a/src/Entity/Vehicle.php +++ b/src/Entity/Vehicle.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use Symfony\Component\Serializer\Annotation\Groups; use Doctrine\Common\Collections\ArrayCollection; use Gedmo\Timestampable\Traits\Timestampable; diff --git a/src/Entity/Vehicle/Trailer.php b/src/Entity/Vehicle/Trailer.php index 1b6e96314e..112f8552d2 100644 --- a/src/Entity/Vehicle/Trailer.php +++ b/src/Entity/Vehicle/Trailer.php @@ -10,7 +10,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; + #[ApiResource(shortName: 'VehicleTrailer')] class Trailer { diff --git a/src/Entity/Warehouse.php b/src/Entity/Warehouse.php index 3c9825d95b..b77f8090cc 100644 --- a/src/Entity/Warehouse.php +++ b/src/Entity/Warehouse.php @@ -10,7 +10,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Api\State\ValidationAwareRemoveProcessor; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; diff --git a/src/Entity/Webhook.php b/src/Entity/Webhook.php index 38dc75cdc7..b428a09010 100644 --- a/src/Entity/Webhook.php +++ b/src/Entity/Webhook.php @@ -7,7 +7,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use AppBundle\Action\Webhook\Create as CreateController; use Gedmo\Timestampable\Traits\Timestampable; use Symfony\Component\Serializer\Annotation\Groups; diff --git a/src/Entity/Woopit/QuoteRequest.php b/src/Entity/Woopit/QuoteRequest.php index aa0fac0f78..69f446a5f7 100644 --- a/src/Entity/Woopit/QuoteRequest.php +++ b/src/Entity/Woopit/QuoteRequest.php @@ -9,7 +9,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\ApiProperty; -use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Action\NotFoundAction; use AppBundle\Action\Woopit\QuoteRequest as QuoteRequestController; use AppBundle\Action\Woopit\DeliveryRequest as DeliveryRequestController;