<?php
namespace App\Security\Voter;
use App\Entity\Formation;
use App\Repository\FormationRegistrationRepository;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
class FormationVoter extends Voter
{
public const FORMATION_SHOW = 'FORMATION_SHOW';
private $security;
private FormationRegistrationRepository $formationRepository;
public function __construct(Security $security, FormationRegistrationRepository $formationRepository)
{
$this->security = $security;
$this->formationRepository = $formationRepository;
}
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [self::FORMATION_SHOW])
&& ( $subject instanceof Formation);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
//utilisateur connecté
$user = $token->getUser();
// if the user is anonymous, do not grant access
if (!$user instanceof UserInterface) {
return false;
}
switch ($attribute) {
case self::FORMATION_SHOW:
return $this->canUserShowFormation($subject, $user);
}
return false;
}
/**
* @param Formation $formation
* @param UserInterface $user - user connecté
* @return bool
*/
private function canUserShowFormation(Formation $formation, UserInterface $user): bool
{
//si admin ok
if($this->security->isGranted('ROLE_ADMIN') && $formation->getOwner() === $user){
return true;
}
//si rh
if ($this->security->isGranted('ROLE_RH')){
// $f = $this->formationRepository->belongsToUser($user,$formation->getId());
//soit je suis propriétaire
if($formation->getOwner() === $user){
return true ;
}
$f = $this->formationRepository->userIsRegistered($user,$formation->getId());
//soit je suis inscrit et la formation est public
if( ($f && !empty($f)) && $formation->isPublished()){
return true;
}
}
//si user
if ($this->security->isGranted('ROLE_USER_ACTIF') || $this->security->isGranted('ROLE_USER_INACTIF')) {
$f = $this->formationRepository->userIsRegistered($user,$formation->getId());
if( ($f && !empty($f)) && $formation->isPublished()){
return true;
}
}
return false;
}
}