src/Task/Security/TaskTemplateVoter.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Task\Security;
  3. use App\Task\Entity\TaskTemplate;
  4. use App\Task\Entity\TaskTemplateItem;
  5. use AppBundle\Entity\User;
  6. use AppBundle\Enum\FeatureAccessEnum;
  7. use CRMBundle\Entity\Contact;
  8. use SettingsBundle\Enum\ModuleEnum;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. use Symfony\Component\Security\Core\Security;
  12. class TaskTemplateVoter extends Voter
  13. {
  14.     public const ADD_TASK_TEMPLATE 'ADD_TASK_TEMPLATE';
  15.     public const CHECK_TASK_TEMPLATE_ITEM 'CHECK_TASK_TEMPLATE_ITEM';
  16.     public const EDIT_TASK_TEMPLATE 'EDIT_TASK_TEMPLATE';
  17.     public const EDIT_TASK_TEMPLATE_ITEM 'EDIT_TASK_TEMPLATE_ITEM';
  18.     public const DELETE_TASK_TEMPLATE 'DELETE_TASK_TEMPLATE';
  19.     public const DELETE_TASK_TEMPLATE_ITEM 'DELETE_TASK_TEMPLATE_ITEM';
  20.     public const GET_TASK_TEMPLATE 'GET_TASK_TEMPLATE';
  21.     public const GET_TASK_TEMPLATE_ITEMS 'GET_TASK_TEMPLATE_ITEMS';
  22.     public const CREATE_CONTACT_TASKS 'CREATE_CONTACT_TASKS';
  23.     private Security $security;
  24.     public function __construct(Security $security)
  25.     {
  26.         $this->security $security;
  27.     }
  28.     private static array $attributesAlone = [
  29.         self::ADD_TASK_TEMPLATE,
  30.         self::GET_TASK_TEMPLATE,
  31.         self::CHECK_TASK_TEMPLATE_ITEM,
  32.     ];
  33.     private static array $attributesWithTaskTemplate = [
  34.         self::EDIT_TASK_TEMPLATE,
  35.         self::DELETE_TASK_TEMPLATE,
  36.         self::GET_TASK_TEMPLATE_ITEMS,
  37.     ];
  38.     private static array $attributesWithTaskTemplateItem = [
  39.         self::EDIT_TASK_TEMPLATE_ITEM,
  40.         self::DELETE_TASK_TEMPLATE_ITEM,
  41.     ];
  42.     protected function supports($attribute$subject): bool
  43.     {
  44.         switch (true)
  45.         {
  46.             case in_array($attributeself::$attributesAlone):
  47.             case in_array($attributeself::$attributesWithTaskTemplate) && $subject instanceof TaskTemplate:
  48.             case in_array($attributeself::$attributesWithTaskTemplateItem) && $subject instanceof TaskTemplateItem:
  49.                 return true;
  50.             case $attribute === self::CREATE_CONTACT_TASKS && ($subject instanceof Contact || $subject instanceof TaskTemplate):
  51.                 return true;
  52.             default:
  53.                 return false;
  54.         }
  55.     }
  56.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  57.     {
  58.         $user $token->getUser();
  59.         if (!$user instanceof User) {
  60.             return false;
  61.         }
  62.         switch ($attribute) {
  63.             case self::ADD_TASK_TEMPLATE:
  64.             case self::GET_TASK_TEMPLATE:
  65.             case self::CHECK_TASK_TEMPLATE_ITEM:
  66.                 return $this->hasAccess($user);
  67.             case self::EDIT_TASK_TEMPLATE:
  68.             case self::DELETE_TASK_TEMPLATE:
  69.             case self::GET_TASK_TEMPLATE_ITEMS:
  70.                 /** @var TaskTemplate $subject */
  71.                 return $this->hasAccess($user) && $subject->getLawFirm() === $user->getLawFirm();
  72.             case self::EDIT_TASK_TEMPLATE_ITEM:
  73.             case self::DELETE_TASK_TEMPLATE_ITEM:
  74.                 /** @var TaskTemplateItem $subject */
  75.                 return $this->hasAccess($user) && $subject->getLawFirm() === $user->getLawFirm();
  76.             case self::CREATE_CONTACT_TASKS:
  77.                 /** @var Contact|TaskTemplate $subject */
  78.                 return $this->security->isGranted(ModuleEnum::USER_MODULE_TASK_TEMPLATE) &&
  79.                     $subject->getLawFirm() === $user->getLawFirm();
  80.             
  81.             default:
  82.                 throw new \LogicException('This code should not be reached');
  83.         }
  84.     }
  85.     private function hasAccess(User $user): bool
  86.     {
  87.         return $this->security->isGranted(ModuleEnum::USER_MODULE_TASK_TEMPLATE) &&
  88.             $user->hasRole(FeatureAccessEnum::LAW_FIRM_ADMIN);
  89.     }
  90. }