src/Security/Voter/ProgramVoter.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Program\Program;
  4. use App\Entity\Program\ProgramCrewMember;
  5. use App\Entity\User;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. class ProgramVoter extends Voter
  9. {
  10.     // these strings are just invented: you can use anything
  11.     const SHOW 'show';
  12.     const EDIT 'edit';
  13.     const DELETE 'delete';
  14.     const CHANGE_MEDIA 'change_media';
  15.     const CHAT 'chat';
  16.     protected function supports(string $attribute$subject): bool
  17.     {
  18.         // if the attribute isn't one we support, return false
  19.         if (!in_array($attribute, [self::SHOWself::EDITself::DELETEself::CHANGE_MEDIAself::CHAT])) {
  20.             return false;
  21.         }
  22.         // only vote on `Post` objects
  23.         if (!$subject instanceof Program) {
  24.             return false;
  25.         }
  26.         return true;
  27.     }
  28.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  29.     {
  30.         $user $token->getUser();
  31.         if (!$user instanceof User) {
  32.             // the user must be logged in; if not, deny access
  33.             return false;
  34.         }
  35.         // you know $subject is a Post object, thanks to `supports()`
  36.         /** @var Program $program */
  37.         $program $subject;
  38.         switch ($attribute) {
  39.             case self::SHOW:
  40.                 return $this->canView($program$user);
  41.             case self::EDIT:
  42.                 return $this->canEdit($program$user);
  43.             case self::DELETE:
  44.                 return $this->canDelete($program$user);
  45.             case self::CHANGE_MEDIA:
  46.                 return $this->canChangeMedia($program$user);
  47.             case self::CHAT:
  48.                 return $this->canChat($program$user);
  49.         }
  50.         throw new \LogicException('This code should not be reached!');
  51.     }
  52.     private function canView(Program $programUser $user): bool
  53.     {
  54.         if ($program->getMedia()->getCreatedBy() === $user) {
  55.             return true;
  56.         }
  57.         /**
  58.          * @var ProgramCrewMember[] $crews
  59.          */
  60.         $crews $program->getCrews();
  61.         $authorized false;
  62.         if (sizeof($program->getCrews()) > 0) {
  63.             foreach ($crews as $crew) {
  64.                 if ($crew->getUser() === $user && ($crew->getHasAdminRole() || $crew->getHasPostPublisherRole())) {
  65.                     $authorized true;
  66.                 }
  67.             }
  68.         }
  69.         return $authorized;
  70.     }
  71.     private function canEdit(Program $programUser $user): bool
  72.     {
  73.         if ($program->getMedia()->getCreatedBy() === $user) {
  74.             return true;
  75.         }
  76.         /**
  77.          * @var ProgramCrewMember[] $crews
  78.          */
  79.         $crews $program->getCrews();
  80.         $authorized false;
  81.         if (sizeof($program->getCrews()) > 0) {
  82.             foreach ($crews as $crew) {
  83.                 if ($crew->getUser() === $user && $crew->getHasAdminRole()) {
  84.                     $authorized true;
  85.                 }
  86.             }
  87.         }
  88.         return $authorized;
  89.     }
  90.     private function canDelete(Program $programUser $user): bool
  91.     {
  92.         return $program->getMedia()->getCreatedBy() === $user;
  93.     }
  94.     private function canChangeMedia(Program $programUser $user): bool
  95.     {
  96.         return $program->getMedia()->getCreatedBy() === $user;
  97.     }
  98.     private function canChat(Program $programUser $user): bool
  99.     {
  100.         if ($program->getMedia()->getCreatedBy() === $user) {
  101.             return true;
  102.         }
  103.         /**
  104.          * @var ProgramCrewMember[] $crews
  105.          */
  106.         $crews $program->getCrews();
  107.         $authorized false;
  108.         if (sizeof($program->getCrews()) > 0) {
  109.             foreach ($crews as $crew) {
  110.                 if (
  111.                     $crew->getUser() === $user &&
  112.                     (
  113.                         $crew->getHasAdminRole() ||
  114.                         $crew->getHasPostPublisherRole()
  115.                     )
  116.                 ) {
  117.                     $authorized true;
  118.                 }
  119.             }
  120.         }
  121.         return $authorized;
  122.     }
  123. }