src/Controller/WebController.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\BucketsRepository;
  4. use App\Repository\InfoRepository;
  5. use App\Repository\IssuesRepository;
  6. use App\Repository\NFHSRepository;
  7. use App\Repository\UpdatesRepository;
  8. use App\Repository\CreateRepository;
  9. use App\Repository\BannerRepository;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  12. use Symfony\Contracts\Translation\TranslatorInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use App\Entity\ChatUser;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Psr\Log\LoggerInterface;
  20. use App\Repository\SubscriberRepository;
  21. use App\Entity\Subscriber;
  22. class WebController extends AbstractController
  23. {
  24.   private $entityManager;
  25.     private $translator;
  26.     private $logger;
  27.     private $otpValidityDuration;
  28.     public function __construct(
  29.         EntityManagerInterface $entityManager,
  30.         TranslatorInterface $translator,
  31.         LoggerInterface $logger
  32.     ) {
  33.         $this->entityManager $entityManager;
  34.         $this->translator $translator;
  35.         $this->logger $logger;
  36.     }
  37.   #[Route('/'name'web_index')]
  38.   public function index(
  39.     Request $req,
  40.     BucketsRepository $bucketsRepository,
  41.     InfoRepository $infoRepository,
  42.     UpdatesRepository $updatesRepository,
  43.      BannerRepository $bannerRepository,
  44.     TranslatorInterface $translator
  45.   ): Response {
  46.     return $this->render('index.twig', [
  47.       'title' => $translator->trans('home.title'),
  48.       'page' => 'home',
  49.       'data' => [
  50.         'buckets' => $bucketsRepository->findBy([
  51.           'locale' => $req->getLocale()
  52.         ]),
  53.         'intro' => $infoRepository->findBy(['locale' => $req->getLocale()]),
  54.         'updates' => $updatesRepository->findBy(['locale' => $req->getLocale()]),
  55.          'banners' => $bannerRepository->findBy(['locale' => $req->getLocale()])
  56.       ]
  57.     ]);
  58.   }
  59.   #[Route('/{_locale<en|hi>}/'name'web_index_locale')]
  60.   public function indexLocale(
  61.     Request $req,
  62.     BucketsRepository $bucketsRepository,
  63.     InfoRepository $infoRepository,
  64.     UpdatesRepository $updatesRepository,
  65.     TranslatorInterface $translator
  66.   ): Response {
  67.     return $this->render('index.twig', [
  68.       'title' => $translator->trans('home.title'),
  69.       'page' => 'home',
  70.       'data' => [
  71.         'buckets' => $bucketsRepository->findBy([
  72.           'locale' => $req->getLocale()
  73.         ]),
  74.         'intro' => $infoRepository->findBy(['locale' => $req->getLocale()]),
  75.         'updates' => $updatesRepository->findBy(['locale' => $req->getLocale()])
  76.       ]
  77.     ]);
  78.   }
  79.   #[
  80.     Route(
  81.       '/dashboard/{statecode}',
  82.       name'web_dashboard',
  83.       options: ['expose' => true]
  84.     )
  85.   ]
  86.   public function dashboard(
  87.     Request $req,
  88.     BucketsRepository $bucketsRepository,
  89.     NFHSRepository $nfhsRepository,
  90.     TranslatorInterface $translator,
  91.     string $statecode
  92.   ): Response {
  93.     $nfhs $nfhsRepository->findOneBy(['code' => $statecode]);
  94.     return $this->render('dashboard.twig', [
  95.       'title' =>
  96.         $translator->trans('dashboard.title') .
  97.         ' - ' .
  98.         $translator->trans($nfhs->getState()),
  99.       'page' => 'dashboard',
  100.       'data' => [
  101.         'buckets' => $bucketsRepository->findBy([
  102.           'locale' => $req->getLocale()
  103.         ]),
  104.         'state' => $nfhs
  105.       ]
  106.     ]);
  107.   }
  108.   #[
  109.     Route(
  110.       '/bucket/{id}/{category}',
  111.       name'web_bucket',
  112.       options: ['expose' => true]
  113.     )
  114.   ]
  115.   public function bucket(
  116.     Request $req,
  117.     BucketsRepository $bucketsRepository,
  118.     IssuesRepository $issuesRepository,
  119.     string $id,
  120.     string $category null
  121.   ): Response {
  122.     $issues = [];
  123.     $results $issuesRepository->findBy([
  124.       'bucket' => $id,
  125.       'locale' => $req->getLocale()
  126.     ],['date' => 'DESC']);
  127.     if (!empty($results)) {
  128.       foreach ($results as $issue) {
  129.         if ($category) {
  130.           if (in_array($category$issue->getCategory())) {
  131.             array_push($issues$issue);
  132.           }
  133.         } else {
  134.           array_push($issues$issue);
  135.         }
  136.       }
  137.     } else {
  138.       return $this->redirectToRoute('web_index');
  139.     }
  140.     return $this->render('bucket.twig', [
  141.       'title' => $bucketsRepository->findOneBy(['_id' => $id])->getTitle(),
  142.     'description' => $bucketsRepository->findOneBy(['_id' => $id])->getDescription(),
  143.       'data' => [
  144.         'bucket' => $id,
  145.         'category' => $category,
  146.         'buckets' => $bucketsRepository->findBy([
  147.           'locale' => $req->getLocale()
  148.         ]),
  149.         'issues' => $issues
  150.       ]
  151.     ]);
  152.   }
  153.   #[
  154.     Route(
  155.       '/search/{query}/{category}',
  156.       name'web_search',
  157.       options: ['expose' => true]
  158.     )
  159.   ]
  160.   public function search(
  161.     Request $req,
  162.     BucketsRepository $bucketsRepository,
  163.     IssuesRepository $issuesRepository,
  164.     TranslatorInterface $translator,
  165.     string $query,
  166.     string $category null
  167.   ): Response {
  168.     $search = [];
  169.     $results $issuesRepository->search($query$req->getDefaultLocale());
  170.     if (!empty($results)) {
  171.       foreach ($results as $result) {
  172.         if ($category) {
  173.           if (in_array($category$result['category'])) {
  174.             array_push($search$result);
  175.           }
  176.         } else {
  177.           array_push($search$result);
  178.         }
  179.       }
  180.     } else {
  181.       return $this->redirectToRoute('web_index');
  182.     }
  183.     return $this->render('search.twig', [
  184.       'title' => $translator->trans('search.title'),
  185.       'page' => 'search',
  186.       'data' => [
  187.         'category' => $category,
  188.         'buckets' => $bucketsRepository->findBy([
  189.           'locale' => $req->getLocale()
  190.         ]),
  191.         'query' => $query,
  192.         'results' => $search
  193.       ]
  194.     ]);
  195.   }
  196.   #[Route('/contact'name'web_contact')]
  197.   public function contact(
  198.     Request $req,
  199.     BucketsRepository $bucketsRepository,
  200.     TranslatorInterface $translator
  201.   ): Response {
  202.     return $this->render('contact.twig', [
  203.       'title' => $translator->trans('contact.title'),
  204.       'data' => [
  205.         'buckets' => $bucketsRepository->findBy([
  206.           'locale' => $req->getLocale()
  207.         ])
  208.       ]
  209.     ]);
  210.   }
  211.  #[Route('/introduction'name'web_introduction')]
  212.   public function introduction(
  213.     Request $req,
  214.     BucketsRepository $bucketsRepository,
  215.     InfoRepository $infoRepository,
  216.     UpdatesRepository $updatesRepository,
  217.     TranslatorInterface $translator): Response {
  218.     
  219.   return $this->render('introduction.twig', [
  220.       
  221.       'data' => [
  222.         'buckets' => $bucketsRepository->findBy([
  223.           'locale' => $req->getLocale()
  224.         ]),
  225.         'intro' => $infoRepository->findBy(['locale' => $req->getLocale()]),
  226.         'updates' => $updatesRepository->findBy(['locale' => $req->getLocale()])
  227.       ]
  228.     ]);
  229.     
  230.   }
  231.  #[Route('/updates'name'web_updates')]
  232.   public function updates(
  233.     Request $req,
  234.     BucketsRepository $bucketsRepository,
  235.     InfoRepository $infoRepository,
  236.     UpdatesRepository $updatesRepository,
  237.     TranslatorInterface $translator): Response {
  238.     
  239.   return $this->render('updates.twig', [
  240.       
  241.       'data' => [
  242.         'buckets' => $bucketsRepository->findBy([
  243.           'locale' => $req->getLocale()
  244.         ]),
  245.         'intro' => $infoRepository->findBy(['locale' => $req->getLocale()]),
  246.         'updates' => $updatesRepository->findBy(['locale' => $req->getLocale()])
  247.       ]
  248.     ]);
  249.   }
  250.   #[Route('/chatbot'name'web_chatbot')]
  251.   public function chatbot(Request $request,BucketsRepository $bucketsRepository,
  252.     InfoRepository $infoRepository,
  253.     UpdatesRepository $updatesRepository,
  254.     TranslatorInterface $translator): Response {
  255.     
  256.         if (isset($_SESSION['user_email'])) {
  257.           $user_email $_SESSION['user_email'];
  258.           $user_name $_SESSION['user_name'];
  259.         }else{
  260.           $user_email '';
  261.           $user_name '';
  262.         }
  263.        
  264.         
  265.          $query $request->query->get('q');
  266.         $curl curl_init();
  267.         curl_setopt_array($curl, array(
  268.             // CURLOPT_URL => 'http://89.116.20.47:8000/chat_history/[email protected]',
  269.             CURLOPT_URL => 'http://89.116.20.47:8000/unique_dates/'urlencode($user_email),
  270.             CURLOPT_RETURNTRANSFER => true,
  271.             CURLOPT_ENCODING => '',
  272.             CURLOPT_MAXREDIRS => 10,
  273.             CURLOPT_TIMEOUT => 0,
  274.             CURLOPT_FOLLOWLOCATION => true,
  275.             CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  276.             CURLOPT_CUSTOMREQUEST => 'GET',
  277.         ));
  278.         $response curl_exec($curl);
  279.         curl_close($curl);
  280.         
  281.         
  282.         // $chatHistory = json_decode($response, true)['chat_history'];
  283.         $chatHistory = [];
  284.         $responseData json_decode($responsetrue);
  285. //echo "<pre>";print_r($responseData);echo "</pre>";
  286.         /*if (isset($responseData['chat_history'])) {
  287.             $chatHistory = $responseData['unique_dates'];
  288.         } else {
  289.             // Handle case where 'chat_history' key is not present in the response
  290.             $chatHistory=  '';
  291.         }*/
  292.       $uniqueDates $responseData['unique_dates'] ?? [];
  293.         return $this->render('chatbot.twig', [
  294.             'uniqueDates' => $uniqueDates,
  295.             'user_Email' => $user_email,
  296.             'user_Name' => $user_name,
  297.             'query' => $query,
  298.         'data' => [
  299.         'buckets' => $bucketsRepository->findBy([
  300.           'locale' => $request->getLocale()
  301.         ]),]
  302.         ]);
  303.     
  304.   }
  305.  #[Route('/chathistory'name'web_chathistory')]
  306. public function chathistory(Request $request,BucketsRepository $bucketsRepository,
  307.     InfoRepository $infoRepository,
  308.     UpdatesRepository $updatesRepository,
  309.     TranslatorInterface $translator): Response {
  310.     if (isset($_SESSION['user_email'])) {
  311.         $user_email $_SESSION['user_email'];
  312.         $user_name $_SESSION['user_name'];
  313.     } else {
  314.         $user_email '';
  315.         $user_name '';
  316.     }
  317. if(!empty($request->query->get('date'''))){
  318.     $date $request->query->get('date''');
  319.     $dateval "?date=".urlencode($date)."";
  320.   }else{
  321.     $date '';
  322.     $dateval '';
  323.   }
  324.     $curl curl_init();
  325.     curl_setopt_array($curl, array(
  326.         CURLOPT_URL => 'http://89.116.20.47:8000/chat_history/' urlencode($user_email).$dateval,
  327.         CURLOPT_RETURNTRANSFER => true,
  328.         CURLOPT_ENCODING => '',
  329.         CURLOPT_MAXREDIRS => 10,
  330.         CURLOPT_TIMEOUT => 0,
  331.         CURLOPT_FOLLOWLOCATION => true,
  332.         CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  333.         CURLOPT_CUSTOMREQUEST => 'GET',
  334.     ));
  335.     $response curl_exec($curl);
  336.     curl_close($curl);
  337.     $chatHistory = [];
  338.     $responseData json_decode($responsetrue);
  339.    if (isset($responseData['chat_history'])) {
  340.             $chatHistory $responseData['chat_history'];
  341.         } else {
  342.             // Handle case where 'chat_history' key is not present in the response
  343.             $chatHistory 'Invalid API response: Missing "chat_history" key';
  344.         }
  345.  $curl1 curl_init();
  346.         curl_setopt_array($curl1, array(
  347.             // CURLOPT_URL => 'http://89.116.20.47:8000/chat_history/[email protected]',
  348.             CURLOPT_URL => 'http://89.116.20.47:8000/unique_dates/'urlencode($user_email),
  349.             CURLOPT_RETURNTRANSFER => true,
  350.             CURLOPT_ENCODING => '',
  351.             CURLOPT_MAXREDIRS => 10,
  352.             CURLOPT_TIMEOUT => 0,
  353.             CURLOPT_FOLLOWLOCATION => true,
  354.             CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  355.             CURLOPT_CUSTOMREQUEST => 'GET',
  356.         ));
  357.         $response1 curl_exec($curl1);
  358.         curl_close($curl1);
  359.                 
  360.         $uniqueDates = [];
  361.         $responseData1 json_decode($response1true);
  362.       $uniqueDates $responseData1['unique_dates'] ?? [];
  363.     return $this->render('chathistory.twig', [
  364.          'uniqueDates' => $uniqueDates,
  365.         'chatHistory' => $chatHistory,
  366.         'user_Email' => $user_email,
  367.         'user_Name' => $user_name,
  368.     'data' => [
  369.         'buckets' => $bucketsRepository->findBy([
  370.           'locale' => $request->getLocale()
  371.         ]),]
  372.     ]);
  373. }
  374.   #[Route('/destroysession'name'destroy_session'methods: ['POST'])]
  375.     public function destroySession(Request $request): Response
  376.     {
  377.         // Use core PHP to destroy the session
  378.         if (session_status() === PHP_SESSION_NONE) {
  379.             session_start();
  380.         }
  381.         session_destroy();
  382.         // Redirect to the homepage or any other page
  383.         return $this->redirectToRoute('web_chatbot');
  384.     }
  385.   
  386.   
  387.   
  388.     #[Route('/sendOTP'name'send_otp'methods: ['POST'])]
  389.     public function sendOTP(Request $request): JsonResponse
  390.     {
  391.         $data json_decode($request->getContent(), true);
  392.         $email $data['email'] ?? null;
  393.         if (!$email) {
  394.             return new JsonResponse(['success' => false'message' => 'Email is required.'], 400);
  395.         }
  396.         
  397.       $query $this->entityManager->createQuery('SELECT c FROM App\Entity\ChatUser c WHERE c.email = :email'
  398.       )->setParameter('email'$email);
  399.         $emailverify $query->getOneOrNullResult();
  400.        
  401.         if($emailverify){
  402.           //$otpSent = $this->sendOtpToEmail($emailverify->getId());
  403.           $otpSent $this->sendOtpToEmail($emailverify->getId(), $email);
  404.           //$this->sendOtpToEmail1($emailverify->getId());
  405.           
  406.       
  407.         }
  408.         else{
  409.           return new JsonResponse(['success' => false'message' => 'User does not exist.']);
  410.         }
  411.         if ($otpSent) {
  412.      
  413.             return new JsonResponse(['success' => true'message' => 'OTP Sent Succesfully.']);
  414.         } else {
  415.             return new JsonResponse(['success' => false'message' => 'Failed to send OTP.']);
  416.         }
  417.     }
  418. /*  private function sendOtpToEmail(int $userId, string $email): bool
  419.     {
  420.         // Generate a 6-digit OTP
  421.         $otp = random_int(100000, 999999);
  422.         
  423.         // Save OTP and timestamp to database or session for verification later
  424.         // ...
  425.         // Prepare email content
  426.         $to = $email;
  427.         $subject = "Your OTP Code";
  428.         $message = "Your OTP code is: $otp";
  429.         $headers = "From: [email protected]";
  430.         // Send the email
  431.         if (mail($to, $subject, $message, $headers)) {
  432.             $this->logger->info("OTP email sent successfully to user ID: $userId");
  433.             return true;
  434.         } else {
  435.             $this->logger->error("Failed to send OTP email to user ID: $userId");
  436.             return false;
  437.         }
  438.     }*/
  439.     
  440.     private function sendOtpToEmail(int $idstring $email): bool
  441.     {
  442.         $otp rand(123456999999);
  443.         
  444.         $chatUser $this->entityManager->getRepository(ChatUser::class)->find($id);
  445.         if (!$chatUser) {
  446.             return false;
  447.         }
  448.         
  449.         $otpExpiresAt = new \DateTime('+300 seconds');
  450.         $chatUser->setOtp($otp);
  451.         $chatUser->setOtpExpiresAt($otpExpiresAt);
  452.         $this->entityManager->persist($chatUser);
  453.         $this->entityManager->flush();
  454.         $to $email;
  455.         $subject "Your OTP Code";
  456.        // $message = "Your OTP code is: $otp";
  457.         $message "Your OTP code is: $otp\n\nThanks and Regards,\n PFI";
  458.         $headers = [
  459.             'From' => '[email protected]',
  460.             'Reply-To' => '[email protected]',
  461.             'X-Mailer' => 'PHP/' phpversion()
  462.         ];
  463.         // Send the email
  464.         if (mail($to$subject$message$headers)) {
  465.             $this->logger->info("OTP email sent successfully ");
  466.             return true;
  467.         } else {
  468.             $this->logger->error("Failed to send OTP email");
  469.             return false;
  470.         }
  471.         
  472.         return true;
  473.     }
  474.     #[Route('/verifyOTP'name'verify_otp'methods: ['POST'])]
  475.     public function verifyOTP(Request $request): JsonResponse
  476.     {   
  477.       if (session_status() == PHP_SESSION_NONE) {
  478.             session_start();
  479.         }
  480.         $data json_decode($request->getContent(), true);
  481.         $otp $data['otp'] ?? null;
  482.         $email $data['email'] ?? null;
  483.         
  484.         if (!$email || !$otp) {
  485.             return new JsonResponse(['success' => false'message' => 'Email and OTP are required.'], 400);
  486.         }
  487.     
  488.         // Get current time
  489.         $currentTime = new \DateTime();
  490.        
  491.         $query $this->entityManager->createQuery(
  492.             'SELECT c FROM App\Entity\ChatUser c 
  493.             WHERE c.email = :email AND c.otp = :otp AND c.otp_expires_at > :currentTime'
  494.         )->setParameter('email'$email)
  495.          ->setParameter('otp'$otp)
  496.          ->setParameter('currentTime'$currentTime);
  497.        
  498.         $otpverify $query->getOneOrNullResult();
  499.         
  500.         if ($otpverify) {
  501.             $_SESSION['user_email'] = $otpverify->getEmail();
  502.             $_SESSION['user_name'] = $otpverify->getName();
  503.             
  504.             // Clear OTP and expiration time after successful verification
  505.             $otpverify->setOtp(0);
  506.             $otpverify->setOtpExpiresAt(null);
  507.             $this->entityManager->persist($otpverify);
  508.             $this->entityManager->flush();
  509.     
  510.             return new JsonResponse(['success' => true'message' => 'OTP Verified Successfully']);
  511.         } else {
  512.             // Check if the email exists to give a more specific error message
  513.             $user $this->entityManager->getRepository(ChatUser::class)->findOneBy(['email' => $email]);
  514.             
  515.             if ($user && $user->getOtpExpiresAt() <= $currentTime) {
  516.                 return new JsonResponse(['success' => false'message' => 'OTP has expired.'], 400);
  517.             }
  518.     
  519.             return new JsonResponse(['success' => false'message' => 'Invalid OTP.'], 400);
  520.         }
  521.     }
  522.     
  523.     
  524.   #[Route('/saveUser'name'save_user'methods: ['POST'])]
  525.     
  526.   public function saveUser(Request $requestEntityManagerInterface $entityManager): JsonResponse
  527. {
  528.     $data json_decode($request->getContent(), true);
  529.     $email $data['email'] ?? null;
  530.     $name $data['name'] ?? null;
  531.     if (!$email || !$name) {
  532.         return new JsonResponse(['success' => false'message' => 'Email and Name are required.'], 400);
  533.     }
  534.     $query $this->entityManager->createQuery(
  535.       'SELECT c FROM App\Entity\ChatUser c WHERE c.email = :email '
  536.      )->setParameter('email'$email);
  537.      $chatUser $query->getOneOrNullResult();
  538.     if ($chatUser !='') {
  539.         return new JsonResponse(['success' => false'message' => 'User already exist.'], 200);
  540.     }
  541.     else{
  542.       try {
  543.             $otp rand(123456999999);
  544.             $otpExpiresAt = new \DateTime('+300 seconds');
  545.             $chatUser = new ChatUser();
  546.             $chatUser->setEmail($email);
  547.             $chatUser->setName($name); 
  548.             $chatUser->setOtp($otp);
  549.             $chatUser->setOtpExpiresAt($otpExpiresAt);
  550.             $this->entityManager->persist($chatUser);
  551.             $this->entityManager->flush();
  552.       } catch (\Exception $e) {
  553.         return new JsonResponse(['success' => false'message' => 'Failed to save user. Error: ' $e->getMessage()]);
  554.       }
  555.     }
  556.     
  557.     // $email = $chatUser->setEmail();
  558.     $otpSent $this->sendOtpToEmailReg($otp,$data['email']);
  559.     return new JsonResponse(['success' => true'message' => 'User saved successfully.']);
  560. }
  561.     
  562.  private function sendOtpToEmailReg(int $otp,string $email): bool
  563.     {
  564.         //$otp = rand(123456, 999999);
  565.        
  566.         
  567.       
  568.         $to $email;
  569.         $subject "Your OTP Code";
  570.         $message "Your OTP code is: $otp\n\nThanks and Regards,\n PFI";
  571.         $headers = [
  572.             'From' => '[email protected]',
  573.             'Reply-To' => '[email protected]',
  574.             'X-Mailer' => 'PHP/' phpversion()
  575.         ];
  576.         // Send the email
  577.         if (mail($to$subject$message$headers)) {
  578.             $this->logger->info("OTP email sent successfully ");
  579.             return true;
  580.         } else {
  581.             $this->logger->error("Failed to send OTP email");
  582.             return false;
  583.         }
  584.         
  585.         return true;
  586.     }
  587.  #[Route('/chatbot/query'name'web_chatbot_query'methods: ['POST'])]
  588.     public function chatbotQuery(Request $request): JsonResponse
  589.     {
  590.         $data json_decode($request->getContent(), true);
  591.         $question $data['question'];
  592.         //  $email ="[email protected]";
  593.         if (isset($_SESSION['user_email'])) {
  594.           $email $_SESSION['user_email'];
  595.           }else{
  596.           $email '';
  597.           }
  598.     
  599.          
  600.         // Make API call using cURL
  601.         $curl curl_init();
  602.         curl_setopt_array($curl, array(
  603.             CURLOPT_URL => 'http://89.116.20.47:8000/query',
  604.             CURLOPT_RETURNTRANSFER => true,
  605.             CURLOPT_ENCODING => '',
  606.             CURLOPT_MAXREDIRS => 10,
  607.             CURLOPT_TIMEOUT => 0,
  608.             CURLOPT_FOLLOWLOCATION => true,
  609.             CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  610.             CURLOPT_CUSTOMREQUEST => 'POST',
  611.             CURLOPT_POSTFIELDS => json_encode(['question' => $question,'email' =>$email]),
  612.             CURLOPT_HTTPHEADER => array(
  613.                 'Content-Type: application/json'
  614.             ),
  615.         ));
  616.         $response curl_exec($curl);
  617.         curl_close($curl);
  618.         $responseData json_decode($responsetrue);
  619.         return new JsonResponse($responseData);
  620.     }
  621. #[Route('/viewDistrict'name'web_district'options: ['expose' => true])]
  622. public function viewDistrict(NFHSRepository $nfhsRepository,CreateRepository $createRepositoryRequest $request,BucketsRepository $bucketsRepository,
  623.     InfoRepository $infoRepository,
  624.     UpdatesRepository $updatesRepository,
  625.     TranslatorInterface $translator): Response
  626. {   
  627.    $ts $request->query->get('ts''');
  628.     $states $nfhsRepository->findAllStates();
  629.     $searchQuery $request->query->get('search''');
  630.     if ($searchQuery) {
  631.         $districts $nfhsRepository->searchDistrictsWithStateNames($searchQuery);
  632.     } else {
  633.         $districts $nfhsRepository->findAllWithStateNames();
  634.     }
  635. $districtslink $createRepository->findByStateFieldyind(794);
  636. //print_r($districtslink);
  637. $districtLink '';
  638.     if (!empty($districtslink) && isset($districtslink[0])) {
  639.         $districtLink $districtslink[0]->getLink();
  640.     }
  641.     return $this->render('DistrictDashboard.twig', [
  642.         'title' => 'District Dashboard',
  643.         'states' => $states,
  644.         'districts' => $districts,
  645.         'search' => $searchQuery,
  646.         'ts' => $ts,
  647.         'districtLink' => $districtLink,
  648.     'data' => [
  649.         'buckets' => $bucketsRepository->findBy([
  650.           'locale' => $request->getLocale()
  651.         ]),]
  652.     ]);
  653. }
  654. #[Route('/mail_subscribe'name'mail_save'methods: ['POST'])]
  655. public function mail_subscribe(Request $request): JsonResponse
  656. {
  657.    
  658.     $data json_decode($request->getContent(), true);
  659.     $email $data['email'] ?? null;
  660.     
  661.     if (!$email) {
  662.         return new JsonResponse(['success' => false'message' => 'Email is required.'], 400);
  663.     }
  664.     
  665.   
  666.     $query $this->entityManager->createQuery(
  667.         'SELECT c FROM App\Entity\Subscriber c WHERE c.email = :email'
  668.     )->setParameter('email'$email);
  669.     $emailverify $query->getOneOrNullResult();
  670.     
  671.     if ($emailverify) {
  672.         
  673.         if ($emailverify->getIsSubscribe() == 1) {
  674.             $emailverify->setIsSubscribe(0);
  675.             $emailverify->setUpdatedBy(new \DateTime());
  676.             $this->entityManager->flush();
  677.             return new JsonResponse(['success' => true'message' => 'Thank you for signing up! We’ll keep you posted on the latest updates.']);
  678.         }
  679.         
  680.         return new JsonResponse(['success' => false'message' => 'Email is already subscribed.']);
  681.     } else {
  682.         $details = new Subscriber();
  683.         $details->setEmail($email);
  684.         $details->setIsSubscribe(0); 
  685.         $details->setCreatedBy(0); 
  686.         $details->setCreatedAt(new \DateTime()); 
  687.         $this->entityManager->persist($details);
  688.         $this->entityManager->flush();
  689.         return new JsonResponse(['success' => true'message' => 'Thank you for signing up! We’ll keep you posted on the latest updates.']);
  690.     }
  691. }
  692. }