<?php
/**
* This file is part of the CosaVostra, TrackPay, Symfony package.
*
* (c) Mohamed Radhi GUENNICHI <rg@mate.tn> <+216 50 711 816>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace App\Controller\App;
use App\Entity\User;
use App\Entity\SecurityQuestions;
use App\Factory\OrganizationContactFactory;
use App\Form\App\RegisterType;
use App\Manager\UserManager;
use App\Repository\WorkflowRepository;
use App\Repository\SecurityQuestionsRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* Class SecurityController
*
* @package App\Controller\App
*
* @Route(name="app_security_")
*/
class SecurityController extends AbstractController
{
/**
* @param AuthenticationUtils $authenticationUtils
*
* @return Response
*
* @Route("/signin", name="signin")
*/
public function signin(AuthenticationUtils $authenticationUtils): Response
{
if (null !== $this->getUser()) {
return $this->redirectToRoute('app_page_index');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('app/security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error
]);
}
/**
* @param Request $request
* @param UserManager $userManager
* @param WorkflowRepository $workflowRepository
* @param OrganizationContactFactory $organizationContactFactory
*
* @return Response
*
* @Route("/signup", name="signup")
*/
public function signup(Request $request, UserManager $userManager, WorkflowRepository $workflowRepository, OrganizationContactFactory $organizationContactFactory): Response
{
if (null !== $this->getUser()) {
return $this->redirectToRoute('app_page_index');
}
$form = $this->createForm(RegisterType::class, $user = $userManager->createNew(User::ROLE_APP, false), [
'action' => $this->generateUrl('app_security_signup', $request->query->all())
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setWorkflow(
$workflowRepository->findDefault()
);
$user->setDepositWorkflow(
$workflowRepository->findDefaultDeposit()
);
// Set locale for user organization
$user
->getOrganization()
->setLocale($user->getLocale());
$organizationContactFactory->createForUser($user, true);
$userManager
->encode($user)
->save($user);
return $this->render('app/security/signup/final_step.html.twig', [
'crm' => $request->query->get('crm')
]);
}
return $this->render('app/security/signup/index.html.twig', [
'form' => $form->createView(),
'crm' => $request->query->get('crm')
]);
}
/**
* @return Response
*
* @Route("/signup1", name="signup1")
*/
public function signup1(): Response
{
return $this->render('app/security/static/signup1.html.twig');
}
/**
* @return Response
*
* @Route("/signup2", name="signup2")
*/
public function signup2(): Response
{
return $this->render('app/security/static/signup2.html.twig');
}
/**
* @return Response
*
* @Route("/signup3", name="signup3")
*/
public function signup3(): Response
{
return $this->render('app/security/static/signup3.html.twig');
}
/**
* @param Request $request
* @param EntityManagerInterface $entityManager
*
* @return JsonResponse
*
* @Route("/ajax-get-user-questions", name="user_questions_list_ajax", methods={"GET"})
*/
public function ajaxGetUserSecurityQuestions(Request $request,EntityManagerInterface $entityManager, TranslatorInterface $translate): JsonResponse
{
$email = $request->query->get('email');
$response = [];
$user = $entityManager->getRepository(User::class)->findOneByUsername($email);
if (null === $user) {
$response['status'] = "0";
$response['error'] = $translate->trans('reset_password.error.mail_not_assosiated_with_any_user');
} else {
$response['status'] = "1";
$response['question'] = null;
foreach ($user->getSecurityQuestions() as $question) {
$response['question'] = $question->getQuestion();
}
}
return new JsonResponse($response);
}
/**
* @param Request $request
* @param EntityManagerInterface $entityManager
*
* @return JsonResponse
*
* @Route("/add-user-questions", name="user_questions_add", methods={"POST"})
*/
public function addUserSecurityQuestions(Request $request,EntityManagerInterface $entityManager ): JsonResponse
{
$question = $request->request->get('question');
$answer = $request->request->get('answer');
$response['statuts'] = 0;
if (!empty($question) && !empty($answer)) {
$user = $this->getUser();
$userSecurityQuestion = new SecurityQuestions();
$userSecurityQuestion->setQuestion($question);
$userSecurityQuestion->setAnswer($answer);
$entityManager->persist($userSecurityQuestion);
$user->addSecurityQuestion($userSecurityQuestion);
$entityManager->persist($user);
$entityManager->flush();
$response['statuts'] = 1;
}
return new JsonResponse($response);
}
/**
* @param Request $request
* @param EntityManagerInterface $entityManager
*
* @return JsonResponse
*
* @Route("/update-user-questions", name="user_questions_update", methods={"POST"})
*/
public function updateUserSecurityQuestions(Request $request,EntityManagerInterface $entityManager,SecurityQuestionsRepository $securityQuestionsRepository): JsonResponse
{
$questionId = $request->request->get('questionId');
$question = $request->request->get('question');
$answer = $request->request->get('answer');
$response['statuts'] = 0;
$userSecurityQuestion = $securityQuestionsRepository->find($questionId);
if (!empty($question) && null !== $userSecurityQuestion) {
(! empty($answer))? $userSecurityQuestion->setAnswer($answer): "";
$userSecurityQuestion ->setQuestion($question);
$entityManager ->persist($userSecurityQuestion);
$entityManager ->flush();
$response['statuts'] = 1;
}
return new JsonResponse($response);
}
}