src/Bundles/OrganizationBundle/Security/Voter/OrganizationVoter.php line 17

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Bundles\OrganizationBundle\Security\Voter;
  4. use App\Bundles\OrganizationBundle\Entity\Organization;
  5. use App\Bundles\OrganizationBundle\Enum\UserOrganizationResponsibleLevelEnum;
  6. use App\Bundles\OrganizationBundle\Exception\UserOrganizationNotFoundException;
  7. use App\Bundles\OrganizationBundle\Repository\OrganizationRepository;
  8. use App\Bundles\OrganizationBundle\Service\UserOrganization\UserOrganizationProvider;
  9. use App\Bundles\OrganizationBundle\Service\UserOrganization\UserOrganizationResponsibleLevelResolver;
  10. use App\Bundles\UserBundle\Enum\SystemPermissionEnum;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  13. class OrganizationVoter extends Voter
  14. {
  15.     public function __construct(
  16.         private readonly UserOrganizationProvider $userOrganizationProvider,
  17.         private readonly UserOrganizationResponsibleLevelResolver $levelResolver,
  18.         private readonly OrganizationRepository $organizationRepository,
  19.     ) {
  20.     }
  21.     protected function supports(string $attribute$subject): bool
  22.     {
  23.         return $attribute === SystemPermissionEnum::SPECIFIC_ORGANIZATION_VIEW->value;
  24.     }
  25.     /** @param Organization $subject
  26.      * @throws UserOrganizationNotFoundException
  27.      */
  28.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  29.     {
  30.         if (
  31.             $this->levelResolver->resolve() === UserOrganizationResponsibleLevelEnum::NATIONAL_LEVEL->value
  32.         ) {
  33.             return true;
  34.         }
  35.         return $this->organizationRepository->withinAvailableOrganization(
  36.             $subject,
  37.             $this->userOrganizationProvider->provideFromSession()->getOrganization()
  38.         );
  39.     }
  40. }