<?php
declare(strict_types=1);
namespace App\Security\Voter;
use App\Entity\Call;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class CallVoter extends Voter
{
private const ATTRIBUTES = ['UPDATE', 'READ_RECORDING'];
private Security $security;
public function __construct(Security $security)
{
$this->security = $security;
}
/**
* @param mixed $subject
* @return bool
*/
protected function supports(string $attribute, $subject)
{
return ($subject instanceof Call);
}
/**
* @param Call $subject
* @return bool
*/
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token)
{
if (!in_array($attribute, self::ATTRIBUTES, true)) {
return false;
}
/** @var User $currentUser */
$currentUser = $token->getUser();
if (!$currentUser instanceof User) {
return false;
}
if ($attribute === 'READ_RECORDING') {
return (
($subject->getUser() !== null
&& $subject->getUser()->getId() === $currentUser->getId()
)
|| $subject->getStatus() === Call::STATUS_VOICEMAIL
|| $this->security->isGranted('ROLE_SUPERVISOR')
);
} elseif ($attribute === 'UPDATE') {
return (
$subject->getUser() === null
|| $subject->getUser()->getId() === $currentUser->getId()
|| $this->security->isGranted('ROLE_SUPERVISOR')
);
}
// unreachable
return false;
}
}