src/Security/Voter/ItemDocumentOwnerVoter.php line 15

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voter;
  4. use App\Entity\ItemDocument;
  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 ItemDocumentOwnerVoter 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 === 'item_document_owner_voter') {
  19.             return true;
  20.         }
  21.         return false;
  22.     }
  23.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  24.     {
  25.         if (!$subject instanceof ItemDocument) {
  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.                 ->getItem()
  42.                 ->getProject()
  43.                 ->getInstitution()
  44.                 ->getId()
  45.             ===
  46.             $currentRoleInstitution
  47.                 ->getUserInstitution()
  48.                 ->getInstitution()
  49.                 ->getId()
  50.         ) {
  51.             return true;
  52.         }
  53.         // Project manager can see details only for project where he is assignee
  54.         if (
  55.             RoleEnum::PROJECT_MANAGER === $currentRoleInstitution->getRole()->getKeyName()
  56.             &&
  57.             $loggedUser->getId() === $subject
  58.                 ->getItem()
  59.                 ->getProject()
  60.                 ->getProjectManager()
  61.                 ->getId()
  62.         ) {
  63.             return true;
  64.         }
  65.         // Check if loggedUser is project employee
  66.         return (bool) $this->itemUserRepository->findOneBy(['item' => $subject->getItem(), 'user' => $loggedUser]);
  67.     }
  68. }