diff --git a/module/Core/src/Model/VisitsParams.php b/module/Core/src/Model/VisitsParams.php index 734dbf57..fe6f1a30 100644 --- a/module/Core/src/Model/VisitsParams.php +++ b/module/Core/src/Model/VisitsParams.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace Shlinkio\Shlink\Core\Model; +use Cake\Chronos\Chronos; use Shlinkio\Shlink\Common\Util\DateRange; final class VisitsParams @@ -21,6 +22,19 @@ final class VisitsParams $this->itemsPerPage = $itemsPerPage; } + public static function fromRawData(array $query): self + { + $startDate = self::getDateQueryParam($query, 'startDate'); + $endDate = self::getDateQueryParam($query, 'endDate'); + + return new self(new DateRange($startDate, $endDate), $query['page'] ?? 1, $query['itemsPerPage'] ?? null); + } + + private static function getDateQueryParam(array $query, string $key): ?Chronos + { + return ! isset($query[$key]) || empty($query[$key]) ? null : Chronos::parse($query[$key]); + } + public function getDateRange(): DateRange { return $this->dateRange; diff --git a/module/Rest/src/Action/Visit/GetVisitsAction.php b/module/Rest/src/Action/Visit/GetVisitsAction.php index aa128c8f..bdb62e0b 100644 --- a/module/Rest/src/Action/Visit/GetVisitsAction.php +++ b/module/Rest/src/Action/Visit/GetVisitsAction.php @@ -3,12 +3,10 @@ declare(strict_types=1); namespace Shlinkio\Shlink\Rest\Action\Visit; -use Cake\Chronos\Chronos; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Log\LoggerInterface; use Shlinkio\Shlink\Common\Exception\InvalidArgumentException; -use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Service\VisitsTrackerInterface; use Shlinkio\Shlink\Rest\Action\AbstractRestAction; @@ -38,11 +36,9 @@ class GetVisitsAction extends AbstractRestAction public function handle(Request $request): Response { $shortCode = $request->getAttribute('shortCode'); - $startDate = $this->getDateQueryParam($request, 'startDate'); - $endDate = $this->getDateQueryParam($request, 'endDate'); try { - $visits = $this->visitsTracker->info($shortCode, new VisitsParams(new DateRange($startDate, $endDate))); + $visits = $this->visitsTracker->info($shortCode, VisitsParams::fromRawData($request->getQueryParams())); return new JsonResponse([ 'visits' => [ @@ -57,10 +53,4 @@ class GetVisitsAction extends AbstractRestAction ], self::STATUS_NOT_FOUND); } } - - private function getDateQueryParam(Request $request, string $key): ?Chronos - { - $query = $request->getQueryParams(); - return ! isset($query[$key]) || empty($query[$key]) ? null : Chronos::parse($query[$key]); - } }