diff --git a/module/Core/src/Repository/ShortUrlRepository.php b/module/Core/src/Repository/ShortUrlRepository.php index 78962ccd..a287fe0b 100644 --- a/module/Core/src/Repository/ShortUrlRepository.php +++ b/module/Core/src/Repository/ShortUrlRepository.php @@ -17,7 +17,7 @@ class ShortUrlRepository extends EntityRepository implements ShortUrlRepositoryI */ public function findList($limit = null, $offset = null, $searchTerm = null, array $tags = [], $orderBy = null) { - $qb = $this->createListQueryBuilder($searchTerm); + $qb = $this->createListQueryBuilder($searchTerm, $tags); $qb->select('s'); if (isset($limit)) { @@ -49,7 +49,7 @@ class ShortUrlRepository extends EntityRepository implements ShortUrlRepositoryI */ public function countList($searchTerm = null, array $tags = []) { - $qb = $this->createListQueryBuilder($searchTerm); + $qb = $this->createListQueryBuilder($searchTerm, $tags); $qb->select('COUNT(s)'); return (int) $qb->getQuery()->getSingleScalarResult(); @@ -64,6 +64,7 @@ class ShortUrlRepository extends EntityRepository implements ShortUrlRepositoryI { $qb = $this->getEntityManager()->createQueryBuilder(); $qb->from(ShortUrl::class, 's'); + $qb->where('1=1'); // Apply search term to every searchable field if not empty if (! empty($searchTerm)) { @@ -73,11 +74,17 @@ class ShortUrlRepository extends EntityRepository implements ShortUrlRepositoryI ]; // Unpack and apply search conditions - $qb->where($qb->expr()->orX(...$conditions)); + $qb->andWhere($qb->expr()->orX(...$conditions)); $searchTerm = '%' . $searchTerm . '%'; $qb->setParameter('searchPattern', $searchTerm); } + // Filter by tags if provided + if (! empty($tags)) { + $qb->join('s.tags', 't') + ->andWhere($qb->expr()->in('t.name', $tags)); + } + return $qb; } } diff --git a/module/Core/src/Service/ShortUrlService.php b/module/Core/src/Service/ShortUrlService.php index e3c2e451..faf778b1 100644 --- a/module/Core/src/Service/ShortUrlService.php +++ b/module/Core/src/Service/ShortUrlService.php @@ -33,13 +33,14 @@ class ShortUrlService implements ShortUrlServiceInterface /** * @param int $page * @param string $searchQuery + * @param array $tags * @return ShortUrl[]|Paginator */ - public function listShortUrls($page = 1, $searchQuery = null) + public function listShortUrls($page = 1, $searchQuery = null, array $tags = []) { /** @var ShortUrlRepository $repo */ $repo = $this->em->getRepository(ShortUrl::class); - $paginator = new Paginator(new PaginableRepositoryAdapter($repo, $searchQuery)); + $paginator = new Paginator(new PaginableRepositoryAdapter($repo, $searchQuery, $tags)); $paginator->setItemCountPerPage(PaginableRepositoryAdapter::ITEMS_PER_PAGE) ->setCurrentPageNumber($page); diff --git a/module/Core/src/Service/ShortUrlServiceInterface.php b/module/Core/src/Service/ShortUrlServiceInterface.php index 7fbc1b4e..cdf9a45f 100644 --- a/module/Core/src/Service/ShortUrlServiceInterface.php +++ b/module/Core/src/Service/ShortUrlServiceInterface.php @@ -10,9 +10,10 @@ interface ShortUrlServiceInterface /** * @param int $page * @param string $searchQuery + * @param array $tags * @return ShortUrl[]|Paginator */ - public function listShortUrls($page = 1, $searchQuery = null); + public function listShortUrls($page = 1, $searchQuery = null, array $tags = []); /** * @param string $shortCode diff --git a/module/Rest/src/Action/ListShortcodesAction.php b/module/Rest/src/Action/ListShortcodesAction.php index d6f6782d..dd08c071 100644 --- a/module/Rest/src/Action/ListShortcodesAction.php +++ b/module/Rest/src/Action/ListShortcodesAction.php @@ -74,6 +74,7 @@ class ListShortcodesAction extends AbstractRestAction return [ isset($query['page']) ? $query['page'] : 1, isset($query['searchTerm']) ? $query['searchTerm'] : null, + isset($query['tags']) ? $query['tags'] : [], ]; } }