Passed
Pull Request — master (#317)
by Guilherme
04:03
created

Blocklist::isBlockedAutomatically()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 9
ccs 5
cts 5
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * This file is part of the login-cidadao project or it's bundles.
4
 *
5
 * (c) Guilherme Donato <guilhermednt on github>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace LoginCidadao\PhoneVerificationBundle\Service;
12
13
use Doctrine\ORM\EntityManagerInterface;
14
use libphonenumber\PhoneNumber;
15
use LoginCidadao\CoreBundle\Mailer\TwigSwiftMailer;
16
use LoginCidadao\CoreBundle\Model\PersonInterface;
17
use LoginCidadao\CoreBundle\Security\User\Manager\UserManager;
18
use LoginCidadao\PhoneVerificationBundle\Entity\BlockedPhoneNumber;
19
use LoginCidadao\PhoneVerificationBundle\Entity\BlockedPhoneNumberRepository;
20
use LoginCidadao\PhoneVerificationBundle\Model\BlockedPhoneNumberInterface;
21
22
class Blocklist implements BlocklistInterface
23
{
24
    /** @var UserManager */
25
    private $userManager;
26
27
    /** @var TwigSwiftMailer */
28
    private $mailer;
29
30
    /** @var BlockedPhoneNumberRepository */
31
    private $blockedPhoneRepository;
32
33
    /** @var PhoneVerificationServiceInterface */
34
    private $phoneVerificationService;
35
36
    /** @var EntityManagerInterface */
37
    private $em;
38
39
    /** @var BlocklistOptions */
40
    private $options;
41
42
    /**
43
     * Blocklist constructor.
44
     * @param UserManager $userManager
45
     * @param TwigSwiftMailer $mailer
46
     * @param EntityManagerInterface $em
47
     * @param PhoneVerificationServiceInterface $phoneVerificationService
48
     * @param BlocklistOptions $options
49
     */
50 7
    public function __construct(
51
        UserManager $userManager,
52
        TwigSwiftMailer $mailer,
53
        EntityManagerInterface $em,
54
        PhoneVerificationServiceInterface $phoneVerificationService,
55
        BlocklistOptions $options
56
    ) {
57 7
        $this->userManager = $userManager;
58 7
        $this->mailer = $mailer;
59 7
        $this->em = $em;
60 7
        $this->options = $options;
61 7
        $this->blockedPhoneRepository = $this->em->getRepository(BlockedPhoneNumber::class);
62 7
        $this->phoneVerificationService = $phoneVerificationService;
63 7
    }
64
65
    /**
66
     * @inheritDoc
67
     */
68 4
    public function isPhoneBlocked(PhoneNumber $phoneNumber): bool
69
    {
70 4
        return $this->isManuallyBlocked($phoneNumber) || $this->isBlockedAutomatically($phoneNumber);
71
    }
72
73
    /**
74
     * @inheritDoc
75
     */
76 2
    public function blockByPhone(PhoneNumber $phoneNumber): array
77
    {
78 2
        $blockedUsers = $this->userManager->blockUsersByPhone($phoneNumber, UserManager::FLUSH_STRATEGY_ONCE);
79 2
        $this->notifyBlockedUsers($blockedUsers);
80
81 2
        return $blockedUsers;
82
    }
83
84
    /**
85
     * @inheritDoc
86
     */
87 1
    public function checkPhoneNumber(PhoneNumber $phoneNumber): array
88
    {
89 1
        $blocked = [];
90 1
        if ($this->isPhoneBlocked($phoneNumber)) {
91 1
            $blocked = $this->blockByPhone($phoneNumber);
92
        }
93
94 1
        return $blocked;
95
    }
96
97
    /**
98
     * @inheritDoc
99
     */
100 1
    public function addBlockedPhoneNumber(
101
        PhoneNumber $phoneNumber,
102
        PersonInterface $blockedBy
103
    ): BlockedPhoneNumberInterface {
104 1
        $blockedPhoneNumber = new BlockedPhoneNumber($phoneNumber, $blockedBy, new \DateTime());
105 1
        $this->em->persist($blockedPhoneNumber);
106 1
        $this->em->flush();
107
108 1
        return $blockedPhoneNumber;
109
    }
110
111
    /**
112
     * @inheritDoc
113
     */
114 1
    public function getBlockedPhoneNumberByPhone(PhoneNumber $phoneNumber): ?BlockedPhoneNumberInterface
115
    {
116
        /** @var BlockedPhoneNumberInterface $blockedPhoneNumber */
117 1
        $blockedPhoneNumber = $this->blockedPhoneRepository->findByPhone($phoneNumber);
118
119 1
        return $blockedPhoneNumber;
120
    }
121
122
    /**
123
     * @param PersonInterface[] $blockedUsers
124
     */
125 2
    private function notifyBlockedUsers(array $blockedUsers)
126
    {
127 2
        foreach ($blockedUsers as $person) {
128 2
            $this->mailer->sendAccountAutoBlockedMessage($person);
129
        }
130 2
    }
131
132 4
    private function isManuallyBlocked(PhoneNumber $phoneNumber): bool
133
    {
134 4
        return $this->blockedPhoneRepository->findByPhone($phoneNumber) instanceof BlockedPhoneNumberInterface;
135
    }
136
137 2
    private function isBlockedAutomatically(PhoneNumber $phoneNumber): bool
138
    {
139 2
        if ($this->options->isAutoBlockEnabled()) {
140 1
            $autoBlockLimit = $this->options->getAutoBlockPhoneLimit();
141
142 1
            return $this->phoneVerificationService->countVerified($phoneNumber) >= $autoBlockLimit;
143
        }
144
145 1
        return false;
146
    }
147
}
148