Passed
Pull Request — master (#588)
by Alejandro
03:34
created

VisitsTracker   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Test Coverage

Coverage 94.74%

Importance

Changes 0
Metric Value
eloc 19
c 0
b 0
f 0
dl 0
loc 52
rs 10
ccs 18
cts 19
cp 0.9474
wmc 4

3 Methods

Rating   Name   Duplication   Size   Complexity  
A track() 0 13 1
A info() 0 15 2
A __construct() 0 4 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Shlinkio\Shlink\Core\Service;
6
7
use Doctrine\ORM;
8
use Psr\EventDispatcher\EventDispatcherInterface;
9
use Shlinkio\Shlink\Core\Entity\ShortUrl;
10
use Shlinkio\Shlink\Core\Entity\Visit;
11
use Shlinkio\Shlink\Core\EventDispatcher\ShortUrlVisited;
12
use Shlinkio\Shlink\Core\Exception\ShortUrlNotFoundException;
13
use Shlinkio\Shlink\Core\Model\Visitor;
14
use Shlinkio\Shlink\Core\Model\VisitsParams;
15
use Shlinkio\Shlink\Core\Paginator\Adapter\VisitsPaginatorAdapter;
16
use Shlinkio\Shlink\Core\Repository\VisitRepository;
17
use Zend\Paginator\Paginator;
18
19
class VisitsTracker implements VisitsTrackerInterface
20
{
21
    /** @var ORM\EntityManagerInterface */
22
    private $em;
23
    /** @var EventDispatcherInterface */
24
    private $eventDispatcher;
25
26 3
    public function __construct(ORM\EntityManagerInterface $em, EventDispatcherInterface $eventDispatcher)
27
    {
28 3
        $this->em = $em;
29 3
        $this->eventDispatcher = $eventDispatcher;
30
    }
31
32
    /**
33
     * Tracks a new visit to provided short code from provided visitor
34
     */
35 2
    public function track(string $shortCode, Visitor $visitor): void
36
    {
37
        /** @var ShortUrl $shortUrl */
38 2
        $shortUrl = $this->em->getRepository(ShortUrl::class)->findOneBy([
39 2
            'shortCode' => $shortCode,
40
        ]);
41
42 2
        $visit = new Visit($shortUrl, $visitor);
43
44 2
        $this->em->persist($visit);
45 2
        $this->em->flush();
46
47 2
        $this->eventDispatcher->dispatch(new ShortUrlVisited($visit->getId()));
48
    }
49
50
    /**
51
     * Returns the visits on certain short code
52
     *
53
     * @return Visit[]|Paginator
54
     * @throws ShortUrlNotFoundException
55
     */
56 1
    public function info(string $shortCode, VisitsParams $params): Paginator
57
    {
58
        /** @var ORM\EntityRepository $repo */
59 1
        $repo = $this->em->getRepository(ShortUrl::class);
60 1
        if ($repo->count(['shortCode' => $shortCode]) < 1) {
61
            throw ShortUrlNotFoundException::fromNotFoundShortCode($shortCode);
62
        }
63
64
        /** @var VisitRepository $repo */
65 1
        $repo = $this->em->getRepository(Visit::class);
66 1
        $paginator = new Paginator(new VisitsPaginatorAdapter($repo, $shortCode, $params));
67 1
        $paginator->setItemCountPerPage($params->getItemsPerPage())
68 1
                  ->setCurrentPageNumber($params->getPage());
69
70 1
        return $paginator;
71
    }
72
}
73