<?php
declare(strict_types=1);
namespace App\UI\Admin\Security;
use App\Domain\Administrator\Model\Administrator;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class AdministratorVoter extends Voter
{
public const REMOVE = 'remove';
public const ACTIVATE = 'activate';
protected function supports(string $attribute, mixed $subject): bool
{
if (!in_array($attribute, [self::REMOVE, self::ACTIVATE])) {
return false;
}
if (!$subject instanceof Administrator) {
return false;
}
return true;
}
protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool
{
/** @var Administrator $user */
$user = $token->getUser();
/** @var Administrator $administrator */
$administrator = $subject;
return match ($attribute) {
self::REMOVE => $this->canRemove($administrator, $user),
self::ACTIVATE => $this->canActivate($administrator, $user),
default => throw new \LogicException('This code should not be reached!')
};
}
private function canRemove(Administrator $administrator, Administrator $currentUser): bool
{
if ($administrator !== $currentUser) {
return true;
}
return false;
}
private function canActivate(Administrator $administrator, Administrator $currentUser): bool
{
if ($administrator !== $currentUser) {
return true;
}
return false;
}
}