mirror of
https://github.com/shlinkio/shlink.git
synced 2025-01-12 09:02:23 -06:00
Added support to order short URL lists
This commit is contained in:
parent
18ae541c93
commit
85146e5676
module
Core/src
Rest/src/Action
@ -20,21 +20,42 @@ class ShortUrlRepository extends EntityRepository implements ShortUrlRepositoryI
|
|||||||
$qb = $this->createListQueryBuilder($searchTerm, $tags);
|
$qb = $this->createListQueryBuilder($searchTerm, $tags);
|
||||||
$qb->select('s');
|
$qb->select('s');
|
||||||
|
|
||||||
|
// Set limit and offset
|
||||||
if (isset($limit)) {
|
if (isset($limit)) {
|
||||||
$qb->setMaxResults($limit);
|
$qb->setMaxResults($limit);
|
||||||
}
|
}
|
||||||
if (isset($offset)) {
|
if (isset($offset)) {
|
||||||
$qb->setFirstResult($offset);
|
$qb->setFirstResult($offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In case the ordering has been specified, the query could be more complex. Process it
|
||||||
if (isset($orderBy)) {
|
if (isset($orderBy)) {
|
||||||
if (is_string($orderBy)) {
|
return $this->processOrderByForList($qb, $orderBy);
|
||||||
$qb->orderBy($orderBy);
|
}
|
||||||
} elseif (is_array($orderBy)) {
|
|
||||||
$key = key($orderBy);
|
// With no order by, order by date and just return the list of ShortUrls
|
||||||
$qb->orderBy($key, $orderBy[$key]);
|
$qb->orderBy('s.dateCreated');
|
||||||
}
|
return $qb->getQuery()->getResult();
|
||||||
} else {
|
}
|
||||||
$qb->orderBy('s.dateCreated');
|
|
||||||
|
protected function processOrderByForList(QueryBuilder $qb, $orderBy)
|
||||||
|
{
|
||||||
|
$fieldName = is_array($orderBy) ? key($orderBy) : $orderBy;
|
||||||
|
$order = is_array($orderBy) ? $orderBy[$fieldName] : 'ASC';
|
||||||
|
|
||||||
|
if ($fieldName === 'visits') {
|
||||||
|
$qb->addSelect('COUNT(v) AS totalVisits')
|
||||||
|
->leftJoin('s.visits', 'v')
|
||||||
|
->groupBy('s')
|
||||||
|
->orderBy('totalVisits', $order);
|
||||||
|
|
||||||
|
return array_column($qb->getQuery()->getResult(), 0);
|
||||||
|
} elseif (in_array($fieldName, [
|
||||||
|
'originalUrl',
|
||||||
|
'shortCode',
|
||||||
|
'dateCreated',
|
||||||
|
])) {
|
||||||
|
$qb->orderBy('s.' . $fieldName, $order);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $qb->getQuery()->getResult();
|
return $qb->getQuery()->getResult();
|
||||||
|
@ -34,13 +34,14 @@ class ShortUrlService implements ShortUrlServiceInterface
|
|||||||
* @param int $page
|
* @param int $page
|
||||||
* @param string $searchQuery
|
* @param string $searchQuery
|
||||||
* @param array $tags
|
* @param array $tags
|
||||||
|
* @param null $orderBy
|
||||||
* @return ShortUrl[]|Paginator
|
* @return ShortUrl[]|Paginator
|
||||||
*/
|
*/
|
||||||
public function listShortUrls($page = 1, $searchQuery = null, array $tags = [])
|
public function listShortUrls($page = 1, $searchQuery = null, array $tags = [], $orderBy = null)
|
||||||
{
|
{
|
||||||
/** @var ShortUrlRepository $repo */
|
/** @var ShortUrlRepository $repo */
|
||||||
$repo = $this->em->getRepository(ShortUrl::class);
|
$repo = $this->em->getRepository(ShortUrl::class);
|
||||||
$paginator = new Paginator(new PaginableRepositoryAdapter($repo, $searchQuery, $tags));
|
$paginator = new Paginator(new PaginableRepositoryAdapter($repo, $searchQuery, $tags, $orderBy));
|
||||||
$paginator->setItemCountPerPage(PaginableRepositoryAdapter::ITEMS_PER_PAGE)
|
$paginator->setItemCountPerPage(PaginableRepositoryAdapter::ITEMS_PER_PAGE)
|
||||||
->setCurrentPageNumber($page);
|
->setCurrentPageNumber($page);
|
||||||
|
|
||||||
|
@ -11,9 +11,10 @@ interface ShortUrlServiceInterface
|
|||||||
* @param int $page
|
* @param int $page
|
||||||
* @param string $searchQuery
|
* @param string $searchQuery
|
||||||
* @param array $tags
|
* @param array $tags
|
||||||
|
* @param null $orderBy
|
||||||
* @return ShortUrl[]|Paginator
|
* @return ShortUrl[]|Paginator
|
||||||
*/
|
*/
|
||||||
public function listShortUrls($page = 1, $searchQuery = null, array $tags = []);
|
public function listShortUrls($page = 1, $searchQuery = null, array $tags = [], $orderBy = null);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $shortCode
|
* @param string $shortCode
|
||||||
|
@ -75,6 +75,7 @@ class ListShortcodesAction extends AbstractRestAction
|
|||||||
isset($query['page']) ? $query['page'] : 1,
|
isset($query['page']) ? $query['page'] : 1,
|
||||||
isset($query['searchTerm']) ? $query['searchTerm'] : null,
|
isset($query['searchTerm']) ? $query['searchTerm'] : null,
|
||||||
isset($query['tags']) ? $query['tags'] : [],
|
isset($query['tags']) ? $query['tags'] : [],
|
||||||
|
isset($query['orderBy']) ? $query['orderBy'] : null,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user