em = $em; } public function getVisitsStats(?ApiKey $apiKey = null): VisitsStats { /** @var VisitRepository $visitsRepo */ $visitsRepo = $this->em->getRepository(Visit::class); return new VisitsStats($visitsRepo->countVisits($apiKey), $visitsRepo->countOrphanVisits()); } /** * @return Visit[]|Paginator * @throws ShortUrlNotFoundException */ public function visitsForShortUrl( ShortUrlIdentifier $identifier, VisitsParams $params, ?ApiKey $apiKey = null ): Paginator { $spec = $apiKey !== null ? $apiKey->spec() : null; /** @var ShortUrlRepositoryInterface $repo */ $repo = $this->em->getRepository(ShortUrl::class); if (! $repo->shortCodeIsInUse($identifier->shortCode(), $identifier->domain(), $spec)) { throw ShortUrlNotFoundException::fromNotFound($identifier); } /** @var VisitRepositoryInterface $repo */ $repo = $this->em->getRepository(Visit::class); return $this->createPaginator(new VisitsPaginatorAdapter($repo, $identifier, $params, $spec), $params); } /** * @return Visit[]|Paginator * @throws TagNotFoundException */ public function visitsForTag(string $tag, VisitsParams $params, ?ApiKey $apiKey = null): Paginator { /** @var TagRepository $tagRepo */ $tagRepo = $this->em->getRepository(Tag::class); if (! $tagRepo->tagExists($tag, $apiKey)) { throw TagNotFoundException::fromTag($tag); } /** @var VisitRepositoryInterface $repo */ $repo = $this->em->getRepository(Visit::class); return $this->createPaginator(new VisitsForTagPaginatorAdapter($repo, $tag, $params, $apiKey), $params); } /** * @return Visit[]|Paginator */ public function orphanVisits(VisitsParams $params): Paginator { /** @var VisitRepositoryInterface $repo */ $repo = $this->em->getRepository(Visit::class); return $this->createPaginator(new OrphanVisitsPaginatorAdapter($repo, $params), $params); } private function createPaginator(AdapterInterface $adapter, VisitsParams $params): Paginator { $paginator = new Paginator($adapter); $paginator->setMaxPerPage($params->getItemsPerPage()) ->setCurrentPage($params->getPage()); return $paginator; } }