<?php
namespace App\Domain\Core\Voter;
use App\Domain\Application\Voter\AbstractVoter;
use App\Domain\Core\Entity\Club;
use App\Domain\User\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class ClubVoter extends AbstractVoter
{
public const DELETE = 'delete';
public function supportsType(string $subjectType): bool
{
return is_a($subjectType, Club::class, true);
}
public function supportsAttribute(string $attribute): bool
{
return \in_array($attribute, [
self::DELETE,
]);
}
/**
* @param Club $club
*/
protected function voteOnAttribute(string $attribute, mixed $club, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
return match ($attribute) {
self::DELETE => $this->canDelete($user, $club),
default => false,
};
}
private function canDelete(User $user, Club $club): bool
{
return $this->security->isGranted(User::ROLE_SUPER_ADMIN)
&& $club->getTeams()->isEmpty();
}
}