thomas-claireau/PHP-P6-Openclassrooms

View on GitHub
src/Controller/Security/UserValidate.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Controller\Security;

use App\Entity\User;
use App\Form\ResetPasswordUserType;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class UserValidate extends AbstractController
{
    /**
     * @var ObjectManager
     */
    private $em;

    /**
     * @var UserPasswordEncoderInterface
     */
    private $encoder;

    public function __construct(ObjectManager $em, UserPasswordEncoderInterface $encoder)
    {
        $this->em = $em;
        $this->encoder = $encoder;
    }

    /**
     * @Route("/validate-user/{idUser}/{token}", name="security.validate.user")
     */
    public function validateUser(Request $request, User $user)
    {
        $params = $request->attributes->get('_route_params');
        $id = $params['idUser'];
        $token = $params['token'];
        $user = $this->getDoctrine()
            ->getRepository(User::class)
            ->find($id);

        if ($user->getToken() === $token) {
            $user->setToken(null);
            $user->setActif(1);
            $this->em->persist($user);
            $this->em->flush();
            $this->addFlash('success', 'Inscription confirmée');

            return $this->redirectToRoute('home');
        } else {
            $this->addFlash('error', 'Inscription non confirmée, un problème est survenu');
            return $this->redirectToRoute('home');
        }
    }

    /**
     * @Route("/reset-password/{id}/{token}", name="security.reset.user")
     */
    public function resetPassword(Request $request, User $user): Response
    {
        $params = $request->attributes->get('_route_params');
        $id = $params['id'];
        $token = $params['token'];
        $user = $this->getDoctrine()
            ->getRepository(User::class)
            ->find($id);

        if ($user->getToken() === $token) {
            $form = $this->createForm(ResetPasswordUserType::class, $user);
            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                $user->setPassword($this->encoder->encodePassword($user, $user->getPassword()));
                $user->setToken(null);
                $this->em->persist($user);
                $this->em->flush();

                $this->addFlash('success', 'Votre mot de passe a bien été réinitialisé');
                return $this->redirectToRoute('home');
            }

            return $this->render('security/reset-password.html.twig', [
                'current_menu' => 'register',
                'form' => $form->createView(),
            ]);
        } else {
            $this->addFlash('error', 'Le lien de réinitialisation du mot de passe a expiré, veuillez recommencer');
            return $this->redirectToRoute('home');
        }
    }
}