src/Security/Voter/API/Appointment/PersonViewVoter.php line 12

  1. <?php
  2. namespace App\Security\Voter\API\Appointment;
  3. use App\Entity\Appointment\AppointmentPerson;
  4. use App\Entity\User\PatientUser;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use function is_array;
  8. use function is_iterable;
  9. class PersonViewVoter extends Voter
  10. {
  11.     protected function supports(string $attributemixed $subject): bool
  12.     {
  13.         return $attribute === 'API_APPOINTMENT_PERSON_VIEW';
  14.     }
  15.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  16.     {
  17.         /** @var PatientUser $user */
  18.         $user $token->getUser();
  19.         if (!$user instanceof PatientUser) {
  20.             return false;
  21.         }
  22.         if (is_iterable($subject)) {
  23.             foreach ($subject as $item) {
  24.                 if (!$item instanceof AppointmentPerson) {
  25.                     return false;
  26.                 }
  27.                 if (!$this->canView($item$user)) {
  28.                     return false;
  29.                 }
  30.             }
  31.             return true;
  32.         }
  33.         else if ($subject instanceof AppointmentPerson) {
  34.             return $this->canView($subject$user);
  35.         }
  36.         return false;
  37.     }
  38.     private function canView(AppointmentPerson $personPatientUser $user): bool
  39.     {
  40.         return $person->getAppointment()?->getPatient()?->getUser() === $user;
  41.     }
  42. }