Passed
Push — master ( 094416...528c5a )
by Sylvain
13:44
created

MessageQueuer::createMessage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 5
dl 0
loc 13
ccs 1
cts 1
cp 1
crap 1
rs 9.9666
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\Message;
9
use Application\Model\Order;
10
use Application\Model\User;
11
use Doctrine\ORM\EntityManager;
12
use Ecodev\Felix\Service\MessageRenderer;
13
14
/**
15
 * Service to queue new message for pre-defined purposes
16
 */
17
class MessageQueuer
18
{
19
    private EntityManager $entityManager;
20
21
    private MessageRenderer $messageRenderer;
22
23 13
    private array $config;
24
25 13
    public function __construct(EntityManager $entityManager, MessageRenderer $messageRenderer, array $config)
26 13
    {
27 13
        $this->entityManager = $entityManager;
28
        $this->messageRenderer = $messageRenderer;
29 2
        $this->config = $config;
30
    }
31 2
32
    public function queueRegister(User $user): Message
33 2
    {
34
        $subject = 'Demande de création de compte Les artisans de la transition';
35
        $mailParams = [
36 2
            'token' => $user->createToken(),
37
        ];
38 2
39
        $message = $this->createMessage($user, $user->getEmail(), $subject, MessageTypeType::REGISTER, $mailParams);
40
41 1
        return $message;
42
    }
43 1
44
    public function queueConfirmedRegistration(string $adminEmail, User $registeredUser): Message
45 1
    {
46
        $subject = 'Nouveau membre';
47
        $mailParams = [
48 1
            'registeredUser' => $registeredUser,
49
        ];
50 1
51
        $message = $this->createMessage(null, $adminEmail, $subject, MessageTypeType::CONFIRMED_REGISTRATION, $mailParams);
52
53
        return $message;
54
    }
55
56
    /**
57
     * Queue a reset password email to specified user
58
     *
59 2
     * @param User $user The user for which a password reset will be done
60
     * @param string $email the address to send the email to. Might be different than the user's email
61 2
     */
62
    public function queueResetPassword(User $user, string $email): Message
63 2
    {
64
        $subject = 'Demande de modification de mot de passe';
65
        $mailParams = [
66 2
            'token' => $user->createToken(),
67
        ];
68 2
69
        $message = $this->createMessage($user, $email, $subject, MessageTypeType::RESET_PASSWORD, $mailParams);
70
71 2
        return $message;
72
    }
73 2
74
    public function queueUpdatedUser(string $adminEmail, User $updatedUser, array $before, array $after): Message
75 2
    {
76 2
        $subject = 'Un utilisateur a modifié ses données personnelles';
77 2
        $mailParams = [
78
            'updatedUser' => $updatedUser,
79
            'before' => $before,
80 2
            'after' => $after,
81
        ];
82 2
83
        $message = $this->createMessage(null, $adminEmail, $subject, MessageTypeType::UPDATED_USER, $mailParams);
84
85 5
        return $message;
86
    }
87 5
88
    public function queueUserPendingOrder(User $user, Order $order): Message
89 5
    {
90
        $subject = 'Votre commande est en cours de traitement';
91
        $mailParams = [
92 5
            'order' => $order,
93
        ];
94 5
95
        $message = $this->createMessage($user, $user->getEmail(), $subject, MessageTypeType::USER_PENDING_ORDER, $mailParams);
96
97 2
        return $message;
98
    }
99 2
100
    public function queueUserValidatedOrder(User $user, Order $order): Message
101 2
    {
102
        $subject = 'Votre commande a été validée';
103
        $mailParams = [
104 2
            'order' => $order,
105
        ];
106 2
107
        $message = $this->createMessage($user, $user->getEmail(), $subject, MessageTypeType::USER_VALIDATED_ORDER, $mailParams);
108
109 6
        return $message;
110
    }
111 6
112
    public function queueAdminPendingOrder(string $adminEmail, Order $order): Message
113 6
    {
114
        $subject = 'Une commande a besoin d\'un BVR';
115
        $mailParams = [
116 6
            'order' => $order,
117
        ];
118 6
119
        $message = $this->createMessage(null, $adminEmail, $subject, MessageTypeType::ADMIN_PENDING_ORDER, $mailParams);
120
121 3
        return $message;
122
    }
123 3
124
    public function queueAdminValidatedOrder(string $email, Order $order): Message
125 3
    {
126
        $subject = 'Commande à comptabiliser';
127
        $mailParams = [
128 3
            'order' => $order,
129
        ];
130 3
131
        $message = $this->createMessage(null, $email, $subject, MessageTypeType::ADMIN_VALIDATED_ORDER, $mailParams);
132
133 2
        return $message;
134
    }
135 2
136
    public function queueRequestMembershipEnd(string $adminEmail, User $member): Message
137 2
    {
138
        $subject = 'Demande d\'arrêt de cotisations';
139
        $mailParams = [
140 2
            'member' => $member,
141
        ];
142 2
143
        $message = $this->createMessage(null, $adminEmail, $subject, MessageTypeType::REQUEST_MEMBERSHIP_END, $mailParams);
144
145 2
        return $message;
146
    }
147 2
148
    public function queueNewsletterSubscription(string $adminEmail, string $email): Message
149 2
    {
150
        $subject = 'Demande d\'inscription à la newsletter';
151
        $mailParams = [
152 2
            'newsletterEmail' => $email,
153
        ];
154 2
155
        $message = $this->createMessage(null, $adminEmail, $subject, MessageTypeType::NEWSLETTER_SUBSCRIPTION, $mailParams);
156
157
        return $message;
158
    }
159
160 22
    /**
161
     * Get all admin emails to notify
162 22
     */
163
    public function getAllEmailsToNotify(): array
164 22
    {
165 22
        return $this->config['email']['admins'];
166 22
    }
167 22
168 22
    /**
169 22
     * Create a message by rendering the template
170 22
     */
171
    private function createMessage(?User $user, string $email, string $subject, string $type, array $mailParams): Message
172 22
    {
173
        $content = $this->messageRenderer->render($user, $email, $subject, $type, $mailParams);
174
175
        $message = new Message();
176
        $message->setType($type);
177
        $message->setRecipient($user);
178
        $message->setSubject($subject);
179
        $message->setBody($content);
180
        $message->setEmail($email);
181
        $this->entityManager->persist($message);
182
183
        return $message;
184
    }
185
}
186