<?php
namespace App\Security\Voter;
use App\Entity\Client;
use App\Entity\Company;
use App\Entity\User;
use App\Entity\Video;
use App\Repository\ExclusionsVideoRepository;
use App\Repository\UserRepository;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class VideoVoter extends Voter
{
/**
* @var Security
*/
private $security = null;
/**
* @var ExclusionsVideoRepository
*/
private $exclusionsVideoRepository;
/**
* @var UserRepository
*/
private $userRepository;
/**
* VideoVoter constructor.
* @param Security $security
* @param ExclusionsVideoRepository $exclusionsVideoRepository
*/
public function __construct(Security $security, ExclusionsVideoRepository $exclusionsVideoRepository, UserRepository $userRepository)
{
$this->security = $security;
$this->exclusionsVideoRepository = $exclusionsVideoRepository;
$this->userRepository = $userRepository;
}
protected function supports(string $attribute, $subject): bool
{
$supportAttr = in_array($attribute, ['VIDEO_GET']);
$supportObject = ($subject instanceof Video);
return $supportAttr && $supportObject;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
if ($attribute == 'VIDEO_GET') {
$user = $this->security->getUser();
if ($this->security->isGranted(User::ROLE_CLIENT) && $user instanceof User) {
$user = $this->userRepository->find($user->getId());
if($user instanceof User && $user->getClient() instanceof Client && $user->getClient()->getCompany() instanceof Company) {
return !$this->exclusionsVideoRepository->isExclusion($user->getClient()->getCompany(), $subject);
}
}
}
return true;
}
}