diff --git a/composer.json b/composer.json index 17a5e21f..284a34e5 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,7 @@ "predis/predis": "^1.1", "pugx/shortid-php": "^0.7", "ramsey/uuid": "^3.9", - "shlinkio/shlink-common": "^3.7", + "shlinkio/shlink-common": "dev-main#6e96039 as 4.0", "shlinkio/shlink-config": "^1.2", "shlinkio/shlink-event-dispatcher": "^2.1", "shlinkio/shlink-importer": "^2.3.1", diff --git a/module/CLI/src/Command/ShortUrl/GetVisitsCommand.php b/module/CLI/src/Command/ShortUrl/GetVisitsCommand.php index 5113debc..bb2f0229 100644 --- a/module/CLI/src/Command/ShortUrl/GetVisitsCommand.php +++ b/module/CLI/src/Command/ShortUrl/GetVisitsCommand.php @@ -7,7 +7,6 @@ namespace Shlinkio\Shlink\CLI\Command\ShortUrl; use Shlinkio\Shlink\CLI\Command\Util\AbstractWithDateRangeCommand; use Shlinkio\Shlink\CLI\Util\ExitCodes; use Shlinkio\Shlink\CLI\Util\ShlinkTable; -use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Entity\Visit; use Shlinkio\Shlink\Core\Model\ShortUrlIdentifier; use Shlinkio\Shlink\Core\Model\VisitsParams; @@ -21,6 +20,7 @@ use Symfony\Component\Console\Style\SymfonyStyle; use function Functional\map; use function Functional\select_keys; +use function Shlinkio\Shlink\Common\buildDateRange; use function sprintf; class GetVisitsCommand extends AbstractWithDateRangeCommand @@ -73,7 +73,7 @@ class GetVisitsCommand extends AbstractWithDateRangeCommand $paginator = $this->visitsHelper->visitsForShortUrl( $identifier, - new VisitsParams(new DateRange($startDate, $endDate)), + new VisitsParams(buildDateRange($startDate, $endDate)), ); $rows = map($paginator->getCurrentPageResults(), function (Visit $visit) { diff --git a/module/CLI/test/Command/ShortUrl/GetVisitsCommandTest.php b/module/CLI/test/Command/ShortUrl/GetVisitsCommandTest.php index b9262217..ca9e0981 100644 --- a/module/CLI/test/Command/ShortUrl/GetVisitsCommandTest.php +++ b/module/CLI/test/Command/ShortUrl/GetVisitsCommandTest.php @@ -45,7 +45,7 @@ class GetVisitsCommandTest extends TestCase $shortCode = 'abc123'; $this->visitsHelper->visitsForShortUrl( new ShortUrlIdentifier($shortCode), - new VisitsParams(new DateRange(null, null)), + new VisitsParams(DateRange::emptyInstance()), ) ->willReturn(new Paginator(new ArrayAdapter([]))) ->shouldBeCalledOnce(); @@ -61,7 +61,7 @@ class GetVisitsCommandTest extends TestCase $endDate = '2016-02-01'; $this->visitsHelper->visitsForShortUrl( new ShortUrlIdentifier($shortCode), - new VisitsParams(new DateRange(Chronos::parse($startDate), Chronos::parse($endDate))), + new VisitsParams(DateRange::withStartAndEndDate(Chronos::parse($startDate), Chronos::parse($endDate))), ) ->willReturn(new Paginator(new ArrayAdapter([]))) ->shouldBeCalledOnce(); @@ -80,7 +80,7 @@ class GetVisitsCommandTest extends TestCase $startDate = 'foo'; $info = $this->visitsHelper->visitsForShortUrl( new ShortUrlIdentifier($shortCode), - new VisitsParams(new DateRange()), + new VisitsParams(DateRange::emptyInstance()), )->willReturn(new Paginator(new ArrayAdapter([]))); $this->commandTester->execute([ diff --git a/module/Core/functions/functions.php b/module/Core/functions/functions.php index 7910ad1a..888e1833 100644 --- a/module/Core/functions/functions.php +++ b/module/Core/functions/functions.php @@ -16,6 +16,7 @@ use function Functional\reduce_left; use function is_array; use function lcfirst; use function print_r; +use function Shlinkio\Shlink\Common\buildDateRange; use function sprintf; use function str_repeat; use function str_replace; @@ -51,12 +52,7 @@ function parseDateRangeFromQuery(array $query, string $startDateName, string $en $startDate = parseDateFromQuery($query, $startDateName); $endDate = parseDateFromQuery($query, $endDateName); - return match (true) { - $startDate === null && $endDate === null => DateRange::emptyInstance(), - $startDate !== null && $endDate !== null => DateRange::withStartAndEndDate($startDate, $endDate), - $startDate !== null => DateRange::withStartDate($startDate), - default => DateRange::withEndDate($endDate), - }; + return buildDateRange($startDate, $endDate); } /** diff --git a/module/Core/src/Model/ShortUrlsParams.php b/module/Core/src/Model/ShortUrlsParams.php index 2336b18a..b3761ea8 100644 --- a/module/Core/src/Model/ShortUrlsParams.php +++ b/module/Core/src/Model/ShortUrlsParams.php @@ -8,6 +8,7 @@ use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Exception\ValidationException; use Shlinkio\Shlink\Core\Validation\ShortUrlsParamsInputFilter; +use function Shlinkio\Shlink\Common\buildDateRange; use function Shlinkio\Shlink\Core\parseDateField; final class ShortUrlsParams @@ -54,7 +55,7 @@ final class ShortUrlsParams $this->page = (int) ($inputFilter->getValue(ShortUrlsParamsInputFilter::PAGE) ?? 1); $this->searchTerm = $inputFilter->getValue(ShortUrlsParamsInputFilter::SEARCH_TERM); $this->tags = (array) $inputFilter->getValue(ShortUrlsParamsInputFilter::TAGS); - $this->dateRange = new DateRange( + $this->dateRange = buildDateRange( parseDateField($inputFilter->getValue(ShortUrlsParamsInputFilter::START_DATE)), parseDateField($inputFilter->getValue(ShortUrlsParamsInputFilter::END_DATE)), ); diff --git a/module/Core/src/Model/VisitsParams.php b/module/Core/src/Model/VisitsParams.php index 5ace1d8d..efe082db 100644 --- a/module/Core/src/Model/VisitsParams.php +++ b/module/Core/src/Model/VisitsParams.php @@ -23,7 +23,7 @@ final class VisitsParams ?int $itemsPerPage = null, private bool $excludeBots = false ) { - $this->dateRange = $dateRange ?? new DateRange(); + $this->dateRange = $dateRange ?? DateRange::emptyInstance(); $this->page = $this->determinePage($page); $this->itemsPerPage = $this->determineItemsPerPage($itemsPerPage); } diff --git a/module/Core/src/Repository/ShortUrlRepository.php b/module/Core/src/Repository/ShortUrlRepository.php index 4c3a4e9c..fb853b96 100644 --- a/module/Core/src/Repository/ShortUrlRepository.php +++ b/module/Core/src/Repository/ShortUrlRepository.php @@ -105,13 +105,13 @@ class ShortUrlRepository extends EntitySpecificationRepository implements ShortU $qb->from(ShortUrl::class, 's') ->where('1=1'); - if ($dateRange?->getStartDate() !== null) { + if ($dateRange?->startDate() !== null) { $qb->andWhere($qb->expr()->gte('s.dateCreated', ':startDate')); - $qb->setParameter('startDate', $dateRange->getStartDate(), ChronosDateTimeType::CHRONOS_DATETIME); + $qb->setParameter('startDate', $dateRange->startDate(), ChronosDateTimeType::CHRONOS_DATETIME); } - if ($dateRange?->getEndDate() !== null) { + if ($dateRange?->endDate() !== null) { $qb->andWhere($qb->expr()->lte('s.dateCreated', ':endDate')); - $qb->setParameter('endDate', $dateRange->getEndDate(), ChronosDateTimeType::CHRONOS_DATETIME); + $qb->setParameter('endDate', $dateRange->endDate(), ChronosDateTimeType::CHRONOS_DATETIME); } // Apply search term to every searchable field if not empty diff --git a/module/Core/src/Repository/VisitRepository.php b/module/Core/src/Repository/VisitRepository.php index 6adba193..1e157757 100644 --- a/module/Core/src/Repository/VisitRepository.php +++ b/module/Core/src/Repository/VisitRepository.php @@ -187,11 +187,11 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo private function applyDatesInline(QueryBuilder $qb, ?DateRange $dateRange): void { - if ($dateRange?->getStartDate() !== null) { - $qb->andWhere($qb->expr()->gte('v.date', '\'' . $dateRange->getStartDate()->toDateTimeString() . '\'')); + if ($dateRange?->startDate() !== null) { + $qb->andWhere($qb->expr()->gte('v.date', '\'' . $dateRange->startDate()->toDateTimeString() . '\'')); } - if ($dateRange?->getEndDate() !== null) { - $qb->andWhere($qb->expr()->lte('v.date', '\'' . $dateRange->getEndDate()->toDateTimeString() . '\'')); + if ($dateRange?->endDate() !== null) { + $qb->andWhere($qb->expr()->lte('v.date', '\'' . $dateRange->endDate()->toDateTimeString() . '\'')); } } diff --git a/module/Core/src/Spec/InDateRange.php b/module/Core/src/Spec/InDateRange.php index 81d11b9e..05cb6f0a 100644 --- a/module/Core/src/Spec/InDateRange.php +++ b/module/Core/src/Spec/InDateRange.php @@ -20,12 +20,12 @@ class InDateRange extends BaseSpecification { $criteria = []; - if ($this->dateRange?->getStartDate() !== null) { - $criteria[] = Spec::gte($this->field, $this->dateRange->getStartDate()->toDateTimeString()); + if ($this->dateRange?->startDate() !== null) { + $criteria[] = Spec::gte($this->field, $this->dateRange->startDate()->toDateTimeString()); } - if ($this->dateRange?->getEndDate() !== null) { - $criteria[] = Spec::lte($this->field, $this->dateRange->getEndDate()->toDateTimeString()); + if ($this->dateRange?->endDate() !== null) { + $criteria[] = Spec::lte($this->field, $this->dateRange->endDate()->toDateTimeString()); } return Spec::andX(...$criteria); diff --git a/module/Core/test-db/Repository/ShortUrlRepositoryTest.php b/module/Core/test-db/Repository/ShortUrlRepositoryTest.php index adc3d67f..a614844f 100644 --- a/module/Core/test-db/Repository/ShortUrlRepositoryTest.php +++ b/module/Core/test-db/Repository/ShortUrlRepositoryTest.php @@ -133,16 +133,16 @@ class ShortUrlRepositoryTest extends DatabaseTestCase self::assertCount(3, $result); self::assertSame($bar, $result[0]); - $result = $this->repo->findList(null, null, null, [], null, new DateRange(null, Chronos::now()->subDays(2))); + $result = $this->repo->findList(null, null, null, [], null, DateRange::withEndDate(Chronos::now()->subDays(2))); self::assertCount(1, $result); - self::assertEquals(1, $this->repo->countList(null, [], new DateRange(null, Chronos::now()->subDays(2)))); + self::assertEquals(1, $this->repo->countList(null, [], DateRange::withEndDate(Chronos::now()->subDays(2)))); self::assertSame($foo2, $result[0]); self::assertCount( 2, - $this->repo->findList(null, null, null, [], null, new DateRange(Chronos::now()->subDays(2))), + $this->repo->findList(null, null, null, [], null, DateRange::withStartDate(Chronos::now()->subDays(2))), ); - self::assertEquals(2, $this->repo->countList(null, [], new DateRange(Chronos::now()->subDays(2)))); + self::assertEquals(2, $this->repo->countList(null, [], DateRange::withStartDate(Chronos::now()->subDays(2)))); } /** @test */ diff --git a/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php b/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php index aa684b70..c92e21c6 100644 --- a/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php +++ b/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php @@ -35,7 +35,7 @@ class VisitsForTagPaginatorAdapterTest extends TestCase $adapter = $this->createAdapter(null); $findVisits = $this->repo->findVisitsByTag( 'foo', - new VisitsListFiltering(new DateRange(), false, null, $limit, $offset), + new VisitsListFiltering(DateRange::emptyInstance(), false, null, $limit, $offset), )->willReturn([]); for ($i = 0; $i < $count; $i++) { diff --git a/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php b/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php index 97a2c1f0..413ae1cd 100644 --- a/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php +++ b/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php @@ -36,7 +36,7 @@ class VisitsPaginatorAdapterTest extends TestCase $adapter = $this->createAdapter(null); $findVisits = $this->repo->findVisitsByShortCode( ShortUrlIdentifier::fromShortCodeAndDomain(''), - new VisitsListFiltering(new DateRange(), false, null, $limit, $offset), + new VisitsListFiltering(DateRange::emptyInstance(), false, null, $limit, $offset), )->willReturn([]); for ($i = 0; $i < $count; $i++) { @@ -54,7 +54,7 @@ class VisitsPaginatorAdapterTest extends TestCase $adapter = $this->createAdapter($apiKey); $countVisits = $this->repo->countVisitsByShortCode( ShortUrlIdentifier::fromShortCodeAndDomain(''), - new VisitsCountFiltering(new DateRange(), false, $apiKey->spec()), + new VisitsCountFiltering(DateRange::emptyInstance(), false, $apiKey->spec()), )->willReturn(3); for ($i = 0; $i < $count; $i++) { diff --git a/module/Rest/test/Action/Visit/ShortUrlVisitsActionTest.php b/module/Rest/test/Action/Visit/ShortUrlVisitsActionTest.php index d0c67e7c..6e982aec 100644 --- a/module/Rest/test/Action/Visit/ShortUrlVisitsActionTest.php +++ b/module/Rest/test/Action/Visit/ShortUrlVisitsActionTest.php @@ -53,7 +53,7 @@ class ShortUrlVisitsActionTest extends TestCase { $shortCode = 'abc123'; $this->visitsHelper->visitsForShortUrl(new ShortUrlIdentifier($shortCode), new VisitsParams( - new DateRange(null, Chronos::parse('2016-01-01 00:00:00')), + DateRange::withEndDate(Chronos::parse('2016-01-01 00:00:00')), 3, 10, ), Argument::type(ApiKey::class))