<?php
namespace App\Controller;
/* use App\Entity\Main\Offre;
use App\Entity\Main\Abonnement;
use App\Entity\Main\User;
use App\Entity\Main\UserPlatform; */
use App\Entity\Abonnement;
use App\Entity\Offre;
use App\Entity\User;
use App\Entity\UserPlatform;
use App\Form\RegistrationFormType;
use App\Repository\OffreRepository;
use App\Repository\UserRepository;
use App\Security\EmailVerifier;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Twig\Environment;
class RegistrationController extends AbstractCoreController
{
private EmailVerifier $emailVerifier;
public function __construct(EmailVerifier $emailVerifier)
{
$this->emailVerifier = $emailVerifier;
}
/**
* @Route("/register", name="app_register")
*/
public function register(Request $request, OffreRepository $offreRepository, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $entityManager, Security $security, Environment $twig, MailerInterface $mailer): Response
{
if (null !== $security->getUser()) {
return $this->redirectToRoute('index', [], Response::HTTP_SEE_OTHER);
}
$user = new User();
$datas = $request->request->get('registration_form');
if(!isset($datas['offre'])) {
$datas['offre'] = (int)$request->query->get('offre');
}
$offre = $offreRepository->find((int)$datas['offre']);
/* if($offre instanceof Offre) {
$user->setOffreId($offre);
} */
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// encode the plain password
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$user->setRoles(["ROLE_USER"]);
$user->setIsVerified(true);
$entityManager->persist($user);
$entityManager->flush();
$userPlatform = new UserPlatform();
$userPlatform->setEmail($user);
$userPlatform->setFirstname($request->request->get('registration_form')['firstname']);
$userPlatform->setLastname($request->request->get('registration_form')['lastname']);
$userPlatform->setPays($request->request->get('registration_form')['pays']);
$userPlatform->setTelephone($request->request->get('registration_form')['phoneNumber']);
$userPlatform->setStatut('Non actif');
$userPlatform->setCreatedAt(new \DateTimeImmutable(date('Y-m-d H:i:s')));
$entityManager->persist($userPlatform);
$entityManager->flush();
// generate a signed url and email it to the user
$to = $user->getEmail();
$subject = "Inscription";
$message = $twig->render('registration/confirmation_email.html.twig', [
'email' => $user->getEmail(),
'name' => $userPlatform->getFirstname() . (!empty($userPlatform->getLastname()) ? ' ' . $userPlatform->getLastname() : ''),
]);
// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
// More headers
$headers .= 'From: '.$_ENV["EMAIL_SENDER_NAME"].' <'.$_ENV["EMAIL_SENDER"].'>' . "\r\n";
//code nampiako
$mail = (new Email())
->from($_ENV["EMAIL_SENDER"])
->to($to)
->subject($subject)
->html($message);
$mail->getHeaders()->addTextHeader('MIME-Version','1.0')
->addTextHeader('Content-type','text/html;charset=UTF-8');
$mailer->send($mail);
// Manually login user / authenticate user after registration
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set('_security_secured_area', serialize($token));
if($offre instanceof Offre) {
$abonnement = new Abonnement();
$abonnement->setAbonOffre($offre);
/* $abonnement->setAbonOffre($offre->getId()); */
$abonnement->setAbonUser($userPlatform);
$abonnement->setStatutPaiement(0);
$abonnement->setIsSubscriber(false);
$abonnement->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
$entityManager->persist($abonnement);
$entityManager->flush();
return $this->redirectToRoute('app_abonnement_pay', ['id' => $abonnement->getId()]);
}
else {
return $this->redirectToRoute('app_offre_index');
}
}
return $this->render('registration/register.html.twig', [
'registrationForm' => $form->createView(),
'offres' => $offreRepository->findOffreActifWithPlan(),
]);
}
/**
* @Route("/verify/email", name="app_verify_email")
*/
public function verifyUserEmail(Request $request, TranslatorInterface $translator, UserRepository $userRepository): Response
{
$id = $request->get('id');
if (null === $id) {
return $this->redirectToRoute('app_register');
}
$user = $userRepository->find($id);
if (null === $user) {
return $this->redirectToRoute('app_register');
}
// validate email confirmation link, sets User::isVerified=true and persists
try {
$this->emailVerifier->handleEmailConfirmation($request, $user);
} catch (VerifyEmailExceptionInterface $exception) {
$this->addFlash('verify_email_error', $translator->trans($exception->getReason(), [], 'VerifyEmailBundle'));
return $this->redirectToRoute('app_register');
}
// @TODO Change the redirect on success and handle or remove the flash message in your templates
$this->addFlash('success', 'Votre adresse e-mail a été vérifiée.');
return $this->redirectToRoute('app_register');
}
/**
* @Route("delete-user", name="app_delete_user")
*/
public function removeUser(UserRepository $userRepo, EntityManagerInterface $em){
$user = $userRepo->findOneBy(['email' => 'vonintsoa.teko@gmail.com']);
$em->remove($user);
$res = $em->flush();
dd($user);
}
}