repository = $entityManager->getRepository(SocialAction::class); } public function createQueryBuilder(string $alias, ?string $indexBy = null): QueryBuilder { return $this->repository->createQueryBuilder($alias, $indexBy); } public function find($id): ?SocialAction { return $this->repository->find($id); } /** * @return array */ public function findAll(): array { return $this->repository->findAll(); } public function findAllOrdered(): array { return $this->repository->createQueryBuilder('si') ->orderBy('si.ordering', 'ASC') ->getQuery() ->getResult(); } /** * @return array|SocialAction[] */ public function findAllActive(): array { return $this->buildQueryWithDesactivatedDateCriteria()->getQuery()->getResult(); } /** * @param mixed|null $limit * @param mixed|null $offset * * @return array */ public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array { return $this->repository->findBy($criteria, $orderBy, $limit, $offset); } public function findOneBy(array $criteria, ?array $orderBy = null): ?SocialAction { return $this->repository->findOneBy($criteria, $orderBy); } /** * @return class-string */ public function getClassName(): string { return SocialAction::class; } private function getLang(): string { return $this->requestStack->getCurrentRequest()?->getLocale() ?? 'fr'; } public function getResult( QueryBuilder $qb, ?int $start = 0, ?int $limit = 50, ?array $orderBy = [], ): array { $qb->select('sa'); $qb ->setFirstResult($start) ->setMaxResults($limit); foreach ($orderBy as $field => $direction) { $qb->addOrderBy('sa.'.$field, $direction); } return $qb->getQuery()->getResult(); } private function queryByTitle(string $pattern): QueryBuilder { $qb = $this->entityManager->createQueryBuilder()->from(SocialAction::class, 'sa'); $qb ->where($qb->expr()->like('LOWER(UNACCENT(JSON_EXTRACT(sa.title, :lang)))', "CONCAT('%', LOWER(UNACCENT(:pattern)), '%')")) ->setParameter('pattern', $pattern) ->setParameter('lang', $this->getLang()); return $qb; } public function buildFilterBaseQuery(?string $queryString, array $isActive): QueryBuilder { if (null !== $queryString) { $qb = $this->queryByTitle($queryString); } else { $qb = $this->entityManager->createQueryBuilder()->from(SocialAction::class, 'sa'); } $now = new \DateTime('now'); if (in_array('Active', $isActive, true) && !in_array('Inactive', $isActive, true)) { $qb->andWhere( $qb->expr()->orX( $qb->expr()->isNull('sa.desactivationDate'), $qb->expr()->gt('sa.desactivationDate', ':now') ) )->setParameter('now', $now); } elseif (in_array('Inactive', $isActive, true) && !in_array('Active', $isActive, true)) { $qb->andWhere( $qb->expr()->andX( $qb->expr()->isNotNull('sa.desactivationDate'), $qb->expr()->lte('sa.desactivationDate', ':now') ) )->setParameter('now', $now); } return $qb; } /** * @return array */ public function findFilteredSocialActions( ?string $queryString = null, array $isActive = ['active'], ?int $start = 0, ?int $limit = 50, ?array $orderBy = ['ordering' => 'ASC'], ): array { $qb = $this->buildFilterBaseQuery($queryString, $isActive); return $this->getResult($qb, $start, $limit, $orderBy); } public function countFilteredSocialActions( ?string $queryString = null, array $isActive = ['active'], ): int { $qb = $this->buildFilterBaseQuery($queryString, $isActive); try { return $qb ->select('COUNT(sa)') ->getQuery()->getSingleScalarResult(); } catch (NoResultException|NonUniqueResultException $e) { throw new \LogicException('a count query should return one result', previous: $e); } } private function buildQueryWithDesactivatedDateCriteria(): QueryBuilder { $qb = $this->repository->createQueryBuilder('sa'); $qb->where('sa.desactivationDate is null') ->orWhere('sa.desactivationDate > :now') ->orderBy('sa.ordering', 'ASC') ->setParameter('now', new \DateTime('now')); return $qb; } }