|
6 | 6 | use App\Repositories\AuthorizationCodeRepository; |
7 | 7 | use App\Repositories\StreamRepository; |
8 | 8 | use App\Repositories\UserRepository; |
| 9 | +use App\Models\User; |
9 | 10 | use App\Services\ApiWrapper; |
10 | 11 | use Exception; |
11 | 12 | use MailchimpTransactional\ApiClient; |
@@ -50,6 +51,7 @@ public function login(Request $request, Response $response): Response |
50 | 51 |
|
51 | 52 | if ($user && password_verify($password, $user->password)) { |
52 | 53 | if (isset($user->email_verified) && !$user->email_verified) { |
| 54 | + $this->sendVerificationEmail($request, $user); |
53 | 55 | $this->messages->addMessage('email_not_verified', true); |
54 | 56 | return $this->redirectToRoute($request, $response, 'app_index'); |
55 | 57 | } |
@@ -94,40 +96,9 @@ public function register(Request $request, Response $response): Response |
94 | 96 |
|
95 | 97 | // Créer l'utilisateur (email non vérifié) |
96 | 98 | $user = $this->userRepository->insertWithPassword($email, $password); |
97 | | - $user = $this->userRepository->insertResetToken($user); |
98 | 99 |
|
99 | 100 | // Envoyer l'email de vérification |
100 | | - $routeParser = RouteContext::fromRequest($request)->getRouteParser(); |
101 | | - $verifyUrl = $_SERVER['WEBSITE_DOMAIN'] . $routeParser->urlFor('app_verify_email', ["token" => $user->reset_token]); |
102 | | - |
103 | | - try { |
104 | | - $result = $this->mailchimp->messages->send([ |
105 | | - "message" => [ |
106 | | - "from_email" => "contact@helloasso.io", |
107 | | - "from_name" => "HelloAsso", |
108 | | - "subject" => "Confirmez votre adresse email", |
109 | | - "html" => $this->buildVerificationEmail($verifyUrl), |
110 | | - "to" => [["email" => $user->email, "type" => "to"]], |
111 | | - ], |
112 | | - ]); |
113 | | - |
114 | | - // Le client Mandrill retourne l'exception au lieu de la lancer |
115 | | - if ($result instanceof Exception) { |
116 | | - throw $result; |
117 | | - } |
118 | | - |
119 | | - // Vérifier le statut de l'envoi Mandrill |
120 | | - if (is_array($result) && isset($result[0]->status) && in_array($result[0]->status, ['rejected', 'invalid'])) { |
121 | | - throw new Exception('Email rejeté par Mandrill : ' . ($result[0]->reject_reason ?? 'raison inconnue')); |
122 | | - } |
123 | | - } catch (Exception $e) { |
124 | | - $this->logger->error('Échec de l\'envoi de l\'email de vérification', [ |
125 | | - 'email' => $user->email, |
126 | | - 'error' => $e->getMessage(), |
127 | | - ]); |
128 | | - $this->messages->addMessage('register_error', 'Votre compte a été créé mais l\'email de vérification n\'a pas pu être envoyé. Veuillez réessayer plus tard.'); |
129 | | - return $this->redirectToRoute($request, $response, 'app_register'); |
130 | | - } |
| 101 | + $this->sendVerificationEmail($request, $user); |
131 | 102 |
|
132 | 103 | $this->messages->addMessage('register_success', true); |
133 | 104 | return $this->redirectToRoute($request, $response, 'app_index'); |
@@ -180,6 +151,43 @@ private function validatePassword(string $password, string $passwordRepeat): arr |
180 | 151 | return $errors; |
181 | 152 | } |
182 | 153 |
|
| 154 | + /** |
| 155 | + * Envoie (ou renvoie) l'email de vérification à un utilisateur. |
| 156 | + * Génère un nouveau token de réinitialisation avant l'envoi. |
| 157 | + */ |
| 158 | + private function sendVerificationEmail(Request $request, User $user): void |
| 159 | + { |
| 160 | + $user = $this->userRepository->insertResetToken($user); |
| 161 | + |
| 162 | + $routeParser = RouteContext::fromRequest($request)->getRouteParser(); |
| 163 | + $verifyUrl = $_SERVER['WEBSITE_DOMAIN'] . $routeParser->urlFor('app_verify_email', ["token" => $user->reset_token]); |
| 164 | + |
| 165 | + try { |
| 166 | + $result = $this->mailchimp->messages->send([ |
| 167 | + "message" => [ |
| 168 | + "from_email" => "contact@helloasso.io", |
| 169 | + "from_name" => "HelloAsso", |
| 170 | + "subject" => "Confirmez votre adresse email", |
| 171 | + "html" => $this->buildVerificationEmail($verifyUrl), |
| 172 | + "to" => [["email" => $user->email, "type" => "to"]], |
| 173 | + ], |
| 174 | + ]); |
| 175 | + |
| 176 | + if ($result instanceof Exception) { |
| 177 | + throw $result; |
| 178 | + } |
| 179 | + |
| 180 | + if (is_array($result) && isset($result[0]->status) && in_array($result[0]->status, ['rejected', 'invalid'])) { |
| 181 | + throw new Exception('Email rejeté par Mandrill : ' . ($result[0]->reject_reason ?? 'raison inconnue')); |
| 182 | + } |
| 183 | + } catch (Exception $e) { |
| 184 | + $this->logger->error('Échec de l\'envoi de l\'email de vérification', [ |
| 185 | + 'email' => $user->email, |
| 186 | + 'error' => $e->getMessage(), |
| 187 | + ]); |
| 188 | + } |
| 189 | + } |
| 190 | + |
183 | 191 | /** |
184 | 192 | * Génère le contenu HTML de l'email de vérification. |
185 | 193 | */ |
|
0 commit comments