src/Paginator/WorkExample/WorkExamplePaginator.php line 29

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Paginator\WorkExample;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Knp\Component\Pager\Pagination\PaginationInterface;
  6. use Knp\Component\Pager\PaginatorInterface;
  7. use Slivki\Entity\WorkExample;
  8. use Slivki\Message\Query\Beauty\Offer\GetWorkExampleOfMasterQuery;
  9. use Slivki\Message\Query\WorkExample\GetWorkExamplesQuery;
  10. use function sprintf;
  11. final class WorkExamplePaginator implements WorkExamplePaginatorInterface
  12. {
  13.     private EntityManagerInterface $entityManager;
  14.     private PaginatorInterface $paginator;
  15.     public function __construct(
  16.         EntityManagerInterface $entityManager,
  17.         PaginatorInterface $paginator
  18.     ) {
  19.         $this->entityManager $entityManager;
  20.         $this->paginator $paginator;
  21.     }
  22.     public function findAllByQuery(GetWorkExamplesQuery $query): PaginationInterface
  23.     {
  24.         $queryBuilder $this->entityManager->createQueryBuilder();
  25.         $expr $queryBuilder->expr();
  26.         $currentUserPosition $query->getCurrentUserPosition();
  27.         $queryBuilder
  28.             ->addSelect('workExample')
  29.             ->addSelect(
  30.                 sprintf(
  31.                     '%s as %s',
  32.                     $currentUserPosition === null
  33.                         0
  34.                         $expr->min(
  35.                         sprintf(
  36.                             "ST_Distance(geoLocation.point, GeomFromEWKT('SRID=4326;POINT(%s %s)'))",
  37.                             $currentUserPosition->getLatitude(),
  38.                             $currentUserPosition->getLongitude(),
  39.                         ),
  40.                     ),
  41.                     WorkExamplePaginatorInterface::DISTANCE_SORT_FIELD,
  42.                 ),
  43.             )
  44.             ->addSelect('RAND() as HIDDEN rand')
  45.             ->from(WorkExample::class, 'workExample')
  46.             ->innerJoin('workExample.offer''offer')
  47.             ->innerJoin('workExample.geoLocations''geoLocation')
  48.             ->andWhere($expr->eq('offer.active'':active'))
  49.             ->andWhere($expr->eq('offer.hidden'':hidden'))
  50.             ->andWhere($expr->between('current_timestamp()''offer.activeSince''offer.activeTill'))
  51.             ->addGroupBy('workExample')
  52.             ->addOrderBy($query->getSortField(), $query->getSortDirection())
  53.             ->setParameter('active'true)
  54.             ->setParameter('hidden'false)
  55.         ;
  56.         if (null !== $query->getCategoryId()) {
  57.             $queryBuilder
  58.                 ->innerJoin('offer.categories''category')
  59.                 ->andWhere($expr->eq('category'':categoryId'))
  60.                 ->setParameter('categoryId'$query->getCategoryId())
  61.             ;
  62.         }
  63.         if (null !== $query->getOfferId()) {
  64.             $queryBuilder->andWhere($expr->eq('workExample.offer'':offerId'));
  65.             $queryBuilder->setParameter('offerId'$query->getOfferId());
  66.         }
  67.         if (null !== $query->getMinPrice()) {
  68.             $queryBuilder->andWhere($expr->gte('workExample.price'':minPrice'));
  69.             $queryBuilder->setParameter('minPrice'$query->getMinPrice());
  70.         }
  71.         if (null !== $query->getMaxPrice()) {
  72.             $queryBuilder->andWhere($expr->lte('workExample.price'':maxPrice'));
  73.             $queryBuilder->setParameter('maxPrice'$query->getMaxPrice());
  74.         }
  75.         return $this->paginator->paginate($queryBuilder->getQuery(), $query->getPage(), $query->getPerPage());
  76.     }
  77.     public function findByMaster(GetWorkExampleOfMasterQuery $query): PaginationInterface
  78.     {
  79.         $queryBuilder $this->entityManager->createQueryBuilder();
  80.         $expr $queryBuilder->expr();
  81.         $queryBuilder
  82.             ->addSelect('workExample')
  83.             ->from(WorkExample::class, 'workExample')
  84.             ->andWhere($expr->eq('workExample.beautyMaster'':masterId'))
  85.             ->setParameter('masterId'$query->getMasterId());
  86.         return $this->paginator->paginate($queryBuilder->getQuery(), $query->getPage(), $query->getPerPage());
  87.     }
  88. }