Added support to order short URLs by title

This commit is contained in:
Alejandro Celaya 2021-02-04 22:07:54 +01:00
parent 4330a09793
commit ed18f10b94
4 changed files with 23 additions and 10 deletions

View file

@ -64,7 +64,9 @@
"dateCreated-ASC", "dateCreated-ASC",
"dateCreated-DESC", "dateCreated-DESC",
"visits-ASC", "visits-ASC",
"visits-DESC" "visits-DESC",
"title-ASC",
"title-DESC"
] ]
} }
}, },

View file

@ -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(

View file

@ -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);

View file

@ -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,