src/Security/Voter/ContractorVoter.php line 10

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\Security\Voter;
  3. use App\Entity\Contractor;
  4. use App\Entity\User;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. class ContractorVoter extends Voter
  8. {
  9.     public const VIEW 'view';
  10.     public const EDIT 'edit';
  11.     public const ARCHIVE 'archive';
  12.     public const DELETE 'delete';
  13.     /**
  14.      * @param string $attribute
  15.      * @param mixed  $subject
  16.      *
  17.      * @return bool
  18.      */
  19.     protected function supports($attribute$subject): bool
  20.     {
  21.         if (!in_array($attribute, [self::VIEWself::EDITself::ARCHIVEself::DELETE], true)) {
  22.             return false;
  23.         }
  24.         if (!$subject instanceof Contractor) {
  25.             return false;
  26.         }
  27.         return true;
  28.     }
  29.     /**
  30.      * @param string         $attribute
  31.      * @param mixed          $subject
  32.      * @param TokenInterface $token
  33.      *
  34.      * @return bool
  35.      */
  36.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  37.     {
  38.         $user $token->getUser();
  39.         if (!$user instanceof User) {
  40.             return false;
  41.         }
  42.         /** @var Contractor $contractor */
  43.         $contractor $subject;
  44.         $hasPrivilege false;
  45.         switch ($attribute) {
  46.             case self::VIEW:
  47.                 $hasPrivilege $this->canView($contractor$user);
  48.                 break;
  49.             case self::EDIT:
  50.                 $hasPrivilege $this->canEdit($contractor$user);
  51.                 break;
  52.             case self::ARCHIVE:
  53.                 $hasPrivilege $this->canArchive($contractor$user);
  54.                 break;
  55.             case self::DELETE:
  56.                 $hasPrivilege $this->canDelete($contractor$user);
  57.                 break;
  58.         }
  59.         return $hasPrivilege;
  60.     }
  61.     /**
  62.      * @param Contractor $contractor
  63.      * @param User       $user
  64.      *
  65.      * @return bool
  66.      */
  67.     private function canView(Contractor $contractorUser $user): bool
  68.     {
  69.         return (!$user->isSystemUser()) && $user->getOrganization() && $contractor->isInUserOrganization($user);
  70.     }
  71.     /**
  72.      * @param Contractor $contractor
  73.      * @param User       $user
  74.      *
  75.      * @return bool
  76.      */
  77.     private function canEdit(Contractor $contractorUser $user): bool
  78.     {
  79.         return (!$user->isSystemUser()) && $user->getOrganization() && $contractor->isInUserOrganization($user);
  80.     }
  81.     /**
  82.      * @param Contractor $contractor
  83.      * @param User       $user
  84.      *
  85.      * @return bool
  86.      */
  87.     private function canArchive(Contractor $contractorUser $user): bool
  88.     {
  89.         return (!$user->isSystemUser()) && $user->getOrganization() && $contractor->isInUserOrganization($user);
  90.     }
  91.     /**
  92.      * @param Contractor $contractor
  93.      * @param User       $user
  94.      *
  95.      * @return bool
  96.      */
  97.     private function canDelete(Contractor $contractorUser $user): bool
  98.     {
  99.         return (!$user->isSystemUser()) && $user->getOrganization() && $contractor->isInUserOrganization($user);
  100.     }
  101. }