<?php
namespace App\Controller;
use App\Entity\User;
use MangoPay\MangoPayApi;
use App\Entity\ImageProfil;
use App\Entity\UserAccount;
use App\Form\ImageprofilType;
use App\Repository\UserRepository;
use Symfony\Bundle\MakerBundle\Str;
use Symfony\Component\Asset\Package;
use App\Service\Payment\StripeService;
use App\Service\Payment\MangopayService;
use App\Repository\AccountFormRepository;
use App\Repository\UserAccountRepository;
use App\Repository\OrdersRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Security\Http\Util\TargetPathTrait;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class LoginFormController extends AbstractController
{
use TargetPathTrait;
private $passwordEncoder;
public function __construct(UserPasswordEncoderInterface $passwordEncoder)
{
$this->passwordEncoder = $passwordEncoder;
}
public function load($pass, $User)
{
$User->setPassword($this->passwordEncoder->encodePassword(
$User,
$pass
))->getPassword();
}
/**
*@Route("/register", name="user.register")
*/
public function register(Request $request, UserRepository $UserRepository, \Swift_Mailer $mailer, StripeService $stripeService)
{
if (!$this->getUser() && $this->getUser() === null)
{
$userRegistered = false;
$LoginForm = new User();
$UserAccount = new UserAccount();
// $request->request->get()
$LoginForm->setUserAccount($UserAccount);
$form = $this->createFormBuilder($LoginForm)
->add('lastname', TextType::class, ['label'=>'Votre Nom'])
->add('firstname', TextType::class, ['label'=> 'Votre prénom'])
->add('phone', TextType::class, ['label'=> 'Numéro de téléphone'])
->add('email', TextType::class, ['label'=> 'Votre adresse mail', 'attr'=> ['name'=>'_username']])
->add('password', PasswordType::class, ['label'=> 'Mot de passe','attr' => ['password' => '_password']])
->add('inscription', SubmitType::class, ['label' => 'S\' inscrire'])
->getForm();
//$pass = $form['password']->getData();
// dump($form['password']);
$form->handleRequest($request);
}
else
{
$user = $this->getUser();
// if ($user->getUserAccount() && $user->getUserAccount() !== null)
//{
$userRegistered = true;
$LoginForm = null;
$user = $user->setUserAccount($user->getUserAccount());
$form = $this->createFormBuilder($user, ['validation_groups' => [false]])
->add('lastname', TextType::class, ['label'=>'Votre Nom'])
->add('firstname', TextType::class, ['label'=> 'Votre prénom'])
->add('email', TextType::class, ['label'=> 'Votre adresse mail', 'attr'=> ['name'=>'_username']])
->add('phone', TextType::class, ['label'=> 'Numéro de téléphone'])
->add('submit', SubmitType::class, ['label' => 'Valider'])
->getForm();
$form->handleRequest($request);
// }
}
if ($form->isSubmitted() && $form->isValid() )
{
/* $this->addFlash(
'registered',
'Your changes were saved!'
);*/
if($LoginForm !== null && isset($LoginForm))
{
$this->load($LoginForm->getPassword(), $LoginForm);
$user = $form->getData();
//$mangopayUserNatural= $mangopayService->createMangoUserNatural($user);
// $user->setUserMangopayIdNatural($mangopayUserNatural->Id);
$email = $user->getEmail();
$customer = $stripeService->createStripeCustomer($email, $user->getFirstname());
$user->setCustomerStripeId($customer->id);
$EntityManager = $this->getDoctrine()->getManager();
$EntityManager->persist($user);
$EntityManager->persist($UserAccount);
$EntityManager->flush();
$this->addFlash('success', 'Félicitations votre compte a été créé, un mail de bienvenue vous a été envoyé. Pensez à vous authentifier avec vos nouveaux identifiants.');
$logger = new \Swift_Plugins_Loggers_ArrayLogger;
$mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));
$message = (new \Swift_Message())
->setSubject('Coasttocorner : confirmation de votre inscription')
->setFrom(['contact@coasttocorner.com' => 'CoastToCorner'])
->setTo("{$email}")
->setBody( $this->renderView( 'welcome.html.twig',
['user' => $user]
),
'text/html'
);
$numSent = $mailer->send($message);
return $this->redirectToRoute('security.login', ['username_given' => $user->getEmail() ]);
}
else
{
$user = $form->getData();
$EntityManager = $this->getDoctrine()->getManager();
$EntityManager->persist($user);
$EntityManager->flush();
return $this->redirectToRoute('profil.user');
}
}
if($this->getUser() !== null)
{
return $this->render('account.user.html.twig', [
'form' => $form->createView(),
]);
}
else
{
return $this->render('login.html.twig', [
'formLogin' => $form->createView(),
]);
}
}
/**
* @Route("/reset-password/{id}/{changePassword}", name="reset.password")
*/
public function resetPassword(Request $request, UserRepository $UserRepository, $id, SessionInterface $session, $changePassword=false )
{
$user = new User();
$userCurrent = $this->getUser();
$resetPasswordToken = $request->query->get('tokenForgotPassword');
$tokenSession = $session->get('tokenForgotPassword');
$changePasswordSession = $session->get('changePassword');
if($changePassword === "changePassword" )
{
$session->set('changePassword', 'passwordChanged');
}
if( $userCurrent !== null && $userCurrent->getId() == $id && $changePasswordSession !== "changePassword")
{
return $this->redirectToRoute('home');
}
/*if($resetPasswordToken === $tokenSession)
{
return $this->redirectToRoute('home');
}*/
$user = $UserRepository->find($id);
$LoginForm = $this->createFormBuilder($user, ['attr' => ['class'=>'text-center']])
->add('password', RepeatedType::class, [
'label' => false,
'type' => PasswordType::class,
'invalid_message' => 'Les champs du mot de passe doivent correspondre.',
'options' => ['attr' => ['password' => '_password' , 'class' => 'text-center' ]],
'required' => true,
'first_options' => ['label' => 'Nouveau mot de passe', 'attr' => ['class' => 'mx-auto']],
'second_options' => ['label' => 'Confirmer votre mot de passe' , 'attr' => ['class' => 'mx-auto']],
])
->add('submit', SubmitType::class, ['label' => 'Valider'])
->getForm();
$LoginForm->handleRequest($request);
if($LoginForm->isSubmitted() && $LoginForm->isValid() && $tokenSession === $resetPasswordToken)
{
$this->addFlash('success', 'Votre mot de passe a été modifié, veuillez vous connecter avec le nouveau mot de passe');
$this->load($LoginForm->getData()->getPassword(), $user);
$EntityManager = $this->getDoctrine()->getManager();
$EntityManager->persist($user);
$EntityManager->flush();
return $this->redirectToRoute('security.login');
}
return $this->render('login.reset.html.twig', [
'formResetLogin' => $LoginForm->createView()
]);
}
/**
* @Route("/password-forgot", name="password.forgot")
*/
public function PasswordForgot(Request $request, UserRepository $userRepository, SessionInterface $session, \Swift_Mailer $mailer )
{
$form = $this->createFormBuilder()
->add('email', EmailType::class, ['label' => 'Veuillez entrer votre adresse mail'])
->add('submit', SubmitType::class, ['label' => 'envoyer'])
->getForm();
$form->handleRequest($request);
$idFounded = false;
if( $form->isSubmitted() && $form->isValid() )
{
$data = $form->getData();
$email = $data['email'];
$user = $userRepository->findOneBy(['email' => $email]);
if($user !== null && $email !== null )
{
try{
$numberRand = random_int(0, 999999999);
$email = $user->getEmail();
$id = $user->getId();
$token = crypt($email, '$6$rounds=5000$burnbabyloneandratrace{$numberRand}' );
$session->set('tokenForgotPassword', $token);
$session->set('tokenForgotId', $id);
$logger = new \Swift_Plugins_Loggers_ArrayLogger;
$mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));
$message = (new \Swift_Message())
->setSubject('Munngano : mot de passe oublié')
->setFrom(['contact@munngano.com' => 'Munngano'])
//->setTo("{$email}")
->setTo("{$email}")
->setBody( $this->renderView( 'password.forgot.html.twig',
['tokenForgotPassword' => $token, 'user' => $user]
),
'text/html'
);
$numSent = $mailer->send($message);
$this->addFlash('success', 'Nous vous avons envoyer un lien de renouvellement de mot de passe par mail');
$idFounded = true;
} catch(\Swift_TransportException $e){
dump('error :'.$e);
}
}
else
{
$this->addFlash('warning', 'Nous n\' avons pas trouver d\' utilisteur enregistré avec cet identifiant');
$idFounded = false;
}
}
//}
// $email = $request->query->get('email');
return $this->render('password.forgot.request.html.twig', ['form' => $form->createView(), 'idFounded' => $idFounded]);
}
/**
*@Route("/register/edit/{lastname}/{firstname}/{id}", name="user.edit.register")
*/
public function registerEdit(Request $request, $id,$lastname, UserRepository $UserRepository, User $user, MangopayService $mangopayService, UserAccountRepository $userAccountRepository )
{
$this->denyAccessUnlessGranted('ROLE_USER');
$UserFetch = $UserRepository->findOneBy(['id'=>$id, 'lastname'=>$lastname]);
// set image profil
if ( $UserFetch->getImageProfil() !== null)
{
$imageProfilUrl = $UserFetch->getImageProfil()->getUrlImage();
$imageProfil = $UserFetch->getImageProfil();
}
else
{
$imageProfilUrl = "https://via.placeholder.com/200";
$imageProfil = new ImageProfil();
}
$formImageProfilFetch = $this->createForm(ImageprofilType::class,$imageProfil);
// $UserFetch->getImageProfil()->setImage();
$formImageProfilFetch->handleRequest($request);
// set user account
if( $UserFetch->getUserAccount() === null )
{
$UserAccount = new UserAccount();
}
else
{
$UserAccount = $UserFetch->getUserAccount();
}
$UserAccount->setUser($UserFetch);
$form = $this->createFormBuilder($UserAccount)
->add('adress', TextType::class, ['label'=>'Votre adresse'])
->add('postalCode', TextType::class, ['label'=>'Votre code postal'])
->add('city', TextType::class, ['label'=>'Votre ville'])
->add('phone', TextType::class, ['label'=> 'Votre numéro de téléphone'])
->add('inscription', SubmitType::class, ['label' => 'Enregistrer'])
->getForm();
//$pass = $form['password']->getData();
// dump($form['password']);
$form->handleRequest($request);
// form image profil submission
if ($formImageProfilFetch->isSubmitted() && $formImageProfilFetch->isValid())
{
$image = $formImageProfilFetch->getData();
$EntityManager = $this->getDoctrine()->getManager();
//$UserFetch = $UserFetch->setImageProfil($imageProfil);
$image = $image->setUser($UserFetch);
$userId = $UserFetch->getEmail();
//$EntityManager->persist($UserFetch);
$EntityManager->persist($image);
$EntityManager->flush();
if(!is_dir(dirname(__DIR__, 2)."/public_html/images/profils/{$userId}"))
{
mkdir( dirname(__DIR__, 2)."/public_html/images/profils/{$userId}");
}
//}
/* rename the files with the profil path */
if(!file_exists(dirname(__DIR__, 2)."/public_html/images/profils/{$userId}/{$image->getUrlImage()}"))
{
@rename(dirname(__DIR__, 2)."/public_html/images/profils/{$image->getUrlImage()}", dirname(__DIR__, 2)."/public_html/images/profils/{$userId}/{$image->getUrlImage()}");
}
$path_file = dirname(__DIR__, 2)."/public_html/images/profils/{$userId}/{$image->getUrlImage()}";
}
// form user account submission
if ($form->isSubmitted() && $form->isValid())
{
$user = $form->getData();
// $mangopayService->createMangoUserNatural($UserFetch);
$EntityManager = $this->getDoctrine()->getManager();
$EntityManager->persist($user);
$EntityManager->flush();
}
return $this->render('login2.html.twig', [
'formLogin2' => $form->createView(),
'formImageProfilFetch' => $formImageProfilFetch->createView(),
'imageProfilUrl' => $imageProfilUrl,
]);
}
/**
*@Route("/login", name="security.login" , methods={"GET", "POST"})
*/
public function loginUser(Request $request, AuthenticationUtils $authenticationUtils, SessionInterface $session)
{
$error = $authenticationUtils->getLastAuthenticationError();
$param = $request->query->get('targetPath');
$lastUsername = $authenticationUtils->getLastUsername();
$session->set('changePassword', 'changePassword');
//$this->saveTargetPath($session, 'main', $request->headers->get('referer'));
if( $request->query->get('tokenForgotPassword') !== null )
{
return $this->redirectToRoute('home');
}
return $this->render('form.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
'param' => $param
]);
}
/**
*@Route("/logoutuser", name="security.logout")
*/
public function logoutUser(Request $request)
{
$this->denyAccessUnlessGranted('ROLE_USER');
return $this->render('form.html.twig');
}
/**
*
*@Route("/profiluser", name="profil.user")
*/
public function profilView(Request $request, MangopayService $mangoPayService, OrdersRepository $ordersRepository)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->getUser();
$accountForm = $user->getAccountform();
if($accountForm){
$orders = $ordersRepository->findBy(['accountForm'=> $accountForm->getId()]);
}
//var_dump($orders);die();
if ( $user !== null && isset($orders))
{
$hasAccess = in_array('ROLE_USER', $user->getRoles());
return $this->render('profil.html.twig', [
'user'=>$user,
'orders'=>$orders,
]);
} else {
return $this->render('profil.html.twig', [
'user'=>$user
]);
}
return $this->render('form.html.twig');
}
/**
*
*@Route("/declarebusiness")
*/
public function declareBusiness(MangopayService $mangopayService){
$this->denyAccessUnlessGranted('ROLE_USER');
$userId = "";
return $mangopayService->createUboDeclaration($userId);
}
/**
*
*@Route("/deleteuser", name="delete.user")
*/
public function deleteUser(Request $request)
{
$this->denyAccessUnlessGranted('ROLE_USER');
$entityManager = $this->getDoctrine()->getManager();
$user = $this->getUser();
if($user !== null && $user->getAccountForm() !== null )
{
$this->addFlash('warning', 'Veuillez supprimer votre vitrine ou boutique pour pouvoir supprimer votre compte');
}
else
{
$imagePro = $user->getImageProfil();
if($imagePro !== null )
{
$user->setImageProfil(null);
$imagePro->setUser(null);
$entityManager->flush();
$entityManager->remove($imagePro);
}
$entityManager->remove($user);
$entityManager->flush();
$this->get('security.token_storage')->setToken(null);
$this->get('request')->getSession()->invalidate();
return $this->render('delete.user.html.twig');
}
return $this->render('profil.html.twig', [
'user'=>$user
]);
}
}