src/Voters/ApiVoter.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Voters;
  3. use App\Entity\Clinic\Person\ClinicUser;
  4. use App\Entity\Message\TableConversation;
  5. use App\Entity\Message\UserConversation;
  6. use App\Entity\Person\Patient;
  7. use App\Entity\Person\SuperClinicAdmin;
  8. use App\Entity\Person\User;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
  12. class ApiVoter extends AppVoter
  13. {
  14.     public const IPAD 'ipad';
  15.     public const IPAD_BY_PATIENT 'ipad_by_patient';
  16.     public const IPAD_LIMITED_ACCESS 'ipad_limited_access';
  17.     public const IPAD_LIMITED_ACCESS_CHAT 'ipad_limited_access_chat';
  18.     public const IPHONE 'iphone';
  19.     /**
  20.      * @var ManagerRegistry
  21.      */
  22.     private $doctrine;
  23.     public function __construct(AccessDecisionManagerInterface $decisionManagerManagerRegistry $registry)
  24.     {
  25.         parent::__construct($decisionManager);
  26.         $this->doctrine $registry;
  27.     }
  28.     protected function supports($attribute$subject)
  29.     {
  30.         return in_array($attribute,
  31.             [
  32.                 self::IPAD,
  33.                 self::IPHONE,
  34.                 self::IPAD_BY_PATIENT,
  35.                 self::IPAD_LIMITED_ACCESS,
  36.                 self::IPAD_LIMITED_ACCESS_CHAT
  37.             ],
  38.             true
  39.         );
  40.     }
  41.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  42.     {
  43.         /** @var ClinicUser|Patient|SuperClinicAdmin $user */
  44.         $user $token->getUser();
  45.         if ($this->decisionManager->decide($token, [User::ROLE_PATIENT]) && self::IPHONE == $attribute) {
  46.             return $user->getId() == $subject;
  47.         }
  48.         if ($this->decisionManager->decide($token, [User::ROLE_PRACTITIONERUser::ROLE_SCHEDULERUser::ROLE_SUPER_CLINIC_ADMIN])
  49.             && in_array($attribute, [self::IPADself::IPHONEself::IPAD_BY_PATIENT])) {
  50.             if ($subject && in_array($attribute, [self::IPAD_BY_PATIENTself::IPHONE])) {
  51.                 /** @var Patient $patient */
  52.                 $patient $this->doctrine->getRepository(Patient::class)->find((int) $subject);
  53.                 if ($user instanceof SuperClinicAdmin) {
  54.                     $clinic $user->getCurrentClinic();
  55.                    
  56.                 } else {
  57.                     $clinic $user->getClinic();
  58.                 }
  59.                 return $patient && ($clinic->getId() == $patient->getClinic()->getId() || $patient->getAllowedClinics()->contains($clinic));
  60.             }
  61.             return true;
  62.         }
  63.         if ($this->decisionManager->decide($token,
  64.                 [
  65.                     User::ROLE_PRACTITIONER,
  66.                     User::ROLE_SCHEDULER,
  67.                     User::ROLE_CLINIC_ADMIN,
  68.                     User::ROLE_SUPER_CLINIC_ADMIN,
  69.                     User::ROLE_RECEPTIONIST,
  70.                     User::ROLE_BOOKER
  71.                 ]
  72.             )
  73.                 && self::IPAD_LIMITED_ACCESS == $attribute) {
  74.             if ($subject) {
  75.                 /** @var Patient $patient */
  76.                 $patient $this->doctrine->getRepository(Patient::class)->find($subject);
  77.                 if ($user instanceof SuperClinicAdmin) {
  78.                     if ($user->getCurrentClinic()) {
  79.                         return $patient && ($user->getCurrentClinic()->getId() == $patient->getClinic()->getId() || $patient->getAllowedClinics()->contains($user->getCurrentClinic()));
  80.                     }
  81.                     return false;
  82.                 }
  83.                 return $patient && ($user->getClinic()->getId() == $patient->getClinic()->getId() || $patient->getAllowedClinics()->contains($user->getClinic()));
  84. //                return $patient && $user->getClinic()->getId() == $patient->getClinic()->getId();
  85.             }
  86.             return true;
  87.         }
  88.         if ($this->decisionManager->decide($token,
  89.                 [
  90.                     User::ROLE_PRACTITIONER,
  91.                     User::ROLE_SCHEDULER,
  92.                     User::ROLE_CLINIC_ADMIN,
  93.                     User::ROLE_SUPER_CLINIC_ADMIN,
  94.                     User::ROLE_RECEPTIONIST,
  95.                     User::ROLE_BOOKER
  96.                 ]
  97.             )
  98.             && self::IPAD_LIMITED_ACCESS_CHAT == $attribute) {
  99.             if ($subject) {
  100.                 /** @var TableConversation $conversation */
  101.                 $conversation $this->doctrine->getRepository(TableConversation::class)->find($subject);
  102.                 return $conversation &&
  103.                     $conversation->getUserConversations()->filter(function (UserConversation $userConversation) use ($user) {
  104.                         return $userConversation->getUser()->getId() == $user->getId();
  105.                     })->count() > 0;
  106.             }
  107.             return false;
  108.         }
  109.         return false;
  110.     }
  111. }