<?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 EditUserVoter extends Voter
{
protected function supports($attribute, $subject): bool
{
$supportsAttribute = in_array($attribute, ['edit', 'view']);
return $supportsAttribute && $subject instanceof User;
}
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];
if ($role->getRoleName() === RoleEnum::SUPER_ADMIN->value) return true;
/** @var User $user */
$user = $subject;
if ($role->getRoleName() === RoleEnum::REGULAR_ADMIN->value) {
if ($user->getUserRole()->isEmpty()) return true;
return !$this->isSubjectSuperAdmin($user);
}
return $authenticatedUser->getId() === $user->getId();
}
private function isSubjectSuperAdmin(User $user): bool
{
/** @var RoleManagement $role */
$role = $user->getUserRole()[0];
return $role->getRoleName() === RoleEnum::SUPER_ADMIN->value;
}
}