<?php
declare(strict_types=1);
namespace App\Program\Doctrine\Repository;
use App\Point\Form\DataTransferObject\DashboardFilter;
use App\Program\Doctrine\Entity\Program;
use App\Program\Form\DataTransferObject\ProgramsFilter;
use App\Program\Gateway\ProgramGateway;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @template T
*
* @extends ServiceEntityRepository<Program>
*
* @method findOneBy(array $criteria, ?array $orderBy = null) ?Program
* @method findAll() array<int, Program>
*/
final class ProgramRepository extends ServiceEntityRepository implements ProgramGateway
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Program::class);
}
/**
* @return array<array-key, Program>
*/
public function getPointToCurrency(DashboardFilter $filter): array
{
$queryBuilder = $this->createQueryBuilder('p')
->addSelect('c')
->join('p.client', 'c');
if (null !== $filter->getClient()) {
$queryBuilder->andWhere('c = :client')->setParameter('client', $filter->getClient());
}
if (null !== $filter->getProgram()) {
$queryBuilder->andWhere('p = :program')->setParameter('program', $filter->getProgram());
}
if (null !== $filter->getProfile()) {
$queryBuilder
->andWhere('p = :profile')
->setParameter('profile', $filter->getProfile());
}
return $queryBuilder->getQuery()->getResult();
}
public function loadUserByUsername(string $username): ?Program
{
$user = $this->findOneBy(['apiKey' => $username]);
if (null === $user) {
throw new UserNotFoundException();
}
return $user;
}
public function loadUserByIdentifier(string $identifier): ?UserInterface
{
return $this->loadUserByUsername($identifier);
}
public function update(Program $program): void
{
$this->_em->flush();
}
public function create(Program $program): void
{
$this->_em->persist($program);
$this->_em->flush();
}
public function delete(Program $program): void
{
$this->_em->remove($program);
$this->_em->flush();
}
public function getPaginatedPrograms(
int $page,
int $length,
string $column,
string $direction,
ProgramsFilter $filter
): Paginator {
$queryBuilder = $this->createQueryBuilder('p')
->addSelect('c')
->join('p.client', 'c')
->orderBy($column, $direction)
->setMaxResults($length)
->setFirstResult($page * $length - $length);
if (null !== $filter->getClient()) {
$queryBuilder
->andWhere('c = :client')
->setParameter('client', $filter->getClient());
}
if (null !== $filter->getSearch()) {
$queryBuilder
->andWhere('p.name LIKE :search')
->setParameter('search', '%'.$filter->getSearch().'%');
}
if (1 === $filter->getStatus()) {
$queryBuilder
->andWhere('p.startedAt <= NOW()')
->andWhere(
$queryBuilder->expr()->orX(
$queryBuilder->expr()->lte('p.endedAt', 'NOW()'),
$queryBuilder->expr()->isNull('p.endedAt')
)
);
}
if (2 === $filter->getStatus()) {
$queryBuilder->andWhere('p.startedAt > NOW()');
}
if (3 === $filter->getStatus()) {
$queryBuilder->andWhere('p.endedAt <= NOW()');
}
return new Paginator($queryBuilder, true);
}
}