<?php
namespace App\Service\Entry;
use App\Entity\Entry\Entry;
use App\Repository\Entry\EntryRepository;
use App\Repository\Entry\Report\PostRepository;
use App\Utils\GetQueryUtilTrait;
use App\Utils\PaginationUtil;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\Request;
class ReportService
{
use GetQueryUtilTrait;
public const RESUME_SESSION_NAME = "entry_report_index_resume";
private PostRepository $postRepository;
private EntryRepository $entryRepository;
public function __construct(
PostRepository $postRepository,
EntryRepository $entryRepository
) {
$this->postRepository = $postRepository;
$this->entryRepository = $entryRepository;
}
public function getCriteriaFromRequest(Request $request): array {
$criteria = [];
if($entryCategory = $this->getSingleQuery($request, "category")) {
$criteria['category'] = $entryCategory;
}
if($page = $this->getSingleQuery($request, "page")) {
$criteria['page'] = $page;
} else {
$criteria['page'] = 1;
}
$request->getSession()->set(self::RESUME_SESSION_NAME, $criteria);
return $criteria;
}
public function getQueryBuilder(array $criteria): QueryBuilder
{
$qb = $this->postRepository->getListQuery([]);
$qb
->leftJoin(Entry::class, "e", "with", "a.Entry = e.id")
;
if(isset($criteria['id'])) {
$qb
->andWhere($qb->expr()->eq('a.id', ':id'))
->setParameter("id" , $criteria['id'])
;
}
if(isset($criteria['category'])) {
$qb
->andWhere($qb->expr()->eq('e.category', ":category"))
->setParameter("category", $criteria['category'])
;
}
$this->entryRepository->joinOwner($qb);
$this->entryRepository->addPublishWhere($qb);
return $qb;
}
public function handleList(QueryBuilder $qb, array $criteria): PaginationUtil
{
if(!isset($criteria['page'])) {
$criteria['page'] = 1;
}
if(!isset($criteria['liimit'])) {
$criteria['limit'] = 12;
}
return new PaginationUtil($qb, $criteria['page'], $criteria['limit']);
}
}