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($attribute, self::$attributes, true) && $subject instanceof Invoice;
  21.     }
  22.     protected function voteOnAttribute($attribute, $subject, TokenInterface $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 $invoice, User $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 $invoice, User $user): bool
  53.     {
  54.         $contact = $invoice->getCustomer();
  55.         $config = $invoice->getLawFirm()->getLawFirmConfig();
  56.         return $contact->getOwner() === $user || $config->isFullContactAccess();
  57.     }
  58. }