diff --git a/module/CLI/src/Command/Domain/GetDomainVisitsCommand.php b/module/CLI/src/Command/Domain/GetDomainVisitsCommand.php index c2b8d859..19790e3a 100644 --- a/module/CLI/src/Command/Domain/GetDomainVisitsCommand.php +++ b/module/CLI/src/Command/Domain/GetDomainVisitsCommand.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Shlinkio\Shlink\CLI\Command\Domain; use Shlinkio\Shlink\CLI\Command\Visit\VisitsCommandUtils; -use Shlinkio\Shlink\CLI\Input\VisitsDateRangeInput; +use Shlinkio\Shlink\CLI\Input\VisitsListInput; use Shlinkio\Shlink\CLI\Util\ShlinkTable; use Shlinkio\Shlink\Core\ShortUrl\Helper\ShortUrlStringifierInterface; use Shlinkio\Shlink\Core\Visit\Entity\Visit; @@ -34,9 +34,9 @@ class GetDomainVisitsCommand extends Command SymfonyStyle $io, #[Argument('The domain which visits we want to get'), Ask('For what domain do you want to get visits?')] string $domain, - #[MapInput] VisitsDateRangeInput $dateRangeInput, + #[MapInput] VisitsListInput $input, ): int { - $paginator = $this->visitsHelper->visitsForDomain($domain, new VisitsParams($dateRangeInput->toDateRange())); + $paginator = $this->visitsHelper->visitsForDomain($domain, new VisitsParams($input->dateRange())); [$rows, $headers] = VisitsCommandUtils::resolveRowsAndHeaders($paginator, $this->mapExtraFields(...)); ShlinkTable::default($io)->render($headers, $rows); diff --git a/module/CLI/src/Command/ShortUrl/GetShortUrlVisitsCommand.php b/module/CLI/src/Command/ShortUrl/GetShortUrlVisitsCommand.php index 38d9e371..54f6c019 100644 --- a/module/CLI/src/Command/ShortUrl/GetShortUrlVisitsCommand.php +++ b/module/CLI/src/Command/ShortUrl/GetShortUrlVisitsCommand.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Shlinkio\Shlink\CLI\Command\ShortUrl; use Shlinkio\Shlink\CLI\Command\Visit\VisitsCommandUtils; -use Shlinkio\Shlink\CLI\Input\VisitsDateRangeInput; +use Shlinkio\Shlink\CLI\Input\VisitsListInput; use Shlinkio\Shlink\CLI\Util\ShlinkTable; use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlIdentifier; use Shlinkio\Shlink\Core\Visit\Model\VisitsParams; @@ -32,14 +32,14 @@ class GetShortUrlVisitsCommand extends Command SymfonyStyle $io, #[Argument('The short code which visits we want to get'), Ask('Which short code do you want to use?')] string $shortCode, - #[MapInput] VisitsDateRangeInput $dateRangeInput, + #[MapInput] VisitsListInput $input, #[Option('The domain for the short code', shortcut: 'd')] string|null $domain = null, ): int { $identifier = ShortUrlIdentifier::fromShortCodeAndDomain($shortCode, $domain); - $dateRange = $dateRangeInput->toDateRange(); + $dateRange = $input->dateRange(); $paginator = $this->visitsHelper->visitsForShortUrl($identifier, new VisitsParams($dateRange)); - [$rows, $headers] = VisitsCommandUtils::resolveRowsAndHeaders($paginator, static fn () => []); + [$rows, $headers] = VisitsCommandUtils::resolveRowsAndHeaders($paginator); ShlinkTable::default($io)->render($headers, $rows); diff --git a/module/CLI/src/Command/Tag/GetTagVisitsCommand.php b/module/CLI/src/Command/Tag/GetTagVisitsCommand.php index 7db1b7e1..426e253e 100644 --- a/module/CLI/src/Command/Tag/GetTagVisitsCommand.php +++ b/module/CLI/src/Command/Tag/GetTagVisitsCommand.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Shlinkio\Shlink\CLI\Command\Tag; use Shlinkio\Shlink\CLI\Command\Visit\VisitsCommandUtils; -use Shlinkio\Shlink\CLI\Input\VisitsDateRangeInput; +use Shlinkio\Shlink\CLI\Input\VisitsListInput; use Shlinkio\Shlink\CLI\Util\ShlinkTable; use Shlinkio\Shlink\Core\Domain\Entity\Domain; use Shlinkio\Shlink\Core\ShortUrl\Helper\ShortUrlStringifierInterface; @@ -35,7 +35,7 @@ class GetTagVisitsCommand extends Command public function __invoke( SymfonyStyle $io, #[Argument('The tag which visits we want to get'), Ask('For what tag do you want to get visits')] string $tag, - #[MapInput] VisitsDateRangeInput $dateRangeInput, + #[MapInput] VisitsListInput $input, #[Option( 'Return visits that belong to this domain only. Use ' . Domain::DEFAULT_AUTHORITY . ' keyword for visits ' . 'in default domain', @@ -44,7 +44,7 @@ class GetTagVisitsCommand extends Command string|null $domain = null, ): int { $paginator = $this->visitsHelper->visitsForTag($tag, new WithDomainVisitsParams( - dateRange: $dateRangeInput->toDateRange(), + dateRange: $input->dateRange(), domain: $domain, )); [$rows, $headers] = VisitsCommandUtils::resolveRowsAndHeaders($paginator, $this->mapExtraFields(...)); diff --git a/module/CLI/src/Command/Visit/GetNonOrphanVisitsCommand.php b/module/CLI/src/Command/Visit/GetNonOrphanVisitsCommand.php index 6291d6db..3620bbd3 100644 --- a/module/CLI/src/Command/Visit/GetNonOrphanVisitsCommand.php +++ b/module/CLI/src/Command/Visit/GetNonOrphanVisitsCommand.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Shlinkio\Shlink\CLI\Command\Visit; -use Shlinkio\Shlink\CLI\Input\VisitsDateRangeInput; +use Shlinkio\Shlink\CLI\Input\VisitsListInput; use Shlinkio\Shlink\CLI\Util\ShlinkTable; use Shlinkio\Shlink\Core\Domain\Entity\Domain; use Shlinkio\Shlink\Core\ShortUrl\Helper\ShortUrlStringifierInterface; @@ -31,7 +31,7 @@ class GetNonOrphanVisitsCommand extends Command public function __invoke( SymfonyStyle $io, - #[MapInput] VisitsDateRangeInput $dateRangeInput, + #[MapInput] VisitsListInput $input, #[Option( 'Return visits that belong to this domain only. Use ' . Domain::DEFAULT_AUTHORITY . ' keyword for visits ' . 'in default domain', @@ -40,7 +40,7 @@ class GetNonOrphanVisitsCommand extends Command string|null $domain = null, ): int { $paginator = $this->visitsHelper->nonOrphanVisits(new WithDomainVisitsParams( - dateRange: $dateRangeInput->toDateRange(), + dateRange: $input->dateRange(), domain: $domain, )); [$rows, $headers] = VisitsCommandUtils::resolveRowsAndHeaders($paginator, $this->mapExtraFields(...)); diff --git a/module/CLI/src/Command/Visit/GetOrphanVisitsCommand.php b/module/CLI/src/Command/Visit/GetOrphanVisitsCommand.php index 5640361f..d6c12c5c 100644 --- a/module/CLI/src/Command/Visit/GetOrphanVisitsCommand.php +++ b/module/CLI/src/Command/Visit/GetOrphanVisitsCommand.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Shlinkio\Shlink\CLI\Command\Visit; -use Shlinkio\Shlink\CLI\Input\VisitsDateRangeInput; +use Shlinkio\Shlink\CLI\Input\VisitsListInput; use Shlinkio\Shlink\CLI\Util\ShlinkTable; use Shlinkio\Shlink\Core\Domain\Entity\Domain; use Shlinkio\Shlink\Core\Visit\Entity\Visit; @@ -29,7 +29,7 @@ class GetOrphanVisitsCommand extends Command public function __invoke( SymfonyStyle $io, - #[MapInput] VisitsDateRangeInput $dateRangeInput, + #[MapInput] VisitsListInput $input, #[Option( 'Return visits that belong to this domain only. Use ' . Domain::DEFAULT_AUTHORITY . ' keyword for visits ' . 'in default domain', @@ -39,7 +39,7 @@ class GetOrphanVisitsCommand extends Command #[Option('Return visits only with this type', shortcut: 't')] OrphanVisitType|null $type = null, ): int { $paginator = $this->visitsHelper->orphanVisits(new OrphanVisitsParams( - dateRange: $dateRangeInput->toDateRange(), + dateRange: $input->dateRange(), domain: $domain, type: $type, )); diff --git a/module/CLI/src/Command/Visit/VisitsCommandUtils.php b/module/CLI/src/Command/Visit/VisitsCommandUtils.php index 55f425c7..57ef2ec6 100644 --- a/module/CLI/src/Command/Visit/VisitsCommandUtils.php +++ b/module/CLI/src/Command/Visit/VisitsCommandUtils.php @@ -16,11 +16,13 @@ class VisitsCommandUtils { /** * @param Paginator $paginator - * @param callable(Visit $visits): array $mapExtraFields + * @param null|callable(Visit $visits): array $mapExtraFields */ - public static function resolveRowsAndHeaders(Paginator $paginator, callable $mapExtraFields): array + public static function resolveRowsAndHeaders(Paginator $paginator, callable|null $mapExtraFields = null): array { $extraKeys = []; + $mapExtraFields ??= static fn (Visit $_) => []; + $rows = array_map(function (Visit $visit) use (&$extraKeys, $mapExtraFields) { $extraFields = $mapExtraFields($visit); $extraKeys = array_keys($extraFields); diff --git a/module/CLI/src/Input/VisitsDateRangeInput.php b/module/CLI/src/Input/VisitsListInput.php similarity index 90% rename from module/CLI/src/Input/VisitsDateRangeInput.php rename to module/CLI/src/Input/VisitsListInput.php index 189fa0b7..c550d4ff 100644 --- a/module/CLI/src/Input/VisitsDateRangeInput.php +++ b/module/CLI/src/Input/VisitsListInput.php @@ -10,7 +10,7 @@ use Symfony\Component\Console\Attribute\Option; use function Shlinkio\Shlink\Common\buildDateRange; use function Shlinkio\Shlink\Core\normalizeOptionalDate; -class VisitsDateRangeInput +class VisitsListInput { #[Option('Only return visits older than this date', shortcut: 's')] public string|null $startDate = null; @@ -18,7 +18,7 @@ class VisitsDateRangeInput #[Option('Only return visits newer than this date', shortcut: 'e')] public string|null $endDate = null; - public function toDateRange(): DateRange + public function dateRange(): DateRange { return buildDateRange( startDate: normalizeOptionalDate($this->startDate),