Failed Conditions
Push — master ( 893dc8...0c1f2a )
by Adrien
06:01
created

MessageQueuer::getEmail()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 17
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4.0218

Importance

Changes 0
Metric Value
eloc 8
c 0
b 0
f 0
dl 0
loc 17
ccs 8
cts 9
cp 0.8889
rs 10
cc 4
nc 3
nop 1
crap 4.0218
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 Application\Repository\UserRepository;
13
use Doctrine\ORM\EntityManager;
14
use Ecodev\Felix\Service\MessageRenderer;
15
16
/**
17
 * Service to queue new message for pre-defined purposes.
18
 */
19
class MessageQueuer
20
{
21
    private EntityManager $entityManager;
22
23
    private MessageRenderer $messageRenderer;
24
25
    private bool $toFamilyOwner = false;
26
27
    private UserRepository $userRepository;
28
29 11
    public function __construct(EntityManager $entityManager, MessageRenderer $messageRenderer)
30
    {
31 11
        $this->entityManager = $entityManager;
32 11
        $this->messageRenderer = $messageRenderer;
33 11
        $this->userRepository = $this->entityManager->getRepository(User::class);
34 11
    }
35
36 2
    public function queueRegister(User $user): ?Message
37
    {
38 2
        $subject = 'Demande de création de compte au Club Nautique Ichtus';
39
        $mailParams = [
40 2
            'token' => $user->createToken(),
41
        ];
42
43 2
        $message = $this->createMessage($user, $subject, MessageTypeType::REGISTER, $mailParams);
44
45 2
        return $message;
46
    }
47
48 2
    public function queueUnregister(User $admin, User $unregisteredUser): ?Message
49
    {
50 2
        $subject = 'Démission';
51
        $mailParams = [
52 2
            'unregisteredUser' => $unregisteredUser,
53
        ];
54
55 2
        $message = $this->createMessage($admin, $subject, MessageTypeType::UNREGISTER, $mailParams);
56
57 2
        return $message;
58
    }
59
60
    /**
61
     * Queue a reset password email to specified user.
62
     *
63
     * @param User $user The user for which a password reset will be done
64
     */
65 7
    public function queueResetPassword(User $user): ?Message
66
    {
67 7
        $subject = 'Demande de modification de mot de passe';
68
        $mailParams = [
69 7
            'token' => $user->createToken(),
70
        ];
71
72 7
        $message = $this->createMessage($user, $subject, MessageTypeType::RESET_PASSWORD, $mailParams);
73
74 7
        return $message;
75
    }
76
77
    /**
78
     * @param Bookable[] $bookables
79
     */
80 3
    public function queueBalance(User $user, iterable $bookables): ?Message
81
    {
82 3
        $subject = 'Balance de compte';
83
        $mailParams = [
84 3
            'bookables' => $bookables,
85
        ];
86
87 3
        $message = $this->createMessage($user, $subject, MessageTypeType::BALANCE, $mailParams);
88
89 3
        return $message;
90
    }
91
92
    /**
93
     * Create a message by rendering the template.
94
     */
95 14
    private function createMessage(?User $user, string $subject, string $type, array $mailParams): ?Message
96
    {
97 14
        $email = $this->getEmail($user);
98 14
        if (!$email) {
99 2
            return null;
100
        }
101
102 12
        $content = $this->messageRenderer->render($user, $email, $subject, $type, $mailParams);
103
104 12
        $message = new Message();
105 12
        $message->setType($type);
106 12
        $message->setRecipient($user);
107 12
        $message->setSubject($subject);
108 12
        $message->setBody($content);
109 12
        $message->setEmail($email);
110 12
        $this->entityManager->persist($message);
111
112 12
        return $message;
113
    }
114
115
    /**
116
     * @param User[] $users
117
     */
118 2
    private function queueBalanceForEachUsers(array $users): int
119
    {
120 2
        foreach ($users as $user) {
121 1
            $bookables = $user->getRunningBookings()->map(fn (Booking $booking) => $booking->getBookable());
122
123 1
            $this->queueBalance($user, $bookables);
124
        }
125
126 2
        return count($users);
127
    }
128
129 1
    public function queueAllBalance(): int
130
    {
131 1
        $users = $this->userRepository->getAllToQueueBalanceMessage();
132
133 1
        return $this->queueBalanceForEachUsers($users);
134
    }
135
136 1
    public function queueNegativeBalance(): int
137
    {
138
        /** @var UserRepository $userRepository */
139 1
        $userRepository = $this->entityManager->getRepository(User::class);
140 1
        $users = $userRepository->getAllToQueueBalanceMessage(true);
141
142 1
        return $this->queueBalanceForEachUsers($users);
143
    }
144
145 14
    private function getEmail(?User $user): ?string
146
    {
147 14
        $this->toFamilyOwner = false;
148 14
        if (!$user) {
149
            return null;
150
        }
151
152 14
        $email = $user->getEmail();
153
154
        // Fallback to family owner if any
155 14
        if (!$email && $user->getOwner()) {
156 3
            $email = $this->userRepository->getAclFilter()->runWithoutAcl(fn () => $user->getOwner()->getEmail());
157
158 3
            $this->toFamilyOwner = true;
159
        }
160
161 14
        return $email;
162
    }
163
164
    /**
165
     * Whether the last sent email was sent to family owner instead of original recipient.
166
     */
167 3
    public function wasToFamilyOwner(): bool
168
    {
169 3
        return $this->toFamilyOwner;
170
    }
171
}
172