src/Security/Voters/Ledger/TransactionVoter.php line 11

  1. <?php
  2. namespace App\Security\Voters\Ledger;
  3. use App\Entity\Ledger\Transaction;
  4. use App\Enums\Operation;
  5. use App\Enums\Roles;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\CacheableVoterInterface;
  8. class TransactionVoter implements CacheableVoterInterface
  9. {
  10.     public function __construct(
  11.         private readonly \Symfony\Bundle\SecurityBundle\Security $security,
  12.     ) {
  13.     }
  14.     public function supportsAttribute(string $attribute): bool
  15.     {
  16.         return Operation::match($attribute);
  17.     }
  18.     public function supportsType(string $subjectType): bool
  19.     {
  20.         return Transaction::class === $subjectType;
  21.     }
  22.     public function vote(TokenInterface $tokenmixed $subject, array $attributes): int
  23.     {
  24.         return match ($attributes) {
  25.             [Operation::READ->value] => $this->checkRead($token$subject),
  26.             [Operation::CREATE->value] => $this->checkCreate($token$subject$attributes),
  27.             default => self::ACCESS_DENIED,
  28.         };
  29.     }
  30.     private function checkCreate(TokenInterface $tokenTransaction $subject, array $attributes): int
  31.     {
  32.         $currentUser $token->getUser();
  33.         if ($subject->getAccountFrom()->getOwner()->getUserIdentifier() === $currentUser->getUserIdentifier()) {
  34.             return self::ACCESS_GRANTED;
  35.         }
  36.         return self::ACCESS_DENIED;
  37.     }
  38.     private function checkRead(TokenInterface $tokenTransaction $subject): int
  39.     {
  40.         if ($this->security->isGranted(Roles::ROLE_ADMIN)) {
  41.             return self::ACCESS_GRANTED;
  42.         }
  43.         if ($token->getUserIdentifier() === $subject->getAccountFrom()->getOwner()->getUserIdentifier()) {
  44.             return self::ACCESS_GRANTED;
  45.         }
  46.         if ($token->getUserIdentifier() === $subject->getAccountTo()->getOwner()->getUserIdentifier()) {
  47.             return self::ACCESS_GRANTED;
  48.         }
  49.         return self::ACCESS_DENIED;
  50.     }
  51. }