mirror of
https://github.com/shlinkio/shlink.git
synced 2025-12-10 22:13:47 -06:00
Merge pull request #2495 from acelaya-forks/tags-option
Extract tags option to its own Option class
This commit is contained in:
commit
cae18ccfb3
@ -6,6 +6,7 @@ namespace Shlinkio\Shlink\CLI\Command\ShortUrl;
|
|||||||
|
|
||||||
use Shlinkio\Shlink\CLI\Input\EndDateOption;
|
use Shlinkio\Shlink\CLI\Input\EndDateOption;
|
||||||
use Shlinkio\Shlink\CLI\Input\StartDateOption;
|
use Shlinkio\Shlink\CLI\Input\StartDateOption;
|
||||||
|
use Shlinkio\Shlink\CLI\Input\TagsOption;
|
||||||
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
||||||
use Shlinkio\Shlink\Common\Paginator\Paginator;
|
use Shlinkio\Shlink\Common\Paginator\Paginator;
|
||||||
use Shlinkio\Shlink\Common\Paginator\Util\PagerfantaUtils;
|
use Shlinkio\Shlink\Common\Paginator\Util\PagerfantaUtils;
|
||||||
@ -27,7 +28,6 @@ use function array_keys;
|
|||||||
use function array_pad;
|
use function array_pad;
|
||||||
use function explode;
|
use function explode;
|
||||||
use function implode;
|
use function implode;
|
||||||
use function Shlinkio\Shlink\Core\ArrayUtils\flatten;
|
|
||||||
use function Shlinkio\Shlink\Core\ArrayUtils\map;
|
use function Shlinkio\Shlink\Core\ArrayUtils\map;
|
||||||
use function sprintf;
|
use function sprintf;
|
||||||
|
|
||||||
@ -37,6 +37,7 @@ class ListShortUrlsCommand extends Command
|
|||||||
|
|
||||||
private readonly StartDateOption $startDateOption;
|
private readonly StartDateOption $startDateOption;
|
||||||
private readonly EndDateOption $endDateOption;
|
private readonly EndDateOption $endDateOption;
|
||||||
|
private readonly TagsOption $tagsOption;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private readonly ShortUrlListServiceInterface $shortUrlService,
|
private readonly ShortUrlListServiceInterface $shortUrlService,
|
||||||
@ -45,6 +46,7 @@ class ListShortUrlsCommand extends Command
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->startDateOption = new StartDateOption($this, 'short URLs');
|
$this->startDateOption = new StartDateOption($this, 'short URLs');
|
||||||
$this->endDateOption = new EndDateOption($this, 'short URLs');
|
$this->endDateOption = new EndDateOption($this, 'short URLs');
|
||||||
|
$this->tagsOption = new TagsOption($this, 'A list of tags that short URLs need to include.');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function configure(): void
|
protected function configure(): void
|
||||||
@ -71,17 +73,6 @@ class ListShortUrlsCommand extends Command
|
|||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'Used to filter results by domain. Use DEFAULT keyword to filter by default domain',
|
'Used to filter results by domain. Use DEFAULT keyword to filter by default domain',
|
||||||
)
|
)
|
||||||
->addOption(
|
|
||||||
'tags',
|
|
||||||
mode: InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
|
|
||||||
description: '[DEPRECATED] Use --tag instead',
|
|
||||||
)
|
|
||||||
->addOption(
|
|
||||||
'tag',
|
|
||||||
't',
|
|
||||||
InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
|
|
||||||
'A list of tags that short URLs need to include.',
|
|
||||||
)
|
|
||||||
->addOption('including-all-tags', 'i', InputOption::VALUE_NONE, '[DEPRECATED] Use --tags-all instead')
|
->addOption('including-all-tags', 'i', InputOption::VALUE_NONE, '[DEPRECATED] Use --tags-all instead')
|
||||||
->addOption(
|
->addOption(
|
||||||
'tags-all',
|
'tags-all',
|
||||||
@ -154,9 +145,7 @@ class ListShortUrlsCommand extends Command
|
|||||||
$searchTerm = $input->getOption('search-term');
|
$searchTerm = $input->getOption('search-term');
|
||||||
$domain = $input->getOption('domain');
|
$domain = $input->getOption('domain');
|
||||||
|
|
||||||
// FIXME DEPRECATED Remove support for comma-separated tags in next major release
|
$tags = $this->tagsOption->get($input);
|
||||||
$tags = [...$input->getOption('tag'), ...$input->getOption('tags')];
|
|
||||||
$tags = flatten(map($tags, static fn (string $tag) => explode(',', $tag)));
|
|
||||||
$tagsMode = $input->getOption('tags-all') === true || $input->getOption('including-all-tags') === true
|
$tagsMode = $input->getOption('tags-all') === true || $input->getOption('including-all-tags') === true
|
||||||
? TagsMode::ALL->value
|
? TagsMode::ALL->value
|
||||||
: TagsMode::ANY->value;
|
: TagsMode::ANY->value;
|
||||||
|
|||||||
@ -13,13 +13,10 @@ use Symfony\Component\Console\Input\InputArgument;
|
|||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
|
||||||
use function array_map;
|
|
||||||
use function array_unique;
|
|
||||||
use function Shlinkio\Shlink\Core\ArrayUtils\flatten;
|
|
||||||
use function Shlinkio\Shlink\Core\splitByComma;
|
|
||||||
|
|
||||||
final readonly class ShortUrlDataInput
|
final readonly class ShortUrlDataInput
|
||||||
{
|
{
|
||||||
|
private readonly TagsOption $tagsOption;
|
||||||
|
|
||||||
public function __construct(Command $command, private bool $longUrlAsOption = false)
|
public function __construct(Command $command, private bool $longUrlAsOption = false)
|
||||||
{
|
{
|
||||||
if ($longUrlAsOption) {
|
if ($longUrlAsOption) {
|
||||||
@ -28,13 +25,9 @@ final readonly class ShortUrlDataInput
|
|||||||
$command->addArgument('longUrl', InputArgument::REQUIRED, 'The long URL to set');
|
$command->addArgument('longUrl', InputArgument::REQUIRED, 'The long URL to set');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->tagsOption = new TagsOption($command, 'Tags to apply to the short URL');
|
||||||
|
|
||||||
$command
|
$command
|
||||||
->addOption(
|
|
||||||
ShortUrlDataOption::TAGS->value,
|
|
||||||
ShortUrlDataOption::TAGS->shortcut(),
|
|
||||||
InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED,
|
|
||||||
'Tags to apply to the short URL',
|
|
||||||
)
|
|
||||||
->addOption(
|
->addOption(
|
||||||
ShortUrlDataOption::VALID_SINCE->value,
|
ShortUrlDataOption::VALID_SINCE->value,
|
||||||
ShortUrlDataOption::VALID_SINCE->shortcut(),
|
ShortUrlDataOption::VALID_SINCE->shortcut(),
|
||||||
@ -117,9 +110,8 @@ final readonly class ShortUrlDataInput
|
|||||||
$maxVisits = $input->getOption('max-visits');
|
$maxVisits = $input->getOption('max-visits');
|
||||||
$data[ShortUrlInputFilter::MAX_VISITS] = $maxVisits !== null ? (int) $maxVisits : null;
|
$data[ShortUrlInputFilter::MAX_VISITS] = $maxVisits !== null ? (int) $maxVisits : null;
|
||||||
}
|
}
|
||||||
if (ShortUrlDataOption::TAGS->wasProvided($input)) {
|
if ($this->tagsOption->exists($input)) {
|
||||||
$tags = array_unique(flatten(array_map(splitByComma(...), $input->getOption('tags'))));
|
$data[ShortUrlInputFilter::TAGS] = $this->tagsOption->get($input);
|
||||||
$data[ShortUrlInputFilter::TAGS] = $tags;
|
|
||||||
}
|
}
|
||||||
if (ShortUrlDataOption::TITLE->wasProvided($input)) {
|
if (ShortUrlDataOption::TITLE->wasProvided($input)) {
|
||||||
$data[ShortUrlInputFilter::TITLE] = $input->getOption('title');
|
$data[ShortUrlInputFilter::TITLE] = $input->getOption('title');
|
||||||
|
|||||||
@ -10,7 +10,6 @@ use function sprintf;
|
|||||||
|
|
||||||
enum ShortUrlDataOption: string
|
enum ShortUrlDataOption: string
|
||||||
{
|
{
|
||||||
case TAGS = 'tags';
|
|
||||||
case VALID_SINCE = 'valid-since';
|
case VALID_SINCE = 'valid-since';
|
||||||
case VALID_UNTIL = 'valid-until';
|
case VALID_UNTIL = 'valid-until';
|
||||||
case MAX_VISITS = 'max-visits';
|
case MAX_VISITS = 'max-visits';
|
||||||
@ -21,7 +20,6 @@ enum ShortUrlDataOption: string
|
|||||||
public function shortcut(): string|null
|
public function shortcut(): string|null
|
||||||
{
|
{
|
||||||
return match ($this) {
|
return match ($this) {
|
||||||
self::TAGS => 't',
|
|
||||||
self::VALID_SINCE => 's',
|
self::VALID_SINCE => 's',
|
||||||
self::VALID_UNTIL => 'u',
|
self::VALID_UNTIL => 'u',
|
||||||
self::MAX_VISITS => 'm',
|
self::MAX_VISITS => 'm',
|
||||||
|
|||||||
51
module/CLI/src/Input/TagsOption.php
Normal file
51
module/CLI/src/Input/TagsOption.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shlinkio\Shlink\CLI\Input;
|
||||||
|
|
||||||
|
use Symfony\Component\Console\Command\Command;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
|
||||||
|
use function array_map;
|
||||||
|
use function array_unique;
|
||||||
|
use function Shlinkio\Shlink\Core\ArrayUtils\flatten;
|
||||||
|
use function Shlinkio\Shlink\Core\splitByComma;
|
||||||
|
|
||||||
|
readonly class TagsOption
|
||||||
|
{
|
||||||
|
public function __construct(Command $command, string $description)
|
||||||
|
{
|
||||||
|
$command
|
||||||
|
->addOption(
|
||||||
|
'tag',
|
||||||
|
't',
|
||||||
|
InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
|
||||||
|
$description,
|
||||||
|
)
|
||||||
|
->addOption(
|
||||||
|
'tags',
|
||||||
|
mode: InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
|
||||||
|
description: '[DEPRECATED] Use --tag instead',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether tags have been set or not, via `--tag`, `-t` or the deprecated `--tags`
|
||||||
|
*/
|
||||||
|
public function exists(InputInterface $input): bool
|
||||||
|
{
|
||||||
|
return $input->hasParameterOption(['--tag', '-t']) || $input->hasParameterOption('--tags');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string[]
|
||||||
|
*/
|
||||||
|
public function get(InputInterface $input): array
|
||||||
|
{
|
||||||
|
// FIXME DEPRECATED Remove support for comma-separated tags in next major release
|
||||||
|
$tags = [...$input->getOption('tag'), ...$input->getOption('tags')];
|
||||||
|
return array_unique(flatten(array_map(splitByComma(...), $tags)));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user