<?php
namespace App\Repository;
use App\Entity\Booking;
use App\Entity\Resource;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method Resource|null find($id, $lockMode = null, $lockVersion = null)
* @method Resource|null findOneBy(array $criteria, array $orderBy = null)
* @method Resource[] findAll()
* @method Resource[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ResourceRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Resource::class);
}
public function apiGetResourcesList ( ?string $term, User $user, ?int $limit ): array
{
$qb = $this->createQueryBuilder('r')
->select('r.id, r.name AS text')
->orderBy('r.name')
->setMaxResults($limit ?: 15);
if (!empty($term)) {
$qb->where('r.name LIKE :term')
->setParameter('term', "%$term%");
}
$this->addOUFilter($qb, $user);
$res = $qb->getQuery()->getResult();
$response = [];
foreach ( $res as $row ) {
$response[] = $row;
}
return $response;
}
public function qbAvailableResources( User $user ): QueryBuilder
{
$qb = $this->createQueryBuilder('r')
->orderBy('r.name');
$this->addOUFilter($qb, $user);
return $qb;
}
protected function addOUFilter( QueryBuilder $qb, User $user, $alias = 'r' ): QueryBuilder
{
if ($user->getOrganizationUnit()) {
$path = $user->getOrganizationUnit()->getPath();
$qb->leftJoin($alias . '.organizationUnit', 'ou')
->andWhere('ou.path LIKE :tree')
->setParameter('tree', $path . '%');
}
return $qb;
}
}