diff --git a/composer.json b/composer.json index 762ead49..6a5bb317 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ "php-middleware/request-id": "^4.1", "pugx/shortid-php": "^1.1", "ramsey/uuid": "^4.5", - "shlinkio/shlink-common": "dev-main#7515008 as 5.2", + "shlinkio/shlink-common": "dev-main#f4101bc as 5.2", "shlinkio/shlink-config": "dev-main#96c81fb as 2.3", "shlinkio/shlink-event-dispatcher": "^2.6", "shlinkio/shlink-importer": "dev-main#c97662b as 5.0", diff --git a/module/Core/src/ShortUrl/Model/ShortUrlsParams.php b/module/Core/src/ShortUrl/Model/ShortUrlsParams.php index 14e88132..e053a283 100644 --- a/module/Core/src/ShortUrl/Model/ShortUrlsParams.php +++ b/module/Core/src/ShortUrl/Model/ShortUrlsParams.php @@ -24,6 +24,8 @@ final class ShortUrlsParams public readonly array $tags, public readonly Ordering $orderBy, public readonly ?DateRange $dateRange, + public readonly bool $excludeMaxVisitsReached, + public readonly bool $excludePastValidUntil, public readonly TagsMode $tagsMode = TagsMode::ANY, ) { } @@ -55,6 +57,8 @@ final class ShortUrlsParams normalizeOptionalDate($inputFilter->getValue(ShortUrlsParamsInputFilter::START_DATE)), normalizeOptionalDate($inputFilter->getValue(ShortUrlsParamsInputFilter::END_DATE)), ), + excludeMaxVisitsReached: $inputFilter->getValue(ShortUrlsParamsInputFilter::EXCLUDE_MAX_VISITS_REACHED), + excludePastValidUntil: $inputFilter->getValue(ShortUrlsParamsInputFilter::EXCLUDE_PAST_VALID_UNTIL), tagsMode: self::resolveTagsMode($inputFilter->getValue(ShortUrlsParamsInputFilter::TAGS_MODE)), ); } diff --git a/module/Core/src/ShortUrl/Model/TagsMode.php b/module/Core/src/ShortUrl/Model/TagsMode.php index 593d6d83..01cdcc3b 100644 --- a/module/Core/src/ShortUrl/Model/TagsMode.php +++ b/module/Core/src/ShortUrl/Model/TagsMode.php @@ -4,8 +4,15 @@ declare(strict_types=1); namespace Shlinkio\Shlink\Core\ShortUrl\Model; +use function Functional\map; + enum TagsMode: string { case ANY = 'any'; case ALL = 'all'; + + public static function values(): array + { + return map(self::cases(), static fn (TagsMode $mode) => $mode->value); + } } diff --git a/module/Core/src/ShortUrl/Model/Validation/ShortUrlsParamsInputFilter.php b/module/Core/src/ShortUrl/Model/Validation/ShortUrlsParamsInputFilter.php index a5301f21..3bdea8e2 100644 --- a/module/Core/src/ShortUrl/Model/Validation/ShortUrlsParamsInputFilter.php +++ b/module/Core/src/ShortUrl/Model/Validation/ShortUrlsParamsInputFilter.php @@ -23,6 +23,8 @@ class ShortUrlsParamsInputFilter extends InputFilter public const ITEMS_PER_PAGE = 'itemsPerPage'; public const TAGS_MODE = 'tagsMode'; public const ORDER_BY = 'orderBy'; + public const EXCLUDE_MAX_VISITS_REACHED = 'excludeMaxVisitsReached'; + public const EXCLUDE_PAST_VALID_UNTIL = 'excludePastValidUntil'; public function __construct(array $data) { @@ -44,11 +46,14 @@ class ShortUrlsParamsInputFilter extends InputFilter $tagsMode = $this->createInput(self::TAGS_MODE, false); $tagsMode->getValidatorChain()->attach(new InArray([ - 'haystack' => [TagsMode::ALL->value, TagsMode::ANY->value], + 'haystack' => TagsMode::values(), 'strict' => InArray::COMPARE_STRICT, ])); $this->add($tagsMode); $this->add($this->createOrderByInput(self::ORDER_BY, ShortUrlsParams::ORDERABLE_FIELDS)); + + $this->add($this->createBooleanInput(self::EXCLUDE_MAX_VISITS_REACHED, false)); + $this->add($this->createBooleanInput(self::EXCLUDE_PAST_VALID_UNTIL, false)); } }