src/Security/Voter/RequestBaseVoter.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\RequestBase;
  4. use App\Entity\RequestBaseProposals;
  5. use App\Entity\User;
  6. use App\Enum\RequestsNotificationsEnum;
  7. use App\Enum\UserEnum;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. use Symfony\Component\Security\Core\Security;
  11. use Symfony\Component\Security\Core\User\UserInterface;
  12. class RequestBaseVoter extends Voter
  13. {
  14.     public const READ "READ";
  15.     public const DELETE "DELETE";
  16.     /**
  17.      * @var Security
  18.      */
  19.     private $security;
  20.     public function __construct(Security $security)
  21.     {
  22.         $this->security $security;
  23.     }
  24.     protected function supports($attribute$subject)
  25.     {
  26.         $attributesSupported = [
  27.             self::READ,
  28.             self::DELETE
  29.         ];
  30.         if (!in_array($attribute$attributesSupported)) {
  31.             return false;
  32.         }
  33.         if (!$subject instanceof RequestBase) {
  34.             return false;
  35.         }
  36.         return true;
  37.     }
  38.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  39.     {
  40.         /** @var User $user */
  41.         $user $token->getUser();
  42.         if (!$user instanceof UserInterface) {
  43.             return false;
  44.         }
  45.         if ($this->security->isGranted(UserEnum::SUPER_ADMIN)) {
  46.             return true;
  47.         }
  48.         switch ($attribute) {
  49.             case self::READ:
  50.                 return $this->canRead($user$subject);
  51.                 break;
  52.             case self::DELETE:
  53.                 return $this->canDelete($user$subject);
  54.                 break;
  55.         }
  56.         return false;
  57.     }
  58.     private function canRead(User $currentUserRequestBase $subject): bool
  59.     {
  60.         
  61.         $requestIsWaitProposal $subject->getStatus() === RequestsNotificationsEnum::REQUEST_WAITING_PROPOSAL;
  62.         $requestIsInProgress $subject->getStatus() === RequestsNotificationsEnum::REQUEST_IN_PROGRESS;
  63.         $requestIsClosed $subject->getStatus() === RequestsNotificationsEnum::REQUEST_CLOSED;
  64.         $requestIsRefused $subject->getStatus() === RequestsNotificationsEnum::REQUEST_REFUSED;
  65.         if ($currentUser->isTeacher()) {
  66.             if ($requestIsWaitProposal) {
  67.                 /** @var RequestBaseProposals[] $teacherProposalEntity */
  68.                 $teacherProposalEntities $subject->getRequestBaseProposals()->filter(function (RequestBaseProposals $requestProposal) use ($currentUser) {
  69.                     return $requestProposal->getCorrector()->getId() === $currentUser->getId();
  70.                 });
  71.                 $teacherProposalEntity $teacherProposalEntities->isEmpty() ? null $teacherProposalEntities->first();
  72.                 if ($teacherProposalEntity && $teacherProposalEntity->getStatus() !== RequestBaseProposals::STATUS_REFUSE) {
  73.                    return true;
  74.                 }
  75.                 return false;
  76.             }
  77.             if(!$subject->getTeacher()) {
  78.                 return false;
  79.             }
  80.             else {
  81.                 return ($requestIsInProgress || $requestIsClosed || $requestIsRefused) && $currentUser->getId() === $subject->getTeacher()->getId();
  82.             }
  83.         }
  84.         if ($currentUser->isStudent()) {
  85.             return $currentUser->getId() === $subject->getStudent()->getId();
  86.         }
  87.         return false;
  88.     }
  89.     private function canDelete(User $currentUserRequestBase $subject): bool
  90.     {
  91.         return $currentUser->getId() === $subject->getStudent()->getId();
  92.     }
  93. }