src/Security/Voter/ProjectDetailsVoter.php line 16

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