<?php
namespace App\Security\Voter;
use App\Entity\Company;
use App\Entity\User;
use App\Entity\Video;
use App\Repository\ExclusionsVideoRepository;
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;
/**
* VideoVoter constructor.
* @param Security $security
* @param ExclusionsVideoRepository $exclusionsVideoRepository
*/
public function __construct(Security $security, ExclusionsVideoRepository $exclusionsVideoRepository)
{
$this->security = $security;
$this->exclusionsVideoRepository = $exclusionsVideoRepository;
}
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 ($user instanceof User && $user->getCompany() instanceof Company && $this->security->isGranted('ROLE_USER')) {
return !$this->exclusionsVideoRepository->isExclusion($user->getCompany(), $subject);
}
}
return true;
}
}