src/Controller/HomeController.php line 25
<?phpnamespace App\Controller;use App\Entity\PageVisit;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\PageVisitRepository;use App\Repository\ProductRepository;use App\Repository\RoleRepository;use App\Repository\UserRepository;use App\Repository\SubPageRepository;use App\Security\LoginAuthenticator;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\HeaderUtils;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\Authentication\UserAuthenticatorInterface;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, Security $security, EntityManagerInterface $entityManager, PageVisitRepository $pageVisitRepository):Response{// Resolve favicon directory relative to /public$faviconsDirectory = str_replace($this->getParameter('kernel.project_dir') . '/public','',$this->getParameter('favicons_directory'));$companyDetails = $companyDetailsRepository->find('1');$homePagePhotosOnly = 0;$include_qr_code = [];$include_contact_form = [];$website_contact = new WebsiteContacts();$form = $this->createForm(WebsiteContactsType::class, $website_contact);$form->handleRequest($request);if ($companyDetails) {$homePagePhotosOnly = $companyDetails->isHomePagePhotosOnly();$include_qr_code = $companyDetails->isIncludeQRCodeHomePage();$include_contact_form = $companyDetails->isIncludeContactFormHomePage();}// Load Home CMS copy & photos$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';}// -------------------------------------------------// 1) Increment today's PageVisit for the homepage// (product = null bucket)// -------------------------------------------------$user = $security->getUser();$today = new \DateTimeImmutable('today');$homeVisit = $pageVisitRepository->findOneBy(['date' => $today,'product' => null, // 👈 homepage bucket]);if (!$homeVisit) {$homeVisit = new PageVisit();$homeVisit->setDate($today);$homeVisit->setProduct(null);$homeVisit->setCount(0);$homeVisit->setCountUser(0);$homeVisit->setCountAdmin(0);$entityManager->persist($homeVisit);}if (!$user) {// Anonymous visitor$homeVisit->setCount($homeVisit->getCount() + 1);} elseif (in_array('ROLE_ADMIN', $user->getRoles(), true)) {// Admin$homeVisit->setCountAdmin($homeVisit->getCountAdmin() + 1);} else {// Logged-in non-admin$homeVisit->setCountUser($homeVisit->getCountUser() + 1);}// Flush CmsCopy + PageVisit changes once$entityManager->flush();// -------------------------------------------------// 2) Build totals for the homepage across all dates// -------------------------------------------------$visitTotals = ['public' => 0,'user' => 0,'admin' => 0,];$homeVisitsAll = $pageVisitRepository->findBy(['product' => null, // all homepage rows]);foreach ($homeVisitsAll as $visit) {$visitTotals['public'] += (int)$visit->getCount();$visitTotals['user'] += (int)$visit->getCountUser();$visitTotals['admin'] += (int)$visit->getCountAdmin();}// ----------------------------------// 3) Existing render logic// ----------------------------------$product = [];$sub_pages = [];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,'visitTotals' => $visitTotals, // 👈 added]);} 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,'visitTotals' => $visitTotals, // 👈 added]);}}/*** @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)->setPauseForBookmark(false)->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, UserAuthenticatorInterface $userAuthenticator, LoginAuthenticator $loginAuthenticator, Request $request): Response{$user = $userRepository->findOneBy(['autoLoginURL' => $code]);if (!$user instanceof UserInterface) {throw $this->createNotFoundException('Invalid or expired auto-login code.');}// Special case: bookmark pause page BEFORE redirecting them anywhereif ($user->isPauseForBookmark()) {// Option A: log them in (so they’re authenticated) but STILL show pause page:$userAuthenticator->authenticateUser($user, $loginAuthenticator, $request);return $this->render('user/auto_login_bookmark_pause_landing_page.html.twig', ['user' => $user,]);}// Normal flow: authenticate via the same LoginAuthenticator used at /login// This will call LoginAuthenticator::onAuthenticationSuccess()// which uses your LoginDirection logic.return $userAuthenticator->authenticateUser($user,$loginAuthenticator,$request);}#[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("/helpful_guides", name="helpful_guides")*/public function helpfulGuides(ProductRepository $productRepository){$products = $productRepository->findBy(['category' => 'Useful Guide']);return $this->render('home/helpful_guides.html.twig', ['products' => $products,]);}/*** @Route("/interests/{product}", name="product_display")*/public function articles(string $product,CmsCopyRepository $cmsCopyRepository,CmsPhotoRepository $cmsPhotoRepository,SubPageRepository $subPageRepository,ProductRepository $productRepository,\Symfony\Component\Security\Core\Security $security,EntityManagerInterface $entityManager,PageVisitRepository $pageVisitRepository): 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',]);}// ------------------------------------// 1) Page visit increment for today// ------------------------------------// Default zero totals (covers static pages too)$visitTotals = ['public' => 0,'user' => 0,'admin' => 0,];if ($productEntity) {// Normalised "today" (midnight)$today = new \DateTimeImmutable('today');// Try to find existing PageVisit for this product+date$pageVisit = $pageVisitRepository->findOneBy(['product' => $productEntity,'date' => $today,]);if (!$pageVisit) {$pageVisit = new PageVisit();$pageVisit->setProduct($productEntity);$pageVisit->setDate($today);$pageVisit->setCount(0);$pageVisit->setCountUser(0);$pageVisit->setCountAdmin(0);$entityManager->persist($pageVisit);}$user = $security->getUser();if (!$user) {// Anonymous visitor$pageVisit->setCount($pageVisit->getCount() + 1);} elseif (in_array('ROLE_ADMIN', $user->getRoles(), true)) {// Admin$pageVisit->setCountAdmin($pageVisit->getCountAdmin() + 1);} else {// Logged-in non-admin user$pageVisit->setCountUser($pageVisit->getCountUser() + 1);}// Flush all changes once$entityManager->flush();// ------------------------------------// 2) Build totals for THIS product// ------------------------------------$pageVisitsForProduct = $pageVisitRepository->findBy(['product' => $productEntity,]);foreach ($pageVisitsForProduct as $visit) {$visitTotals['public'] += (int)$visit->getCount();$visitTotals['user'] += (int)$visit->getCountUser();$visitTotals['admin'] += (int)$visit->getCountAdmin();}} else {// No productEntity (static page) – nothing to increment or total// (visitTotals stays at 0/0/0)$entityManager->flush();}// ------------------------------------// 3) Existing content loading// ------------------------------------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','visitTotals' => $visitTotals, // 👈 added]);}/*** @Route ("/initial_setup", name="project_set_up_initial_import" )*/public function 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"})*/public function deleteAllFilesAndDirectoriesInImport(Request $request): Response{$referer = $request->headers->get('referer');if ($this->isCsrfTokenValid('delete_all_import_files', $request->request->get('_token'))) {$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"})*/public function deleteAllFilesAndDirectoriesInAttachments(Request $request): Response{$referer = $request->headers->get('referer');if ($this->isCsrfTokenValid('delete_all_attachment_files', $request->request->get('_token'))) {$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*/private function 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);}}