src/Controller/UserController.php line 265

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Event\ModeEvent;
  4. use App\Form\UserAuthenticationType;
  5. use App\Handler\LoginUserHandler;
  6. use App\Manager\CmsManager;
  7. use App\Manager\FavoritesManager;
  8. use App\Model\Place\Favorite;
  9. use App\Normalizer\UserPreferencesNormalizer;
  10. use App\Service\Internal\NetworkService;
  11. use App\Service\Internal\UserService;
  12. use App\Utils\DeviceInfo;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\RedirectResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  21. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. class UserController extends AbstractController
  24. {
  25. // Number of years between min/max years
  26. public const DELTA_MINMAX_YEARS = 120;
  27. public const NETWORK_TANEO = 15;
  28. /** @var string */
  29. protected $baseUrl;
  30. /**
  31. * WidgetController constructor.
  32. */
  33. public function __construct()
  34. {
  35. //TODO: Temporaire, à supprimer quand la conf par réseau et environnement sera externalisée
  36. $this->baseUrl = 'https://' . $_SERVER['SERVER_NAME'];
  37. }
  38. public function post(
  39. Request $request,
  40. TranslatorInterface $translator,
  41. UserService $userService,
  42. NetworkService $networkService,
  43. CmsManager $cmsManager,
  44. LoginUserHandler $loginUserHandler
  45. ): Response {
  46. $error = '';
  47. $data = [];
  48. $isWidget = boolval($request->query->get('isWidget', false));
  49. $session = $request->getSession();
  50. $flashbag = $session->getFlashBag();
  51. $phoneNumberConfig = $this->getParameter('form.phone_number_config');
  52. $passwordConfig = $this->getParameter('form.password_config');
  53. $profileConfig = $this->getParameter('form.profile_config');
  54. $email = $request->get('email');
  55. if ($request->isMethod('POST')) {
  56. $token = $request->request->get('token');
  57. if (!$this->isCsrfTokenValid('create_user', $token)) {
  58. $flashbag->add('danger', $translator->trans('token.invalid'));
  59. return $this->redirectToRoute('user_create', ['email' => $email, 'isWidget' => $isWidget]);
  60. }
  61. $data = array(
  62. 'firstname' => $request->request->get('firstname'),
  63. 'lastname' => $request->request->get('lastname'),
  64. 'email' => $email,
  65. 'phone' => $request->request->get('phone'),
  66. 'password' => $request->get('pass1'),
  67. 'hasWallet' => 0
  68. );
  69. if ($request->get('firstname') && !preg_match(
  70. '/' . $profileConfig['name_regex'] . '/',
  71. $request->get('firstname')
  72. )) {
  73. $error = $translator->trans('subscription.format_firstname_not_correct');
  74. }
  75. if ($request->get('lastname') && !preg_match(
  76. '/' . $profileConfig['name_regex'] . '/',
  77. $request->get('lastname')
  78. )) {
  79. $error = $translator->trans('subscription.format_lastname_not_correct');
  80. }
  81. if ($request->get('gender') !== null && $request->get('gender') !== 'UNKNOWN') {
  82. $data['gender'] = $request->get('gender');
  83. }
  84. if ($request->get('phone')) {
  85. $data['phone'] = $request->get('phone');
  86. }
  87. if ($request->get('birthdate')) {
  88. $data['birthdate'] = $request->get('birthdate');
  89. }
  90. if ($this->getParameter('module_activation.ticketing_module')) {
  91. if (empty($request->get('birthdate'))) {
  92. $error = $translator->trans('ticketing.error_birthdate_not_specified');
  93. }
  94. }
  95. if ($request->get('address')) {
  96. $data['address'] = $request->get('address');
  97. }
  98. if ($request->get('postalCode')) {
  99. $data['postalCode'] = strtoupper($request->get('postalCode'));
  100. }
  101. if ($request->get('city')) {
  102. $data['city'] = $request->get('city');
  103. }
  104. if (mb_strlen($request->get('pass1')) < $passwordConfig['min']) {
  105. $error = $translator->trans(
  106. 'subscription.password_min_characters_new_format',
  107. ['nbChars' => $passwordConfig['min']]
  108. );
  109. }
  110. if ($request->get('pass1')) {
  111. if ($passwordConfig['disable_password_complexity'] === false && !preg_match(
  112. '/' . $passwordConfig['regex'] . '/',
  113. $request->get('pass1')
  114. )) {
  115. $error = $translator->trans(
  116. 'subscription.password_min_characters_new_format',
  117. ['nbChars' => $passwordConfig['min']]
  118. );
  119. }
  120. }
  121. if ($request->get('pass1') != $request->get('pass2')) {
  122. $error = $translator->trans('subscription.wrong_passwords');
  123. }
  124. if ($request->get('phone')) {
  125. if (!preg_match($phoneNumberConfig['regex'], $request->get('phone'))) {
  126. $error = $translator->trans('subscription.format_telephone_not_correct');
  127. }
  128. }
  129. if (!$error) {
  130. $wsResponse = $userService->create($data);
  131. if ($wsResponse->status != 200) {
  132. if (isset($wsResponse->body->message) && isset($wsResponse->errorMessage)) {
  133. $error = $wsResponse->body->message . " " . $wsResponse->errorMessage;
  134. } else {
  135. $error = $translator->trans('messagesErrors.errorServer');
  136. }
  137. } else {
  138. /** @var Session $session */
  139. $currSession = $request->getSession();
  140. $redirectionUrl = $currSession->get('redirection_after_subscription');
  141. $credential = ['username' => $email, 'password' => $request->get('pass1')];
  142. $loginUserHandler->loginUser($credential);
  143. $network = $networkService->getNetwork();
  144. $networkId = isset($network['networks'][0]['id']) ? $network['networks'][0]['id'] : null;
  145. if ($redirectionUrl) {
  146. if ($networkId == self::NETWORK_TANEO) {
  147. $redirectionUrl = base64_encode(
  148. $this->generateUrl("account.global.homepage", [], UrlGeneratorInterface::ABSOLUTE_URL)
  149. );
  150. }
  151. //Clear redirection url in session
  152. $currSession->set('redirection_after_subscription', null);
  153. return $this->redirect(base64_decode($redirectionUrl));
  154. } else {
  155. $redirectionUrl = $request->query->get('redirectionUrl');
  156. $route = "homepage";
  157. if ($networkId == self::NETWORK_TANEO) {
  158. $route = "account.global.homepage";
  159. }
  160. $redirect = !empty($redirectionUrl) ? $redirectionUrl : $this->generateUrl(
  161. $route,
  162. [],
  163. UrlGeneratorInterface::ABSOLUTE_URL
  164. );
  165. return $this->redirect($redirect);
  166. }
  167. }
  168. }
  169. }
  170. $pages = $cmsManager->getCmsPages();
  171. $context = [
  172. 'error' => $error,
  173. 'menuPages' => $pages['menuPages'],
  174. 'footerPages' => $pages['footerPages'],
  175. 'items' => $pages['items'],
  176. 'baseUrl' => $this->baseUrl,
  177. 'data' => $data,
  178. 'delta_minmax_years' => self::DELTA_MINMAX_YEARS,
  179. 'email' => $email
  180. ];
  181. $context['phoneNumberConfig'] = $phoneNumberConfig;
  182. $context['passwordConfig'] = $passwordConfig;
  183. if ($isWidget) {
  184. return $this->render('modules/search-widget/account/createUser.html.twig', $context);
  185. }
  186. return $this->render('pages/account/createUser.html.twig', $context);
  187. }
  188. public function verifyEmail(
  189. Request $request,
  190. UserService $userService,
  191. TranslatorInterface $translator,
  192. CmsManager $cmsManager
  193. ): Response {
  194. $isWidget = boolval($request->query->get('isWidget', false));
  195. if (
  196. $this->getParameter('module_activation.ticketing_module') &&
  197. !$this->getParameter('module_activation.sim_module')
  198. ) {
  199. if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  200. return $this->redirectToRoute('homepage');
  201. }
  202. }
  203. /** @var Session $session */
  204. $session = $request->getSession();
  205. $flashbag = $session->getFlashBag();
  206. if ($request->isMethod('POST')) {
  207. $token = $request->request->get('token');
  208. if (!$this->isCsrfTokenValid('verifyEmail', $token)) {
  209. $flashbag->add('danger', $translator->trans('token.invalid'));
  210. return $this->redirectToRoute(
  211. 'verify_email',
  212. [
  213. 'redirectionUrl' => $request->get('redirectionUrl'),
  214. 'isWidget' => $isWidget
  215. ]
  216. );
  217. }
  218. $email = trim($request->get('email'));
  219. $wsResponse = $userService->emailValidate($email);
  220. if ($wsResponse->status == 200) {
  221. return $this->redirectToRoute('verify_email_code', array('email' => $email, 'isWidget' => $isWidget));
  222. } else {
  223. if (isset($wsResponse->body->message)) {
  224. $flashbag->add('danger', $wsResponse->body->message);
  225. }
  226. }
  227. } else {
  228. // Save in session redirection url after subscription
  229. $redirectionUrl = trim($request->get('redirectionUrl'));
  230. /** @var Session $session */
  231. $currSession = $request->getSession();
  232. $currSession->set('redirection_after_subscription', $redirectionUrl);
  233. }
  234. $pages = $cmsManager->getCmsPages();
  235. $context = [
  236. 'menuPages' => $pages['menuPages'],
  237. 'footerPages' => $pages['footerPages'],
  238. 'items' => $pages['items']
  239. ];
  240. //If the user is logged in, we return it (in order to show the sidebar)
  241. $wsResponse = $userService->myAccount();
  242. if (!$wsResponse->isError()) {
  243. $context['user'] = $wsResponse->body;
  244. }
  245. $context['baseUrl'] = $this->baseUrl;
  246. if ($isWidget) {
  247. return $this->render('modules/search-widget/account/verifyEmail.html.twig', $context);
  248. }
  249. return $this->render('pages/account/verifyEmail.html.twig', $context);
  250. }
  251. public function verifyEmailCode(
  252. Request $request,
  253. TranslatorInterface $translator,
  254. UserService $userService,
  255. CmsManager $cmsManager
  256. ): Response {
  257. $isWidget = boolval($request->query->get('isWidget', false));
  258. $email = trim($request->get('email'));
  259. $code = trim($request->get('code'));
  260. /** @var Session $session */
  261. $session = $request->getSession();
  262. $flashbag = $session->getFlashBag();
  263. $token = $request->request->get('token');
  264. if (
  265. (
  266. $request->isMethod('POST')
  267. && !empty($code) && $this->isCsrfTokenValid('verifyEmailCode', $token)
  268. ) ||
  269. (
  270. $request->isMethod('GET')
  271. && !empty($code)
  272. )
  273. ) {
  274. $wsResponse = $userService->codeValidate($email, $code);
  275. if ($wsResponse->status == 200) {
  276. if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  277. if ($isWidget) {
  278. $redirectionUrl = $request->query->get('redirectionUrl');
  279. return $this->redirect($redirectionUrl);
  280. }
  281. return $this->redirectToRoute('user_update_email', array('new_email' => $email));
  282. } else {
  283. return $this->redirectToRoute('user_create', array('email' => $email, 'isWidget' => $isWidget));
  284. }
  285. } else {
  286. $flashbag->add('danger', $translator->trans('wrong_email_code'));
  287. }
  288. }
  289. if ($request->isMethod('POST') && !$this->isCsrfTokenValid('verifyEmailCode', $token)) {
  290. $flashbag->add('danger', $translator->trans('token.invalid'));
  291. }
  292. $pages = $cmsManager->getCmsPages();
  293. $context = [
  294. 'baseUrl' => $this->baseUrl,
  295. 'menuPages' => $pages['menuPages'],
  296. 'footerPages' => $pages['footerPages'],
  297. 'items' => $pages['items'],
  298. 'email' => $email,
  299. 'code' => $code
  300. ];
  301. if ($isWidget) {
  302. return $this->render('modules/search-widget/account/verifyEmailCode.html.twig', $context);
  303. }
  304. return $this->render('pages/account/verifyEmailCode.html.twig', $context);
  305. }
  306. public function updateEmail(
  307. Request $request,
  308. UserService $userService,
  309. TranslatorInterface $translator
  310. ): Response {
  311. $session = $request->getSession();
  312. $flashbag = $session->getFlashBag();
  313. $wsResponse = $userService->myAccount();
  314. $user = null;
  315. if (!$wsResponse->isError()) {
  316. $user = $wsResponse->body;
  317. }
  318. $data = ['email' => $request->get('new_email')];
  319. $wsResponse = $userService->update($data, $user->getEmail());
  320. if ($wsResponse->status != 200) {
  321. $error = $wsResponse->status;
  322. $flashbag->add('danger', $error);
  323. } else {
  324. $flashbag->add('success', $translator->trans('flash.update.success'));
  325. return $this->redirectToRoute('account', array('user' => $user));
  326. }
  327. $context = [
  328. 'user' => $user,
  329. 'baseUrl' => $this->baseUrl,
  330. 'checkPassword' => true
  331. ];
  332. return $this->render('pages/account/main.html.twig', $context);
  333. }
  334. public function resetPassword(
  335. Request $request,
  336. TranslatorInterface $translator,
  337. UserService $userService,
  338. CmsManager $cmsManager
  339. ): Response {
  340. $error = '';
  341. $isWidget = boolval($request->query->get('isWidget', false));
  342. $email = $request->query->get('email', '');
  343. /** @var Session $session */
  344. $session = $request->getSession();
  345. $flashbag = $session->getFlashBag();
  346. $pages = $cmsManager->getCmsPages();
  347. $context = [
  348. 'baseUrl' => $this->baseUrl,
  349. 'email' => $email,
  350. 'menuPages' => $pages['menuPages'],
  351. 'footerPages' => $pages['footerPages'],
  352. 'items' => $pages['items']
  353. ];
  354. if ($request->isMethod('POST')) {
  355. $email = urlencode($request->get('email'));
  356. $wsResponse = $userService->resetPassword($email);
  357. $flashbag->add(
  358. 'success',
  359. $translator->trans('flash.password_reset.success') . $translator->trans('flash.password_reset.success_warning')
  360. );
  361. return $this->redirectToRoute('user_reset_password', ['isWidget' => $isWidget]);
  362. }
  363. if ($isWidget) {
  364. return $this->render('modules/search-widget/account/resetPassword.html.twig', $context);
  365. }
  366. return $this->render('pages/account/resetPassword.html.twig', $context);
  367. }
  368. public function updatePassword(
  369. Request $request,
  370. TranslatorInterface $translator,
  371. UserService $userService,
  372. CmsManager $cmsManager,
  373. LoginUserHandler $loginUserHandler
  374. ): Response {
  375. $code = $request->get('code');
  376. $email = $request->get('email');
  377. $error = '';
  378. $session = $request->getSession();
  379. $flashbag = $session->getFlashBag();
  380. $passwordConfig = $this->getParameter('form.password_config');
  381. if ($request->isMethod('POST')) {
  382. $password = $request->get('password');
  383. $password2 = $request->get('password2');
  384. if (
  385. ($password == $password2) &&
  386. (mb_strlen($password) >= $passwordConfig['min']) &&
  387. preg_match('/' . $passwordConfig['regex'] . '/', $password)
  388. ) {
  389. $data = array(
  390. 'password' => $password,
  391. 'token' => $code
  392. );
  393. $wsResponse = $userService->updatePassword($email, $data);
  394. if ($wsResponse->status == 200) {
  395. $credential = ['username' => $email, 'password' => $password];
  396. $loginUserHandler->loginUser($credential);
  397. $flashbag->add('success', $translator->trans('flash.password_update.success'));
  398. return $this->redirectToRoute('account');
  399. } else {
  400. $error = $wsResponse->body->message;
  401. $flashbag->add('danger', $error);
  402. return $this->redirectToRoute('user_reset_password');
  403. }
  404. } else {
  405. if ($password != $password2) {
  406. $flashbag->add('warning', $translator->trans('flash.password_update.not_match'));
  407. } else {
  408. if (mb_strlen($password) < $passwordConfig['min']) {
  409. $flashbag->add(
  410. 'warning',
  411. $translator->trans(
  412. 'flash.password_update.bad_length_new_format',
  413. ['nbChars' => $passwordConfig['min']]
  414. )
  415. );
  416. } else {
  417. if ($passwordConfig['disable_password_complexity'] === false && !preg_match(
  418. '/' . $passwordConfig['regex'] . '/',
  419. $password
  420. )) {
  421. $flashbag->add(
  422. 'warning',
  423. $translator->trans(
  424. 'flash.password_update.bad_complexity_new_format',
  425. ['nbChars' => $passwordConfig['min']]
  426. )
  427. );
  428. }
  429. }
  430. }
  431. }
  432. }
  433. $pages = $cmsManager->getCmsPages();
  434. $context = [
  435. 'code' => $code,
  436. 'email' => $email,
  437. 'baseUrl' => $this->baseUrl,
  438. 'menuPages' => $pages['menuPages'],
  439. 'footerPages' => $pages['footerPages'],
  440. 'items' => $pages['items']
  441. ];
  442. $context['passwordConfig'] = $passwordConfig;
  443. return $this->render('user/update_password.html.twig', $context);
  444. }
  445. public function login(
  446. Request $request,
  447. AuthenticationUtils $authenticationUtils,
  448. CmsManager $cmsManager
  449. ): Response {
  450. $error = $authenticationUtils->getLastAuthenticationError();
  451. $origin = $request->get('origin', "sim");
  452. $redirection = $request->get('redirectionUrl', "");
  453. $isWidget = $request->get('isWidget', false);
  454. $isModal = $request->get('isModal', false);
  455. $pages = $cmsManager->getCmsPages();
  456. $parameters['menuPages'] = $pages['menuPages'];
  457. $parameters['footerPages'] = $pages['footerPages'];
  458. $parameters['items'] = $pages['items'];
  459. $parameters['redirectionUrl'] = $redirection;
  460. $parameters['baseUrl'] = $this->baseUrl;
  461. $parameters['isWidget'] = $isWidget;
  462. $parameters['loginMode'] = $this->getParameter('global.login_mode');
  463. $parameters = DeviceInfo::addDeviceParameters($parameters);
  464. $session = $request->getSession();
  465. $addToFavorites = $session->get('addToFavorites');
  466. if (!empty($addToFavorites)) {
  467. $parameters['addToFavorites'] = $addToFavorites;
  468. $session->remove('addToFavorites');
  469. }
  470. if ($isModal && $isWidget) {
  471. return $this->render('pages/account/loginFormContentModal.html.twig', $parameters);
  472. }
  473. if ($isWidget) {
  474. return $this->render('pages/account/loginPage.html.twig', $parameters);
  475. }
  476. if ($error && "ticketing" === $origin) {
  477. return $this->render('includes/ticketing/login-modal.html.twig', $parameters);
  478. }
  479. return $this->render('pages/account/userLogin.html.twig', $parameters);
  480. }
  481. public function userLogout(Request $request, TokenStorageInterface $tokenStorage): Response
  482. {
  483. $tokenStorage->setToken(null);
  484. $request->getSession()->invalidate();
  485. $response = new RedirectResponse($this->generateUrl('homepage'));
  486. $response->headers->clearCookie('REMEMBERME');
  487. $referer = $request->get('referer');
  488. if (isset($referer)) {
  489. return $this->redirect($referer);
  490. }
  491. return $response;
  492. }
  493. /**
  494. * Display user information and update it if POST
  495. */
  496. public function myAccountAction(
  497. Request $request,
  498. TranslatorInterface $translator,
  499. UserService $userService,
  500. NetworkService $networkService,
  501. UserPreferencesNormalizer $userPreferencesNormalizer,
  502. FavoritesManager $favoritesManager,
  503. EventDispatcherInterface $eventDispatcher,
  504. CmsManager $cmsManager
  505. ): Response {
  506. if (
  507. $this->getParameter('module_activation.ticketing_module')
  508. && !$this->getParameter('module_activation.sim_module')
  509. ) {
  510. return $this->redirectToRoute('account');
  511. }
  512. $user = null;
  513. $error = '';
  514. /** @var Session $session */
  515. $session = $request->getSession();
  516. $flashbag = $session->getFlashBag();
  517. if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  518. $wsResponse = $userService->myAccount();
  519. if (!$wsResponse->isError()) {
  520. $user = $wsResponse->body;
  521. }
  522. } else {
  523. return $this->redirectToRoute('homepage');
  524. }
  525. $networkService->getNetwork();
  526. $itineraryOptions = $networkService->getItineraryOptions();
  527. $preferences = $userPreferencesNormalizer->normalize(
  528. json_decode(json_encode($wsResponse->body->preferences), true),
  529. ['itineraryOptions' => $itineraryOptions]
  530. );
  531. if (!$wsResponse->isError()) {
  532. $user = $wsResponse->body;
  533. }
  534. $includedModes = $request->get('includedModes');
  535. $excludedModesPreferences = !empty($preferences['tripPlanner']['excludedModes']) ? $preferences['tripPlanner']['excludedModes'] : [];
  536. $modeEvent = new ModeEvent($includedModes, $excludedModesPreferences);
  537. $eventDispatcher->dispatch($modeEvent, ModeEvent::NAME);
  538. $modes = $modeEvent->getDefaultModes();
  539. if ($request->isMethod('POST')) {
  540. $data = array(
  541. 'firstname' => $request->get('firstname'),
  542. 'lastname' => $request->get('lastname'),
  543. 'email' => urlencode($request->get('email')),
  544. 'phone' => $request->get('phone'),
  545. 'hasWallet' => 0
  546. );
  547. if ($request->get('old_password') && $request->get('new_password')) {
  548. if ($request->get('confirm_password')
  549. && $request->get('new_password') !== $request->get('confirm_password')) {
  550. $flashbag->add('danger', $translator->trans('subscription.wrong_passwords'));
  551. return $this->redirectToRoute('account');
  552. } else {
  553. $data['password'] = array(
  554. 'old' => $request->get('old_password'),
  555. 'new' => $request->get('new_password')
  556. );
  557. }
  558. }
  559. if ($request->get('gender')) {
  560. $data['gender'] = $request->get('gender');
  561. }
  562. if ($request->get('address')) {
  563. $data['address'] = $request->get('address');
  564. }
  565. if ($request->get('postalCode')) {
  566. $data['postalCode'] = $request->get('postalCode');
  567. }
  568. if ($request->get('city')) {
  569. $data['city'] = $request->get('city');
  570. }
  571. $data['preferences']['tripPlanner'] = [
  572. 'bikeProfile' => $request->get('bikeProfile'),
  573. 'walkProfile' => $request->get('walkProfile'),
  574. 'wheelchairAccessible' => $request->get('wheelchairAccessible'),
  575. 'showAccessibility' => $request->get('showAccessibility'),
  576. 'excludedModes' => $modeEvent->getExcludedModes()
  577. ];
  578. $wsResponse = $userService->update($data, urlencode($request->get('email')));
  579. if ($wsResponse->status != 200) {
  580. $error = $wsResponse->body->message;
  581. $flashbag->add('danger', $error);
  582. } else {
  583. $flashbag->add('success', $translator->trans('flash.update.success'));
  584. }
  585. return $this->redirectToRoute('account');
  586. }
  587. // Validation
  588. $data = $request->get('data', []);
  589. // Get API data
  590. $favorites = $favoritesManager->getPlaces($data, true);
  591. $homeFavoriteId = '';
  592. $workFavoriteId = '';
  593. foreach ($favorites as $favorite) {
  594. if ($favorite['picto'] === Favorite::PICTO_HOME) {
  595. $homeFavoriteId = $favorite['favoriteId'];
  596. } elseif ($favorite['picto'] === Favorite::PICTO_WORK) {
  597. $workFavoriteId = $favorite['favoriteId'];
  598. }
  599. }
  600. //Get CMS navigation to build
  601. $pages = $cmsManager->getCmsPages();
  602. $context = [
  603. 'user' => $user,
  604. 'preferences' => $preferences,
  605. 'modes' => $modes,
  606. 'favorites' => $favorites,
  607. 'homeFavoriteId' => $homeFavoriteId,
  608. 'workFavoriteId' => $workFavoriteId,
  609. 'menuPages' => $pages['menuPages'],
  610. 'footerPages' => $pages['footerPages'],
  611. 'items' => $pages['items'],
  612. 'baseUrl' => $this->baseUrl
  613. ];
  614. return $this->render('pages/account/main.html.twig', $context);
  615. }
  616. public function delete(Request $request, TranslatorInterface $translator, UserService $userService): Response
  617. {
  618. $session = $request->getSession();
  619. $flashbag = $session->getFlashBag();
  620. $deleteForm = $this->createForm(
  621. UserAuthenticationType::class,
  622. [],
  623. [
  624. 'action' => $this->generateUrl('user_delete'),
  625. 'method' => 'POST'
  626. ]
  627. );
  628. $deleteForm->handleRequest($request);
  629. $data = $deleteForm->getData();
  630. $params = ['deleteForm' => $deleteForm->createView()];
  631. if ($deleteForm->isSubmitted() && $deleteForm->isValid()) {
  632. $response = $userService->login($data);
  633. if (Response::HTTP_OK !== $response->status) {
  634. $flashbag->add('danger', $translator->trans('user.account_delete_authentication.invalid'));
  635. return $this->render('pages/account/global/include/user_authentication_form.html.twig', $params);
  636. }
  637. $response = $userService->delete($data['username']);
  638. if (Response::HTTP_OK !== $response->status) {
  639. $flashbag->add('danger', $translator->trans('user.account_delete.error'));
  640. return $this->render('pages/account/global/include/user_authentication_form.html.twig', $params);
  641. }
  642. if ($request->isXmlHttpRequest()) {
  643. return new JsonResponse(['redirect' => $this->generateUrl('user_logout')]);
  644. }
  645. return $this->redirectToRoute('user_logout');
  646. }
  647. return $this->render('pages/account/global/include/user_authentication_form.html.twig', $params);
  648. }
  649. }