<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\User;
use App\Form\UserType;
class UserController extends BaseController
{
/**
* @Route("/login", name="login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
if($this->isGranted('ROLE_USER')) return $this->redirectToRoute('root');
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('login/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
/**
* @Route("/logout", name="logout", methods={"GET"})
*/
public function logout(): void
{
// controller can be blank: it will never be called!
throw new \Exception('Don\'t forget to activate logout in security.yaml');
}
/**
* @Route("/confirm-logout", name="confirm_logout", methods={"GET"})
*/
public function confirmLogout(): Response
{
return $this->render('login/logout.html.twig');
}
/**
* @Route("/profile", name="profile", methods={"GET"})
*/
public function profile(): Response
{
return $this->render('login/profile.html.twig', [
'user' => $this->getUser(),
]);
}
/**
* @Route("/users", name="users")
*/
public function users()
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$adminLevel = $this->isGranted('ROLE_SUPER_ADMIN') ? 'ROLE_SUPER_ADMIN' : 'ROLE_ADMIN';
return $this->render(
'pages/users.html.twig',
[
'users' => $this->userModel->getAllUsers($adminLevel),
]
);
}
/**
* @Route("/user/{id}", name="user_detail", defaults={"id"=null}, requirements={"id"="\d+"})
*/
public function userDetail($id, Request $request)
{
$this->denyAccessUnlessGranted('ROLE_ADMIN'); // musim byt admin
$adminLevel = $this->isGranted('ROLE_SUPER_ADMIN') ? 'ROLE_SUPER_ADMIN' : 'ROLE_ADMIN';
// radsi si to osetrim:
$from = $request->query->get('from');
if(!in_array($from, ['suppliers', 'providers'])) $from = 'users';
if(is_null($id))
{
// NOVY UZIVATEL
// zde jeste specielni osetreni:
// pokud jsem jen admin, musim dostat v requestu suppliera nebo providera (navazane na uzivatele)
if($adminLevel == 'ROLE_ADMIN' && is_null($request->query->get('supplier_id')) && is_null($request->query->get('provider_id')))
{
throw $this->createAccessDeniedException();
}
$user = new User;
$operation = 'create';
// role podle todo, zda mam navazujici id:
switch(true)
{
case !is_null($request->query->get('supplier_id')) :
$user->setRoles(['ROLE_SUPPLIER']);
$user->setSupplier($this->supplierModel->getSupplier($request->query->get('supplier_id')));
break;
case !is_null($request->query->get('provider_id')) :
$user->setRoles(['ROLE_PROVIDER']);
$user->setProvider($this->providerModel->getProvider($request->query->get('provider_id')));
break;
case $adminLevel == 'ROLE_SUPER_ADMIN':
$user->setRoles(['ROLE_ADMIN']);
break;
}
}
else
{
// editace
$user = $this->userModel->getUser($adminLevel, $id);
if(empty($user)) throw $this->createNotFoundException('Uživatel nenalezen');
$operation = 'edit';
}
$role = $this->userModel::USER_ROLE_NAMES[$user->getSingleRole()];
switch($user->getSingleRole())
{
case 'ROLE_SUPPLIER': $role .= ' ' . $user->getSupplier()->getDescription(); break;
case 'ROLE_PROVIDER': $role .= ' ' . $user->getProvider()->getDescription(); break;
default: break; // pro admina zustava jen admin
}
$form = $this->createForm(UserType::class, $user, ['operation' => $operation, 'admin_level' => $adminLevel]);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid())
{
// poresit prava
/*
if($adminLevel == 'ROLE_SUPER_ADMIN' && $form['roleStyle']->getData() == 'admin')
{
$roles = array();
$roles[] = 'ROLE_ADMIN';
}
else
{
$roles = $form['roles']->getData();
}
$user->setRoles($roles);
*/
if(is_null($id))
{
// vytvareni noveho
$result = $this->userModel->createNewUser($user);
if($result === true)
{
$this->addFlash('success', 'Uživatel vytvořen');
return $this->redirectToRoute($from);
}
else
{
$this->addFlash('danger', $result);
}
}
else
{
// uprava stavajiciho
$result = $this->userModel->updateUser($user);
if($result === true)
{
$this->addFlash('success', 'Uživatel upraven');
return $this->redirectToRoute($from);
}
else
{
$this->addFlash('danger', $result);
}
}
}
return $this->render(
'pages/user-detail.html.twig',
[
'form' => $form->createView(),
'operation' => $operation,
'role' => $role,
'from' => $from,
]
);
}
/************************************************************************************************************************************************/
/* AJAX
/************************************************************************************************************************************************/
/**
* @Route("/ajax/user-toggle-block/{id}", name="user_toggle_block", requirements={"id"="\d+"}, methods={"POST"}, condition="request.isXmlHttpRequest()")
*/
public function toggleUserBlock($id)
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$adminLevel = $this->isGranted('ROLE_SUPER_ADMIN') ? 'ROLE_SUPER_ADMIN' : 'ROLE_ADMIN';
try
{
$stav = $this->userModel->toggleUserBlock($adminLevel, $id);
}
catch(\Exception $e)
{
return new JsonResponse(["code" => 500, "result" => $e->getMessage()]);
}
return new JsonResponse(["code" => 200, "result" => $stav ? '1' : '0']);
}
}