Passed
Push — master ( ecb839...55faee )
by Sam
07:41
created

MessageQueuer::queueUserPendingOrder()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 5
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 10
ccs 5
cts 5
cp 1
crap 1
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Application\Service;
6
7
use Application\DBAL\Types\MessageTypeType;
8
use Application\Model\Message;
9
use Application\Model\Order;
10
use Application\Model\User;
11
use Doctrine\ORM\EntityManager;
12
use Laminas\View\Model\ViewModel;
13
use Laminas\View\Renderer\RendererInterface;
14
15
/**
16
 * Service to queue new message for pre-defined purposes
17
 */
18
class MessageQueuer
19
{
20
    /**
21
     * @var EntityManager
22
     */
23
    private $entityManager;
24
25
    /**
26
     * @var string
27
     */
28
    private $hostname;
29
30
    /**
31
     * @var RendererInterface
32
     */
33
    private $viewRenderer;
34
35 12
    public function __construct(EntityManager $entityManager, RendererInterface $viewRenderer, string $hostname)
36
    {
37 12
        $this->entityManager = $entityManager;
38 12
        $this->hostname = $hostname;
39 12
        $this->viewRenderer = $viewRenderer;
40 12
    }
41
42 2
    public function queueRegister(User $user): Message
43
    {
44 2
        $subject = 'Demande de création de compte Les artisans de la transition';
45
        $mailParams = [
46 2
            'token' => $user->createToken(),
47
        ];
48
49 2
        $message = $this->createMessage($user, $user->getEmail(), $subject, MessageTypeType::REGISTER, $mailParams);
50
51 2
        return $message;
52
    }
53
54 1
    public function queueConfirmedRegistration(User $admin, User $registeredUser): Message
55
    {
56 1
        $subject = 'Nouveau membre';
57
        $mailParams = [
58 1
            'registeredUser' => $registeredUser,
59
        ];
60
61 1
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::CONFIRMED_REGISTRATION, $mailParams);
62
63 1
        return $message;
64
    }
65
66 2
    public function queueUnregister(User $admin, User $unregisteredUser): Message
67
    {
68 2
        $subject = 'Démission';
69
        $mailParams = [
70 2
            'unregisteredUser' => $unregisteredUser,
71
        ];
72
73 2
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::UNREGISTER, $mailParams);
74
75 2
        return $message;
76
    }
77
78
    /**
79
     * Queue a reset password email to specified user
80
     *
81
     * @param User $user The user for which a password reset will be done
82
     * @param string $email the address to send the email to. Might be different than the user's email
83
     *
84
     * @return Message
85
     */
86 2
    public function queueResetPassword(User $user, string $email): Message
87
    {
88 2
        $subject = 'Demande de modification de mot de passe';
89
        $mailParams = [
90 2
            'token' => $user->createToken(),
91
        ];
92
93 2
        $message = $this->createMessage($user, $email, $subject, MessageTypeType::RESET_PASSWORD, $mailParams);
94
95 2
        return $message;
96
    }
97
98 2
    public function queueUpdatedUser(User $admin, User $updatedUser, array $before, array $after): Message
99
    {
100 2
        $subject = 'Un utilisateur a modifié ses données personnelles';
101
        $mailParams = [
102 2
            'updatedUser' => $updatedUser,
103 2
            'before' => $before,
104 2
            'after' => $after,
105
        ];
106
107 2
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::UPDATED_USER, $mailParams);
108
109 2
        return $message;
110
    }
111
112 3
    public function queueUserPendingOrder(Order $order): Message
113
    {
114 3
        $subject = 'Votre commande est en cours de traitement';
115
        $mailParams = [
116 3
            'order' => $order,
117
        ];
118
119 3
        $message = $this->createMessage($order->getOwner(), $order->getOwner()->getEmail(), $subject, MessageTypeType::USER_PENDING_ORDER, $mailParams);
120
121 3
        return $message;
122
    }
123
124 1
    public function queueUserValidatedOrder(Order $order): Message
125
    {
126 1
        $subject = 'Votre commande a été validée';
127
        $mailParams = [
128 1
            'order' => $order,
129
        ];
130
131 1
        $message = $this->createMessage($order->getOwner(), $order->getOwner()->getEmail(), $subject, MessageTypeType::USER_VALIDATED_ORDER, $mailParams);
132
133 1
        return $message;
134
    }
135
136 3
    public function queueAdminPendingOrder(User $admin, Order $order): Message
137
    {
138 3
        $subject = 'Une commande a besoin d\'un BVR';
139
        $mailParams = [
140 3
            'order' => $order,
141
        ];
142
143 3
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::ADMIN_PENDING_ORDER, $mailParams);
144
145 3
        return $message;
146
    }
147
148 1
    public function queueAdminValidatedOrder(User $admin, Order $order): Message
149
    {
150 1
        $subject = 'Commande à comptabiliser';
151
        $mailParams = [
152 1
            'order' => $order,
153
        ];
154
155 1
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::ADMIN_VALIDATED_ORDER, $mailParams);
156
157 1
        return $message;
158
    }
159
160 2
    public function queueRequestMembershipEnd(User $admin, User $member): Message
161
    {
162 2
        $subject = 'Demande d\'arrêt de cotisations';
163
        $mailParams = [
164 2
            'member' => $member,
165
        ];
166
167 2
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::REQUEST_MEMBERSHIP_END, $mailParams);
168
169 2
        return $message;
170
    }
171
172 2
    public function queueNewsletterSubscription(User $admin, string $email): Message
173
    {
174 2
        $subject = 'Demande d\'inscription à la newsletter';
175
        $mailParams = [
176 2
            'newsletterEmail' => $email,
177
        ];
178
179 2
        $message = $this->createMessage($admin, $admin->getEmail(), $subject, MessageTypeType::NEWSLETTER_SUBSCRIPTION, $mailParams);
180
181 2
        return $message;
182
    }
183
184
    /**
185
     * Create a message by rendering the template
186
     *
187
     * @param null|User $user
188
     * @param string $email
189
     * @param string $subject
190
     * @param string $type
191
     * @param array $mailParams
192
     *
193
     * @return Message
194
     */
195 19
    private function createMessage(?User $user, string $email, string $subject, string $type, array $mailParams): Message
196
    {
197
        // First render the view
198 19
        $serverUrl = 'https://' . $this->hostname;
199 19
        $model = new ViewModel($mailParams);
200 19
        $model->setTemplate(str_replace('_', '-', $type));
201 19
        $model->setVariable('email', $email);
202 19
        $model->setVariable('user', $user);
203 19
        $model->setVariable('serverUrl', $serverUrl);
204 19
        $partialContent = $this->viewRenderer->render($model);
205
206
        // Then inject it into layout
207 19
        $layoutModel = new ViewModel([$model->captureTo() => $partialContent]);
208 19
        $layoutModel->setTemplate('layout');
209 19
        $layoutModel->setVariable('subject', $subject);
210 19
        $layoutModel->setVariable('user', $user);
211 19
        $layoutModel->setVariable('serverUrl', $serverUrl);
212 19
        $layoutModel->setVariable('hostname', $this->hostname);
213 19
        $content = $this->viewRenderer->render($layoutModel);
214
215 19
        $message = new Message();
216 19
        $message->setType($type);
217 19
        $message->setRecipient($user);
218 19
        $message->setSubject($subject);
219 19
        $message->setBody($content);
220 19
        $message->setEmail($email);
221 19
        $this->entityManager->persist($message);
222
223 19
        return $message;
224
    }
225
}
226