Extracted some private functions ase helper global functions

This commit is contained in:
Alejandro Celaya 2020-01-28 09:41:48 +01:00
parent b9e58b9300
commit 240d2588f9
5 changed files with 33 additions and 45 deletions

View file

@ -4,6 +4,8 @@ declare(strict_types=1);
namespace Shlinkio\Shlink\Core; namespace Shlinkio\Shlink\Core;
use Cake\Chronos\Chronos;
use DateTimeInterface;
use PUGX\Shortid\Factory as ShortIdFactory; use PUGX\Shortid\Factory as ShortIdFactory;
function generateRandomShortCode(int $length = 5): string function generateRandomShortCode(int $length = 5): string
@ -16,3 +18,24 @@ function generateRandomShortCode(int $length = 5): string
$alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
return $shortIdFactory->generate($length, $alphabet)->serialize(); return $shortIdFactory->generate($length, $alphabet)->serialize();
} }
function parseDateFromQuery(array $query, string $dateName): ?Chronos
{
return ! isset($query[$dateName]) || empty($query[$dateName]) ? null : Chronos::parse($query[$dateName]);
}
/**
* @param string|DateTimeInterface|Chronos|null $date
*/
function parseDateField($date): ?Chronos
{
if ($date === null || $date instanceof Chronos) {
return $date;
}
if ($date instanceof DateTimeInterface) {
return Chronos::instance($date);
}
return Chronos::parse($date);
}

View file

