<?php
namespace App\Controller;
use App\Entity\Location;
use App\Entity\ReleaseNote;
use App\Entity\User;
use App\EventListener\LoggableListener;
use App\Controller\base\AbstractController;
use App\Entity\Company;
use App\Enum\Location\LocationIdEnum;
use App\Form\UserMassImporterValidationType;
use App\Model\Response\AjaxResponseSuccess;
use App\Model\UserMassImporterResult;
use App\Service\UserActivityService;
use App\Service\UserImporterService;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/")
*/
class DefaultController extends AbstractController
{
/** @var SessionInterface */
private $session;
/** @var LoggerInterface */
private $logger;
public function __construct(RequestStack $requestStack, LoggerInterface $logger)
{
$this->session = $requestStack->getSession();
$this->logger = $logger;
}
/**
* @Route("/", name="app_index")
*/
public function index(): Response
{
// if user is logged in
/** @var User $user */
if ($user = $this->getUser()) {
// if admin login admin first
if ($user->isHatchAdministrator()) {
return $this->redirectToRoute('admin_index');
}
// if company is still active
$activeLocations = $user->getActiveLocations();
if ($activeLocations->isEmpty() ) {
$this->addFlash('notice', 'User has no active location(s)');
return $this->redirectToRoute('app_logout');
}
$defaultLocation = $user->getDefaultLocation();
if ($defaultLocation instanceof Location && $activeLocations->contains($defaultLocation) ) {
return $this->redirectToRoute('app_change_location', [ 'locationId' => $defaultLocation->getId() ] );
}
if ($activeLocations->count() == 1) {
return $this->redirectToRoute('app_change_location', [ 'locationId' => $activeLocations->first()->getId() ] );
} else {
return $this->redirectToRoute('location_login_select');
}
}
//if user is not logged in
return $this->redirectToRoute('app_login');
}
/**
* @Route("/change/location/{locationId}", name="app_change_location")
*
* @param Request $request
* @param int $locationId
* @param UserActivityService $userActivityService
*
* @return Response
*/
public function changeLocation(Request $request, int $locationId, UserActivityService $userActivityService): Response
{
/** @var User $user */
if (!$user = $this->getUser()) {
return $this->redirectToRoute('app_index');
}
$location = $this->getDoctrine()->getRepository(Location::class)->find($locationId);
if (!$location || !$location->isActive() || !$location->getCompany()->isActive()) {
return $this->redirectToRoute('app_login');
}
if ($locationId == LocationIdEnum::LOCATION_ID_ADMINISTRATION_OFFICE) {
$userActivityService->logAdminActivity(LoggableListener::ACTION_LOGIN, $user, $this->getUser());
return $this->redirectToRoute('admin_index');
}
$userActivityService->logUserActivity(LoggableListener::ACTION_LOGIN, $user, $locationId, $this->getUser());
$this->session->set('loginIsTracked', true);
try {
if(
!strpos($request->server->get('HTTP_REFERER'),'login') &&
!strpos($request->server->get('HTTP_REFERER'),'company')
){
$httpReferrer = $request->server->get('HTTP_REFERER', 'client');
$broken = explode('/', $httpReferrer);
$broken[4] = $locationId;
$refer = implode('/', $broken);
if ($locationId != LocationIdEnum::LOCATION_ID_ADMINISTRATION_OFFICE) {
//$refer = str_ireplace('admin','client', $refer);
$broken[3] = 'client';
//if you are at a page like /admin/user/1234
//this will ensure the user will be redirected to /client/{locationId}
//and not to /client/{locationId}/123
if (str_contains($httpReferrer, 'admin')) {
$refer = implode('/', array_slice($broken, 0, 5));
}
}
$refer = str_ireplace('company','client', $refer);
if(strpos($refer, 'client') !== false){
// test to make sure redirect will be good
$urlPieces = explode('/',$refer);
$key = array_search('client', $urlPieces);
if(isset($urlPieces[$key+1]) && is_numeric($urlPieces[$key+1])){
return $this->redirect($refer);
}
}
return $this->redirect($refer);
}
} catch (\Exception $e) {
$this->logger->error("Error changing location. Error:" . $e->getMessage());
return $this->redirectToRoute('client_index', [
'locationId' => $locationId
]);
}
return $this->redirectToRoute('client_index', [
'locationId' => $locationId
]);
}
/**
* @Route("/change/company/{company}", name="app_change_to_company_admin")
*
* @param Request $request
* @param Company $company
* @param UserActivityService $userActivityService
*
* @return Response
*/
public function goToCompanyAdmin(Request $request, Company $company, UserActivityService $userActivityService): Response
{
try {
/** @var User $user */
if (!$user = $this->getUser()) {
return $this->redirectToRoute('app_index');
}
$this->session->set('loginIsTracked', true);
$userActivityService->logCompanyAdminActivity(LoggableListener::ACTION_LOGIN, $user, $this->getUser(), $company);
return $this->redirectToRoute('company_admin_index', [
'company' => $company
]);
} catch (Exception $e) {
$this->logger->error("Problem Opening Company Admin. Error:" . $e->getMessage());
$this->addFlash('error', 'Problem Opening Company Admin');
return $this->redirectToRoute('app_index');
}
}
/**
* @Route("/releaseNoteOptOut", name="releaseNoteOptOut", methods={"POST"})
* @return JsonResponse
*/
public function updateReleaseNoteOptOut(): JsonResponse {
/** @var User $user */
$user = $this->getUser();
$currentActiveReleaseNote = $this->getDoctrine()->getRepository(ReleaseNote::class)->getCurrentActive();
$user->setOptOutReleaseNoteId($currentActiveReleaseNote->getId());
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
return new JsonResponse(
new AjaxResponseSuccess('Success')
);
}
/**
* @Route("/sessionStatusCheck", name="session_status_check", methods={"POST"})
* @return JsonResponse
*/
public function sessionStatusCheck(): JsonResponse {
$status = $this->getUser() ? 1 : 0;
if ($status === 0) {
$this->addFlash('error', 'Your session has ended');
}
return new JsonResponse(new AjaxResponseSuccess($status));
}
/**
* @Route("/mass-upload-validation", name="mass_upload_validation", methods={"GET", "POST"})
*/
public function massUploadValidation(Request $request, UserImporterService $userImporterService): Response
{
$form = $this->createForm(UserMassImporterValidationType::class);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$csvFile = $form->get('csv_file')->getData();
if($csvFile) {
$importResult = $userImporterService->import($csvFile, null);
}
}
return $this->render('Default/mass_import.html.twig', [
'form' => $form->createView(),
'import_result' => $importResult ?? new UserMassImporterResult(),
'import_keys' => $userImporterService->getKeys()
]);
}
}