src/Controller/UserController.php line 215

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