<?php
namespace App\Security\Voter;
use App\Repository\TbClienteRepository;
use App\Repository\TbPermisoUsuarioHimedAdminRepository;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Centraliza toda la lógica de los permisos para las acciones en Clientes y usuarios de cliente de HiMed Web
* y luego reutilizarlos en muchos lugares.
*/
class TbClienteRepositoryVoter extends Voter
{
private $tbPermisoUsuarioHimedAdminRepository;
public function __construct(TbPermisoUsuarioHimedAdminRepository $tbPermisoUsuarioHimedAdminRepository)
{
$this->tbPermisoUsuarioHimedAdminRepository = $tbPermisoUsuarioHimedAdminRepository;
}
protected function supports($attribute, $subject): bool
{
return in_array($attribute, [
'CONSULTAR_CLIENTE_HIMED_WEB',
'CONSULTAR_USUARIO_CLIENTE_HIMED_WEB',
'MODIFICAR_LICENCIA_CLIENTE_HIMED_WEB',
'ADICIONAR_LICENCIA_CLIENTE_HIMED_WEB',
'CONSULTAR_INFORMES_CLIENTE_HIMED_WEB',
'CREAR_CLIENTES_HIMED',
'CREAR_BASE_DATOS'])
&& $subject instanceof TbClienteRepository;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
/** @var TbClienteRepository $subject */
$user = $token->getUser();
// si el usuario es anónimo, no concede el acceso
if (!$user instanceof UserInterface) {
return false;
}
// Comprueba cada permiso de forma individual y devuelve true o false
switch ($attribute) {
case 'CONSULTAR_CLIENTE_HIMED_WEB':
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolConsultarClienteHimedWeb' => true])) {
return true;
}
return false;
case 'CONSULTAR_USUARIO_CLIENTE_HIMED_WEB':
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolConsultarUsuarioClienteHimedWeb' => true])) {
return true;
}
return false;
case 'MODIFICAR_LICENCIA_CLIENTE_HIMED_WEB':
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolModificarLicenciaClienteHimedWeb' => true])) {
return true;
}
return false;
case 'ADICIONAR_LICENCIA_CLIENTE_HIMED_WEB':
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolAdicionarLicenciaClienteHimedWeb' => true])) {
return true;
}
return false;
case 'CONSULTAR_INFORMES_CLIENTE_HIMED_WEB':
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolConsultarGaleriaInformes' => true])) {
return true;
}
return false;
case 'CREAR_CLIENTES_HIMED':
// logica que determina si el usuario puede acceder a la ruta o acción deseada
// devuelve true o false
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'tintCrearClienteHimedWeb' => true])) {
return true;
}
return false;
case 'CREAR_BASE_DATOS':
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolCrearBaseDatos' => true])) {
return true;
}
return false;
}
return false;
}
}