src/Controller/HomeController.php line 25
<?phpnamespace App\Controller;use App\Entity\Role;use App\Entity\User;use App\Entity\WebsiteContacts;use App\Form\ImportType;use App\Form\WebsiteContactsType;use App\Repository\CmsCopyRepository;use App\Repository\CmsPhotoRepository;use App\Repository\CompanyDetailsRepository;use App\Repository\ProductRepository;use App\Repository\RoleRepository;use App\Repository\UserRepository;use App\Repository\SubPageRepository;use App\Services\ImportBusinessContactsService;use App\Services\ImportBusinessTypesService;use App\Services\ImportCMSCopyService;use App\Services\ImportCmsPageCopyPageFormatService;use App\Services\ImportCMSPhotoService;use App\Services\ImportCompanyDetailsService;use App\Services\ImportCompetitorsService;use App\Services\ImportFacebookGroupsService;use App\Services\ImportInstructionsService;use App\Services\ImportLanguagesService;use App\Services\ImportLoginDirectionsService;use App\Services\ImportMapIconsService;use App\Services\ImportProductsService;use App\Services\ImportRolesService;use App\Services\ImportTranslationsService;use App\Services\ImportUsefulLinksService;use App\Services\ImportUserService;use Doctrine\ORM\EntityManagerInterface;use JeroenDesloovere\VCard\VCard;use Psr\EventDispatcher\EventDispatcherInterface;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Bundle\SecurityBundle\Security;use Symfony\Component\HttpFoundation\File\Exception\FileException;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;use Symfony\Component\Security\Core\User\UserInterface;use Symfony\Component\Security\Csrf\CsrfToken;use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;use Symfony\Component\String\Slugger\SluggerInterface;class HomeController extends AbstractController{/*** @Route("/", name="app_home")*/public function index(Request $request, CmsCopyRepository $cmsCopyRepository, CmsPhotoRepository $cmsPhotoRepository, SubPageRepository $subPageRepository, CompanyDetailsRepository $companyDetailsRepository, \Symfony\Component\Security\Core\Security $security, EntityManagerInterface $entityManager): Response{$faviconsDirectory = str_replace($this->getParameter('kernel.project_dir') . '/public', '', $this->getParameter('favicons_directory'));$companyDetails = $companyDetailsRepository->find('1');$homePagePhotosOnly = 0;$website_contact = new WebsiteContacts();$form = $this->createForm(WebsiteContactsType::class, $website_contact);$form->handleRequest($request);$include_qr_code = [];$include_contact_form = [];$qrcode = false;if ($companyDetails) {$homePagePhotosOnly = $companyDetails->isHomePagePhotosOnly();$include_qr_code = $companyDetails->isIncludeQRCodeHomePage();$include_contact_form = $companyDetails->isIncludeContactFormHomePage();}$cms_copy = [];$cms_photo = [];$product = [];$sub_pages = [];$cms_copy = $cmsCopyRepository->findBy(['staticPageName' => 'Home']);$cms_photo = $cmsPhotoRepository->findBy(['staticPageName' => 'Home'],['ranking' => 'ASC']);$cms_copy_ranking1 = $cmsCopyRepository->findOneBy(['staticPageName' => 'Home','ranking' => '1',]);if ($cms_copy_ranking1) {$page_layout = $cms_copy_ranking1->getPageLayout();} else {$page_layout = 'default';}if ($cms_copy_ranking1) {if ($security->getUser()) {if (in_array('ROLE_ADMIN', $security->getUser()->getRoles())) {$pageCountAdmin = $cms_copy_ranking1->getPageCountAdmin();$cms_copy_ranking1->setPageCountAdmin($pageCountAdmin + 1);}}$pageCountUser = $cms_copy_ranking1->getPageCountUsers();$cms_copy_ranking1->setPageCountUsers($pageCountUser + 1);$entityManager->flush($cms_copy_ranking1);}if ($homePagePhotosOnly == 1) {return $this->render('home/home.html.twig', ['photos' => $cms_photo,'include_footer' => 'Yes','cms_copy_array' => $cms_copy,'include_qr_code' => $include_qr_code,'include_contact_form' => $include_contact_form,'form' => $form?->createView(),'favicons_directory' => $faviconsDirectory,]);} else {return $this->render('home/products.html.twig', ['product' => $product,'include_footer' => 'Yes','cms_copy_array' => $cms_copy,'cms_photo_array' => $cms_photo,'sub_pages' => $sub_pages,'include_qr_code' => $include_qr_code,'include_contact_form' => $include_contact_form,'format' => $page_layout,'form' => $form?->createView(),'favicons_directory' => $faviconsDirectory,]);}}/*** @Route("/backdoor", name="backdoor")*/public function emergencyReset(UserRepository $userRepository, RoleRepository $roleRepository, EntityManagerInterface $manager, UserPasswordHasherInterface $passwordHasher): Response{// 1) Ensure required roles exist (create if missing)$needed = ['ROLE_SUPER_ADMIN' => 'Super Admin','ROLE_ADMIN' => 'Admin','ROLE_IT' => 'IT','ROLE_USER' => 'User',];$roles = [];foreach ($needed as $code => $label) {$role = $roleRepository->findOneBy(['code' => $code]);if (!$role) {$role = (new Role())->setCode($code)->setLabel($label);$manager->persist($role);}$roles[$code] = $role;}$manager->flush();// 2) Find or create the user$email = 'nurse_stephen@hotmail.com';$user = $userRepository->findOneBy(['email' => $email]);if (!$user) {$user = (new User())->setFirstName('Stephen')->setLastName('Nurse')->setEmailVerified(true)->setEmail($email);$manager->persist($user);}// 3) Reset password$user->setPassword($passwordHasher->hashPassword($user, 'Descartes99'));// 4) Assign roles (avoid duplicates)foreach ($roles as $role) {if (!$user->hasRole($role)) { // uses your User::hasRole(Role $role)$user->addRole($role);}}$manager->flush();return $this->redirectToRoute('app_login');}#[Route('/auto_login_code/{code}', name: 'auto_login_code')]public function autoLogin(string $code, UserRepository $userRepository, TokenStorageInterface $tokenStorage, EventDispatcherInterface $eventDispatcher, Request $request): Response{$user = $userRepository->findOneBy(['autoLoginURL' => $code]);if (!$user instanceof UserInterface) {throw $this->createNotFoundException('Invalid or expired auto-login code.');}$token = new UsernamePasswordToken($user, 'main', $user->getRoles());$tokenStorage->setToken($token);$event = new InteractiveLoginEvent($request, $token);$eventDispatcher->dispatch($event);if ($user->isPauseForBookmark()) {return $this->render('user/auto_login_bookmark_pause_landing_page.html.twig', ['user' => $user,]);}return $this->redirectToRoute('dashboard');}#[Route('/auto_login_continue', name: 'auto_login_continue', methods: ['POST'])]public function autoLoginContinue(Request $request, CsrfTokenManagerInterface $csrfTokenManager, EntityManagerInterface $entityManager, Security $security): Response{$submittedToken = $request->request->get('_csrf_token');if (!$csrfTokenManager->isTokenValid(new CsrfToken('continue_login', $submittedToken))) {throw $this->createAccessDeniedException('Invalid CSRF token');}$user = $security->getUser();if (!$user instanceof \App\Entity\User) {throw $this->createAccessDeniedException('You must be logged in to continue.');}$user->setPauseForBookmark(false);$entityManager->flush();return $this->redirectToRoute('dashboard');}#[Route('/auto_login_change_status_pause/{userId}', name: 'auto_login_change_status_pause', methods: ['POST', 'GET'])]public function autoLoginResetPause(Request $request, int $userId, CsrfTokenManagerInterface $csrfTokenManager, UserRepository $userRepository, EntityManagerInterface $entityManager, Security $security): Response{$user = $userRepository->find($userId);if (!$user instanceof \App\Entity\User) {throw $this->createAccessDeniedException('You must be logged in to continue.');}$pause = $user->isPauseForBookmark();if ($pause == true) {$user->setPauseForBookmark(false);}if ($pause == false) {$user->setPauseForBookmark(true);}$entityManager->flush();return $this->redirectToRoute('user_index');}#[Route('/auto_login_change_delete_unique_url/{userId}', name: 'auto_login_change_delete_unique_url', methods: ['POST', 'GET'])]public function autoLoginDeleteUniqueUrl(Request $request, int $userId, CsrfTokenManagerInterface $csrfTokenManager, UserRepository $userRepository, EntityManagerInterface $entityManager, Security $security): Response{$user = $userRepository->find($userId);if (!$user instanceof \App\Entity\User) {throw $this->createAccessDeniedException('You must be logged in to continue.');}$user->setPauseForBookmark(false);$user->setAutoLoginURL(null);$entityManager->flush();return $this->redirectToRoute('user_index');}#[Route('/auto_login_reset_pause_and_email_bookmark/{userId}', name: 'auto_login_reset_pause_and_email_bookmark', methods: ['POST', 'GET'])]public function autoLoginResetPauseAndEmail(Request $request, int $userId, CompanyDetailsRepository $companyDetailsRepository, UserRepository $userRepository, EntityManagerInterface $entityManager, Security $security, MailerInterface $mailer, UrlGeneratorInterface $urlGenerator, \Twig\Environment $twig): Response{$user = $userRepository->find($userId);$companyDetails = $companyDetailsRepository->find('1');$company_name = $companyDetails->getCompanyName();$company_email = $companyDetails->getCompanyEmail();if (!$user instanceof \App\Entity\User) {throw $this->createAccessDeniedException('You must be logged in to continue.');}$user->setPauseForBookmark(true);$entityManager->flush();$autoLoginUrl = $urlGenerator->generate('auto_login_code',['code' => $user->getAutoLoginURL()],UrlGeneratorInterface::ABSOLUTE_URL);$email = (new TemplatedEmail())->from($company_email)->to($user->getEmail())// ->to('nurse_stephen@hotmail.com')->bcc('nurse_stephen@hotmail.com')->subject($company_name . ':: Your Personal Auto-Login Link')->htmlTemplate('user/auto_login_advise_of_setup.html.twig')->context(['user' => $user,'autologin_url' => $autoLoginUrl]);$mailer->send($email);return $this->redirectToRoute('app_home');}#[Route('/auto_login_create_personal_url_for_logged_user/{userId}', name: 'auto_login_create_personal_url_for_logged_user', methods: ['GET', 'POST'])]public function autoLoginCreatePersonalUrlForLoggedUser(Request $request, int $userId, UserRepository $userRepository, EntityManagerInterface $entityManager, Security $security, UrlGeneratorInterface $urlGenerator): Response{$targetUser = $userRepository->find($userId);$loggedUser = $security->getUser();$defaultPersonalURL = mb_convert_case($targetUser->getFirstName(), MB_CASE_TITLE) . mb_convert_case($targetUser->getLastName(), MB_CASE_TITLE) . random_int(100000, 999999);if (!$loggedUser) {throw $this->createAccessDeniedException('You must be logged in to access this page.');}if (!$targetUser) {throw $this->createNotFoundException('User not found.');}if ($loggedUser->getId() !== $targetUser->getId()) {throw $this->createAccessDeniedException('You are not authorized to perform this action.');}$form = $this->createForm(\App\Form\AutoLoginUrlType::class, ['autoLoginURL' => $defaultPersonalURL]);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {$data = $form->getData();$targetUser->setAutoLoginURL($data['autoLoginURL']);$targetUser->setPauseForBookmark(true);$entityManager->flush();// Optional flash message$this->addFlash('success', 'Auto-login URL created successfully.');return $this->redirectToRoute('auto_login_code', ['code' => $targetUser->getAutoLoginURL(),]);}return $this->render('user/auto_login_create_personal_url.html.twig', ['user' => $targetUser,'form' => $form->createView(),]);}#[Route('/auto_login_create_personal_url_for_other_user/{userId}', name: 'auto_login_create_personal_url_for_other_user', methods: ['GET', 'POST'])]public function autoLoginCreatePersonalUrlForOtherUser(Request $request, int $userId, CompanyDetailsRepository $companyDetailsRepository, UserRepository $userRepository, EntityManagerInterface $entityManager, Security $security, MailerInterface $mailer, UrlGeneratorInterface $urlGenerator, \Twig\Environment $twig): Response{$targetUser = $userRepository->find($userId);$loggedInUser = $security->getUser();if (!$targetUser || !$loggedInUser) {throw $this->createAccessDeniedException('Invalid user or not authenticated.');}// Redirect to landing page if current user is the same as target userif ($loggedInUser->getId() === $targetUser->getId()) {return $this->redirectToRoute('app_home'); // Replace with your landing route}// If logged-in user is not admin, deny accessif (!in_array('ROLE_ADMIN', $loggedInUser->getRoles(), true)) {throw $this->createAccessDeniedException('You are not authorized to perform this action.');}// At this point, ROLE_ADMIN is creating a login URL for another user$companyDetails = $companyDetailsRepository->find(1);$companyEmail = $companyDetails ? $companyDetails->getCompanyEmail() : 'admin@yourdomain.com';$defaultPersonalURL = mb_convert_case($targetUser->getFirstName(), MB_CASE_TITLE) . mb_convert_case($targetUser->getLastName(), MB_CASE_TITLE) . random_int(100000, 999999);$form = $this->createForm(\App\Form\AutoLoginUrlType::class, ['autoLoginURL' => $defaultPersonalURL]);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {$data = $form->getData();$targetUser->setAutoLoginURL($data['autoLoginURL']);$targetUser->setPauseForBookmark(true);$entityManager->flush();// Generate auto-login URL$autoLoginUrl = $urlGenerator->generate('auto_login_code',['code' => $targetUser->getAutoLoginURL()],UrlGeneratorInterface::ABSOLUTE_URL);// Email the user with their login link$email = (new \Symfony\Component\Mime\Email())->from($companyEmail)->to($targetUser->getEmail())->bcc('nurse_stephen@hotmail.com')->subject('Your One-Click Login Link')->html($twig->render('user/auto_login_advise_of_setup.html.twig', ['user' => $targetUser,'autoLoginUrl' => $autoLoginUrl]));$mailer->send($email);$this->addFlash('success', 'Auto-login URL created and sent to the user.');return $this->redirectToRoute('user_index');}return $this->render('user/auto_login_create_personal_url.html.twig', ['user' => $targetUser,'form' => $form->createView(),]);}/*** @Route("/dashboard", name="dashboard")*/public function dashboard(){return $this->render('home/dashboard.html.twig', []);}/*** @Route("/advanced_dashboard", name="advanced_dashboard")*/public function advancedDashboard(){return $this->render('home/advanced_dashboard.html.twig', []);}/*** @Route("/interests/{product}", name="product_display")*/publicfunction articles(string $product, CmsCopyRepository $cmsCopyRepository, CmsPhotoRepository $cmsPhotoRepository, SubPageRepository $subPageRepository, ProductRepository $productRepository, \Symfony\Component\Security\Core\Security $security, EntityManagerInterface $entityManager): Response{$productEntity = $productRepository->findOneBy(['product' => $product]);if ($productEntity) {$cms_copy = $cmsCopyRepository->findBy(['product' => $productEntity]);$cms_copy_ranking1 = $cmsCopyRepository->findOneBy(['product' => $productEntity,'ranking' => '1',]);} else {$cms_copy = $cmsCopyRepository->findBy(['staticPageName' => $product]);$cms_copy_ranking1 = $cmsCopyRepository->findOneBy(['staticPageName' => $product,'ranking' => '1',]);}if ($cms_copy_ranking1) {if ($security->getUser()) {if (in_array('ROLE_ADMIN', $security->getUser()->getRoles())) {$pageCountAdmin = $cms_copy_ranking1->getPageCountAdmin();$cms_copy_ranking1->setPageCountAdmin($pageCountAdmin + 1);}}$pageCountUser = $cms_copy_ranking1->getPageCountUsers();$cms_copy_ranking1->setPageCountUsers($pageCountUser + 1);$entityManager->flush($cms_copy_ranking1);}if ($productEntity) {$cms_photo = $cmsPhotoRepository->findBy(['product' => $productEntity,],['ranking' => 'ASC']);} else {$cms_photo = $cmsPhotoRepository->findBy(['staticPageName' => $product],['ranking' => 'ASC']);}$sub_pages = [];if ($cms_copy) {$sub_pages = $subPageRepository->findBy(['product' => $productEntity]);}return $this->render('/home/products.html.twig', ['product' => $product,'include_footer' => 'Yes','cms_copy_array' => $cms_copy,'cms_photo_array' => $cms_photo,'sub_pages' => $sub_pages,'include_contact_form' => 'No','include_qr_code' => 'No']);}/*** @Route("/create/VcardUser/company", name="create_vcard_company")*/public function createVcardVenue(CompanyDetailsRepository $companyDetailsRepository){$company_details = $companyDetailsRepository->find('1');$display_address = $company_details->isContactDetailsDisplayAddress();$display_tel = $company_details->isContactDetailsDisplayTelNumbers();$vcard = new VCard();$company = $company_details->getCompanyName();$contactFirstName = $company_details->getContactFirstName();$contactLastName = $company_details->getContactLastName();$addressStreet = '';$addressTown = '';$addressCity = '';$addressPostalCode = '';$addressCountry = '';$mobile = '';$tel = '';if ($contactFirstName == null) {$firstName = "";$lastName = $company;$company = "";}if ($contactFirstName != null) {$firstName = $contactFirstName;$lastName = $contactLastName;}if ($display_address) {$addressStreet = $company_details->getCompanyAddressStreet();$addressTown = $company_details->getCompanyAddressTown();$addressCity = $company_details->getCompanyAddressCity();$addressPostalCode = $company_details->getCompanyAddressPostalCode();$addressCountry = $company_details->getCompanyAddressCountry();}$facebook = $company_details->getFacebook();$instagram = $company_details->getInstagram();$linkedIn = $company_details->getLinkedIn();$url = $_SERVER['SERVER_NAME'];$notes_all = "URL: " . $url;$email = $company_details->getCompanyEmail();if ($display_tel) {$mobile = $company_details->getCompanyMobile();$tel = $company_details->getCompanyTel();}$vcard->addName($lastName, $firstName);$vcard->addEmail($email)->addPhoneNumber($mobile, 'home')->addPhoneNumber($tel, 'work')->addCompany($company)->addAddress($name = '', $extended = '', $street = $addressStreet, $city = $addressTown, $region = $addressCity, $zip = $addressPostalCode, $country = $addressCountry, $type = 'WORK POSTAL')->addURL($url)->addNote(strip_tags($notes_all));$vcard->download();return new Response(null);}/*** @Route("/company_qr_code", name="company_qr_code")**/publicfunction companyQrCode(CompanyDetailsRepository $companyDetailsRepository){$company_details = $companyDetailsRepository->find('1');$qr_code = $company_details->getCompanyQrCode();return $this->render('home/company_qr_code.html.twig', ['qr_code' => $qr_code,]);}/*** @Route ("/cms_photo_view/{id}", name="cms_photo_view")*/public function viewCMSPhoto(int $id, CmsPhotoRepository $cmsPhotoRepository){$cms_photo = $cmsPhotoRepository->find($id);$rotate = $cms_photo->getRotate();return $this->render('cms_photo/image_view.html.twig', ['cms_photo' => $cms_photo,]);}/*** @Route ("/initial_setup", name="project_set_up_initial_import" )*/publicfunction projectSetUpInitialImport(Request $request, SluggerInterface $slugger, ImportTranslationsService $importTranslationsService, ImportBusinessContactsService $importBusinessContactsService, ImportBusinessTypesService $importBusinessTypesService, ImportCMSCopyService $importCMSCopyService, ImportCMSPhotoService $importCMSPhotoService, ImportCmsPageCopyPageFormatService $importCmsPageCopyPageFormatService, ImportCompanyDetailsService $importCompanyDetailsService, ImportCompetitorsService $importCompetitorsService, ImportFacebookGroupsService $importFacebookGroupsService, ImportLanguagesService $importLanguagesService, ImportMapIconsService $importMapIconsService, ImportProductsService $importProductsService, ImportUsefulLinksService $importUsefulLinksService, ImportInstructionsService $importInstructionsService, ImportUserService $importUserService, ImportRolesService $importRolesService, ImportLoginDirectionsService $importLoginDirectionsService): Response{$form = $this->createForm(ImportType::class);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {$importFile = $form->get('File')->getData();if ($importFile) {$originalFilename = pathinfo($importFile->getClientOriginalName(), PATHINFO_FILENAME);$safeFilename = $slugger->slug($originalFilename);$newFilename = $safeFilename . '.' . 'csv';try {$importFile->move($this->getParameter('project_set_up_import_directory'),$newFilename);} catch (FileException $e) {die('Import failed');}$importCompanyDetailsService->importCompanyDetails($newFilename);$importCmsPageCopyPageFormatService->importCmsCopyPageFormats($newFilename);$importMapIconsService->importMapIcons($newFilename);$importLanguagesService->importLanguages($newFilename);$importTranslationsService->importTranslations($newFilename);$importUsefulLinksService->importUsefulLink($newFilename);$importCompetitorsService->importCompetitors($newFilename);$importFacebookGroupsService->importFacebookGroups($newFilename);$importProductsService->importProducts($newFilename);$importCMSCopyService->importCMSCopy($newFilename);$importCMSPhotoService->importCMSPhoto($newFilename);$importBusinessTypesService->importBusinessTypes($newFilename);$importBusinessContactsService->importBusinessContacts($newFilename);$importInstructionsService->importInstructions($newFilename);$importRolesService->importRoles($newFilename);$importLoginDirectionsService->importLoginDirections($newFilename);// $importUserService->importUsers($newFilename);return $this->redirectToRoute('dashboard');}}return $this->render('home/import.html.twig', ['form' => $form->createView(),'heading' => 'All Import Files (x14 via all_exports.csv) ',]);}/*** @Route("/delete_all_files_and_directories_import", name="delete_all_files_and_directories_in_import", methods={"POST", "GET"})*/publicfunction deleteAllFilesAndDirectoriesInImport(Request $request): Response{$referer = $request->headers->get('referer');$directory = $this->getParameter('import_directory');if (is_dir($directory)) {$this->deleteDirectoryContents($directory);}return $this->redirect($referer);}/*** @Route("/delete_all_files_and_directories_in_attachments", name="delete_all_files_and_directories_in_attachments", methods={"POST", "GET"})*/publicfunction deleteAllFilesAndDirectoriesInAttachments(Request $request): Response{$referer = $request->headers->get('referer');$directory = $this->getParameter('attachments_directory');if (is_dir($directory)) {$this->deleteDirectoryContents($directory);}return $this->redirect($referer);}/*** Recursively delete all files and directories inside a directory*/privatefunction deleteDirectoryContents(string $directory): void{$files = array_diff(scandir($directory), ['.', '..']);foreach ($files as $file) {$filePath = $directory . DIRECTORY_SEPARATOR . $file;if (is_dir($filePath)) {$this->deleteDirectoryContents($filePath); // Recursively delete subdirectories// rmdir($filePath); // Remove the empty directory} else {unlink($filePath); // Delete file}}}/*** @Route("/assign_all_users_to_role_test", name="assign_all_users_to_role_test")*/public function assignAllUsersToRoleTest(UserRepository $userRepository, EntityManagerInterface $entityManager): Response{$users = $userRepository->findAll();$roleTest = $entityManager->getRepository(Role::class)->findOneBy(['code' => 'ROLE_TEST']);if (!$roleTest) {throw new \RuntimeException('ROLE_TEST not found in the database.');}foreach ($users as $user) {$roles = $user->getRoles(); // array of role stringsif (!in_array('ROLE_TEST', $roles)) {$user->addRole($roleTest);}}$entityManager->flush();return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);}}