src/Security/Voter/ToolApplicationVoter.php line 12

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voter;
  4. use App\Entity\ToolApplication;
  5. use App\Entity\User;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. class ToolApplicationVoter extends Voter
  9. {
  10.     public const DETAILS 'details';
  11.     public const EDIT 'edit';
  12.     public const ARCHIVE 'archive';
  13.     public const DELETE 'delete';
  14.     public const SHOW_TECHNOLOGY 'show-technology';
  15.     public const ADD_TECHNOLOGY 'add-technology';
  16.     public const EDIT_TECHNOLOGY 'edit-technology';
  17.     public const CAN_CHANGE_STATE 'can-change-state';
  18.     public const EXPORT_DATA_TO_CAM 'export-data-to-cam';
  19.     /**
  20.      * @param string $attribute
  21.      * @param mixed  $subject
  22.      *
  23.      * @return bool
  24.      */
  25.     protected function supports($attribute$subject): bool
  26.     {
  27.         if (!\in_array($attribute, [
  28.             self::DETAILS,
  29.             self::SHOW_TECHNOLOGY,
  30.             self::ADD_TECHNOLOGY,
  31.             self::EDIT_TECHNOLOGY,
  32.             self::CAN_CHANGE_STATE,
  33.             self::EDIT,
  34.             self::ARCHIVE,
  35.             self::DELETE,
  36.             self::EXPORT_DATA_TO_CAM
  37.         ], true)) {
  38.             return false;
  39.         }
  40.         if (!$subject instanceof ToolApplication) {
  41.             return false;
  42.         }
  43.         return true;
  44.     }
  45.     /**
  46.      * @param string         $attribute
  47.      * @param mixed          $subject
  48.      * @param TokenInterface $token
  49.      *
  50.      * @return bool
  51.      */
  52.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  53.     {
  54.         $user $token->getUser();
  55.         if (!$user instanceof User) {
  56.             return false;
  57.         }
  58.         /** @var ToolApplication $toolApplication */
  59.         $toolApplication $subject;
  60.         $hasVotePassed false;
  61.         switch ($attribute) {
  62.             case self::DETAILS:
  63.             case self::SHOW_TECHNOLOGY:
  64.             case self::ADD_TECHNOLOGY:
  65.             case self::EDIT_TECHNOLOGY:
  66.                 $hasVotePassed $this->canDetails($toolApplication$user);
  67.                 break;
  68.             case self::CAN_CHANGE_STATE:
  69.                 $hasVotePassed $this->canChangeState($toolApplication$user);
  70.                 break;
  71.             case self::EDIT:
  72.             case self::DELETE:
  73.                 $hasVotePassed $this->canEdit($toolApplication$user);
  74.                 break;
  75.             case self::ARCHIVE:
  76.                 $hasVotePassed $this->canArchive($toolApplication$user);
  77.                 break;
  78.             case self::EXPORT_DATA_TO_CAM:
  79.                 $hasVotePassed $this->canExportDataToCam($toolApplication$user);
  80.                 break;
  81.         }
  82.         return $hasVotePassed;
  83.     }
  84.     /**
  85.      * @param ToolApplication $toolApplication
  86.      * @param User    $user
  87.      *
  88.      * @return bool
  89.      */
  90.     private function canDetails(ToolApplication $toolApplicationUser $user): bool
  91.     {
  92.         return ($user->getOrganization()->getId() === $toolApplication->getCreatedBy()->getOrganization()->getId())
  93.             && $toolApplication->isActive();
  94.     }
  95.     /**
  96.      * @param ToolApplication $toolApplication
  97.      * @param User    $user
  98.      *
  99.      * @return bool
  100.      */
  101.     private function canChangeState(ToolApplication $toolApplicationUser $user): bool
  102.     {
  103.         return ($user->getOrganization()->getId() === $toolApplication->getCreatedBy()->getOrganization()->getId())
  104.             && $toolApplication->isActive();
  105.     }
  106.     /**
  107.      * @param ToolApplication $toolApplication
  108.      * @param User    $user
  109.      *
  110.      * @return bool
  111.      */
  112.     private function canEdit(ToolApplication $toolApplicationUser $user): bool
  113.     {
  114.          return ($user->getOrganization()->getId() === $toolApplication->getCreatedBy()->getOrganization()->getId())
  115.              && (!$toolApplication->isDeleted());
  116.     }
  117.     /**
  118.      * @param ToolApplication $toolApplication
  119.      * @param User    $user
  120.      *
  121.      * @return bool
  122.      */
  123.     private function canArchive(ToolApplication $toolApplicationUser $user): bool
  124.     {
  125.         return $this->canEdit($toolApplication$user) && $toolApplication->isActive();
  126.     }
  127.     /**
  128.      * @param ToolApplication $toolApplication
  129.      * @param User            $user
  130.      *
  131.      * @return bool
  132.      */
  133.     private function canExportDataToCam(ToolApplication $toolApplicationUser $user): bool
  134.     {
  135.         return $this->canEdit($toolApplication$user);
  136.     }
  137. }