Completed
Push — master ( f867ee...b2d0fe )
by Adrien
09:16 queued 04:47
created

MessageQueuer::queueAllBalance()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 5
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Application\Service;
6
7
use Application\DBAL\Types\MessageTypeType;
8
use Application\Model\Bookable;
9
use Application\Model\Booking;
10
use Application\Model\Message;
11
use Application\Model\User;
12
use Doctrine\ORM\EntityManager;
13
use Zend\View\Model\ViewModel;
14
use Zend\View\Renderer\RendererInterface;
15
16
/**
17
 * Service to queue new message for pre-defined purposes
18
 */
19
class MessageQueuer
20
{
21
    /**
22
     * @var EntityManager
23
     */
24
    private $entityManager;
25
26
    /**
27
     * @var string
28
     */
29
    private $hostname;
30
31
    /**
32
     * @var RendererInterface
33
     */
34
    private $viewRenderer;
35
36 8
    public function __construct(EntityManager $entityManager, RendererInterface $viewRenderer, string $hostname)
37
    {
38 8
        $this->entityManager = $entityManager;
39 8
        $this->hostname = $hostname;
40 8
        $this->viewRenderer = $viewRenderer;
41 8
    }
42
43 2
    public function queueRegister(User $user): Message
44
    {
45 2
        $subject = 'Demande de création de compte au Club Nautique Ichtus';
46
        $mailParams = [
47 2
            'token' => $user->createToken(),
48
        ];
49
50 2
        $message = $this->createMessage($user, $user->getEmail(), $subject, MessageTypeType::REGISTER, $mailParams);
0 ignored issues
show
Bug introduced by
It seems like $user->getEmail() can also be of type null; however, parameter $email of Application\Service\MessageQueuer::createMessage() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

50
        $message = $this->createMessage($user, /** @scrutinizer ignore-type */ $user->getEmail(), $subject, MessageTypeType::REGISTER, $mailParams);
Loading history...
51
52 2
        return $message;
53
    }
54
55 2
    public function queueUnregister(User $admin, User $unregisteredUser): Message
56
    {
57 2
        $subject = 'Démission';
58
        $mailParams = [
59 2
            'unregisteredUser' => $unregisteredUser,
60
        ];
61
62 2
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::UNREGISTER, $mailParams);
0 ignored issues
show
Bug introduced by
It seems like $admin->getEmail() can also be of type null; however, parameter $email of Application\Service\MessageQueuer::createMessage() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

62
        $message = $this->createMessage($admin, /** @scrutinizer ignore-type */ $admin->getEmail(), $subject, MessageTypeType::UNREGISTER, $mailParams);
Loading history...
63
64 2
        return $message;
65
    }
66
67
    /**
68
     * Queue a reset password email to specified user
69
     *
70
     * @param User $user The user for which a password reset will be done
71
     * @param string $email the address to send the email to. Might be different than the user's email
72
     *
73
     * @return Message
74
     */
75 3
    public function queueResetPassword(User $user, string $email): Message
76
    {
77 3
        $subject = 'Demande de modification de mot de passe';
78
        $mailParams = [
79 3
            'token' => $user->createToken(),
80
        ];
81
82 3
        $message = $this->createMessage($user, $email, $subject, MessageTypeType::RESET_PASSWORD, $mailParams);
83
84 3
        return $message;
85
    }
86
87
    /**
88
     * @param User $user
89
     * @param Bookable[] $bookables
90
     *
91
     * @return Message
92
     */
93 3
    public function queueBalance(User $user, iterable $bookables): Message
94
    {
95 3
        $subject = 'Balance de compte';
96
        $mailParams = [
97 3
            'bookables' => $bookables,
98
        ];
99
100 3
        $message = $this->createMessage($user, $user->getEmail(), $subject, MessageTypeType::BALANCE, $mailParams);
0 ignored issues
show
Bug introduced by
It seems like $user->getEmail() can also be of type null; however, parameter $email of Application\Service\MessageQueuer::createMessage() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

100
        $message = $this->createMessage($user, /** @scrutinizer ignore-type */ $user->getEmail(), $subject, MessageTypeType::BALANCE, $mailParams);
Loading history...
101
102 3
        return $message;
103
    }
104
105
    /**
106
     * Create a message by rendering the template
107
     *
108
     * @param null|User $user
109
     * @param string $email
110
     * @param string $subject
111
     * @param string $type
112
     * @param array $mailParams
113
     *
114
     * @return Message
115
     */
116 10
    private function createMessage(?User $user, string $email, string $subject, string $type, array $mailParams): Message
117
    {
118
        // First render the view
119 10
        $serverUrl = 'https://' . $this->hostname;
120 10
        $model = new ViewModel($mailParams);
121 10
        $model->setTemplate(str_replace('_', '-', $type));
122 10
        $model->setVariable('email', $email);
123 10
        $model->setVariable('user', $user);
124 10
        $model->setVariable('serverUrl', $serverUrl);
125 10
        $partialContent = $this->viewRenderer->render($model);
126
127
        // Then inject it into layout
128 10
        $layoutModel = new ViewModel([$model->captureTo() => $partialContent]);
129 10
        $layoutModel->setTemplate('layout');
130 10
        $layoutModel->setVariable('subject', $subject);
131 10
        $layoutModel->setVariable('user', $user);
132 10
        $layoutModel->setVariable('serverUrl', $serverUrl);
133 10
        $layoutModel->setVariable('hostname', $this->hostname);
134 10
        $content = $this->viewRenderer->render($layoutModel);
135
136 10
        $message = new Message();
137 10
        $message->setType($type);
138 10
        $message->setRecipient($user);
139 10
        $message->setSubject($subject);
140 10
        $message->setBody($content);
141 10
        $message->setEmail($email);
142 10
        $this->entityManager->persist($message);
143
144 10
        return $message;
145
    }
146
147
    /**
148
     * @param User[] $users
149
     *
150
     * @return int
151
     */
152 2
    private function queueBalanceForEachUsers(array $users): int
153
    {
154 2
        foreach ($users as $user) {
155
            $bookables = $user->getBookings()->map(function (Booking $booking) {
156 1
                return $booking->getBookable();
157 1
            });
158
159 1
            $this->queueBalance($user, $bookables);
160
        }
161
162 2
        return count($users);
163
    }
164
165 1
    public function queueAllBalance(): int
166
    {
167 1
        $users = $this->entityManager->getRepository(User::class)->getAllToQueueBalanceMessage();
168
169 1
        return $this->queueBalanceForEachUsers($users);
170
    }
171
172 1
    public function queueNegativeBalance(): int
173
    {
174 1
        $users = $this->entityManager->getRepository(User::class)->getAllToQueueBalanceMessage(true);
175
176 1
        return $this->queueBalanceForEachUsers($users);
177
    }
178
}
179