src/Security/Voter/Messenger/FolderVoter.php line 14

  1. <?php
  2. namespace App\Security\Voter\Messenger;
  3. use App\Entity\Messenger\Folder;
  4. use App\Entity\Admin\CustomerUser;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\User\UserInterface;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use Symfony\Bundle\SecurityBundle\Security;
  10. class FolderVoter extends Voter
  11. {
  12.     final public const EDIT 'FOLDER_ENTITY_EDIT';
  13.     final public const VIEW 'FOLDER_ENTITY_VIEW';
  14.     final public const DELETE 'FOLDER_ENTITY_DELETE';
  15.     
  16.     public function __construct(
  17.             private readonly Security $security)
  18.     {
  19.     }
  20.     
  21.     protected function supports(string $attributemixed $subject): bool
  22.     {
  23.         if(!in_array($attribute, [self::EDITself::VIEWself::DELETE])){
  24.             return false;
  25.         }
  26.         
  27.         if ($subject == null){
  28.             return true;
  29.         }
  30.         
  31.         if (!$subject instanceof Folder) {
  32.             return false;
  33.         }
  34.     
  35.         return true;
  36.     }
  37.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  38.     {
  39.         $user $token->getUser();
  40.         // if the user is anonymous, do not grant access
  41.         if (!$user instanceof UserInterface) {
  42.             return false;
  43.         }
  44.  
  45.         if (!$this->security->isGranted('ROLE_STAFF')){
  46.             return false;
  47.         }
  48.        
  49.         // ... (check conditions and return true to grant permission) ...
  50.        return match($attribute) {
  51.             self::VIEW => $this->canView($subject$user),
  52.             self::EDIT => $this->canEdit($subject$user),
  53.             self::DELETE => $this->canDelete($subject$user),
  54.             default => throw new \LogicException('This code should not be reached!')
  55.         };
  56.     }
  57.     
  58.     private function canView(Folder $entityCustomerUser $user): bool
  59.     {
  60.         if ($entity->getStaff() == null) {
  61.             return true;
  62.         }
  63.         
  64.         if ($entity->getStaff()->getId() == $user->getStaff()) {
  65.             return true;
  66.         }
  67.         return false;
  68.     }
  69.     private function canEdit(?Folder $entityCustomerUser $user): bool
  70.     {
  71.         if ($entity == null) {
  72.             return true;
  73.         }
  74.       
  75.         if ($entity->getStaff() == null) {
  76.             return true;
  77.         }
  78.        
  79.         if ($entity->getStaff()->getId() == $user->getStaff()) {
  80.             return true;
  81.         }
  82.       
  83.         return false;
  84.     }
  85.     
  86.     private function canDelete(Folder $entityCustomerUser $user): bool
  87.     {
  88.         if ($entity->getStaff()->getId() == $user->getStaff()) {
  89.             return true;
  90.         }
  91.         return false;
  92.     }
  93. }