src/Security/ItineraryVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Itinerary;
  4. use App\Entity\Permission;
  5. use App\Entity\User;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\Security;
  9. class ItineraryVoter extends Voter
  10. {
  11.     const CREATE_ITINERARY 'createItinerary';
  12.     const EDIT_ITINERARY 'editItinerary';
  13.     const PUBLISH_LIVE_ITINERARY 'publishLiveItinerary';
  14.     const PUBLISH_BETA_ITINERARY 'publishBetaItinerary';
  15.     const PUBLISH_PGOH_ITINERARY 'publishPGOHItinerary';
  16.     const LIST_PLAYER 'listPlayer';
  17.     const CREATE_PLAYER 'createPlayer';
  18.     const EDIT_PLAYER 'editPlayer';
  19.     const LIST_SOUND 'listSound';
  20.     const CREATE_SOUND 'createSound';
  21.     const EDIT_SOUND 'editSound';
  22.     const LIST_CODE 'listCode';
  23.     const CREATE_CODE 'createCode';
  24.     const EDIT_CODE 'editCode';
  25.     private Security $security;
  26.     public function __construct(Security $security)
  27.     {
  28.         $this->security $security;
  29.     }
  30.     protected function supports($attribute$subject): bool
  31.     {
  32.         if (!in_array($attribute, [
  33.             self::CREATE_ITINERARY,
  34.             self::EDIT_ITINERARY,
  35.             self::PUBLISH_LIVE_ITINERARY,
  36.             self::PUBLISH_BETA_ITINERARY,
  37.             self::PUBLISH_PGOH_ITINERARY,
  38.             self::LIST_PLAYER,
  39.             self::CREATE_PLAYER,
  40.             self::EDIT_PLAYER,
  41.             self::LIST_SOUND,
  42.             self::CREATE_SOUND,
  43.             self::EDIT_SOUND,
  44.             self::LIST_CODE,
  45.             self::CREATE_CODE,
  46.             self::EDIT_CODE,
  47.         ])) {
  48.             return false;
  49.         }
  50.         if($subject === null && $attribute === self::CREATE_ITINERARY) {
  51.             return true;
  52.         }
  53.         if (!$subject instanceof Itinerary) {
  54.             return false;
  55.         }
  56.         return true;
  57.     }
  58.     /**
  59.      * @param $attribute
  60.      * @param Itinerary $subject
  61.      * @param TokenInterface $token
  62.      * @return bool
  63.      */
  64.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  65.     {
  66.         $user $token->getUser();
  67.         if (!$user instanceof User) {
  68.             return false;
  69.         }
  70.         if ($this->security->isGranted('ROLE_ADMINISTRATOR')) {
  71.             return true;
  72.         }
  73.         if($attribute === self::CREATE_ITINERARY) {
  74.             return $user->getPermissions()->exists(function(int $indexPermission $permission) {
  75.                 return $permission->getRole() === Permission::ROLE_ADMIN;
  76.             });
  77.         }
  78.         $itinerary $subject;
  79.         $organization $itinerary->getOrganization();
  80.         foreach ($user->getPermissions() as $permission) {
  81.             if ($permission->getOrganization()->getId() === $organization->getId()) {
  82.                 switch ($attribute) {
  83.                     case self::CREATE_ITINERARY:
  84.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_PEDAGOH]);
  85.                     case self::EDIT_ITINERARY:
  86.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTISTPermission::ROLE_COMMUNICATIONPermission::ROLE_PEDAGOH]);
  87.                     case self::PUBLISH_LIVE_ITINERARY:
  88.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_COMMUNICATIONPermission::ROLE_PEDAGOH]);
  89.                     case self::PUBLISH_BETA_ITINERARY:
  90.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_COMMUNICATIONPermission::ROLE_ARTIST]);
  91.                     case self::PUBLISH_PGOH_ITINERARY:
  92.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_PEDAGOH]) && $itinerary->getIsPedagoh();
  93.                     case self::LIST_PLAYER:
  94.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTISTPermission::ROLE_PEDAGOH]);
  95.                     case self::CREATE_PLAYER:
  96.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTISTPermission::ROLE_PEDAGOH]);
  97.                     case self::EDIT_PLAYER:
  98.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTISTPermission::ROLE_PEDAGOH]);
  99.                     case self::LIST_SOUND:
  100.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTISTPermission::ROLE_PEDAGOH]);
  101.                     case self::CREATE_SOUND:
  102.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTISTPermission::ROLE_PEDAGOH]);
  103.                     case self::EDIT_SOUND:
  104.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTISTPermission::ROLE_PEDAGOH]);
  105.                     case self::LIST_CODE:
  106.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTIST]);
  107.                     case self::CREATE_CODE:
  108.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTIST]);
  109.                     case self::EDIT_CODE:
  110.                         return in_array($permission->getRole(), [Permission::ROLE_ADMINPermission::ROLE_EDITORPermission::ROLE_ARTIST]);
  111.                 }
  112.             }
  113.         }
  114.         return false;
  115.     }
  116. }