mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Deprecated camelCase options in some CLI commands
This commit is contained in:
parent
28afb8944f
commit
96d07c4b4e
@ -6,11 +6,11 @@ namespace Shlinkio\Shlink\CLI\Command\Api;
|
|||||||
|
|
||||||
use Cake\Chronos\Chronos;
|
use Cake\Chronos\Chronos;
|
||||||
use Shlinkio\Shlink\CLI\ApiKey\RoleResolverInterface;
|
use Shlinkio\Shlink\CLI\ApiKey\RoleResolverInterface;
|
||||||
|
use Shlinkio\Shlink\CLI\Command\BaseCommand;
|
||||||
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
||||||
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
||||||
use Shlinkio\Shlink\Rest\ApiKey\Role;
|
use Shlinkio\Shlink\Rest\ApiKey\Role;
|
||||||
use Shlinkio\Shlink\Rest\Service\ApiKeyServiceInterface;
|
use Shlinkio\Shlink\Rest\Service\ApiKeyServiceInterface;
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
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 Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
@ -19,7 +19,7 @@ use Symfony\Component\Console\Style\SymfonyStyle;
|
|||||||
use function Shlinkio\Shlink\Core\arrayToString;
|
use function Shlinkio\Shlink\Core\arrayToString;
|
||||||
use function sprintf;
|
use function sprintf;
|
||||||
|
|
||||||
class GenerateKeyCommand extends Command
|
class GenerateKeyCommand extends BaseCommand
|
||||||
{
|
{
|
||||||
public const NAME = 'api-key:generate';
|
public const NAME = 'api-key:generate';
|
||||||
|
|
||||||
@ -42,9 +42,9 @@ class GenerateKeyCommand extends Command
|
|||||||
|
|
||||||
<info>%command.full_name%</info>
|
<info>%command.full_name%</info>
|
||||||
|
|
||||||
You can optionally set its expiration date with <comment>--expirationDate</comment> or <comment>-e</comment>:
|
You can optionally set its expiration date with <comment>--expiration-date</comment> or <comment>-e</comment>:
|
||||||
|
|
||||||
<info>%command.full_name% --expirationDate 2020-01-01</info>
|
<info>%command.full_name% --expiration-date 2020-01-01</info>
|
||||||
|
|
||||||
You can also set roles to the API key:
|
You can also set roles to the API key:
|
||||||
|
|
||||||
@ -56,8 +56,8 @@ class GenerateKeyCommand extends Command
|
|||||||
$this
|
$this
|
||||||
->setName(self::NAME)
|
->setName(self::NAME)
|
||||||
->setDescription('Generates a new valid API key.')
|
->setDescription('Generates a new valid API key.')
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'expirationDate',
|
'expiration-date',
|
||||||
'e',
|
'e',
|
||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'The date in which the API key should expire. Use any valid PHP format.',
|
'The date in which the API key should expire. Use any valid PHP format.',
|
||||||
@ -79,7 +79,7 @@ class GenerateKeyCommand extends Command
|
|||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): ?int
|
protected function execute(InputInterface $input, OutputInterface $output): ?int
|
||||||
{
|
{
|
||||||
$expirationDate = $input->getOption('expirationDate');
|
$expirationDate = $this->getOptionWithDeprecatedFallback($input, 'expiration-date');
|
||||||
$apiKey = $this->apiKeyService->create(
|
$apiKey = $this->apiKeyService->create(
|
||||||
isset($expirationDate) ? Chronos::parse($expirationDate) : null,
|
isset($expirationDate) ? Chronos::parse($expirationDate) : null,
|
||||||
...$this->roleResolver->determineRoles($input),
|
...$this->roleResolver->determineRoles($input),
|
||||||
|
@ -4,12 +4,12 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Shlinkio\Shlink\CLI\Command\Api;
|
namespace Shlinkio\Shlink\CLI\Command\Api;
|
||||||
|
|
||||||
|
use Shlinkio\Shlink\CLI\Command\BaseCommand;
|
||||||
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
||||||
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
||||||
use Shlinkio\Shlink\Rest\ApiKey\Role;
|
use Shlinkio\Shlink\Rest\ApiKey\Role;
|
||||||
use Shlinkio\Shlink\Rest\Entity\ApiKey;
|
use Shlinkio\Shlink\Rest\Entity\ApiKey;
|
||||||
use Shlinkio\Shlink\Rest\Service\ApiKeyServiceInterface;
|
use Shlinkio\Shlink\Rest\Service\ApiKeyServiceInterface;
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
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 Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
@ -19,7 +19,7 @@ use function Functional\map;
|
|||||||
use function implode;
|
use function implode;
|
||||||
use function sprintf;
|
use function sprintf;
|
||||||
|
|
||||||
class ListKeysCommand extends Command
|
class ListKeysCommand extends BaseCommand
|
||||||
{
|
{
|
||||||
private const ERROR_STRING_PATTERN = '<fg=red>%s</>';
|
private const ERROR_STRING_PATTERN = '<fg=red>%s</>';
|
||||||
private const SUCCESS_STRING_PATTERN = '<info>%s</info>';
|
private const SUCCESS_STRING_PATTERN = '<info>%s</info>';
|
||||||
@ -40,8 +40,8 @@ class ListKeysCommand extends Command
|
|||||||
$this
|
$this
|
||||||
->setName(self::NAME)
|
->setName(self::NAME)
|
||||||
->setDescription('Lists all the available API keys.')
|
->setDescription('Lists all the available API keys.')
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'enabledOnly',
|
'enabled-only',
|
||||||
'e',
|
'e',
|
||||||
InputOption::VALUE_NONE,
|
InputOption::VALUE_NONE,
|
||||||
'Tells if only enabled API keys should be returned.',
|
'Tells if only enabled API keys should be returned.',
|
||||||
@ -50,7 +50,7 @@ class ListKeysCommand extends Command
|
|||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): ?int
|
protected function execute(InputInterface $input, OutputInterface $output): ?int
|
||||||
{
|
{
|
||||||
$enabledOnly = $input->getOption('enabledOnly');
|
$enabledOnly = $this->getOptionWithDeprecatedFallback($input, 'enabled-only');
|
||||||
|
|
||||||
$rows = map($this->apiKeyService->listKeys($enabledOnly), function (ApiKey $apiKey) use ($enabledOnly) {
|
$rows = map($this->apiKeyService->listKeys($enabledOnly), function (ApiKey $apiKey) use ($enabledOnly) {
|
||||||
$expiration = $apiKey->getExpirationDate();
|
$expiration = $apiKey->getExpirationDate();
|
||||||
|
51
module/CLI/src/Command/BaseCommand.php
Normal file
51
module/CLI/src/Command/BaseCommand.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shlinkio\Shlink\CLI\Command;
|
||||||
|
|
||||||
|
use Symfony\Component\Console\Command\Command;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
|
||||||
|
use function method_exists;
|
||||||
|
use function Shlinkio\Shlink\Core\kebabCaseToCamelCase;
|
||||||
|
use function sprintf;
|
||||||
|
use function str_contains;
|
||||||
|
|
||||||
|
abstract class BaseCommand extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param mixed|null $default
|
||||||
|
*/
|
||||||
|
protected function addOptionWithDeprecatedFallback(
|
||||||
|
string $name,
|
||||||
|
?string $shortcut = null,
|
||||||
|
?int $mode = null,
|
||||||
|
string $description = '',
|
||||||
|
$default = null
|
||||||
|
): self {
|
||||||
|
$this->addOption($name, $shortcut, $mode, $description, $default);
|
||||||
|
|
||||||
|
if (str_contains($name, '-')) {
|
||||||
|
$camelCaseName = kebabCaseToCamelCase($name);
|
||||||
|
$this->addOption($camelCaseName, null, $mode, sprintf('[DEPRECATED] Same as "%s".', $name), $default);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool|string|string[]|null
|
||||||
|
*/
|
||||||
|
protected function getOptionWithDeprecatedFallback(InputInterface $input, string $name)
|
||||||
|
{
|
||||||
|
$rawInput = method_exists($input, '__toString') ? $input->__toString() : '';
|
||||||
|
$camelCaseName = kebabCaseToCamelCase($name);
|
||||||
|
|
||||||
|
if (str_contains($rawInput, $camelCaseName)) {
|
||||||
|
return $input->getOption($camelCaseName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $input->getOption($name);
|
||||||
|
}
|
||||||
|
}
|
@ -4,13 +4,13 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Shlinkio\Shlink\CLI\Command\ShortUrl;
|
namespace Shlinkio\Shlink\CLI\Command\ShortUrl;
|
||||||
|
|
||||||
|
use Shlinkio\Shlink\CLI\Command\BaseCommand;
|
||||||
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
||||||
use Shlinkio\Shlink\Core\Exception\InvalidUrlException;
|
use Shlinkio\Shlink\Core\Exception\InvalidUrlException;
|
||||||
use Shlinkio\Shlink\Core\Exception\NonUniqueSlugException;
|
use Shlinkio\Shlink\Core\Exception\NonUniqueSlugException;
|
||||||
use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
|
use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
|
||||||
use Shlinkio\Shlink\Core\Service\UrlShortenerInterface;
|
use Shlinkio\Shlink\Core\Service\UrlShortenerInterface;
|
||||||
use Shlinkio\Shlink\Core\Validation\ShortUrlMetaInputFilter;
|
use Shlinkio\Shlink\Core\Validation\ShortUrlMetaInputFilter;
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
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;
|
||||||
@ -23,9 +23,9 @@ use function Functional\flatten;
|
|||||||
use function Functional\unique;
|
use function Functional\unique;
|
||||||
use function method_exists;
|
use function method_exists;
|
||||||
use function sprintf;
|
use function sprintf;
|
||||||
use function strpos;
|
use function str_contains;
|
||||||
|
|
||||||
class GenerateShortUrlCommand extends Command
|
class GenerateShortUrlCommand extends BaseCommand
|
||||||
{
|
{
|
||||||
public const NAME = 'short-url:generate';
|
public const NAME = 'short-url:generate';
|
||||||
|
|
||||||
@ -53,34 +53,34 @@ class GenerateShortUrlCommand extends Command
|
|||||||
InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED,
|
||||||
'Tags to apply to the new short URL',
|
'Tags to apply to the new short URL',
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'validSince',
|
'valid-since',
|
||||||
's',
|
's',
|
||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'The date from which this short URL will be valid. '
|
'The date from which this short URL will be valid. '
|
||||||
. 'If someone tries to access it before this date, it will not be found.',
|
. 'If someone tries to access it before this date, it will not be found.',
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'validUntil',
|
'valid-until',
|
||||||
'u',
|
'u',
|
||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'The date until which this short URL will be valid. '
|
'The date until which this short URL will be valid. '
|
||||||
. 'If someone tries to access it after this date, it will not be found.',
|
. 'If someone tries to access it after this date, it will not be found.',
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'customSlug',
|
'custom-slug',
|
||||||
'c',
|
'c',
|
||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'If provided, this slug will be used instead of generating a short code',
|
'If provided, this slug will be used instead of generating a short code',
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'maxVisits',
|
'max-visits',
|
||||||
'm',
|
'm',
|
||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'This will limit the number of visits for this short URL.',
|
'This will limit the number of visits for this short URL.',
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'findIfExists',
|
'find-if-exists',
|
||||||
'f',
|
'f',
|
||||||
InputOption::VALUE_NONE,
|
InputOption::VALUE_NONE,
|
||||||
'This will force existing matching URL to be returned if found, instead of creating a new one.',
|
'This will force existing matching URL to be returned if found, instead of creating a new one.',
|
||||||
@ -91,11 +91,11 @@ class GenerateShortUrlCommand extends Command
|
|||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'The domain to which this short URL will be attached.',
|
'The domain to which this short URL will be attached.',
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOptionWithDeprecatedFallback(
|
||||||
'shortCodeLength',
|
'short-code-length',
|
||||||
'l',
|
'l',
|
||||||
InputOption::VALUE_REQUIRED,
|
InputOption::VALUE_REQUIRED,
|
||||||
'The length for generated short code (it will be ignored if --customSlug was provided).',
|
'The length for generated short code (it will be ignored if --custom-slug was provided).',
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOption(
|
||||||
'validate-url',
|
'validate-url',
|
||||||
@ -136,18 +136,24 @@ class GenerateShortUrlCommand extends Command
|
|||||||
|
|
||||||
$explodeWithComma = curry('explode')(',');
|
$explodeWithComma = curry('explode')(',');
|
||||||
$tags = unique(flatten(array_map($explodeWithComma, $input->getOption('tags'))));
|
$tags = unique(flatten(array_map($explodeWithComma, $input->getOption('tags'))));
|
||||||
$customSlug = $input->getOption('customSlug');
|
$customSlug = $this->getOptionWithDeprecatedFallback($input, 'custom-slug');
|
||||||
$maxVisits = $input->getOption('maxVisits');
|
$maxVisits = $this->getOptionWithDeprecatedFallback($input, 'max-visits');
|
||||||
$shortCodeLength = $input->getOption('shortCodeLength') ?? $this->defaultShortCodeLength;
|
$shortCodeLength = $this->getOptionWithDeprecatedFallback(
|
||||||
|
$input,
|
||||||
|
'short-code-length',
|
||||||
|
) ?? $this->defaultShortCodeLength;
|
||||||
$doValidateUrl = $this->doValidateUrl($input);
|
$doValidateUrl = $this->doValidateUrl($input);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$shortUrl = $this->urlShortener->shorten($longUrl, $tags, ShortUrlMeta::fromRawData([
|
$shortUrl = $this->urlShortener->shorten($longUrl, $tags, ShortUrlMeta::fromRawData([
|
||||||
ShortUrlMetaInputFilter::VALID_SINCE => $input->getOption('validSince'),
|
ShortUrlMetaInputFilter::VALID_SINCE => $this->getOptionWithDeprecatedFallback($input, 'valid-since'),
|
||||||
ShortUrlMetaInputFilter::VALID_UNTIL => $input->getOption('validUntil'),
|
ShortUrlMetaInputFilter::VALID_UNTIL => $this->getOptionWithDeprecatedFallback($input, 'valid-until'),
|
||||||
ShortUrlMetaInputFilter::CUSTOM_SLUG => $customSlug,
|
ShortUrlMetaInputFilter::CUSTOM_SLUG => $customSlug,
|
||||||
ShortUrlMetaInputFilter::MAX_VISITS => $maxVisits !== null ? (int) $maxVisits : null,
|
ShortUrlMetaInputFilter::MAX_VISITS => $maxVisits !== null ? (int) $maxVisits : null,
|
||||||
ShortUrlMetaInputFilter::FIND_IF_EXISTS => $input->getOption('findIfExists'),
|
ShortUrlMetaInputFilter::FIND_IF_EXISTS => $this->getOptionWithDeprecatedFallback(
|
||||||
|
$input,
|
||||||
|
'find-if-exists',
|
||||||
|
),
|
||||||
ShortUrlMetaInputFilter::DOMAIN => $input->getOption('domain'),
|
ShortUrlMetaInputFilter::DOMAIN => $input->getOption('domain'),
|
||||||
ShortUrlMetaInputFilter::SHORT_CODE_LENGTH => $shortCodeLength,
|
ShortUrlMetaInputFilter::SHORT_CODE_LENGTH => $shortCodeLength,
|
||||||
ShortUrlMetaInputFilter::VALIDATE_URL => $doValidateUrl,
|
ShortUrlMetaInputFilter::VALIDATE_URL => $doValidateUrl,
|
||||||
@ -168,10 +174,10 @@ class GenerateShortUrlCommand extends Command
|
|||||||
{
|
{
|
||||||
$rawInput = method_exists($input, '__toString') ? $input->__toString() : '';
|
$rawInput = method_exists($input, '__toString') ? $input->__toString() : '';
|
||||||
|
|
||||||
if (strpos($rawInput, '--no-validate-url') !== false) {
|
if (str_contains($rawInput, '--no-validate-url')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (strpos($rawInput, '--validate-url') !== false) {
|
if (str_contains($rawInput, '--validate-url')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,9 +12,12 @@ use PUGX\Shortid\Factory as ShortIdFactory;
|
|||||||
|
|
||||||
use function Functional\reduce_left;
|
use function Functional\reduce_left;
|
||||||
use function is_array;
|
use function is_array;
|
||||||
|
use function lcfirst;
|
||||||
use function print_r;
|
use function print_r;
|
||||||
use function sprintf;
|
use function sprintf;
|
||||||
use function str_repeat;
|
use function str_repeat;
|
||||||
|
use function str_replace;
|
||||||
|
use function ucwords;
|
||||||
|
|
||||||
const DEFAULT_DELETE_SHORT_URL_THRESHOLD = 15;
|
const DEFAULT_DELETE_SHORT_URL_THRESHOLD = 15;
|
||||||
const DEFAULT_SHORT_CODES_LENGTH = 5;
|
const DEFAULT_SHORT_CODES_LENGTH = 5;
|
||||||
@ -97,3 +100,8 @@ function arrayToString(array $array, int $indentSize = 4): string
|
|||||||
);
|
);
|
||||||
}, '');
|
}, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function kebabCaseToCamelCase(string $name): string
|
||||||
|
{
|
||||||
|
return lcfirst(str_replace(' ', '', ucwords(str_replace('-', ' ', $name))));
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user