src/Security/Voter/MultimediaVoter.php line 16

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Admin;
  4. use App\Entity\Multimedia;
  5. use App\Entity\ProviderUser;
  6. use App\Entity\User;
  7. use App\Repository\IssueRepository;
  8. use App\Repository\MaintenanceRepository;
  9. use App\Repository\MaintenanceTaskRepository;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  12. use Symfony\Component\Security\Core\User\UserInterface;
  13. class MultimediaVoter extends Voter
  14. {
  15.     public const VIEW 'view';
  16.     public function __construct(
  17.         private readonly MaintenanceRepository     $maintenanceRepository,
  18.         private readonly MaintenanceTaskRepository $maintenanceTaskRepository,
  19.         private readonly IssueRepository $issueRepository
  20.     )
  21.     {
  22.     }
  23.     protected function supports(string $attribute$subject): bool
  24.     {
  25.         // replace with your own logic
  26.         // https://symfony.com/doc/current/security/voters.html
  27.         return in_array($attribute, [self::VIEW])
  28.             && $subject instanceof Multimedia;
  29.     }
  30.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  31.     {
  32.         $user $token->getUser();
  33.         // if the user is anonymous, do not grant access
  34.         if (!$user instanceof UserInterface) {
  35.             return false;
  36.         }
  37.         switch ($attribute) {
  38.             case self::VIEW:
  39.                 return $this->canView($subject$user);
  40.         }
  41.         return false;
  42.     }
  43.     private function canView(Multimedia $multimediaUserInterface $user): bool
  44.     {
  45.         // De momento, si es Administrador puede ver todos los multimedia
  46.         if ($user instanceof Admin) {
  47.             return true;
  48.         }
  49.         // Los usuarios de los clientes...
  50.         if ($user instanceof User) {
  51.             // TODO: filtrar
  52.             return true;
  53.         }
  54.         if ($user instanceof ProviderUser) {
  55.             $userProviderId $user->getProvider()->getId();
  56.             // Se busca el mantenimiento, actuación o incidencia a la que pertenece la Multimedia
  57.             $maintenance $this->maintenanceRepository->findOneBy(['multimedia' => $multimedia]);
  58.             if ($maintenance) {
  59.                 return $maintenance->getProvider()?->getId() === $userProviderId;
  60.             }
  61.             $maintenanceTask $this->maintenanceTaskRepository->findOneBy(['multimedia' => $multimedia]);
  62.             if ($maintenanceTask) {
  63.                 return $maintenanceTask->getMaintenance()->getProvider()?->getId() === $userProviderId;
  64.             }
  65.             $issue $this->issueRepository->findOneBy(['multimedia' => $multimedia]);
  66.             if ($issue) {
  67.                 return $issue->getProvider()?->getId() === $userProviderId;
  68.             }
  69.         }
  70.         return false;
  71.     }
  72. }