vendor/nen/questionnaire-bundle/src/Security/Voter/RespondentVoter.php line 14

Open in your IDE?
  1. <?php
  2. namespace Nen\Bundle\QuestionnaireBundle\Security\Voter;
  3. use App\Entity\Respondent;
  4. use App\Entity\User;
  5. use Nen\Bundle\KennisbankPlatformBundle\Service\PlatformUserRolesProvider;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  8. use Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. use Symfony\Component\Security\Core\Security;
  11. class RespondentVoter extends Voter
  12. {
  13.     private Security $security;
  14.     private RoleHierarchyVoter $roleVoter;
  15.     public function __construct(Security $securityRoleHierarchyVoter $roleVoter)
  16.     {
  17.         $this->security $security;
  18.         $this->roleVoter $roleVoter;
  19.     }
  20.     protected function supports(string $attribute$subject): bool
  21.     {
  22.         return $subject instanceof Respondent;
  23.     }
  24.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  25.     {
  26.         /** @var Respondent $respondent */
  27.         $respondent $subject;
  28.         $user $token->getUser();
  29.         if (!$user instanceof User) {
  30.             return false;
  31.         }
  32.         switch ($attribute) {
  33.             case 'update':
  34.                 return $this->update($respondent$user);
  35.             case 'remove':
  36.                 return $this->remove($respondent);
  37.         }
  38.         return false;
  39.     }
  40.     private function getRespondentToken(Respondent $respondent): TokenInterface
  41.     {
  42.         return new UsernamePasswordToken($respondent->getUser(), null'main'$respondent->getUser()->getRoles());
  43.     }
  44.     private function remove(Respondent $respondent): bool
  45.     {
  46.         // You cannot remove respondents that are connected to questionnaires.
  47.         if ($respondent->getQuestionnaires()->count() > 0) {
  48.             return false;
  49.         }
  50.         // You cannot remove respondents that are also license users.
  51.         $result $this->roleVoter->vote($this->getRespondentToken($respondent), null, [PlatformUserRolesProvider::ROLE_LICENSE_USER]);
  52.         if ($result >= 1) {
  53.             return false;
  54.         }
  55.         // Users with the customer service role can remove respondents.
  56.         if ($this->security->isGranted(PlatformUserRolesProvider::ROLE_CUSTOMER_SERVICE)) {
  57.             return true;
  58.         }
  59.         // User needs to be a license manager.
  60.         if (!$this->security->isGranted(PlatformUserRolesProvider::ROLE_LICENSE_MANAGER)) {
  61.             return false;
  62.         }
  63.         return true;
  64.     }
  65.     private function update(Respondent $respondentUser $user): bool
  66.     {
  67.         // Users with the customer service role can update respondents.
  68.         if ($this->security->isGranted(PlatformUserRolesProvider::ROLE_CUSTOMER_SERVICE)) {
  69.             return true;
  70.         }
  71.         // User needs to be a license manager.
  72.         if (!$this->security->isGranted(PlatformUserRolesProvider::ROLE_LICENSE_MANAGER)) {
  73.             return false;
  74.         }
  75.         // Return true when the user is from the same company as the respondent.
  76.         return $respondent->getUser()->getCompany()->getId() === $user->getCompany()->getId();
  77.     }
  78. }