<?php
namespace App\DataProvider;
use App\Entity\User;
use App\Service\EsCache;
use Doctrine\ORM\EntityManagerInterface;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface;
final class UserCollectionDataProvider implements ContextAwareCollectionDataProviderInterface, RestrictedDataProviderInterface
{
public function __construct(private EntityManagerInterface $_em, private $collectionExtensions = [], private EsCache $esCache)
{}
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return User::class === $resourceClass && $operationName === 'get_for_assign_with_group';
}
public function getCollection(string $resourceClass, string $operationName = null, array $context = []): iterable
{
$queryBuilder = $this->_em->getRepository(User::class)->createQueryBuilder('x');
$queryNameGenerator = new QueryNameGenerator();
foreach ($this->collectionExtensions as $extension) {
$extension->applyToCollection($queryBuilder, $queryNameGenerator, $resourceClass, $operationName, $context);
}
$users = $queryBuilder->getQuery()->getResult();
$cond = ' WHERE client_id = '.$this->esCache->getClient()->getId().' AND is_generated = 0';
if (isset($context['filters']['user_name_search']) && strlen($context['filters']['user_name_search']) > 0) {
$cond .= ' AND name LIKE "%'.$context['filters']['user_name_search'].'%"';
}
$query = 'SELECT id, name as firstName, "" as lastName, "" as company, "" as jobTitle, "" as country, "" as imageName, "group" as type FROM user_group'.$cond;
$statement = $this->_em->getConnection()->prepare($query);
$userGroups = $statement->executeQuery()->fetchAllAssociative();
return [...$users, ...$userGroups];
}
}