src/LawFirm/Security/ContactQualityVoter.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\LawFirm\Security;
  3. use AppBundle\Entity\LawFirm;
  4. use AppBundle\Entity\User;
  5. use CRMBundle\Entity\ContactQuality;
  6. use CRMBundle\Enum\ContactQualityEnum;
  7. use CRMBundle\Repository\ContactRepository;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. use InvalidArgumentException;
  11. class ContactQualityVoter extends Voter
  12. {
  13.     public const EDIT 'edit';
  14.     public const REMOVE 'remove';
  15.     
  16.     private ContactRepository $contactRepository;
  17.     public function __construct(ContactRepository $contactRepository)
  18.     {
  19.         $this->contactRepository $contactRepository;
  20.     }
  21.     /**
  22.      * @inheritDoc
  23.      */
  24.     protected function supports($attribute$subject)
  25.     {
  26.         if (!in_array(
  27.             $attribute,
  28.             [
  29.                 self::EDIT,
  30.                 self::REMOVE,
  31.             ]
  32.         )) {
  33.             return false;
  34.         }
  35.         if (!$subject instanceof ContactQuality) {
  36.             return false;
  37.         }
  38.         return true;
  39.     }
  40.     /**
  41.      * {@inheritdoc}
  42.      * @param ContactQuality $subject
  43.      */
  44.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  45.     {
  46.         $user $token->getUser();
  47.         if (!$user instanceof User) {
  48.             return false;
  49.         }
  50.         /** @var LawFirm $lawFirm */
  51.         $lawFirm $user->getLawFirm();
  52.         $isLockedQuality in_array($subject->getQualityRelated(), [
  53.             ContactQualityEnum::NONE,
  54.             ContactQualityEnum::JURISDICTION,
  55.             ContactQualityEnum::CUSTOMER,
  56.         ]);
  57.         switch ($attribute) {
  58.             case self::EDIT:
  59.                 return !$isLockedQuality;
  60.             case self::REMOVE:
  61.                 return !$isLockedQuality && !$this->usedByContact($subject$lawFirm);
  62.             default:
  63.                 throw new InvalidArgumentException('Invalid attribute');
  64.         }
  65.     }
  66.     private function usedByContact(ContactQuality $contactQualityLawFirm $lawFirm): bool
  67.     {
  68.         return $this->contactRepository->count([
  69.             'lawFirm' => $lawFirm,
  70.             'qualityNew' => $contactQuality,
  71.         ]) > 0;
  72.     }
  73. }