<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Security;
use App\Entity\User;
use App\Repository\UserRepository;
use App\Repository\RegionRepository;
use App\Form\UserType;
use App\Service\AdminService;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
/**
* @Route("/admin", name="admin_")
*/
class AdminController extends AbstractController
{
#[Route('/login', name: 'login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('admin/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
#[Route('/logout', name: 'logout')]
public function logout(Security $security): Response
{
// logout the user in on the current firewall
$response = $security->logout();
// you can also disable the csrf logout
$response = $security->logout(false);
echo "en logout....";
die;
return $this->redirect($this->generateUrl('admin_login'));
}
#[Route('/home', name: 'home')]
public function home(#[CurrentUser] ?User $user): Response
{
return $this->redirect($this->generateUrl('admin_admin_home'));
}
#[Route('/', name: 'default')]
public function default(
Request $request,
): Response
{
return $this->redirect($this->generateUrl('admin_index'));
}
#[Route('/index', name: 'index')]
public function index(
Request $request,
): Response
{
$userActual = $this->getUser();
if (!$userActual){
$this->addFlash('warning', 'Sesión Expirada!');
return $this->redirect($this->generateUrl('admin_login'));
}
if (!$userActual->isActivo()) {
$this->addFlash('warning', 'Usuario inactivo');
return $this->redirect($this->generateUrl('admin_login'));
}
return $this->redirect($this->generateUrl('admin_home'));
}
#[Route('/admin-home', name: 'admin_home')]
public function adminHome(
Request $request,
AdminService $adminService,
): Response
{
$userActual = $this->getUser();
if (!$userActual){
$this->addFlash('warning', 'Sesión Expirada!');
return $this->redirect($this->generateUrl('admin_login'));
}
if (!$userActual->isActivo()) {
$this->addFlash('warning', 'Usuario inactivo');
return $this->redirect($this->generateUrl('admin_login'));
}
$menuAdmin = $adminService->getMenuAdmin($userActual->getRoles());
return $this->render('admin/admin-home.html.twig', [
'menuAdmin' => $menuAdmin
]);
}
#[Route('/usuarios', name: 'usuarios')]
public function usuarios(
Request $request,
UserRepository $userRepository,
AdminService $adminService,
RegionRepository $regionRepository,
): Response
{
try {
$userActual = $this->getUser();
if (!$userActual){
$this->addFlash('warning', 'Sesión Expirada!');
return $this->redirect($this->generateUrl('admin_login'));
}
if (!$userActual->isActivo()) {
$this->addFlash('warning', 'Usuario inactivo');
return $this->redirect($this->generateUrl('admin_login'));
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_ADMINISTRADOR_USU')
){
$this->addFlash('warning', 'Acceso denegado');
return $this->redirect($this->generateUrl('admin_home'));
}
$page = $request->query->getInt('page', 1);
$limit = 10;
$filters = [
'id' => $request->query->get('id'),
'nombres' => $request->query->get('nombres'),
'email' => $request->query->get('email'),
'region' => $request->query->get('region'),
'role' => $request->query->get('role'),
'activo' => $request->query->get('activo'),
];
$menuAdmin = $adminService->getMenuAdmin($userActual->getRoles(), 'admin_usuarios');
$usuarios = $userRepository->findAllPaginatedWithFilters($page, $limit, $filters, $userActual);
$roles = $adminService->getRolesLista();
$regiones = $regionRepository->findAll();
return $this->render('admin/usuarios.html.twig', [
'usuarios'=>$usuarios,
'filters' => $filters,
'menuAdmin' => $menuAdmin,
'roles' => $roles,
'regiones'=> $regiones,
]);
} catch (\Exception $e) {
$this->addFlash('danger', 'Ocurrió un error Inesperado' . $e->getMessage());
return $this->redirect($this->generateUrl('admin_home'));
}
}
#[Route('/usuarios/edit/{id}', name: 'usuarios_edit')]
public function usuariosEditar(
Request $request,
Int $id,
UserPasswordHasherInterface $passwordHasher,
UserRepository $userRepository,
AdminService $adminService,
): Response
{
try {
$userActual = $this->getUser();
if (!$userActual){
$this->addFlash('warning', 'Sesión Expirada!');
return $this->redirect($this->generateUrl('admin_login'));
}
if (!$userActual->isActivo()) {
$this->addFlash('warning', 'Usuario inactivo');
return $this->redirect($this->generateUrl('admin_login'));
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_ADMINISTRADOR_USU')
){
$this->addFlash('warning', 'Acceso denegado');
return $this->redirect($this->generateUrl('admin_home'));
}
$menuAdmin = $adminService->getMenuAdmin($userActual->getRoles(), 'admin_usuarios');
$usuario = $userRepository->findOneById($id);
$form = $this->createForm(UserType::class, $usuario, [
'userActual' => $userActual,
]);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$dataForm = $request->request->all();
if (isset($dataForm["user"]["changePassword"]) && $dataForm["user"]["changePassword"]) {
$plainPassword = $dataForm["user"]["plainPassword"]["first"];
$hashedPassword = $passwordHasher->hashPassword($usuario, $plainPassword);
$usuario->setPassword($hashedPassword);
}
$userRepository->save($usuario, true);
$this->addFlash('success', 'Usuario guardado exitosamente');
return $this->redirect($this->generateUrl('admin_usuarios'));
} catch (\Exception $e) {
$this->addFlash('danger', 'Ocurrió un error al guardar el usuario' . $e->getMessage());
return $this->redirectToRoute('admin_usuarios_edit', ['id' => $id]);
}
}else{
foreach ($form->getErrors() as $error) {
$message[] = $error->getMessage();
$this->addFlash('danger', $error->getMessage());
}
}
}
return $this->renderForm('admin/usuarios_edit.html.twig', [
'usuario'=>$usuario,
'form' => $form,
'menuAdmin' => $menuAdmin,
]);
} catch (\Exception $e) {
$this->addFlash('danger', 'Ocurrió un error Inesperado' . $e->getMessage());
return $this->redirect($this->generateUrl('admin_home'));
}
}
#[Route('/usuarios/new', name: 'usuarios_new')]
public function usuariosNew(
Request $request,
UserRepository $userRepository,
UserPasswordHasherInterface $passwordHasher,
AdminService $adminService,
): Response
{
try {
$userActual = $this->getUser();
if (!$userActual){
$this->addFlash('warning', 'Sesión Expirada!');
return $this->redirect($this->generateUrl('admin_login'));
}
if (!$userActual->isActivo()) {
$this->addFlash('warning', 'Usuario inactivo');
return $this->redirect($this->generateUrl('admin_login'));
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_ADMINISTRADOR_USU')
){
$this->addFlash('warning', 'Acceso denegado');
return $this->redirect($this->generateUrl('admin_home'));
}
$menuAdmin = $adminService->getMenuAdmin($userActual->getRoles(), 'admin_usuarios');
$usuario = new User();
$form = $this->createForm(UserType::class, $usuario,
['userActual' => $userActual,]
);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$dataForm = $request->request->all();
$plainPassword = $dataForm["user"]["plainPassword"]["first"];
$hashedPassword = $passwordHasher->hashPassword($usuario, $plainPassword);
$usuario->setPassword($hashedPassword);
$usuariosExistente = $userRepository->findOneByEmail($usuario->getEmail());
if(!empty($usuariosExistente)){
$this->addFlash('danger', 'Email ya registrado');
return $this->redirect($this->generateUrl('admin_usuarios_new'));
}
$userRepository->save($usuario, true);
$this->addFlash('success', 'Usuario guardado exitosamente');
return $this->redirect($this->generateUrl('admin_usuarios'));
} catch (\Exception $e) {
$this->addFlash('danger', 'Ocurrió un error al guardar el usuario' /*. $e->getMessage() */);
return $this->redirect($this->generateUrl('admin_usuarios_new'));
}
}else{
foreach ($form->getErrors() as $error) {
$message[] = $error->getMessage();
$this->addFlash('danger', $error->getMessage());
}
}
}
return $this->renderForm('admin/usuarios_new.html.twig', [
'usuario'=>$usuario,
'form' => $form,
'menuAdmin' => $menuAdmin,
]);
} catch (\Exception $e) {
$this->addFlash('danger', 'Ocurrió un error Inesperado' . $e->getMessage());
return $this->redirect($this->generateUrl('admin_home'));
}
}
/**
* @Route("/admin-menu-usuarios-view", name="adminMenuUsuariosView")
*/
public function adminMenuUsuariosView(
Request $request,
AdminService $adminService,
)
{
try {
$userActual = $this->getUser();
if (!$userActual){
$this->addFlash('warning', 'Sesión Expirada!');
return $this->redirect($this->generateUrl('admin_login'));
}
if (!$userActual->isActivo()) {
$this->addFlash('warning', 'Usuario inactivo');
return $this->redirect($this->generateUrl('admin_login'));
}
$menuAdmin = $adminService->getMenuAdmin($userActual->getRoles(), 'admin_usuarios');
return $this->renderForm(
'base_admin_menu.html.twig',
['menuAdmin' => $menuAdmin]
);
} catch (\Exception $e) {
$this->addFlash('danger', 'Ocurrió un error Inesperado' . $e->getMessage());
return $this->redirect($this->generateUrl('admin_home'));
}
}
}