<?php
namespace App\DataProvider;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use App\DataProvider\Traits\CompanyRestrictedTrait;
use App\DataTransformer\AnalysisServiceTransformer;
use App\DataValidator\AnalysisServicePriceValidator;
use App\Entity\AnalysisService;
use App\Provider\AnalysisServiceWeightProvider;
use App\Repository\AnalysisServiceRepository;
use App\Request\AnalysisServiceRequest;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Security;
class AnalysisServiceDataProvider implements CollectionDataProviderInterface, RestrictedDataProviderInterface, ItemDataProviderInterface
{
use CompanyRestrictedTrait;
public function __construct(
private readonly AnalysisServiceRepository $analysisServiceRepository,
private readonly AnalysisServiceTransformer $transformer,
private readonly AnalysisServiceWeightProvider $weightProvider,
private readonly AnalysisServicePriceValidator $priceValidator,
EntityManagerInterface $entityManager,
Security $security,
) {
$this->security = $security;
$this->entityManager = $entityManager;
}
public function getCollection(string $resourceClass, string $operationName = null)
{
$company = $this->getCompany();
$isAdmin = $this->security->isGranted('ROLE_ADMIN');
$result = new ArrayCollection();
if ($company === null && $isAdmin === true) {
$result = $this->analysisServiceRepository->findAll();
}
if (is_array($result) === true) {
$result = new ArrayCollection($result);
}
if ($company !== null) {
$result = $company->getSelectedAnalysisServices();
}
if ($result->isEmpty()) {
return [];
}
$data = $result
->filter(fn(AnalysisService $setting) => $isAdmin || $this->priceValidator->validate($setting))
->map(fn(AnalysisService $setting) => $this->transformer->transform($setting));
$data = $this->weightProvider->sortAndEnrich($data);
return $data;
}
public function getItem(string $resourceClass, $id, string $operationName = null, array $context = [])
{
$company = $this->getCompany();
$isAdmin = $this->security->isGranted('ROLE_ADMIN');
$result = new ArrayCollection();
if ($company === null && $isAdmin === true) {
$result = $this->analysisServiceRepository->findAll();
}
if ($company !== null) {
$result = $company->getSelectedAnalysisServices();
}
$available = $result
->filter(fn(AnalysisService $setting) => $setting->getId() === intval($id))
->filter(fn(AnalysisService $setting) => $isAdmin || $this->priceValidator->validate($setting));
if ($available->isEmpty()) {
return null;
}
return $this->transformer->transform($available->current());
}
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return AnalysisServiceRequest::class === $resourceClass;
}
}