mirror of
https://github.com/shlinkio/shlink.git
synced 2024-11-26 23:18:37 +03:00
Added support to order short URLs by title
This commit is contained in:
parent
4330a09793
commit
ed18f10b94
4 changed files with 23 additions and 10 deletions
|
@ -64,7 +64,9 @@
|
||||||
"dateCreated-ASC",
|
"dateCreated-ASC",
|
||||||
"dateCreated-DESC",
|
"dateCreated-DESC",
|
||||||
"visits-ASC",
|
"visits-ASC",
|
||||||
"visits-DESC"
|
"visits-DESC",
|
||||||
|
"title-ASC",
|
||||||
|
"title-DESC"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -19,11 +19,9 @@ use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
use function array_flip;
|
|
||||||
use function array_intersect_key;
|
|
||||||
use function array_pad;
|
use function array_pad;
|
||||||
use function array_values;
|
|
||||||
use function explode;
|
use function explode;
|
||||||
|
use function Functional\map;
|
||||||
use function implode;
|
use function implode;
|
||||||
use function sprintf;
|
use function sprintf;
|
||||||
|
|
||||||
|
@ -32,12 +30,16 @@ class ListShortUrlsCommand extends AbstractWithDateRangeCommand
|
||||||
use PagerfantaUtilsTrait;
|
use PagerfantaUtilsTrait;
|
||||||
|
|
||||||
public const NAME = 'short-url:list';
|
public const NAME = 'short-url:list';
|
||||||
private const COLUMNS_WHITELIST = [
|
private const COLUMNS_TO_SHOW = [
|
||||||
'shortCode',
|
'shortCode',
|
||||||
|
'title',
|
||||||
'shortUrl',
|
'shortUrl',
|
||||||
'longUrl',
|
'longUrl',
|
||||||
'dateCreated',
|
'dateCreated',
|
||||||
'visitsCount',
|
'visitsCount',
|
||||||
|
];
|
||||||
|
private const COLUMNS_TO_SHOW_WITH_TAGS = [
|
||||||
|
...self::COLUMNS_TO_SHOW,
|
||||||
'tags',
|
'tags',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -154,21 +156,20 @@ class ListShortUrlsCommand extends AbstractWithDateRangeCommand
|
||||||
{
|
{
|
||||||
$result = $this->shortUrlService->listShortUrls($params);
|
$result = $this->shortUrlService->listShortUrls($params);
|
||||||
|
|
||||||
$headers = ['Short code', 'Short URL', 'Long URL', 'Date created', 'Visits count'];
|
$headers = ['Short code', 'Title', 'Short URL', 'Long URL', 'Date created', 'Visits count'];
|
||||||
if ($showTags) {
|
if ($showTags) {
|
||||||
$headers[] = 'Tags';
|
$headers[] = 'Tags';
|
||||||
}
|
}
|
||||||
|
|
||||||
$rows = [];
|
$rows = [];
|
||||||
foreach ($result as $row) {
|
foreach ($result as $row) {
|
||||||
|
$columnsToShow = $showTags ? self::COLUMNS_TO_SHOW_WITH_TAGS : self::COLUMNS_TO_SHOW;
|
||||||
$shortUrl = $this->transformer->transform($row);
|
$shortUrl = $this->transformer->transform($row);
|
||||||
if ($showTags) {
|
if ($showTags) {
|
||||||
$shortUrl['tags'] = implode(', ', $shortUrl['tags']);
|
$shortUrl['tags'] = implode(', ', $shortUrl['tags']);
|
||||||
} else {
|
|
||||||
unset($shortUrl['tags']);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$rows[] = array_values(array_intersect_key($shortUrl, array_flip(self::COLUMNS_WHITELIST)));
|
$rows[] = map($columnsToShow, fn (string $prop) => $shortUrl[$prop]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShlinkTable::fromOutput($output)->render($headers, $rows, $all ? null : $this->formatCurrentPageMessage(
|
ShlinkTable::fromOutput($output)->render($headers, $rows, $all ? null : $this->formatCurrentPageMessage(
|
||||||
|
|
|
@ -55,6 +55,7 @@ class ShortUrlRepository extends EntitySpecificationRepository implements ShortU
|
||||||
$fieldName = $orderBy->orderField();
|
$fieldName = $orderBy->orderField();
|
||||||
$order = $orderBy->orderDirection();
|
$order = $orderBy->orderDirection();
|
||||||
|
|
||||||
|
// visitsCount and visitCount are deprecated. Only visits should work
|
||||||
if (contains(['visits', 'visitsCount', 'visitCount'], $fieldName)) {
|
if (contains(['visits', 'visitsCount', 'visitCount'], $fieldName)) {
|
||||||
$qb->addSelect('COUNT(DISTINCT v) AS totalVisits')
|
$qb->addSelect('COUNT(DISTINCT v) AS totalVisits')
|
||||||
->leftJoin('s.visits', 'v')
|
->leftJoin('s.visits', 'v')
|
||||||
|
@ -66,10 +67,11 @@ class ShortUrlRepository extends EntitySpecificationRepository implements ShortU
|
||||||
|
|
||||||
// Map public field names to column names
|
// Map public field names to column names
|
||||||
$fieldNameMap = [
|
$fieldNameMap = [
|
||||||
'originalUrl' => 'longUrl',
|
'originalUrl' => 'longUrl', // Deprecated
|
||||||
'longUrl' => 'longUrl',
|
'longUrl' => 'longUrl',
|
||||||
'shortCode' => 'shortCode',
|
'shortCode' => 'shortCode',
|
||||||
'dateCreated' => 'dateCreated',
|
'dateCreated' => 'dateCreated',
|
||||||
|
'title' => 'title',
|
||||||
];
|
];
|
||||||
if (array_key_exists($fieldName, $fieldNameMap)) {
|
if (array_key_exists($fieldName, $fieldNameMap)) {
|
||||||
$qb->orderBy('s.' . $fieldNameMap[$fieldName], $order);
|
$qb->orderBy('s.' . $fieldNameMap[$fieldName], $order);
|
||||||
|
|
|
@ -159,6 +159,14 @@ class ListShortUrlsTest extends ApiTestCase
|
||||||
self::SHORT_URL_CUSTOM_SLUG,
|
self::SHORT_URL_CUSTOM_SLUG,
|
||||||
self::SHORT_URL_SHLINK_WITH_TITLE,
|
self::SHORT_URL_SHLINK_WITH_TITLE,
|
||||||
], 'valid_api_key'];
|
], 'valid_api_key'];
|
||||||
|
yield [['orderBy' => 'title-DESC'], [
|
||||||
|
self::SHORT_URL_META,
|
||||||
|
self::SHORT_URL_CUSTOM_SLUG,
|
||||||
|
self::SHORT_URL_DOCS,
|
||||||
|
self::SHORT_URL_CUSTOM_DOMAIN,
|
||||||
|
self::SHORT_URL_CUSTOM_SLUG_AND_DOMAIN,
|
||||||
|
self::SHORT_URL_SHLINK_WITH_TITLE,
|
||||||
|
], 'valid_api_key'];
|
||||||
yield [['startDate' => Chronos::parse('2018-12-01')->toAtomString()], [
|
yield [['startDate' => Chronos::parse('2018-12-01')->toAtomString()], [
|
||||||
self::SHORT_URL_META,
|
self::SHORT_URL_META,
|
||||||
self::SHORT_URL_CUSTOM_SLUG,
|
self::SHORT_URL_CUSTOM_SLUG,
|
||||||
|
|
Loading…
Reference in a new issue