src/Security/Voter/ApiItemOwnerVoter.php line 15

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voter;
  4. use App\Entity\Item;
  5. use App\Entity\User;
  6. use App\Entity\UserInstitutionRole;
  7. use App\Enum\RoleEnum;
  8. use App\Repository\ItemUserRepository;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. final class ApiItemOwnerVoter extends Voter
  12. {
  13.     public function __construct(private readonly ItemUserRepository $itemUserRepository)
  14.     {
  15.     }
  16.     protected function supports(string $attribute$subject): bool
  17.     {
  18.         if ($attribute === 'api_item_owner_voter') {
  19.             return true;
  20.         }
  21.         return false;
  22.     }
  23.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  24.     {
  25.         if (!$subject instanceof Item) {
  26.             return false;
  27.         }
  28.         /** @var ?User $loggedUser */
  29.         $loggedUser $token->getUser();
  30.         if (!$loggedUser) {
  31.             return false;
  32.         }
  33.         /** @var UserInstitutionRole $currentRoleInstitution */
  34.         $currentRoleInstitution $loggedUser
  35.             ->getCurrentRoleInstitution();
  36.         // Every general manager can see details for each project on his current institution
  37.         if (
  38.             RoleEnum::GENERAL_MANAGER === $currentRoleInstitution->getRole()->getKeyName()
  39.             &&
  40.             $subject
  41.                 ->getProject()
  42.                 ->getInstitution()
  43.                 ->getId()
  44.             ===
  45.             $currentRoleInstitution
  46.                 ->getUserInstitution()
  47.                 ->getInstitution()
  48.                 ->getId()
  49.         ) {
  50.             return true;
  51.         }
  52.         // Project manager can see details only for project where he is assignee
  53.         if (
  54.             RoleEnum::PROJECT_MANAGER === $currentRoleInstitution->getRole()->getKeyName()
  55.             &&
  56.             $loggedUser->getId() === $subject
  57.                 ->getProject()
  58.                 ->getProjectManager()
  59.                 ->getId()
  60.         ) {
  61.             return true;
  62.         }
  63.         // Check if loggedUser is project employee
  64.         return (bool) $this->itemUserRepository->findOneBy(['item' => $subject'user' => $loggedUser]);
  65.     }
  66. }