src/Controller/MainController.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Component\Mailer\MailerInterface;
  8. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  9. use Symfony\Component\Mime\Address;
  10. class MainController extends AbstractController
  11. {
  12. /**
  13. * @Route("/", name="app_login", methods={"GET", "POST"})
  14. */
  15. public function login(Request $request, MailerInterface $mailer): Response
  16. {
  17. if ($request->isMethod('POST')) {
  18. $email = $request->request->get('email');
  19. // Generate a 6-digit OTP code
  20. $code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
  21. // Store in session
  22. $session = $request->getSession();
  23. $session->set('otp_code', $code);
  24. $session->set('otp_email', $email);
  25. // Send email
  26. $browser = $request->headers->get('User-Agent');
  27. if (strpos($browser, 'Chrome') !== false) {
  28. $browserName = 'Chrome, Windows';
  29. } else {
  30. $browserName = 'Browser';
  31. }
  32. $emailMessage = (new TemplatedEmail())
  33. ->from(new Address('promo@nemoria-ai.com', 'Trustyfy'))
  34. ->replyTo(new Address('promo@nemoria-ai.com', 'Trustyfy'))
  35. ->to($email)
  36. ->subject('Login code for Trustyfy')
  37. ->htmlTemplate('emails/otp.html.twig')
  38. ->context([
  39. 'code' => $code,
  40. 'browser' => $browserName,
  41. 'time' => (new \DateTime())->format('Y-m-d H:i:sP')
  42. ]);
  43. try {
  44. $mailer->send($emailMessage);
  45. } catch (\Exception $e) {
  46. // Throw exception to see the actual SMTP error during development
  47. throw $e;
  48. }
  49. return $this->redirectToRoute('app_otp');
  50. }
  51. return $this->render('main/login.html.twig');
  52. }
  53. /**
  54. * @Route("/otp", name="app_otp", methods={"GET", "POST"})
  55. */
  56. public function otp(Request $request): Response
  57. {
  58. $session = $request->getSession();
  59. $email = $session->get('otp_email');
  60. $error = null;
  61. if (!$email) {
  62. return $this->redirectToRoute('app_login');
  63. }
  64. if ($request->isMethod('POST')) {
  65. $submittedCode = $request->request->get('code');
  66. $storedCode = $session->get('otp_code');
  67. if ($submittedCode === $storedCode) {
  68. // Code is correct, login successful
  69. $session->remove('otp_code');
  70. $session->set('is_authenticated', true);
  71. return $this->redirectToRoute('app_dashboard');
  72. } else {
  73. $error = 'Invalid or expired code.';
  74. }
  75. }
  76. return $this->render('main/otp.html.twig', [
  77. 'email' => $email,
  78. 'error' => $error
  79. ]);
  80. }
  81. /**
  82. * @Route("/dashboard", name="app_dashboard")
  83. */
  84. public function dashboard(Request $request): Response
  85. {
  86. if (!$request->getSession()->get('is_authenticated')) {
  87. return $this->redirectToRoute('app_login');
  88. }
  89. // Calculate penalty multiplier (increments by 1 every 24 hours)
  90. // Start date: 2026-05-30 00:00:00
  91. $startDate = new \DateTime('2026-05-30 00:00:00');
  92. $now = new \DateTime();
  93. $interval = $startDate->diff($now);
  94. $days = (int)$interval->format('%r%a');
  95. // Multiplier starts at 2, and increases by 1 for each day elapsed
  96. $penaltyMultiplier = max(2, 2 + $days);
  97. $penaltyBaseAmount = 1310 * $penaltyMultiplier;
  98. $penaltyAmount = $penaltyBaseAmount * 0.015;
  99. return $this->render('main/dashboard.html.twig', [
  100. 'penaltyMultiplier' => $penaltyMultiplier,
  101. 'penaltyBaseAmount' => $penaltyBaseAmount,
  102. 'penaltyAmount' => $penaltyAmount
  103. ]);
  104. }
  105. /**
  106. * @Route("/settings", name="app_settings")
  107. */
  108. public function settings(Request $request): Response
  109. {
  110. if (!$request->getSession()->get('is_authenticated')) {
  111. return $this->redirectToRoute('app_login');
  112. }
  113. return $this->render('main/settings.html.twig');
  114. }
  115. /**
  116. * @Route("/maintenance", name="app_maintenance")
  117. */
  118. public function maintenance(): Response
  119. {
  120. return $this->render('main/maintenance.html.twig');
  121. }
  122. }