Completed
Push — master ( f7424d...b53e51 )
by Alejandro
07:43
created

ProcessVisitsCommand   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 76
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Test Coverage

Coverage 97.22%

Importance

Changes 0
Metric Value
dl 0
loc 76
ccs 35
cts 36
cp 0.9722
rs 10
c 0
b 0
f 0
wmc 6
lcom 1
cbo 7

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 1
A configure() 0 7 1
B execute() 0 31 4
1
<?php
2
namespace Shlinkio\Shlink\CLI\Command\Visit;
3
4
use Acelaya\ZsmAnnotatedServices\Annotation\Inject;
5
use Shlinkio\Shlink\Common\Exception\WrongIpException;
6
use Shlinkio\Shlink\Common\Service\IpLocationResolver;
7
use Shlinkio\Shlink\Common\Service\IpLocationResolverInterface;
8
use Shlinkio\Shlink\Core\Entity\VisitLocation;
9
use Shlinkio\Shlink\Core\Service\VisitService;
10
use Shlinkio\Shlink\Core\Service\VisitServiceInterface;
11
use Symfony\Component\Console\Command\Command;
12
use Symfony\Component\Console\Input\InputInterface;
13
use Symfony\Component\Console\Output\OutputInterface;
14
use Zend\I18n\Translator\TranslatorInterface;
15
16
class ProcessVisitsCommand extends Command
17
{
18
    const LOCALHOST = '127.0.0.1';
19
20
    /**
21
     * @var VisitServiceInterface
22
     */
23
    private $visitService;
24
    /**
25
     * @var IpLocationResolverInterface
26
     */
27
    private $ipLocationResolver;
28
    /**
29
     * @var TranslatorInterface
30
     */
31
    private $translator;
32
33
    /**
34
     * ProcessVisitsCommand constructor.
35
     * @param VisitServiceInterface $visitService
36
     * @param IpLocationResolverInterface $ipLocationResolver
37
     * @param TranslatorInterface $translator
38
     *
39
     * @Inject({VisitService::class, IpLocationResolver::class, "translator"})
40
     */
41 2
    public function __construct(
42
        VisitServiceInterface $visitService,
43
        IpLocationResolverInterface $ipLocationResolver,
44
        TranslatorInterface $translator
45
    ) {
46 2
        $this->visitService = $visitService;
47 2
        $this->ipLocationResolver = $ipLocationResolver;
48 2
        $this->translator = $translator;
49 2
        parent::__construct(null);
50 2
    }
51
52 2
    public function configure()
53
    {
54 2
        $this->setName('visit:process')
55 2
             ->setDescription(
56 2
                 $this->translator->translate('Processes visits where location is not set yet')
57 2
             );
58 2
    }
59
60 2
    public function execute(InputInterface $input, OutputInterface $output)
61
    {
62 2
        $visits = $this->visitService->getUnlocatedVisits();
63
64 2
        foreach ($visits as $visit) {
65 2
            $ipAddr = $visit->getRemoteAddr();
66 2
            $output->write(sprintf('%s <info>%s</info>', $this->translator->translate('Processing IP'), $ipAddr));
67 2
            if ($ipAddr === self::LOCALHOST) {
68 1
                $output->writeln(
69 1
                    sprintf(' (<comment>%s</comment>)', $this->translator->translate('Ignored localhost address'))
70 1
                );
71 1
                continue;
72
            }
73
74
            try {
75 2
                $result = $this->ipLocationResolver->resolveIpLocation($ipAddr);
76 2
                $location = new VisitLocation();
77 2
                $location->exchangeArray($result);
78 2
                $visit->setVisitLocation($location);
79 2
                $this->visitService->saveVisit($visit);
80 2
                $output->writeln(sprintf(
81 2
                    ' (' . $this->translator->translate('Address located at "%s"') . ')',
82 2
                    $location->getCityName()
83 2
                ));
84 2
            } catch (WrongIpException $e) {
85
                continue;
86
            }
87 2
        }
88
89 2
        $output->writeln($this->translator->translate('Finished processing all IPs'));
90 2
    }
91
}
92