src/DataFilter/OrderRequestDeletedDataFilter.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\DataFilter;
  3. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
  4. use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
  5. use App\Request\OrderRequestRequest;
  6. use App\Security\UserSecurityHelper;
  7. use Doctrine\ORM\QueryBuilder;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Component\HttpFoundation\RequestStack;
  11. use Symfony\Component\Security\Core\Security;
  12. use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
  13. class OrderRequestDeletedDataFilter extends AbstractContextAwareFilter
  14. {
  15. const STATE_DELETED = 'deleted';
  16. const STATE_ALL = 'all';
  17. const STATE_DEFAULT = 'default';
  18. /**
  19. * @var UserSecurityHelper
  20. */
  21. private $securityHelper;
  22. /**
  23. * @var Security
  24. */
  25. private $security;
  26. /**
  27. * OrderRequestDeletedDataFilter constructor.
  28. *
  29. * @param UserSecurityHelper $securityHelper
  30. * @param ManagerRegistry $managerRegistry
  31. * @param RequestStack|null $requestStack
  32. * @param LoggerInterface|null $logger
  33. * @param array|null $properties
  34. * @param NameConverterInterface|null $nameConverter
  35. */
  36. public function __construct(
  37. Security $security,
  38. UserSecurityHelper $securityHelper,
  39. ManagerRegistry $managerRegistry,
  40. ?RequestStack $requestStack = null,
  41. LoggerInterface $logger = null,
  42. array $properties = null,
  43. NameConverterInterface $nameConverter = null
  44. ) {
  45. parent::__construct($managerRegistry, $requestStack, $logger, $properties, $nameConverter);
  46. $this->securityHelper = $securityHelper;
  47. $this->security = $security;
  48. }
  49. /**
  50. * @inheritDoc
  51. */
  52. protected function filterProperty(
  53. string $property,
  54. $state,
  55. QueryBuilder $queryBuilder,
  56. QueryNameGeneratorInterface $queryNameGenerator,
  57. string $resourceClass,
  58. string $operationName = null
  59. ) {
  60. if (!$this->securityHelper->isGranted('ROLE_GALAB_API_USER')) {
  61. return;
  62. }
  63. if ($property !== 'delete_state') {
  64. return;
  65. }
  66. if ($resourceClass !== OrderRequestRequest::class) {
  67. return;
  68. }
  69. $state = $this->normalizeValue($state);
  70. if ($state === null) {
  71. return;
  72. }
  73. if ($state === self::STATE_DEFAULT) {
  74. return;
  75. }
  76. $parts = $queryBuilder->getDQLPart('where')->getParts();
  77. $queryBuilder->resetDQLPart('where');
  78. $parts = array_filter($parts, fn($part) => 'p.deletedAt IS NULL' !== $part);
  79. foreach ($parts as $part) {
  80. $queryBuilder->andWhere($part);
  81. }
  82. if ($state === self::STATE_ALL) {
  83. return;
  84. }
  85. $queryBuilder->andWhere('p.deletedAt IS NOT NULL');
  86. }
  87. private function normalizeValue($value)
  88. {
  89. switch ($value) {
  90. case self::STATE_DELETED:
  91. case self::STATE_ALL:
  92. case self::STATE_DEFAULT:
  93. return $value;
  94. }
  95. return null;
  96. }
  97. /**
  98. * @inheritDoc
  99. */
  100. public function getDescription(string $resourceClass): array
  101. {
  102. $description = [
  103. 'delete_state' => [
  104. 'property' => 'delete_state',
  105. 'type' => 'string',
  106. 'required' => false,
  107. 'schema' => [
  108. 'type' => 'string',
  109. 'description' => 'Allows the admin user to filter by deleted state',
  110. 'enum' => [
  111. self::STATE_DEFAULT => 'Default state, no deleted order requests will be shown',
  112. self::STATE_ALL => 'All order requests will be loaded regardless of delete state',
  113. self::STATE_DELETED => 'Only deleted order requests will be shown',
  114. ],
  115. ],
  116. ],
  117. ];
  118. return $description;
  119. }
  120. }