Failed Conditions
Push — master ( 64d413...b77024 )
by Adrien
10:04
created

MessageQueuer::wasToFamilyOwner()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
ccs 2
cts 2
cp 1
cc 1
nc 1
nop 0
crap 1
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;
1 ignored issue
show
Bug Best Practice introduced by
The expression return $message could return the type null which is incompatible with the type-hinted return Application\Model\Message. Consider adding an additional type-check to rule them out.
Loading history...
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 6
    public function queueResetPassword(User $user): ?Message
66
    {
67 6
        $subject = 'Demande de modification de mot de passe';
68
        $mailParams = [
69 6
            'token' => $user->createToken(),
70
        ];
71
72 6
        $message = $this->createMessage($user, $subject, MessageTypeType::RESET_PASSWORD, $mailParams);
73
74 6
        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;
1 ignored issue
show
Bug Best Practice introduced by
The expression return $message could return the type null which is incompatible with the type-hinted return Application\Model\Message. Consider adding an additional type-check to rule them out.
Loading history...
90
    }
91
92
    /**
93
     * Create a message by rendering the template
94
     */
95 13
    private function createMessage(?User $user, string $subject, string $type, array $mailParams): ?Message
96
    {
97 13
        $email = $this->getEmail($user);
98 13
        if (!$email) {
99 2
            return null;
100
        }
101
102 11
        $content = $this->messageRenderer->render($user, $email, $subject, $type, $mailParams);
103
104 11
        $message = new Message();
105 11
        $message->setType($type);
106 11
        $message->setRecipient($user);
107 11
        $message->setSubject($subject);
108 11
        $message->setBody($content);
109 11
        $message->setEmail($email);
110 11
        $this->entityManager->persist($message);
111
112 11
        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(function (Booking $booking) {
122 1
                return $booking->getBookable();
123 1
            });
124
125 1
            $this->queueBalance($user, $bookables);
126
        }
127
128 2
        return count($users);
129
    }
130
131 1
    public function queueAllBalance(): int
132
    {
133 1
        $users = $this->userRepository->getAllToQueueBalanceMessage();
134
135 1
        return $this->queueBalanceForEachUsers($users);
136
    }
137
138 1
    public function queueNegativeBalance(): int
139
    {
140
        /** @var UserRepository $userRepository */
141 1
        $userRepository = $this->entityManager->getRepository(User::class);
142 1
        $users = $userRepository->getAllToQueueBalanceMessage(true);
143
144 1
        return $this->queueBalanceForEachUsers($users);
145
    }
146
147 13
    private function getEmail(?User $user): ?string
148
    {
149 13
        $this->toFamilyOwner = false;
150 13
        if (!$user) {
151
            return null;
152
        }
153
154 13
        $email = $user->getEmail();
155
156
        // Fallback to family owner if any
157 13
        if (!$email && $user->getOwner()) {
158 3
            $email = $this->userRepository->getAclFilter()->runWithoutAcl(function () use ($user) {
159 3
                return $user->getOwner()->getEmail();
160 3
            });
161
162 3
            $this->toFamilyOwner = true;
163
        }
164
165 13
        return $email;
166
    }
167
168
    /**
169
     * Whether the last sent email was sent to family owner instead of original recipient
170
     */
171 2
    public function wasToFamilyOwner(): bool
172
    {
173 2
        return $this->toFamilyOwner;
174
    }
175
}
176