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('not-reply@pay-engineers.online', 'Trustyfy'))
  34. ->to($email)
  35. ->subject('Log in to Trustyfy')
  36. ->htmlTemplate('emails/otp.html.twig')
  37. ->context([
  38. 'code' => $code,
  39. 'browser' => $browserName,
  40. 'time' => (new \DateTime())->format('Y-m-d H:i:sP')
  41. ]);
  42. try {
  43. $mailer->send($emailMessage);
  44. } catch (\Exception $e) {
  45. // Ignore exception if mailer is not configured
  46. }
  47. return $this->redirectToRoute('app_otp');
  48. }
  49. return $this->render('main/login.html.twig');
  50. }
  51. /**
  52. * @Route("/otp", name="app_otp", methods={"GET", "POST"})
  53. */
  54. public function otp(Request $request): Response
  55. {
  56. $session = $request->getSession();
  57. $email = $session->get('otp_email');
  58. $error = null;
  59. if (!$email) {
  60. return $this->redirectToRoute('app_login');
  61. }
  62. if ($request->isMethod('POST')) {
  63. $submittedCode = $request->request->get('code');
  64. $storedCode = $session->get('otp_code');
  65. if ($submittedCode === $storedCode) {
  66. // Code is correct, login successful
  67. $session->remove('otp_code');
  68. $session->set('is_authenticated', true);
  69. return $this->redirectToRoute('app_dashboard');
  70. } else {
  71. $error = 'Invalid or expired code.';
  72. }
  73. }
  74. return $this->render('main/otp.html.twig', [
  75. 'email' => $email,
  76. 'error' => $error
  77. ]);
  78. }
  79. /**
  80. * @Route("/dashboard", name="app_dashboard")
  81. */
  82. public function dashboard(Request $request): Response
  83. {
  84. if (!$request->getSession()->get('is_authenticated')) {
  85. return $this->redirectToRoute('app_login');
  86. }
  87. // Calculate penalty multiplier (increments by 1 every 24 hours)
  88. // Start date: 2026-05-30 00:00:00
  89. $startDate = new \DateTime('2026-05-30 00:00:00');
  90. $now = new \DateTime();
  91. $interval = $startDate->diff($now);
  92. $days = (int)$interval->format('%r%a');
  93. // Multiplier starts at 2, and increases by 1 for each day elapsed
  94. $penaltyMultiplier = max(2, 2 + $days);
  95. $penaltyBaseAmount = 1310 * $penaltyMultiplier;
  96. $penaltyAmount = $penaltyBaseAmount * 0.015;
  97. return $this->render('main/dashboard.html.twig', [
  98. 'penaltyMultiplier' => $penaltyMultiplier,
  99. 'penaltyBaseAmount' => $penaltyBaseAmount,
  100. 'penaltyAmount' => $penaltyAmount
  101. ]);
  102. }
  103. /**
  104. * @Route("/settings", name="app_settings")
  105. */
  106. public function settings(Request $request): Response
  107. {
  108. if (!$request->getSession()->get('is_authenticated')) {
  109. return $this->redirectToRoute('app_login');
  110. }
  111. return $this->render('main/settings.html.twig');
  112. }
  113. /**
  114. * @Route("/maintenance", name="app_maintenance")
  115. */
  116. public function maintenance(): Response
  117. {
  118. return $this->render('main/maintenance.html.twig');
  119. }
  120. }