<?php
namespace App\Http\Admin\Voter\User;
use App\Domain\User\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class UserVoter extends Voter
{
final public const EDIT_USER = 'admin_user_edit';
final public const BAN_USER = 'admin_user_ban';
final public const UNBAN_USER = 'admin_user_unban';
final public const DELETE_USER = 'admin_user_delete';
protected function supports(string $attribute, mixed $subject): bool
{
return match ($attribute) {
self::EDIT_USER, self::BAN_USER, self::UNBAN_USER, self::DELETE_USER => true,
default => false,
};
}
protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool
{
/** @var ?User $user */
$user = $token->getUser();
if (is_null($user)) {
return false;
}
/* @var User $subject */
return match ($attribute) {
self::EDIT_USER, self::DELETE_USER => !$subject->isDeleted(),
self::BAN_USER => !$subject->isBanned(),
self::UNBAN_USER => $subject->isBanned(),
default => true,
};
}
}