<?php
namespace App\DataProvider;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\FilterExtension;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\PaginationExtension;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderInterface;
use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderTrait;
use App\DataProvider\Paginator\OrderRequestPaginator;
use App\DataProvider\Traits\CompanyRestrictedTrait;
use App\DataTransformer\OrderRequestDataTransformer;
use App\Entity\OrderRequest;
use App\Request\OrderRequestRequest;
use App\Security\CompanyUserProvider;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Security\Core\Security;
class OrderRequestDataProvider implements
ContextAwareCollectionDataProviderInterface,
RestrictedDataProviderInterface,
ItemDataProviderInterface,
SerializerAwareDataProviderInterface
{
use SerializerAwareDataProviderTrait;
use CompanyRestrictedTrait;
/**
* @var OrderRequestDataTransformer
*/
private $transformer;
/**
* @var PaginationExtension
*/
private $paginationExtension;
/**
* @var FilterExtension
*/
private $filterExtension;
/**
* OrderRequestDataProvider constructor.
*
* @param EntityManagerInterface $entityManager
* @param OrderRequestDataTransformer $transformer
* @param PaginationExtension $paginationExtension
* @param FilterExtension $filterExtension
* @param Security $security
* @param CompanyUserProvider $userProvider
*/
public function __construct(
EntityManagerInterface $entityManager,
OrderRequestDataTransformer $transformer,
PaginationExtension $paginationExtension,
FilterExtension $filterExtension,
Security $security,
CompanyUserProvider $userProvider
) {
$this->entityManager = $entityManager;
$this->transformer = $transformer;
$this->paginationExtension = $paginationExtension;
$this->filterExtension = $filterExtension;
$this->security = $security;
$this->userProvider = $userProvider;
}
public function getCollection(string $resourceClass, string $operationName = null, array $context = [])
{
/**
* @var QueryBuilder $qb
*/
$qb = $this->entityManager->getRepository(OrderRequest::class)->createQueryBuilder('p');
$qng = new QueryNameGenerator();
$qb = $this->addRestrictions($qb);
$this->paginationExtension->applyToCollection($qb, $qng, $resourceClass, $operationName, $context);
$this->filterExtension->applyToCollection($qb, $qng, $resourceClass, $operationName, $context);
// Default sorting by created at desc
if (!$qb->getDQLPart('orderBy')) {
$qb->addOrderBy('p.createdAt', 'DESC');
}
return new OrderRequestPaginator($this->transformer, $qb);
}
public function getItem(string $resourceClass, $id, string $operationName = null, array $context = [])
{
/**
* @var QueryBuilder $qb
*/
$qb = $this->entityManager->getRepository(OrderRequest::class)->createQueryBuilder('p');
$this->addRestrictions($qb)
->andWhere('p.id = :id')
->setParameter('id', $id);
$orderRequest = $qb->getQuery()->getOneOrNullResult();
if ($orderRequest === null) {
return null;
}
$this->transformer->setSingleEntity(true);
return $this->transformer->transform($orderRequest);
}
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return OrderRequestRequest::class === $resourceClass;
}
}