<?php
namespace App\Controller;
use App\Model\User\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\EntityManagerInterface;
use LogicException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
use UnexpectedValueException;
class BaseController extends AbstractController
{
final public const MENU_DASHBOARD = 'dashboard';
final public const MENU_USERS = 'users';
final public const MENU_PARKING = 'parking';
final public const MENU_CAR = 'car';
final public const MENU_PROFILE = 'profile';
final public const MENU_RESERVATION = 'reservation';
final public const MENU_GATEKEEPER = 'gatekeeper';
final public const MENU_RECEPTION = "reception";
final public const MENU_CAMERA = "camera";
final public const MENU_CONFIG = "config";
final public const MENU_REPORTER = "reporter";
final public const MENU_RESERVATION_OVERVIEW = "reservation-overview";
final public const SESSION_REFERER = "session-referer";
protected $activeMenu = self::MENU_DASHBOARD;
/**
* BaseController constructor
* @return void
*/
public function __construct(
protected EntityManagerInterface $entityManager,
protected UrlMatcherInterface $matcher
)
{
}
/**
* BaseController render injection
* @param string $view
* @param array $parameters
* @param Response|null $response
* @return Response
* @throws LogicException
* @throws UnexpectedValueException
*/
public function render(string $view, array $parameters = [], Response $response = null): response
{
$parameters['activeMenu'] = $this->activeMenu;
return parent::render($view, $parameters, $response);
}
public static function hasPriviledge(?User $who, User $against)
{
if($who == null || $against == null)
{
return false;
}
if (! $who->getIsActive()) {
return false;
}
if($who == $against)
{
return true;
}
$userRoles = $who->getRoles();
if(in_array(User::ROLE_ADMIN, $userRoles))
{
return true;
}
if(in_array(User::ROLE_RECEPTION, $userRoles) || (in_array(User::ROLE_REPORTER, $userRoles) || in_array(User::ROLE_COMPANYADMIN, $userRoles)))
{
/*if (in_array(User::ROLE_ADMIN, $against->getRoles())) {
return false;
}*/
if($who->getCompanies()->isEmpty())
{
return false;
}
$intersetction = array_intersect($who->getCompanies()->toArray(), $against->getCompanies()->toArray());
if(! empty($intersetction))
{
return true;
}
}
return false;
}
public static function getCompanyIdsOrEmptyForAdmin(?User $user): ?array
{
if($user == null)
{
return null;
}
$companies = [];
if(!in_array(User::ROLE_ADMIN, $user->getRoles()))
{
if(in_array(User::ROLE_RECEPTION, $user->getRoles()) || in_array(User::ROLE_COMPANYADMIN, $user->getRoles()) || in_array(User::ROLE_REPORTER, $user->getRoles()))
{
if(!$user->getCompanies()->isEmpty())
{
foreach($user->getCompanies() as $comp)
{
$companies[] = $comp->getId();
}
}
}
else
{
return null;
}
}
return $companies;
}
public static function getCompaniesOrEmptyForAdmin(User $user): ?Collection
{
if($user == null)
{
return null;
}
$companies = new ArrayCollection();
if(!in_array(User::ROLE_ADMIN, $user->getRoles()))
{
if( in_array(User::ROLE_RECEPTION, $user->getRoles()) ||
in_array(User::ROLE_COMPANYADMIN, $user->getRoles())
)
{
$companies = $user->getCompanies();
}
else
{
return null;
}
}
return $companies;
}
#[Route(path: '/', name: 'home')]
public function homePage(Request $request)
{
$this->clearReferer($request);
$currentUser = $this->getUser();
if($currentUser == null)
{
return $this->redirectToRoute('app_login');
}
$roles = $currentUser->getRoles();
if(in_array(User::ROLE_ADMIN,$roles))
{
return $this->redirectToRoute('dashboard');
}
else if(in_array(User::ROLE_GATE, $roles))
{
return $this->redirectToRoute("gatekeeper");
}
else if(in_array(User::ROLE_RECEPTION,$roles))
{
return $this->redirectToRoute('reception_create_visitor');
}
else if(in_array(User::ROLE_REPORTER,$roles))
{
return $this->redirectToRoute("report");
}
return $this->redirectToRoute("user_reservations");
}
public function updateReferer(Request $request)
{
$session = $request->getSession();
if(!$session->has(self::SESSION_REFERER))
{
if($request->headers->get('referer') !== null)
{
try{
$referer = $request->headers->get('referer');
$basePath = $request->getSchemeAndHttpHost();
$strPos = strlen($basePath);
$path = substr($referer, $strPos);
$strPos = strpos($path, "?");
if($strPos !== false)
{
$path = substr($path,0,$strPos);
}
//$path = str_replace($request->getBaseUrl(), '', $lastPath);
$parameters = $this->matcher->match($path);
$route = $parameters['_route'];
$currentRoute = $request->getRequestUri();
$parameters2 = $this->matcher->match($currentRoute);
$route2 = $parameters2['_route'];
if($route != $route2)
{
$session->set(self::SESSION_REFERER, $referer);
}
else
{
$session->set(self::SESSION_REFERER, $this->generateUrl("home"));
}
}
catch(\Exception $e)
{
$session->set(self::SESSION_REFERER, $this->generateUrl("home"));
}
}
else
{
$session->set(self::SESSION_REFERER, $this->generateUrl("home"));
}
}
}
public function clearReferer(Request $request)
{
$session = $request->getSession();
$session->remove(self::SESSION_REFERER);
}
public function getReferer(Request $request): ?string
{
$session = $request->getSession();
$referer = $session->get(self::SESSION_REFERER);
$this->clearReferer($request);
if($referer === null)
{
$referer = $this->generateUrl('home');
}
return $referer;
}
}