src/Security/Voter/AdminVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Account\User;
  4. use App\Entity\Channel\Channel;
  5. use App\Entity\Chat\Conversation;
  6. use App\Service\Account\UserService;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
  9. class AdminVoter implements VoterInterface
  10. {
  11.     public function __construct(
  12.         private UserService $userService
  13.     ) {}
  14.     public function vote(TokenInterface $token$subject, array $attributes): int
  15.     {
  16.         if (!in_array('NIM_ADMIN'$attributes)) {
  17.             return VoterInterface::ACCESS_ABSTAIN;
  18.         }
  19.         /** @var User $user */
  20.         $user $token->getUser();
  21.         if ($subject instanceof Channel) {
  22.             return $this->accessForChannel($subject$user);
  23.         } else if ($subject instanceof Conversation) {
  24.             return $this->accessForConversation($subject$user);
  25.         }
  26.         return VoterInterface::ACCESS_DENIED;
  27.     }
  28.     private function accessForConversation(Conversation $conversationUser $user): int
  29.     {
  30.         if ($this->userService->isAdminForConversation($user$conversation)) {
  31.             return VoterInterface::ACCESS_GRANTED;
  32.         }
  33.         return VoterInterface::ACCESS_DENIED;
  34.     }
  35.     private function accessForChannel(Channel $channelUser $user): int
  36.     {
  37.         if ($this->userService->isCoordinator($user$channel)) {
  38.             return VoterInterface::ACCESS_GRANTED;
  39.         }
  40.         $channelUserData $user->getChannelUserDataByChannel($channel);
  41.         if (!$channelUserData) {
  42.             return VoterInterface::ACCESS_DENIED;
  43.         }
  44.         if ($channelUserData->isLearner() === false) {
  45.             return VoterInterface::ACCESS_GRANTED;
  46.         }
  47.         return VoterInterface::ACCESS_DENIED;
  48.     }
  49. }