@ -5,11 +5,11 @@ declare(strict_types=1);
namespace Shlinkio\Shlink\Core\Model; namespace Shlinkio\Shlink\Core\Model;
use Cake\Chronos\Chronos; use Cake\Chronos\Chronos;
use DateTimeInterface;
use Shlinkio\Shlink\Core\Exception\ValidationException; use Shlinkio\Shlink\Core\Exception\ValidationException;
use Shlinkio\Shlink\Core\Validation\ShortUrlMetaInputFilter; use Shlinkio\Shlink\Core\Validation\ShortUrlMetaInputFilter;
use function array_key_exists; use function array_key_exists;
use function Shlinkio\Shlink\Core\parseDateField;
final class ShortUrlMeta final class ShortUrlMeta
{ {
@ -34,30 +34,28 @@ final class ShortUrlMeta
} }
/** /**
* @param array $data
* @throws ValidationException * @throws ValidationException
*/ */
public static function fromRawData(array $data): self public static function fromRawData(array $data): self
{ {
$instance = new self(); $instance = new self();
$instance->validate($data); $instance->validateAndInit($data);
return $instance; return $instance;
} }
/** /**
* @param array $data
* @throws ValidationException * @throws ValidationException
*/ */
private function validate(array $data): void private function validateAndInit(array $data): void
{ {
$inputFilter = new ShortUrlMetaInputFilter($data); $inputFilter = new ShortUrlMetaInputFilter($data);
if (! $inputFilter->isValid()) { if (! $inputFilter->isValid()) {
throw ValidationException::fromInputFilter($inputFilter); throw ValidationException::fromInputFilter($inputFilter);
} }
$this->validSince = $this->parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_SINCE)); $this->validSince = parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_SINCE));
$this->validSincePropWasProvided = array_key_exists(ShortUrlMetaInputFilter::VALID_SINCE, $data); $this->validSincePropWasProvided = array_key_exists(ShortUrlMetaInputFilter::VALID_SINCE, $data);
$this->validUntil = $this->parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_UNTIL)); $this->validUntil = parseDateField($inputFilter->getValue(ShortUrlMetaInputFilter::VALID_UNTIL));
$this->validUntilPropWasProvided = array_key_exists(ShortUrlMetaInputFilter::VALID_UNTIL, $data); $this->validUntilPropWasProvided = array_key_exists(ShortUrlMetaInputFilter::VALID_UNTIL, $data);
$this->customSlug = $inputFilter->getValue(ShortUrlMetaInputFilter::CUSTOM_SLUG); $this->customSlug = $inputFilter->getValue(ShortUrlMetaInputFilter::CUSTOM_SLUG);
$maxVisits = $inputFilter->getValue(ShortUrlMetaInputFilter::MAX_VISITS); $maxVisits = $inputFilter->getValue(ShortUrlMetaInputFilter::MAX_VISITS);
@ -67,22 +65,6 @@ final class ShortUrlMeta
$this->domain = $inputFilter->getValue(ShortUrlMetaInputFilter::DOMAIN); $this->domain = $inputFilter->getValue(ShortUrlMetaInputFilter::DOMAIN);
} }
/**
* @param string|DateTimeInterface|Chronos|null $date
*/
private function parseDateField($date): ?Chronos
{
if ($date === null || $date instanceof Chronos) {
return $date;
}
if ($date instanceof DateTimeInterface) {
return Chronos::instance($date);
}
return Chronos::parse($date);
}
public function getValidSince(): ?Chronos public function getValidSince(): ?Chronos
{ {
return $this->validSince; return $this->validSince;

View file

@ -4,9 +4,10 @@ declare(strict_types=1);
namespace Shlinkio\Shlink\Core\Model; namespace Shlinkio\Shlink\Core\Model;
use Cake\Chronos\Chronos;
use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Common\Util\DateRange;
use function Shlinkio\Shlink\Core\parseDateFromQuery;
final class VisitsParams final class VisitsParams
{ {
private const FIRST_PAGE = 1; private const FIRST_PAGE = 1;
@ -34,21 +35,13 @@ final class VisitsParams
public static function fromRawData(array $query): self public static function fromRawData(array $query): self
{ {
$startDate = self::getDateQueryParam($query, 'startDate');
$endDate = self::getDateQueryParam($query, 'endDate');
return new self( return new self(
new DateRange($startDate, $endDate), new DateRange(parseDateFromQuery($query, 'startDate'), parseDateFromQuery($query, 'endDate')),
(int) ($query['page'] ?? 1), (int) ($query['page'] ?? 1),
isset($query['itemsPerPage']) ? (int) $query['itemsPerPage'] : null, isset($query['itemsPerPage']) ? (int) $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 public function getDateRange(): DateRange
{ {
return $this->dateRange; return $this->dateRange;

View file

@ -20,12 +20,10 @@ class ShortUrlMetaInputFilter extends InputFilter
public const FIND_IF_EXISTS = 'findIfExists'; public const FIND_IF_EXISTS = 'findIfExists';
public const DOMAIN = 'domain'; public const DOMAIN = 'domain';
public function __construct(?array $data = null) public function __construct(array $data)
{ {
$this->initialize(); $this->initialize();
if ($data !== null) { $this->setData($data);
$this->setData($data);
}
} }
private function initialize(): void private function initialize(): void

View file

@ -5,7 +5,6 @@ declare(strict_types=1);
namespace Shlinkio\Shlink\Rest\Action\ShortUrl; namespace Shlinkio\Shlink\Rest\Action\ShortUrl;
use Cake\Chronos\Chronos; use Cake\Chronos\Chronos;
use InvalidArgumentException;
use Laminas\Diactoros\Response\JsonResponse; use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
@ -36,9 +35,6 @@ class ListShortUrlsAction extends AbstractRestAction
$this->domainConfig = $domainConfig; $this->domainConfig = $domainConfig;
} }
/**
* @throws InvalidArgumentException
*/
public function handle(Request $request): Response public function handle(Request $request): Response
{ {
$params = $this->queryToListParams($request->getQueryParams()); $params = $this->queryToListParams($request->getQueryParams());
@ -48,10 +44,6 @@ class ListShortUrlsAction extends AbstractRestAction
))]); ))]);
} }
/**
* @param array $query
* @return array
*/
private function queryToListParams(array $query): array private function queryToListParams(array $query): array
{ {
return [ return [