From db4ef328b11c9d03ae3a15412277105e697291dd Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Mon, 10 Jan 2022 20:26:33 +0100 Subject: [PATCH] Renamed some visits paginator adapters for consistency --- .../Adapter/OrphanVisitsPaginatorAdapter.php | 2 +- .../Paginator/Adapter/ShortUrlRepositoryAdapter.php | 2 +- ...Adapter.php => ShortUrlVisitsPaginatorAdapter.php} | 4 ++-- ...natorAdapter.php => TagVisitsPaginatorAdapter.php} | 4 ++-- module/Core/src/Repository/VisitRepository.php | 11 +++++------ .../Core/src/Repository/VisitRepositoryInterface.php | 5 +++++ module/Core/src/Visit/VisitsStatsHelper.php | 8 ++++---- .../Adapter/VisitsForTagPaginatorAdapterTest.php | 6 +++--- .../Paginator/Adapter/VisitsPaginatorAdapterTest.php | 6 +++--- 9 files changed, 26 insertions(+), 22 deletions(-) rename module/Core/src/Paginator/Adapter/{VisitsPaginatorAdapter.php => ShortUrlVisitsPaginatorAdapter.php} (89%) rename module/Core/src/Paginator/Adapter/{VisitsForTagPaginatorAdapter.php => TagVisitsPaginatorAdapter.php} (89%) diff --git a/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php b/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php index 18c2c435..0a7ce3db 100644 --- a/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php +++ b/module/Core/src/Paginator/Adapter/OrphanVisitsPaginatorAdapter.php @@ -23,7 +23,7 @@ class OrphanVisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapte )); } - public function getSlice($offset, $length): iterable // phpcs:ignore + public function getSlice(int $offset, int $length): iterable { return $this->repo->findOrphanVisits(new VisitsListFiltering( $this->params->getDateRange(), diff --git a/module/Core/src/Paginator/Adapter/ShortUrlRepositoryAdapter.php b/module/Core/src/Paginator/Adapter/ShortUrlRepositoryAdapter.php index 0be5403b..cf54e1b5 100644 --- a/module/Core/src/Paginator/Adapter/ShortUrlRepositoryAdapter.php +++ b/module/Core/src/Paginator/Adapter/ShortUrlRepositoryAdapter.php @@ -18,7 +18,7 @@ class ShortUrlRepositoryAdapter implements AdapterInterface ) { } - public function getSlice($offset, $length): array // phpcs:ignore + public function getSlice(int $offset, int $length): iterable { return $this->repository->findList( $length, diff --git a/module/Core/src/Paginator/Adapter/VisitsPaginatorAdapter.php b/module/Core/src/Paginator/Adapter/ShortUrlVisitsPaginatorAdapter.php similarity index 89% rename from module/Core/src/Paginator/Adapter/VisitsPaginatorAdapter.php rename to module/Core/src/Paginator/Adapter/ShortUrlVisitsPaginatorAdapter.php index 9ff13e3c..9f7ba6e0 100644 --- a/module/Core/src/Paginator/Adapter/VisitsPaginatorAdapter.php +++ b/module/Core/src/Paginator/Adapter/ShortUrlVisitsPaginatorAdapter.php @@ -11,7 +11,7 @@ use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; -class VisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter +class ShortUrlVisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter { public function __construct( private VisitRepositoryInterface $visitRepository, @@ -21,7 +21,7 @@ class VisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter ) { } - public function getSlice($offset, $length): array // phpcs:ignore + public function getSlice(int $offset, int $length): iterable { return $this->visitRepository->findVisitsByShortCode( $this->identifier, diff --git a/module/Core/src/Paginator/Adapter/VisitsForTagPaginatorAdapter.php b/module/Core/src/Paginator/Adapter/TagVisitsPaginatorAdapter.php similarity index 89% rename from module/Core/src/Paginator/Adapter/VisitsForTagPaginatorAdapter.php rename to module/Core/src/Paginator/Adapter/TagVisitsPaginatorAdapter.php index 20af1598..e9687f78 100644 --- a/module/Core/src/Paginator/Adapter/VisitsForTagPaginatorAdapter.php +++ b/module/Core/src/Paginator/Adapter/TagVisitsPaginatorAdapter.php @@ -10,7 +10,7 @@ use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; use Shlinkio\Shlink\Rest\Entity\ApiKey; -class VisitsForTagPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter +class TagVisitsPaginatorAdapter extends AbstractCacheableCountPaginatorAdapter { public function __construct( private VisitRepositoryInterface $visitRepository, @@ -20,7 +20,7 @@ class VisitsForTagPaginatorAdapter extends AbstractCacheableCountPaginatorAdapte ) { } - public function getSlice($offset, $length): array // phpcs:ignore + public function getSlice(int $offset, int $length): iterable { return $this->visitRepository->findVisitsByTag( $this->tag, diff --git a/module/Core/src/Repository/VisitRepository.php b/module/Core/src/Repository/VisitRepository.php index 3a8440a7..d4faa836 100644 --- a/module/Core/src/Repository/VisitRepository.php +++ b/module/Core/src/Repository/VisitRepository.php @@ -53,10 +53,7 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo public function findAllVisits(int $blockSize = self::DEFAULT_BLOCK_SIZE): iterable { - $qb = $this->getEntityManager()->createQueryBuilder(); - $qb->select('v') - ->from(Visit::class, 'v'); - + $qb = $this->createQueryBuilder('v'); return $this->visitsIterableForQuery($qb, $blockSize); } @@ -189,11 +186,13 @@ class VisitRepository extends EntitySpecificationRepository implements VisitRepo private function applyDatesInline(QueryBuilder $qb, ?DateRange $dateRange): void { + $conn = $this->getEntityManager()->getConnection(); + if ($dateRange?->startDate() !== null) { - $qb->andWhere($qb->expr()->gte('v.date', '\'' . $dateRange->startDate()->toDateTimeString() . '\'')); + $qb->andWhere($qb->expr()->gte('v.date', $conn->quote($dateRange->startDate()->toDateTimeString()))); } if ($dateRange?->endDate() !== null) { - $qb->andWhere($qb->expr()->lte('v.date', '\'' . $dateRange->endDate()->toDateTimeString() . '\'')); + $qb->andWhere($qb->expr()->lte('v.date', $conn->quote($dateRange->endDate()->toDateTimeString()))); } } diff --git a/module/Core/src/Repository/VisitRepositoryInterface.php b/module/Core/src/Repository/VisitRepositoryInterface.php index 28f1e9a8..29360ddd 100644 --- a/module/Core/src/Repository/VisitRepositoryInterface.php +++ b/module/Core/src/Repository/VisitRepositoryInterface.php @@ -52,5 +52,10 @@ interface VisitRepositoryInterface extends ObjectRepository, EntitySpecification public function countOrphanVisits(VisitsCountFiltering $filtering): int; +// /** +// * @return Visit[] +// */ +// public function findExistingVisits(VisitsListFiltering $filtering): array; + public function countVisits(?ApiKey $apiKey = null): int; } diff --git a/module/Core/src/Visit/VisitsStatsHelper.php b/module/Core/src/Visit/VisitsStatsHelper.php index 8138d170..2f888115 100644 --- a/module/Core/src/Visit/VisitsStatsHelper.php +++ b/module/Core/src/Visit/VisitsStatsHelper.php @@ -15,8 +15,8 @@ use Shlinkio\Shlink\Core\Exception\TagNotFoundException; use Shlinkio\Shlink\Core\Model\ShortUrlIdentifier; use Shlinkio\Shlink\Core\Model\VisitsParams; use Shlinkio\Shlink\Core\Paginator\Adapter\OrphanVisitsPaginatorAdapter; -use Shlinkio\Shlink\Core\Paginator\Adapter\VisitsForTagPaginatorAdapter; -use Shlinkio\Shlink\Core\Paginator\Adapter\VisitsPaginatorAdapter; +use Shlinkio\Shlink\Core\Paginator\Adapter\ShortUrlVisitsPaginatorAdapter; +use Shlinkio\Shlink\Core\Paginator\Adapter\TagVisitsPaginatorAdapter; use Shlinkio\Shlink\Core\Repository\ShortUrlRepositoryInterface; use Shlinkio\Shlink\Core\Repository\TagRepository; use Shlinkio\Shlink\Core\Repository\VisitRepository; @@ -62,7 +62,7 @@ class VisitsStatsHelper implements VisitsStatsHelperInterface /** @var VisitRepositoryInterface $repo */ $repo = $this->em->getRepository(Visit::class); - return $this->createPaginator(new VisitsPaginatorAdapter($repo, $identifier, $params, $spec), $params); + return $this->createPaginator(new ShortUrlVisitsPaginatorAdapter($repo, $identifier, $params, $spec), $params); } /** @@ -80,7 +80,7 @@ class VisitsStatsHelper implements VisitsStatsHelperInterface /** @var VisitRepositoryInterface $repo */ $repo = $this->em->getRepository(Visit::class); - return $this->createPaginator(new VisitsForTagPaginatorAdapter($repo, $tag, $params, $apiKey), $params); + return $this->createPaginator(new TagVisitsPaginatorAdapter($repo, $tag, $params, $apiKey), $params); } /** diff --git a/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php b/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php index c92e21c6..2f0da796 100644 --- a/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php +++ b/module/Core/test/Paginator/Adapter/VisitsForTagPaginatorAdapterTest.php @@ -9,7 +9,7 @@ use Prophecy\PhpUnit\ProphecyTrait; use Prophecy\Prophecy\ObjectProphecy; use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Model\VisitsParams; -use Shlinkio\Shlink\Core\Paginator\Adapter\VisitsForTagPaginatorAdapter; +use Shlinkio\Shlink\Core\Paginator\Adapter\TagVisitsPaginatorAdapter; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; @@ -63,9 +63,9 @@ class VisitsForTagPaginatorAdapterTest extends TestCase $countVisits->shouldHaveBeenCalledOnce(); } - private function createAdapter(?ApiKey $apiKey): VisitsForTagPaginatorAdapter + private function createAdapter(?ApiKey $apiKey): TagVisitsPaginatorAdapter { - return new VisitsForTagPaginatorAdapter( + return new TagVisitsPaginatorAdapter( $this->repo->reveal(), 'foo', VisitsParams::fromRawData([]), diff --git a/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php b/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php index 413ae1cd..66ff77ac 100644 --- a/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php +++ b/module/Core/test/Paginator/Adapter/VisitsPaginatorAdapterTest.php @@ -10,7 +10,7 @@ use Prophecy\Prophecy\ObjectProphecy; use Shlinkio\Shlink\Common\Util\DateRange; use Shlinkio\Shlink\Core\Model\ShortUrlIdentifier; use Shlinkio\Shlink\Core\Model\VisitsParams; -use Shlinkio\Shlink\Core\Paginator\Adapter\VisitsPaginatorAdapter; +use Shlinkio\Shlink\Core\Paginator\Adapter\ShortUrlVisitsPaginatorAdapter; use Shlinkio\Shlink\Core\Repository\VisitRepositoryInterface; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsCountFiltering; use Shlinkio\Shlink\Core\Visit\Persistence\VisitsListFiltering; @@ -64,9 +64,9 @@ class VisitsPaginatorAdapterTest extends TestCase $countVisits->shouldHaveBeenCalledOnce(); } - private function createAdapter(?ApiKey $apiKey): VisitsPaginatorAdapter + private function createAdapter(?ApiKey $apiKey): ShortUrlVisitsPaginatorAdapter { - return new VisitsPaginatorAdapter( + return new ShortUrlVisitsPaginatorAdapter( $this->repo->reveal(), new ShortUrlIdentifier(''), VisitsParams::fromRawData([]),