<?php
namespace App\Controller\Auth;
use App\Services\Api\Auth\AuthService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
class PasswordController extends AbstractController
{
private AuthService $authService;
/**
* @param AuthService $authService
*/
public function __construct(AuthService $authService)
{
$this->authService = $authService;
}
/**
* @throws TransportExceptionInterface
* @throws ServerExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ClientExceptionInterface
*/
#[Route('/reset_password', name: 'app_reset_password')]
public function reset(Request $request): RedirectResponse|\Symfony\Component\HttpFoundation\Response
{
if ($request->isMethod('POST')) {
// Récupère les informations d'identification de l'utilisateur depuis le formulaire de connexion
$email = $request->request->get('email');
//verification si les champ ne sont pas vide
if (!$email) {
$this->addFlash('danger', "l'adresse électronique n'est pas correct");
return $this->redirectToRoute('app_login');
}
$response = $this->authService->resetPassword([
'email' => $email
]);
if ($response->getStatusCode() == 200 || $response->getStatusCode() == 201) {
} else {
// Authentification échouée
// $this->addFlash("danger", json_decode($response->getContent(false), true)['message']);
$this->addFlash("danger", "Une erreur s'est produite : cette adresse e-mail n'existe pas dans le système.");
return $this->redirectToRoute('app_reset_password');
}
// Redirige l'utilisateur vers la page protégée
return $this->redirectToRoute('app_check_reset_password',[
'email' => $email
]);
}
return $this->render('frontend/reset_password/reset.html.twig', [
]);
}
/**
* @throws RedirectionExceptionInterface
* @throws ClientExceptionInterface
* @throws TransportExceptionInterface
* @throws ServerExceptionInterface
*/
#[Route('/check/reset_password/{email}', name: 'app_check_reset_password')]
public function checkPassword(Request $request, $email){
if ($request->isMethod('POST')) {
// Récupère les informations d'identification de l'utilisateur depuis le formulaire de connexion
$code = $request->request->get('code');
//verification si les champ ne sont pas vide
if (!$code) {
$this->addFlash('danger', "Saisir le code");
return $this->redirectToRoute('app_check_reset_password', [
'email' => $email
]);
}
$response = $this->authService->passwordRequestCheck([
'email' => $email,
'code' => $code
]);
if ($response->getStatusCode() == 200 || $response->getStatusCode() == 201) {
} else {
// Authentification échouée
$this->addFlash("danger", json_decode($response->getContent(false), true)['message']);
return $this->redirectToRoute('app_check_reset_password',[
'email' => $email
]);
}
$data = json_decode($response->getContent(), true);
// Redirige l'utilisateur vers la page protégée
return $this->redirectToRoute('app_update_password',[
'token' => $data['token']
]);
}
return $this->render('frontend/reset_password/check_email.html.twig', [
'email'=> $email
]);
}
/**
* @throws RedirectionExceptionInterface
* @throws ClientExceptionInterface
* @throws TransportExceptionInterface
* @throws ServerExceptionInterface
*/
#[Route('/check/update/password/{token}', name: 'app_update_password')]
public function updatePassword(Request $request, $token, ValidatorInterface $validator){
if ($request->isMethod('POST')) {
$password = $request->request->get('password');
//verification si les champ ne sont pas vide
if (!$password) {
$this->addFlash('danger', "Mot de passe non valide");
return $this->redirectToRoute('app_update_password',[
'token' => $token
]);
}
// Vérifie si le mot de passe a une longueur minimale de 4 caractères
$errors = $validator->validate($password, [
new Length([
'min' => 4,
'minMessage' => 'Le mot de passe doit contenir au moins {{ limit }} caractères.',
]),
]);
if (count($errors) > 0) {
$this->addFlash('danger', $errors[0]->getMessage());
return $this->redirectToRoute('app_update_password', [
'token' => $token
]);
}
$response = $this->authService->updatePassword([
'password' => $password,
'token' => $token,
]);
if ($response->getStatusCode() == 200 || $response->getStatusCode() == 201 || $response->getStatusCode() == 202) {
} else {
$this->addFlash("danger", json_decode($response->getContent(false), true)['message']);
return $this->redirectToRoute('app_update_password',[
'token' => $token
]);
}
$data = json_decode($response->getContent(), true);
// Redirige l'utilisateur vers la page protégée
$this->addFlash('success', 'le mot de passe a été modifié avec succès.');
return $this->redirectToRoute('app_login',[
]);
}
return $this->render('frontend/reset_password/update_password.html.twig', [
'token' => $token
]);
}
}