<?php
// src/Controller/ResetPasswordController.php
namespace App\Controller;
use App\Entity\User;
use App\Entity\Order;
use App\Entity\TypeAbonnement;
use App\Form\ResetPasswordRequestFormType;
use Doctrine\ORM\EntityManagerInterface;
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\Email;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Uid\Uuid;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use App\Entity\Abonnement;
class ResetPasswordController extends AbstractController
{
#[Route('/reset-password', name: 'app_reset_password_request')]
public function request(Request $request, EntityManagerInterface $entityManager, MailerInterface $mailer): Response
{
$form = $this->createForm(ResetPasswordRequestFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
$user = $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
if ($user) {
// Génération du jeton et date d'expiration
$resetToken = Uuid::v4();
$user->setResetToken($resetToken);
$user->setResetTokenExpiresAt(new \DateTime('+1 hour'));
$entityManager->persist($user);
$entityManager->flush();
// Envoi de l'e-mail avec le lien de réinitialisation
$resetUrl = $this->generateUrl('app_reset_password', ['token' => $resetToken], 0);
$email = (new Email())
->from('no-reply@cassaclock.com')
->replyTo('no-reply@cassaclock.com')
->to($user->getEmail())
->subject('Réinitialisation de mot de passe')
->html("Bonjour,<br/>
Suivre le lien suivant pour réinitialiser votre mot de passe :
<a href='$resetUrl'>$resetUrl</a><br/><br/>Cdt, Cassa Clock");
$mailer->send($email);
$this->addFlash('success', 'Un lien de réinitialisation a été envoyé à votre adresse e-mail.');
}
return $this->redirectToRoute('app_login');
}
return $this->render('reset_password/request.html.twig', [
'requestForm' => $form->createView(),
]);
}
#[Route('/reset-password-admin', name: 'app_reset_password_request_admin')]
public function requestAdmin(Request $request, EntityManagerInterface $entityManager, MailerInterface $mailer): Response
{
$form = $this->createForm(ResetPasswordRequestFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
$user = $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
if ($user) {
// Génération du jeton et date d'expiration
$resetToken = Uuid::v4();
$user->setResetToken($resetToken);
$user->setResetTokenExpiresAt(new \DateTime('+1 hour'));
$entityManager->persist($user);
$entityManager->flush();
// Envoi de l'e-mail avec le lien de réinitialisation
$resetUrl = $this->generateUrl('app_reset_password', ['token' => $resetToken], 0);
$email = (new Email())
->from('no-reply@cassaclock.com')
->replyTo('no-reply@cassaclock.com')
->to($user->getEmail())
->subject('Réinitialisation de mot de passe')
->html("Bonjour,<br/>
Suivre le lien suivant pour réinitialiser votre mot de passe :
<a href='$resetUrl'>$resetUrl</a><br/><br/>Cdt, Cassa Clock");
$mailer->send($email);
$this->addFlash('success', 'Un lien de réinitialisation a été envoyé à votre adresse e-mail.');
}
return $this->redirectToRoute('app_login');
}
return $this->render('reset_password/requestadmin.html.twig', [
'requestForm' => $form->createView(),
]);
}
#[Route('/paiementpaypal/success', name: 'paiementpaypal_success')]
public function paiementpaypalSuccess(Request $request,
EntityManagerInterface $em
): JsonResponse
{
/*
$data = $request->getSession()->get('paypal_payment_data_abonnement', []);
//$idpay = $data['idpay'];
$amount = $data['amount'];*/
$userId = $request->query->get('userId');
$amount = $request->query->get('amount');
if (!$userId || !is_numeric($userId)) {
return $this->json(['error' => 'userId manquant ou invalide'], 400);
}
$user = $em->getRepository(User::class)->find($userId);
if (7 < $amount && $amount < 10) {
$typeabonnement = $em->getRepository(TypeAbonnement::class)->findOneBy(['libelle' => 'Ndimnal']);
}
else if
(14 < $amount && $amount < 20){
$typeabonnement = $em->getRepository(TypeAbonnement::class)->findOneBy(['libelle' => 'Xarit']);
}
else if (27 < $amount && $amount < 35){
$typeabonnement = $em->getRepository(TypeAbonnement::class)->findOneBy(['libelle' => 'Téranga']);
}
if ($typeabonnement != null && $user != null)
{
// 3. Création de la commande (order)
$order = new Order();
$order->setAmount($amount);
$order->setCurrency('USD');
$order->setPaymentId('paypal-' . uniqid()); // ID unique
$order->setPayerEmail(''); // à compléter si nécessaire
$order->setStatus('approved');
$order->setUserprofile('');
$order->setTypeorder('paypal');
$order->setCreatedAt(new \DateTime());
// 4. Création de l’abonnement
$abonnement = new Abonnement();
$abonnement->setDateabonnement(new \DateTime());
$abonnement->setUserabonnee($user);
$abonnement->setUserprofile($user->getUsername());
$abonnement->setStatutabonnement('ongoing');
$abonnement->setTypeabonnement($typeabonnement);
// 5. Persistance
$em->persist($order);
$em->persist($abonnement);
$em->flush();
}
return $this->json([
'status' => 'success',
'message' => 'Paiement reussi',
]);
}
#[Route('/paiementpaypal/cancel', name: 'paiementpaypal_cancel')]
public function paiementpaypalCancel(Request $request): JsonResponse
{
return $this->json([
'status' => 'cancel',
'message' => 'Paiement canceled',
]);
}
#[Route('/reset-password/{token}', name: 'app_reset_password')]
public function reset(string $token, Request $request, EntityManagerInterface $entityManager): Response
{
$user = $entityManager->getRepository(User::class)->findOneBy(['resetToken' => $token]);
// dd($user->getResetTokenExpiresAt());
if (!$user || $user->getResetTokenExpiresAt() < new \DateTimeImmutable()) {
throw $this->createNotFoundException('Jeton invalide ou expiré.');
}
// Gestion de la modification du mot de passe
if ($request->isMethod('POST')) {
$password = $request->request->get('password');
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
$user->setPassword($hashedPassword);
// Réinitialisation des champs de token
$user->setResetToken(null);
$user->setResetTokenExpiresAt(null);
$entityManager->flush();
$this->addFlash('success', 'Mot de passe modifié avec succès.');
return $this->redirectToRoute('app_login');
}
return $this->render('reset_password/reset.html.twig', [
'token' => $token,
]);
}
}