<?php
namespace App\Security\Voter;
use App\Entity\Note;
use App\Entity\User;
use App\Enum\PermissionEnum;
use App\Service\UserPermissionLookup;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class NoteVoter extends Voter
{
/**
* @var UserPermissionLookup
*/
private $userPermissionLookup;
public function __construct(UserPermissionLookup $userPermissionLookup)
{
$this->userPermissionLookup = $userPermissionLookup;
}
protected function supports($attribute, $subject)
{
$arrayPermissions = [
PermissionEnum::SETTING_VIEW,
PermissionEnum::SETTING_EDIT,
PermissionEnum::SETTING_CREATE,
PermissionEnum::SETTING_DELETE,
];
if (!\in_array($attribute, $arrayPermissions, true)) {
return false;
}
if (!$subject instanceof Note) {
return false;
}
return true;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof UserInterface) {
return false;
}
switch ($attribute) {
case PermissionEnum::SETTING_EDIT:
return $this->canEdit($user);
break;
case PermissionEnum::SETTING_CREATE:
return $this->canCreate($user);
break;
case PermissionEnum::SETTING_DELETE:
return $this->canDelete($user);
break;
case PermissionEnum::SETTING_VIEW:
return $this->canView($user);
break;
}
return false;
}
private function canView(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::SETTING_VIEW, $permissions, true)) {
return true;
}
return false;
}
private function canEdit(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::SETTING_EDIT, $permissions, true)) {
return true;
}
return false;
}
private function canCreate(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::SETTING_CREATE, $permissions, true)) {
return true;
}
return false;
}
private function canDelete(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::SETTING_DELETE, $permissions, true)) {
return true;
}
return false;
}
}