src/Controller/MainController.php line 168

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\FixedPages;
  4. use App\Entity\Letter;
  5. use App\Entity\News;
  6. use App\Entity\Page;
  7. use App\Entity\Santa;
  8. use App\Entity\Services;
  9. use App\Enum\PdfConverter;
  10. use App\Enum\SantaEnum;
  11. use App\Repository\MetaRepository;
  12. use App\Repository\PageRepository;
  13. use App\Services\SpacesUploader;
  14. use GuzzleHttp\ClientInterface;
  15. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Symfony\Component\Mime\Address;
  22. use Symfony\Component\Mime\Email;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Mailer\MailerInterface;
  25. use App\Entity\Gallery;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use Liip\ImagineBundle\Imagine\Cache\CacheManager;
  28. use Symfony\Component\Validator\Constraints\Uuid;
  29. use Symfony\Contracts\HttpClient\HttpClientInterface;
  30. use Symfony\Contracts\Translation\TranslatorInterface;
  31. use Gedmo\Translatable\TranslatableListener;
  32. class MainController extends AbstractController
  33. {
  34.     private EntityManagerInterface $entityManager;
  35.     private TranslatableListener $translatableListener;
  36.     public function __construct(EntityManagerInterface $entityManager,
  37.                                 TranslatableListener $translatableListener
  38.     )
  39.     {
  40.         $this->translatableListener $translatableListener;
  41.         $this->entityManager $entityManager;
  42.     }
  43.     #[Route('/{_locale}/ipad'name'page_ipad'requirements: ['_locale' => 'en|ru|hy'], defaults: ['_locale' => 'en'])]
  44.     public function iphone(MetaRepository $metaRepositoryPageRepository $pageRepository)
  45.     {
  46.         $page $pageRepository->find(11);
  47.         $editable false;
  48.         $pantum false;
  49.         return $this->render('@web/page/template.html.twig', [
  50.             'page' => $page,
  51.             'editable' => $editable,
  52.             'ipad' => true,
  53.         ]);
  54.     }
  55.     #[Route('/{_locale}/pantum'name'page_pantum'requirements: ['_locale' => 'en|ru|hy'], defaults: ['_locale' => 'en'])]
  56.     public function pantum(MetaRepository $metaRepositoryPageRepository $pageRepository)
  57.     {
  58.         $page $pageRepository->find(11);
  59.         $editable false;
  60.         $pantum true;
  61.         return $this->render('@web/page/template.html.twig', [
  62.             'page' => $page,
  63.             'editable' => $editable,
  64.             'pantum' => $pantum
  65.         ]);
  66.     }
  67.     #[Route('/{_locale}/ipad/may'name'page_mayis9'requirements: ['_locale' => 'en|ru|hy'], defaults: ['_locale' => 'en'])]
  68.     public function page_mayis9(MetaRepository $metaRepositoryPageRepository $pageRepository)
  69.     {
  70.         $page $pageRepository->find(4);
  71.         $editable false;
  72.         return $this->render('@web/page/template.html.twig', [
  73.             'page' => $page,
  74.             'editable' => $editable
  75.         ]);
  76.     }
  77.     #[Route('/iphone'name'page_iphone'requirements: ['_locale' => 'en|ru|hy'], defaults: ['_locale' => 'en'])]
  78.     public function ipad(MetaRepository $metaRepository)
  79.     {
  80.         return $this->render('@web/page/iphone.html.twig');
  81.     }
  82.     #[Route('/gallery'name'page_gallery')]
  83.     public function index(MetaRepository $metaRepository)
  84.     {
  85.         $gallery $this->entityManager->getRepository(Gallery::class)->findBy(['isShow' => true], ['id' => 'DESC'], 20);
  86.         return $this->render('@web/page/gallery.html.twig', ['gallery' => $gallery]);
  87.     }
  88.     #[Route('/{_locale}'name'page_index'requirements: ['_locale' => 'en|ru|hy|es|it|fr|el|ua|ka|de'], defaults: ['_locale' => 'en'])]
  89.     public function empty(MetaRepository $metaRepository)
  90.     {
  91.         $banner $this->entityManager->getRepository(FixedPages::class)->find(1);
  92.         $services $this->entityManager->getRepository(Services::class)->findAll();
  93.         $news $this->entityManager->getRepository(News::class)->findAll();
  94.         return $this->render('@web/page/index.html.twig', [
  95.             'banner' => $banner,
  96.             'services' => $services,
  97.             'news' => $news
  98.         ]);
  99.     }
  100.     #[Route('{_locale}/services'name'page_services')]
  101.     public function services(MetaRepository $metaRepository)
  102.     {
  103.         $services $this->entityManager->getRepository(Services::class)->findAll();
  104.         return $this->render('@web/page/services.html.twig', [
  105.             'services' => $services
  106.         ]);
  107.     }
  108.     #[Route('{_locale}/service/view/{id}'name'page_service')]
  109.     public function service(Services $services)
  110.     {
  111.         return $this->render('@web/page/service.html.twig', [
  112.             'service' => $services
  113.         ]);
  114.     }
  115.     #[Route('{_locale}/privacy-policy'name'page_policy')]
  116.     public function policy()
  117.     {
  118.         $page $this->entityManager->getRepository(FixedPages::class)->find(2);
  119.         return $this->render('@web/page/fixed.html.twig', [
  120.             'page' => $page
  121.         ]);
  122.     }
  123.     #[Route('{_locale}/terms-of-use'name'page_terms')]
  124.     public function terms()
  125.     {
  126.         $page $this->entityManager->getRepository(FixedPages::class)->find(3);
  127.         return $this->render('@web/page/fixed.html.twig', [
  128.             'page' => $page
  129.         ]);
  130.     }
  131.     #[Route('{_locale}/about-us'name'page_about')]
  132.     public function aboutUs(MetaRepository $metaRepositoryPageRepository $pageRepository)
  133.     {
  134.         $page $pageRepository->find(2);
  135.         return $this->render('@web/page/about-us.html.twig', [
  136.             'page' => $page,
  137.             'editable' => false
  138.         ]);
  139.     }
  140.     #[Route('{_locale}/support'name'page_contact_us')]
  141.     public function contactUs(MetaRepository $metaRepository)
  142.     {
  143.         return $this->render('@web/page/contact-us.html.twig');
  144.     }
  145.     #[Route('/pyunik/view'name'page_pyunik_view'requirements: ['_locale' => 'en|ru|hy'], defaults: ['_locale' => 'ru'])]
  146.     public function pagePyunik(PageRepository $pageRepository)
  147.     {
  148.         $editable false;
  149.         return $this->render('@web/page/template-pyunik.html.twig', [
  150.             'editable' => $editable
  151.         ]);
  152.     }
  153.     #[Route('{_locale}/view-image'name'page_view_image')]
  154.     public function page_view_image(Request $request)
  155.     {
  156.         $template null;
  157.         $image null;
  158.         $code $request->get('code');
  159.         if ($code) {
  160.             $image $this->entityManager
  161.                 ->getRepository(Gallery::class)
  162.                 ->findOneBy(['documentNumber' => $code]);
  163.             if ($image) {
  164.                 $template $this->entityManager
  165.                     ->getRepository(Page::class)
  166.                     ->find($image->getTemplateId());
  167.             } else {
  168.                 return $this->redirectToRoute('page_index');
  169.             }
  170.         }
  171.         // Redirect to Armenian locale if template ID is 62 and current locale is not hy
  172.         if ($template->getId() == 62 && $request->getLocale() !== $image->getLocale()) {
  173.             return $this->redirectToRoute('page_view_image', [
  174.                 '_locale' => $image->getLocale(),
  175.                 'code' => $code
  176.             ]);
  177.         }
  178.         // Render templates
  179.         if ($template->getId() == 62) {
  180.             $letter $this->entityManager->getRepository(Letter::class)->find($image->getLetterId());
  181.             return $this->render('@web/page/template-christmas.html.twig', [
  182.                 'editable' => false,
  183.                 'viewImage' => true,
  184.                 'page' => $template,
  185.                 'letter' => $letter,
  186.                 'image' => $image
  187.             ]);
  188.         } elseif ($template->getId() == 56) {
  189.             return $this->render('@web/page/template-dalma.html.twig', [
  190.                 'editable' => false,
  191.                 'dalma' => true,
  192.                 'page' => $template,
  193.                 'image' => $image
  194.             ]);
  195.         } elseif ($template->getId() == 60) {
  196.             return $this->render('@web/page/template-sherep.html.twig', [
  197.                 'editable' => false,
  198.                 'dalma' => true,
  199.                 'page' => $template,
  200.                 'image' => $image
  201.             ]);
  202.         } else {
  203.             return $this->render('@web/page/view-image.html.twig', [
  204.                 'editable' => false,
  205.                 'page' => $template,
  206.                 'image' => $image
  207.             ]);
  208.         }
  209.     }
  210.     #[Route('/image/test')]
  211.     public function test(ParameterBagInterface $parameterBagCacheManager $cacheManager)
  212.     {
  213.         $imagePath 'https://infinitemoment.nyc3.cdn.digitaloceanspaces.com/691df26f50fe7.jpg';
  214.         $filteredPath $cacheManager->resolve($imagePath'small_thumb');
  215.         $page $this->entityManager->getRepository(Page::class)->find(10);
  216.         $origFile "https://infinitemoment.nyc3.cdn.digitaloceanspaces.com/6912214177e31.jpg";
  217.         $imgName pathinfo($origFilePATHINFO_BASENAME);
  218.         $destImg '/var/www/infinitemoment/public/uploads/img/' $imgName;
  219.         PdfConverter::resizeImage($origFile$destImg);
  220.         $html $this->renderView('@web/page/template-tmp.html.twig', [
  221.             'page' => $page,
  222.             'preview' => false,
  223.             'image' => 'https://infinitemoment.am/uploads/img/' $imgName,
  224.             'editable' => false
  225.         ]);
  226.         $filename = (string)time();
  227.         $htmlDir $parameterBag->get('kernel.project_dir') . '/public/uploads/html/' $filename '.html';
  228.         file_put_contents($htmlDir$html);
  229.         $pdfDir $parameterBag->get('kernel.project_dir') . '/public/uploads/pdf/' $filename '.pdf';
  230.         PdfConverter::convertHtmlToPdf($htmlDir$pdfDir);
  231.     }
  232.     #[Route('/image/delete'name'image_delete'methods: ['GET'])]
  233.     public function delete(Request $request)
  234.     {
  235.         $ids = ['54302020250427''21442120250427''05461720250501''14131420250509''15221620250601''45452020250811''48002120250901''35391420250904'];
  236.         if (!empty($ids)) {
  237.             foreach ($ids as $id) {
  238.                 $image $this->entityManager->getRepository(Gallery::class)->findOneBy(['documentNumber' => $id]);
  239.                 if ($image) {
  240.                     // Delete file from filesystem
  241.                     $filePath $this->getParameter('brochures_directory') . '/' $image->getImage();
  242.                     if (file_exists($filePath)) {
  243.                         unlink($filePath);
  244.                     }
  245.                     // Remove entity
  246.                     $this->entityManager->remove($image);
  247.                 }
  248.             }
  249.             $this->entityManager->flush();
  250.             $this->addFlash('success''Selected images deleted successfully.');
  251.         } else {
  252.             $this->addFlash('warning''No images selected.');
  253.         }
  254.         die;
  255.     }
  256.     #[Route('{_locale}/santa'name'page_santa'requirements: ['_locale' => 'en|ru|hy|es|it|fr|el|ua|ka|de'], defaults: ['_locale' => 'en'])]
  257.     public function pageSanta(
  258.         Request $request,
  259.                 $_locale,
  260.         SpacesUploader $spacesUploader,
  261.         TranslatorInterface $translator,
  262.         MetaRepository $metaRepository,
  263.         MailerInterface $mailer
  264.     ) {
  265.         if ($request->isMethod('POST')) {
  266.             $action $request->request->get('action');
  267.             $santa = new Santa();
  268.             $brochureFile $request->files->get('image');
  269.             $brochureFileName $spacesUploader->upload($brochureFile);
  270.             $gift $request->get('gift') ?: time();
  271.             $santa->setEmail($request->get('email'));
  272.             $santa->setFromName($request->get('fromName'));
  273.             $santa->setFromEmail($request->get('fromEmail'));
  274.             $santa->setGift($gift);
  275.             $santa->setPhone($request->get('phone'));
  276.             $santa->setMessage($request->get('comment'));
  277.             $santa->setImage($brochureFileName);
  278.             $santa->setLocale($_locale);
  279.             $santa->setStatus(SantaEnum::SANTA_PROGRESS);
  280.             $santa->setName($request->get('name'));
  281.             $this->entityManager->persist($santa);
  282.             $this->entityManager->flush();
  283.             if ($action === 'pay_now') {
  284.                 if ($this->getUser()) {
  285.                     return $this->redirect('/payment/confirm?santa_id=' $santa->getId());
  286.                 }
  287.                 $message = empty($request->get('comment')) ? 2;
  288.                 return $this->redirect(
  289.                     'https://anyrentalcars.com/armenia/infinite?' .
  290.                     'santa_id=' $santa->getId() .
  291.                     '&locale=' $santa->getLocale() .
  292.                     '&message=' $message
  293.                 );
  294.             }
  295.             if ($action === 'request') {
  296.                 $santa->setStatus(SantaEnum::SANTA_REQUEST);
  297.                 $this->entityManager->flush();
  298.                 $this->addFlash('success'$translator->trans('Your request has been sent successfully!'));
  299.                 return $this->redirectToRoute('page_index');
  300.             }
  301.         }
  302.         return $this->render('@web/page/santa.html.twig');
  303.     }
  304.     #[Route('/payment/reject'name'page_reject')]
  305.     public function pageReject(Request $request)
  306.     {
  307.         if ($request->get('santa_id')) {
  308.             $santa $this->entityManager->getRepository(Santa::class)->find($request->get('santa_id'));
  309.             $santa->setStatus(SantaEnum::SANTA_REJECTED);
  310.             return $this->render('@web/page/payment_reject.html.twig');
  311.         }
  312.         return $this->redirectToRoute('page_index');
  313.     }
  314.     #[Route('/payment/confirm'name'page_confirm')]
  315.     public function pageConfirm(Request $requestHttpClientInterface $client)
  316.     {
  317.         if ($request->get('santa_id')) {
  318.             $santa $this->entityManager->getRepository(Santa::class)->find($request->get('santa_id'));
  319.             $santa->setStatus(SantaEnum::SANTA_PAID);
  320.             $this->entityManager->flush();
  321.             $payload = [
  322.                 'id' => $santa->getId(),
  323.                 'name' => $santa->getName(),
  324.                 'locale' => $santa->getLocale(),
  325.                 'gift' => $santa->getGift(),
  326.                 'message' => $santa->getMessage(),
  327.             ];
  328.             // Pass the payload to Twig
  329.             return $this->render('@web/page/payment_confirm.html.twig', [
  330.                 'payload' => json_encode($payload),
  331.             ]);
  332.         }
  333.         return $this->redirectToRoute('page_index');
  334.     }
  335.     #[Route('/send_santa_api'name'send_santa_api')]
  336.     public function sendSantaApi(Request $requestHttpClientInterface $clientRequestStack $requestStackParameterBagInterface $parameterBagMailerInterface $mailerTranslatorInterface $translator)
  337.     {
  338.         $payload json_decode($request->getContent(), true);
  339.         $santa $this->entityManager->getRepository(Santa::class)->find($payload['id']);
  340.         $santa->setStatus(SantaEnum::SANTA_PROCESS);
  341.         $this->entityManager->flush();
  342. // Call the other API
  343.         $response $client->request('POST''https://santa2025.store/receive_letter_api', [
  344.             'json' => $payload,
  345.             'headers' => [
  346.                 'Accept' => 'application/json',
  347.                 'Content-Type' => 'application/json',
  348.                 'User-Agent' => 'Mozilla/5.0 (Symfony Server)',
  349.                 'Referer' => 'https://santa2025.store',
  350.             ],
  351.             'timeout' => 1500,
  352.         ]);
  353.         $data $response->toArray(); // The API response
  354.         $videoUrl $data['video_url'] ?? null;
  355.         $santa->setStatus(SantaEnum::SANTA_COMPLETED);
  356.         $this->entityManager->flush();
  357.         $letter $this->entityManager->getRepository(Letter::class)->findOneBy(['externalId' => $data['letter_id']]);
  358.         $gallery $this->entityManager->getRepository(Gallery::class)->findOneBy(['letterId' => $letter->getId()]);
  359.         $this->entityManager->persist($gallery);
  360.         $this->entityManager->flush();
  361.         $preview false;
  362.         $viewImage false;
  363.         $current $requestStack->getCurrentRequest();
  364.         $main $requestStack->getMainRequest(); // Symfony 5.3+; may be null
  365.         $locale $gallery->getLocale();
  366.         $this->translatableListener->setTranslatableLocale($locale);
  367.         $page $this->entityManager->getRepository(Page::class)
  368.             ->createQueryBuilder('p')
  369.             ->where('p.id = :id')
  370.             ->setParameter('id'$gallery->getTemplateId())
  371.             ->getQuery()
  372.             ->getOneOrNullResult();
  373.         $requestToUse $main ?? $current ?? $request// fallback to injected $request param
  374.         if ($requestToUse) {
  375.             // The important one: attributes _locale (LocaleListener checks this)
  376.             $requestToUse->attributes->set('_locale'$locale);
  377.             // Also set request locale and session (if available)
  378.             $requestToUse->setLocale($locale);
  379.             if ($requestToUse->hasSession()) {
  380.                 $requestToUse->getSession()->set('_locale'$locale);
  381.             }
  382.         }
  383. // 2) Set translator locale
  384.         $translator->setLocale($locale);
  385. // Optional: also set locale on PHP intl (not usually required)
  386.         \Locale::setDefault($locale);
  387.         $html $this->renderView('@web/page/template-santa-tmp.html.twig', [
  388.             'page' => $page,
  389.             'preview' => $preview,
  390.             'viewImage' => $viewImage,
  391.             'letter' => $letter,
  392.             'gallery' => $gallery,
  393.             'image' => $gallery->getImage(),
  394.             'editable' => false
  395.         ]);
  396.         $filename = (string)time();
  397.         $htmlDir $parameterBag->get('kernel.project_dir') . '/public/uploads/html/' $filename '.html';
  398.         file_put_contents($htmlDir$html);
  399.         $pdfDir $parameterBag->get('kernel.project_dir') . '/public/uploads/pdf/' $filename '.pdf';
  400.         PdfConverter::convertHtmlToPdf($htmlDir$pdfDir);
  401.         $subject $translator->trans('email_subject', [
  402.             '%number%' => $gallery->getDocumentNumber(),
  403.             '%name%' => $santa->getName(),
  404.         ]);
  405.         $email = (new Email())
  406.             ->from(new Address('support@infinitemoment.life''Infinite Moment Santa'))
  407.             ->to($santa->getEmail())
  408.             ->subject($subject)
  409.             ->html(
  410.                 $this->renderView(
  411.                     'email/santa_'.$santa->getLocale().'.html.twig',
  412.                     ['subject' => $santa'video_url' => $videoUrl]
  413.                 )
  414.             )
  415.         ->attachFromPath($pdfDir$filename '.pdf''application/pdf');
  416.         $mailer->send($email);
  417.         if ($santa->getFromEmail()) {
  418.             $email = (new Email())
  419.                 ->from(new Address('support@infinitemoment.life''Infinite Moment Santa'))
  420.                 ->to(
  421.                     $santa->getFromEmail(),
  422.                     'developerhovsepyan@gmail.com'
  423.                 )
  424.                 ->subject($subject)
  425.                 ->html(
  426.                     $this->renderView(
  427.                         'email/santa_'.$santa->getLocale().'.html.twig',
  428.                         [
  429.                             'subject' => $santa,
  430.                             'video_url' => $videoUrl
  431.                         ]
  432.                     )
  433.                 )
  434.                 ->attachFromPath($pdfDir$filename '.pdf''application/pdf');
  435.             $mailer->send($email);
  436.         }
  437.         return new JsonResponse([
  438.             'video_url' => $videoUrl
  439.         ]);
  440.     }
  441. }