<?php
namespace App\Security\Voter;
use App\Entity\Enum\RoleEnum;
use App\Entity\RoleManagement;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class RoleVoter extends Voter
{
private function getRolesList(): array
{
return [
RoleEnum::SUPER_ADMIN->value,
RoleEnum::REGULAR_ADMIN->value,
RoleEnum::ROLE_CLIENT->value,
];
}
protected function supports($attribute, $subject): bool
{
$supportsAttribute = in_array($attribute, ['edit', 'delete']);
return $supportsAttribute && $subject instanceof RoleManagement;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$authenticatedUser = $token->getUser();
if (!$authenticatedUser instanceof User) return false;
if ($authenticatedUser->getUserRole()->isEmpty()) return false;
/** @var RoleManagement $role */
$role = $authenticatedUser->getUserRole()[0];
/** @var RoleManagement $subjectRole */
$subjectRole = $subject;
if ($role->getRoleName() === RoleEnum::SUPER_ADMIN->value) return true;
if ($role->getRoleName() === RoleEnum::REGULAR_ADMIN->value) {
return !in_array($subjectRole->getRoleName(), $this->getRolesList());
}
return false;
}
}