src/Http/Customer/Voter/TransactionVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Http\Customer\Voter;
  3. use App\Domain\Transaction\Entity\Transaction;
  4. use App\Domain\Transaction\Repository\CreditHistoryRepository;
  5. use App\Domain\User\Entity\User;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. class TransactionVoter extends Voter
  9. {
  10.     final public const EDIT_TRANSACTION 'customer_transaction_edit';
  11.     final public const ADD_TRANSACTION 'customer_transaction_add';
  12.     public function __construct(private readonly float $minimumToWithdraw, private readonly CreditHistoryRepository $creditHistoryRepository)
  13.     {
  14.     }
  15.     protected function supports(string $attributemixed $subject): bool
  16.     {
  17.         return match ($attribute) {
  18.             self::ADD_TRANSACTIONself::EDIT_TRANSACTION => true,
  19.             default => false,
  20.         };
  21.     }
  22.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  23.     {
  24.         /** @var ?User $user */
  25.         $user $token->getUser();
  26.         if (is_null($user)) {
  27.             return false;
  28.         }
  29.         /* @var Transaction $subject */
  30.         return match ($attribute) {
  31.             self::EDIT_TRANSACTION => ($user->hasRole('ROLE_ADMIN') || $subject->getUser() === $user) && is_null($subject->getProcessedOn()) && !$subject->isDeleted(),
  32.             self::ADD_TRANSACTION => $this->creditHistoryRepository->getBalance($user) >= $this->minimumToWithdraw,
  33.             default => true,
  34.         };
  35.     }
  36. }