src/DataProvider/AnalysisServiceDataProvider.php line 71

Open in your IDE?
  1. <?php
  2. namespace App\DataProvider;
  3. use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
  4. use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
  5. use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
  6. use App\DataProvider\Traits\CompanyRestrictedTrait;
  7. use App\DataTransformer\AnalysisServiceTransformer;
  8. use App\DataValidator\AnalysisServicePriceValidator;
  9. use App\Entity\AnalysisService;
  10. use App\Provider\AnalysisServiceWeightProvider;
  11. use App\Repository\AnalysisServiceRepository;
  12. use App\Request\AnalysisServiceRequest;
  13. use Doctrine\Common\Collections\ArrayCollection;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\Security\Core\Security;
  16. class AnalysisServiceDataProvider implements CollectionDataProviderInterface, RestrictedDataProviderInterface, ItemDataProviderInterface
  17. {
  18. use CompanyRestrictedTrait;
  19. public function __construct(
  20. private readonly AnalysisServiceRepository $analysisServiceRepository,
  21. private readonly AnalysisServiceTransformer $transformer,
  22. private readonly AnalysisServiceWeightProvider $weightProvider,
  23. private readonly AnalysisServicePriceValidator $priceValidator,
  24. EntityManagerInterface $entityManager,
  25. Security $security,
  26. ) {
  27. $this->security = $security;
  28. $this->entityManager = $entityManager;
  29. }
  30. public function getCollection(string $resourceClass, string $operationName = null)
  31. {
  32. $company = $this->getCompany();
  33. $isAdmin = $this->security->isGranted('ROLE_ADMIN');
  34. $result = new ArrayCollection();
  35. if ($company === null && $isAdmin === true) {
  36. $result = $this->analysisServiceRepository->findAll();
  37. }
  38. if (is_array($result) === true) {
  39. $result = new ArrayCollection($result);
  40. }
  41. if ($company !== null) {
  42. $result = $company->getSelectedAnalysisServices();
  43. }
  44. if ($result->isEmpty()) {
  45. return [];
  46. }
  47. $data = $result
  48. ->filter(fn(AnalysisService $setting) => $isAdmin || $this->priceValidator->validate($setting))
  49. ->map(fn(AnalysisService $setting) => $this->transformer->transform($setting));
  50. $data = $this->weightProvider->sortAndEnrich($data);
  51. return $data;
  52. }
  53. public function getItem(string $resourceClass, $id, string $operationName = null, array $context = [])
  54. {
  55. $company = $this->getCompany();
  56. $isAdmin = $this->security->isGranted('ROLE_ADMIN');
  57. $result = new ArrayCollection();
  58. if ($company === null && $isAdmin === true) {
  59. $result = $this->analysisServiceRepository->findAll();
  60. }
  61. if ($company !== null) {
  62. $result = $company->getSelectedAnalysisServices();
  63. }
  64. $available = $result
  65. ->filter(fn(AnalysisService $setting) => $setting->getId() === intval($id))
  66. ->filter(fn(AnalysisService $setting) => $isAdmin || $this->priceValidator->validate($setting));
  67. if ($available->isEmpty()) {
  68. return null;
  69. }
  70. return $this->transformer->transform($available->current());
  71. }
  72. public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
  73. {
  74. return AnalysisServiceRequest::class === $resourceClass;
  75. }
  76. }