src/Security/Voter/User/MemberVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter\User;
  3. use App\Entity\Member;
  4. use App\Security\ApiUser;
  5. use App\Service\User\MemberOperatorService;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. class MemberVoter extends Voter
  9. {
  10.     public const EDIT 'edit';
  11.     public const READ_COINS 'read_coins';
  12.     public const PERMISSION_READ_SENSITIVE 'read_sensitive';
  13.     public const PERMISSION_WRITE_SENSITIVE 'write_sensitive';
  14.     /**
  15.      * ProfileVisits.
  16.      */
  17.     public const PERMISSION_VISITS_READ 'visits_read';
  18.     public const PERMISSION_VISITS_CREATE 'visits_create';
  19.     public const PERMISSION_GUESTBOOK_MANAGE 'guestbook_manage';
  20.     public const PERMISSION_READ_MESSAGES 'messages_read';
  21.     public const PERMISSION_MESSENGER_CONVERSATION_START 'messenger_conversation_start';
  22.     /**
  23.      * ChatTemplate general access. There is an extra voter for accessing a chattemplate entity.
  24.      */
  25.     public const PERMISSION_MESSENGER_TEMPLATES_READ 'messenger_templates_read';
  26.     public const PERMISSION_MESSENGER_TEMPLATES_CREATE 'messenger_templates_create';
  27.     public const PERMISSION_MESSENGER_NOTICE_READ 'messenger_notice_read';
  28.     public const PERMISSION_MESSENGER_NOTICE_WRITE 'messenger_notice_write';
  29.     protected function supports(string $attribute$subject): bool
  30.     {
  31.         if (!$subject instanceof Member) {
  32.             return false;
  33.         }
  34.         return in_array($attribute, [
  35.             self::EDIT,
  36.             self::READ_COINS,
  37.             self::PERMISSION_READ_SENSITIVE,
  38.             self::PERMISSION_WRITE_SENSITIVE,
  39.             self::PERMISSION_VISITS_READ,
  40.             self::PERMISSION_VISITS_CREATE,
  41.             self::PERMISSION_GUESTBOOK_MANAGE,
  42.             self::PERMISSION_READ_MESSAGES,
  43.             self::PERMISSION_MESSENGER_CONVERSATION_START,
  44.             self::PERMISSION_MESSENGER_TEMPLATES_READ,
  45.             self::PERMISSION_MESSENGER_TEMPLATES_CREATE,
  46.             self::PERMISSION_MESSENGER_NOTICE_READ,
  47.             self::PERMISSION_MESSENGER_NOTICE_WRITE,
  48.         ], true);
  49.     }
  50.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  51.     {
  52.         $user $token->getUser();
  53.         if (!$user instanceof ApiUser) {
  54.             return false;
  55.         }
  56.         /*
  57.          * @var $subject Member
  58.          */
  59.         switch ($attribute) {
  60.             case self::PERMISSION_MESSENGER_CONVERSATION_START:
  61.                 return $this->canStartConversation($subject$user);
  62.             case self::PERMISSION_VISITS_CREATE:
  63.                 return $this->mayCreateProfileVisit($subject$user);
  64.             case self::PERMISSION_MESSENGER_TEMPLATES_READ:
  65.             case self::PERMISSION_MESSENGER_NOTICE_READ:
  66.             case self::PERMISSION_MESSENGER_NOTICE_WRITE:
  67.                 return $this->isSameOrOperatedBy($subject$user);
  68.             case self::READ_COINS:
  69.                 return $this->mayReadCoins($subject$user);
  70.             default:
  71.                 // admin should be able to do anything
  72.                 if ($user->getIsAdmin()) {
  73.                     return true;
  74.                 }
  75.                 return $user->getMember()->getId() === $subject->getId();
  76.         }
  77.     }
  78.     protected function mayReadCoins(Member $memberApiUser $user): bool
  79.     {
  80.         if ($user->getMember()->getId() === $member->getId()) {
  81.             return true;
  82.         }
  83.         if ($user->getIsAdmin()) {
  84.             return true;
  85.         }
  86.         if ($user->getIsOperator() && !$member->getIsAmateur() && $member->getIsActive()) {
  87.             return true;
  88.         }
  89.         return false;
  90.     }
  91.     protected function isSameOrOperatedBy(Member $amateurApiUser $user): bool
  92.     {
  93.         if ($user->getMember()->getId() === $amateur->getId()) {
  94.             return true;
  95.         }
  96.         if ($user->getIsOperator()) {
  97.             return MemberOperatorService::isMemberOperatedByUser($amateur$user);
  98.         }
  99.         return false;
  100.     }
  101.     protected function canStartConversation(Member $partnerApiUser $user): bool
  102.     {
  103.         return $user->getMember()->getId() !== $partner->getId();
  104.     }
  105.     protected function mayCreateProfileVisit(Member $subjectApiUser $user): bool
  106.     {
  107.         if ($user->getIsAdmin()) {
  108.             return true;
  109.         }
  110.         if ($user->getIsOperator()) {
  111.             if ($subject->getId() === $user->getMember()->getId()) {
  112.                 return true;
  113.             }
  114.             return MemberOperatorService::isMemberOperatedByUser($subject$user);
  115.         }
  116.         return $user->getMember()->getId() === $subject->getId();
  117.     }
  118. }