src/Invoice/Security/InvoiceCommentVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Invoice\Security;
  3. use App\Api\Controller\Invoice\Comment\InvoiceCommentTrait;
  4. use AppBundle\Entity\User;
  5. use BillingBundle\Entity\Invoice;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. class InvoiceCommentVoter extends Voter
  9. {
  10.     use InvoiceCommentTrait;
  11.     
  12.     public const CAN_ADD_COMMENTS 'CAN_ADD_COMMENTS';
  13.     public const CAN_GET_COMMENTS 'CAN_GET_COMMENTS';
  14.     private static array $attributes = [
  15.         self::CAN_ADD_COMMENTS,
  16.         self::CAN_GET_COMMENTS,
  17.     ];
  18.     protected function supports($attribute$subject): bool
  19.     {
  20.         return in_array($attributeself::$attributestrue) && $subject instanceof Invoice;
  21.     }
  22.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  23.     {
  24.         $user $token->getUser();
  25.         if (!$user instanceof User) {
  26.             return false;
  27.         }
  28.         switch ($attribute) {
  29.             case self::CAN_ADD_COMMENTS:
  30.             case self::CAN_GET_COMMENTS:
  31.                 return $subject instanceof Invoice && ($subject->getMatter() !== null
  32.                     $this->hasMatterAccess($subject$user)
  33.                     : $this->hasContactAccess($subject$user));
  34.             default:
  35.                 throw new \LogicException('This code should not be reached');
  36.         }
  37.     }
  38.     /**
  39.      * @param Invoice $invoice
  40.      * @param User $user
  41.      * @return boolean
  42.      */
  43.     private function hasMatterAccess(Invoice $invoiceUser $user): bool
  44.     {
  45.         return in_array($user$this->getMatterUsers($invoice), true);
  46.     }
  47.     /**
  48.      * @param Invoice $invoice
  49.      * @param User $user
  50.      * @return boolean
  51.      */
  52.     private function hasContactAccess(Invoice $invoiceUser $user): bool
  53.     {
  54.         $contact $invoice->getCustomer();
  55.         $config $invoice->getLawFirm()->getLawFirmConfig();
  56.         return $contact->getOwner() === $user || $config->isFullContactAccess();
  57.     }
  58. }