src/Security/Voter/UserGroup/UserGroupVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter\UserGroup;
  3. use App\Dictionary\UserGroupJoinMode;
  4. use App\Entity\UserGroup;
  5. use App\Security\ApiUser;
  6. use App\Service\UserGroups\GroupMemberService;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. class UserGroupVoter extends Voter
  10. {
  11.     public const PERMISSION_THREAD_LIST 'thread_list';
  12.     public const PERMISSION_THREAD_CREATE 'thread_create';
  13.     public const PERMISSION_THREAD_READ 'thread_read';
  14.     public const PERMISSION_POST_CREATE 'post_create';
  15.     public const PERMISSION_POST_DELETE 'post_delete';
  16.     public const PERMISSION_MODERATOR 'moderator';
  17.     protected GroupMemberService $groupMemberService;
  18.     /**
  19.      * GroupVoter constructor.
  20.      */
  21.     public function __construct(GroupMemberService $groupMemberService)
  22.     {
  23.         $this->groupMemberService $groupMemberService;
  24.     }
  25.     protected function supports(string $attribute$subject): bool
  26.     {
  27.         if (!$subject instanceof UserGroup) {
  28.             return false;
  29.         }
  30.         return in_array($attribute, [
  31.             self::PERMISSION_THREAD_CREATE,
  32.             self::PERMISSION_THREAD_READ,
  33.             self::PERMISSION_THREAD_LIST,
  34.             self::PERMISSION_MODERATOR,
  35.             self::PERMISSION_POST_CREATE,
  36.         ], true);
  37.     }
  38.     /**
  39.      * @param UserGroup $subject
  40.      */
  41.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  42.     {
  43.         $user $token->getUser();
  44.         // admin should be able to do anything
  45.         if ($user instanceof ApiUser && $user->getIsAdmin()) {
  46.             return true;
  47.         }
  48.         switch ($attribute) {
  49.             case self::PERMISSION_THREAD_LIST:
  50.             case self::PERMISSION_THREAD_READ:
  51.                 if (UserGroupJoinMode::PUBLIC === $subject->getJoinMode()) {
  52.                     return true;
  53.                 }
  54.                 if (!$user instanceof ApiUser) {
  55.                     return false;
  56.                 }
  57.                 return null !== $this->groupMemberService->getGroupMember($subject$user->getMember());
  58.             case self::PERMISSION_POST_CREATE:
  59.             case self::PERMISSION_THREAD_CREATE:
  60.                 if (!$user instanceof ApiUser) {
  61.                     return false;
  62.                 }
  63.                 return null !== $this->groupMemberService->getGroupMember($subject$user->getMember());
  64.             case self::PERMISSION_MODERATOR:
  65.             case self::PERMISSION_POST_DELETE:
  66.                 if (!$user instanceof ApiUser) {
  67.                     return false;
  68.                 }
  69.                 return $this->groupMemberService->isModeratorForUserGroup($user->getMember(), $subject);
  70.         }
  71.         return false;
  72.     }
  73. }