<?php
/*
* Author: Dominik Piekarski <code@dompie.de>
* Created at: 2020/08/25 16:29
*/
declare(strict_types=1);
namespace App\Lib\Payment\Voter;
use App\Dictionary\Permission;
use App\Entity\Account;
use App\Service\User\BalanceMemberService;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class HasCoinShortageVoter extends Voter
{
protected array $supportUsernames = [];
protected BalanceMemberService $service;
public function __construct(ParameterBagInterface $params, BalanceMemberService $service)
{
$this->supportUsernames = $params->get('support_usernames');
$this->service = $service;
}
/**
* @param Account $subject
*/
protected function supports(string $attribute, $subject): bool
{
return Permission::ALLOWED_TO_BOOK === $attribute && $subject instanceof Account;
}
/**
* @param Account $subject
*/
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
if (in_array(mb_strtolower($subject->getMember()->getUsername()), $this->supportUsernames, true)) {
return true;
}
if ($this->service->getCoinsForMember($subject->getMember()) >= 2000) {
throw PaymentVoterException::noCoinShortage();
}
return true;
}
}