<?php
declare(strict_types=1);
namespace Slivki\Repository\Offer;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Slivki\Entity\Category;
use Slivki\Entity\Offer;
use Slivki\Exception\OfferNotFoundException;
final class OfferRepository extends ServiceEntityRepository implements OfferRepositoryInterface
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Offer::class);
}
public function findById(int $id): ?Offer
{
$queryBuilder = $this->createQueryBuilder('offer');
$expr = $queryBuilder->expr();
return $queryBuilder
->andWhere($expr->eq('offer.ID', ':id'))
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult();
}
public function getById(int $id): Offer
{
$offer = $this->findById($id);
if (!$offer instanceof Offer) {
throw OfferNotFoundException::missingId($id);
}
return $offer;
}
public function getByIdAndDirector(int $id, int $directorId): Offer
{
$qb = $this->createQueryBuilder('offer');
$expr = $qb->expr();
$offer = $qb
->innerJoin('offer.directors', 'director')
->andWhere($expr->eq('offer.ID', ':id'))
->andWhere($expr->eq('director.ID', ':directorId'))
->setParameters([
'id' => $id,
'directorId' => $directorId,
])
->getQuery()
->getOneOrNullResult();
if (!$offer instanceof Offer) {
throw OfferNotFoundException::missingId($id);
}
return $offer;
}
public function findActiveOffersByIds(array $offerIds): array
{
$queryBuilder = $this->createQueryBuilder('offer');
$expr = $queryBuilder->expr();
return $queryBuilder
->andWhere($expr->in('offer.ID', ':offerIds'))
->andWhere($expr->eq('offer.active', ':active'))
->andWhere($expr->eq('offer.hidden', ':hidden'))
->andWhere($expr->between('current_timestamp()', 'offer.activeSince', 'offer.activeTill'))
->setParameters([
'offerIds' => $offerIds,
'active' => true,
'hidden' => false,
])
->getQuery()
->getResult();
}
public function clear(): void
{
$this->_em->clear(Offer::class);
}
public function findAllActiveByDirector(int $directorId): array
{
$qb = $this->createQueryBuilder('offer');
$expr = $qb->expr();
return $qb
->innerJoin('offer.directors', 'director')
->andWhere($expr->eq('director.ID', ':directorId'))
->andWhere($expr->eq('offer.active', ':active'))
->andWhere($expr->eq('offer.hidden', ':hidden'))
->andWhere($expr->between('current_timestamp()', 'offer.activeSince', 'offer.activeTill'))
->setParameters([
'active' => true,
'hidden' => false,
'directorId' => $directorId,
])
->getQuery()
->getResult();
}
}