<?php
namespace App\Security;
use App\Entity\SolicitudBecaAlumno;
use App\Entity\Usuario;
use LogicException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class SolicitudBecaAlumnoVoter extends Voter
{
public const PUEDE_DESCARGAR = 'DESCARGAR_SOLICITUD_BECA_ALUMNO';
public function __construct(private readonly Security $security)
{
}
protected function supports(string $attribute, $subject): bool
{
if (!in_array($attribute, [self::PUEDE_DESCARGAR])) {
return false;
}
if (!$subject instanceof SolicitudBecaAlumno) {
return false;
}
return true;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
/** @var Usuario $user */
$user = $token->getUser();
if (!$user) {
return false;
}
/** @var SolicitudBecaAlumno $solicitudBecaAlumno */
$solicitudBecaAlumno = $subject;
switch ($attribute) {
case self::PUEDE_DESCARGAR:
return $this->puedeDescargar($solicitudBecaAlumno, $user);
}
throw new LogicException('This code should not be reached!');
}
// Comprobamos si es formador que el alumno pertenezca a un curso de su empresa.
private function puedeDescargar(SolicitudBecaAlumno $solicitudBecaAlumno, Usuario $user): bool
{
// Si es formador e intenta ver un alumno que no es de un curso de su empresa.
if (!$this->security->isGranted('ROLE_ADMIN') &&
$this->security->isGranted('ROLE_FORMADOR') &&
$solicitudBecaAlumno->getAlumno()->getSolicitud()->getUsuario()->getEmpresaFormacion() !== $user->getEmpresaFormacion()) {
return false;
}
return true;
}
}