src/Controller/DefaultController.php line 46

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Location;
  4. use App\Entity\ReleaseNote;
  5. use App\Entity\User;
  6. use App\EventListener\LoggableListener;
  7. use App\Controller\base\AbstractController;
  8. use App\Entity\Company;
  9. use App\Enum\Location\LocationIdEnum;
  10. use App\Form\UserMassImporterValidationType;
  11. use App\Model\Response\AjaxResponseSuccess;
  12. use App\Model\UserMassImporterResult;
  13. use App\Service\UserActivityService;
  14. use App\Service\UserImporterService;
  15. use Exception;
  16. use Psr\Log\LoggerInterface;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. /**
  24. * @Route("/")
  25. */
  26. class DefaultController extends AbstractController
  27. {
  28. /** @var SessionInterface */
  29. private $session;
  30. /** @var LoggerInterface */
  31. private $logger;
  32. public function __construct(RequestStack $requestStack, LoggerInterface $logger)
  33. {
  34. $this->session = $requestStack->getSession();
  35. $this->logger = $logger;
  36. }
  37. /**
  38. * @Route("/", name="app_index")
  39. */
  40. public function index(): Response
  41. {
  42. // if user is logged in
  43. /** @var User $user */
  44. if ($user = $this->getUser()) {
  45. // if admin login admin first
  46. if ($user->isHatchAdministrator()) {
  47. return $this->redirectToRoute('admin_index');
  48. }
  49. // if company is still active
  50. $activeLocations = $user->getActiveLocations();
  51. if ($activeLocations->isEmpty() ) {
  52. $this->addFlash('notice', 'User has no active location(s)');
  53. return $this->redirectToRoute('app_logout');
  54. }
  55. $defaultLocation = $user->getDefaultLocation();
  56. if ($defaultLocation instanceof Location && $activeLocations->contains($defaultLocation) ) {
  57. return $this->redirectToRoute('app_change_location', [ 'locationId' => $defaultLocation->getId() ] );
  58. }
  59. if ($activeLocations->count() == 1) {
  60. return $this->redirectToRoute('app_change_location', [ 'locationId' => $activeLocations->first()->getId() ] );
  61. } else {
  62. return $this->redirectToRoute('location_login_select');
  63. }
  64. }
  65. //if user is not logged in
  66. return $this->redirectToRoute('app_login');
  67. }
  68. /**
  69. * @Route("/change/location/{locationId}", name="app_change_location")
  70. *
  71. * @param Request $request
  72. * @param int $locationId
  73. * @param UserActivityService $userActivityService
  74. *
  75. * @return Response
  76. */
  77. public function changeLocation(Request $request, int $locationId, UserActivityService $userActivityService): Response
  78. {
  79. /** @var User $user */
  80. if (!$user = $this->getUser()) {
  81. return $this->redirectToRoute('app_index');
  82. }
  83. $location = $this->getDoctrine()->getRepository(Location::class)->find($locationId);
  84. if (!$location || !$location->isActive() || !$location->getCompany()->isActive()) {
  85. return $this->redirectToRoute('app_login');
  86. }
  87. if ($locationId == LocationIdEnum::LOCATION_ID_ADMINISTRATION_OFFICE) {
  88. $userActivityService->logAdminActivity(LoggableListener::ACTION_LOGIN, $user, $this->getUser());
  89. return $this->redirectToRoute('admin_index');
  90. }
  91. $userActivityService->logUserActivity(LoggableListener::ACTION_LOGIN, $user, $locationId, $this->getUser());
  92. $this->session->set('loginIsTracked', true);
  93. try {
  94. if(
  95. !strpos($request->server->get('HTTP_REFERER'),'login') &&
  96. !strpos($request->server->get('HTTP_REFERER'),'company')
  97. ){
  98. $httpReferrer = $request->server->get('HTTP_REFERER', 'client');
  99. $broken = explode('/', $httpReferrer);
  100. $broken[4] = $locationId;
  101. $refer = implode('/', $broken);
  102. if ($locationId != LocationIdEnum::LOCATION_ID_ADMINISTRATION_OFFICE) {
  103. //$refer = str_ireplace('admin','client', $refer);
  104. $broken[3] = 'client';
  105. //if you are at a page like /admin/user/1234
  106. //this will ensure the user will be redirected to /client/{locationId}
  107. //and not to /client/{locationId}/123
  108. if (str_contains($httpReferrer, 'admin')) {
  109. $refer = implode('/', array_slice($broken, 0, 5));
  110. }
  111. }
  112. $refer = str_ireplace('company','client', $refer);
  113. if(strpos($refer, 'client') !== false){
  114. // test to make sure redirect will be good
  115. $urlPieces = explode('/',$refer);
  116. $key = array_search('client', $urlPieces);
  117. if(isset($urlPieces[$key+1]) && is_numeric($urlPieces[$key+1])){
  118. return $this->redirect($refer);
  119. }
  120. }
  121. return $this->redirect($refer);
  122. }
  123. } catch (\Exception $e) {
  124. $this->logger->error("Error changing location. Error:" . $e->getMessage());
  125. return $this->redirectToRoute('client_index', [
  126. 'locationId' => $locationId
  127. ]);
  128. }
  129. return $this->redirectToRoute('client_index', [
  130. 'locationId' => $locationId
  131. ]);
  132. }
  133. /**
  134. * @Route("/change/company/{company}", name="app_change_to_company_admin")
  135. *
  136. * @param Request $request
  137. * @param Company $company
  138. * @param UserActivityService $userActivityService
  139. *
  140. * @return Response
  141. */
  142. public function goToCompanyAdmin(Request $request, Company $company, UserActivityService $userActivityService): Response
  143. {
  144. try {
  145. /** @var User $user */
  146. if (!$user = $this->getUser()) {
  147. return $this->redirectToRoute('app_index');
  148. }
  149. $this->session->set('loginIsTracked', true);
  150. $userActivityService->logCompanyAdminActivity(LoggableListener::ACTION_LOGIN, $user, $this->getUser(), $company);
  151. return $this->redirectToRoute('company_admin_index', [
  152. 'company' => $company
  153. ]);
  154. } catch (Exception $e) {
  155. $this->logger->error("Problem Opening Company Admin. Error:" . $e->getMessage());
  156. $this->addFlash('error', 'Problem Opening Company Admin');
  157. return $this->redirectToRoute('app_index');
  158. }
  159. }
  160. /**
  161. * @Route("/releaseNoteOptOut", name="releaseNoteOptOut", methods={"POST"})
  162. * @return JsonResponse
  163. */
  164. public function updateReleaseNoteOptOut(): JsonResponse {
  165. /** @var User $user */
  166. $user = $this->getUser();
  167. $currentActiveReleaseNote = $this->getDoctrine()->getRepository(ReleaseNote::class)->getCurrentActive();
  168. $user->setOptOutReleaseNoteId($currentActiveReleaseNote->getId());
  169. $this->getDoctrine()->getManager()->persist($user);
  170. $this->getDoctrine()->getManager()->flush();
  171. return new JsonResponse(
  172. new AjaxResponseSuccess('Success')
  173. );
  174. }
  175. /**
  176. * @Route("/sessionStatusCheck", name="session_status_check", methods={"POST"})
  177. * @return JsonResponse
  178. */
  179. public function sessionStatusCheck(): JsonResponse {
  180. $status = $this->getUser() ? 1 : 0;
  181. if ($status === 0) {
  182. $this->addFlash('error', 'Your session has ended');
  183. }
  184. return new JsonResponse(new AjaxResponseSuccess($status));
  185. }
  186. /**
  187. * @Route("/mass-upload-validation", name="mass_upload_validation", methods={"GET", "POST"})
  188. */
  189. public function massUploadValidation(Request $request, UserImporterService $userImporterService): Response
  190. {
  191. $form = $this->createForm(UserMassImporterValidationType::class);
  192. $form->handleRequest($request);
  193. if($form->isSubmitted() && $form->isValid()) {
  194. $csvFile = $form->get('csv_file')->getData();
  195. if($csvFile) {
  196. $importResult = $userImporterService->import($csvFile, null);
  197. }
  198. }
  199. return $this->render('Default/mass_import.html.twig', [
  200. 'form' => $form->createView(),
  201. 'import_result' => $importResult ?? new UserMassImporterResult(),
  202. 'import_keys' => $userImporterService->getKeys()
  203. ]);
  204. }
  205. }