<?php
namespace App\Security;
use App\Backoffice\Enum\UserStatusEnum;
use AppBundle\Entity\User;
use AppBundle\Enum\FeatureAccessEnum;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
/**
* Class UserStatusVoter
*/
class UserStatusVoter extends Voter
{
const USER_STATUS_UNSUBSCRIBED = 'user.status.unsubscribed';
/**
* @var Security
*/
private $security;
public function __construct(Security $security)
{
$this->security = $security;
}
/**
* @inheritDoc
*/
protected function supports($attribute, $subject)
{
return \in_array($attribute, [
self::USER_STATUS_UNSUBSCRIBED,
]);
}
/**
* @inheritDoc
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
switch ($attribute) {
case self::USER_STATUS_UNSUBSCRIBED:
return $this->security->isGranted(FeatureAccessEnum::LAW_FIRM_ADMIN)
&& $user->getStatus() === UserStatusEnum::TAG_UNSUBSCRIBED;
default:
throw new \LogicException('This code should not be reached');
}
}
}