src/Security/Voter/Media/MemberMediaVoter.php line 19

Open in your IDE?
  1. <?php
  2. /*
  3.  * Author: Dominik Piekarski <code@dompie.de>
  4.  * Created at: 2021/08/11 14:49
  5.  */
  6. declare(strict_types=1);
  7. namespace App\Security\Voter\Media;
  8. use App\Entity\Member;
  9. use App\Entity\MemberMedia;
  10. use App\Security\ApiUser;
  11. use App\Service\Content\MemberContentService;
  12. use App\Service\Media\MemberMediaService;
  13. use App\Service\User\MemberOperatorService;
  14. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  15. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  16. class MemberMediaVoter extends Voter
  17. {
  18.     public const PERMISSION_DELETE 'delete';
  19.     public const PERMISSION_CREATE 'create';
  20.     protected MemberContentService $memberContentService;
  21.     public function __construct(MemberMediaService $service)
  22.     {
  23.         $this->memberMediaService $service;
  24.     }
  25.     protected function supports(string $attribute$subject): bool
  26.     {
  27.         if (!$subject instanceof MemberMedia) {
  28.             return false;
  29.         }
  30.         return in_array($attribute, [
  31.             self::PERMISSION_DELETE,
  32.             self::PERMISSION_CREATE,
  33.         ], true);
  34.     }
  35.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  36.     {
  37.         /**
  38.          * @var $user ApiUser
  39.          * @var $subject MemberMedia
  40.          */
  41.         $user $token->getUser();
  42.         if (!$user instanceof ApiUser) {
  43.             return false;
  44.         }
  45.         if ($user->getIsAdmin()) {
  46.             return true;
  47.         }
  48.         switch ($attribute) {
  49.             case self::PERMISSION_DELETE:
  50.                 return $subject->getMember()->getId() === $user->getMember()->getId();
  51.             case self::PERMISSION_CREATE:
  52.                 return $this->isSameOrOperatedBy($subject->getMember(), $user);
  53.             default:
  54.                 return false;
  55.         }
  56.     }
  57.     protected function isSameOrOperatedBy(Member $amateurApiUser $user): bool
  58.     {
  59.         if ($user->getMember()->getId() === $amateur->getId()) {
  60.             return true;
  61.         }
  62.         if ($user->getIsOperator()) {
  63.             return MemberOperatorService::isMemberOperatedByUser($amateur$user);
  64.         }
  65.         return false;
  66.     }
  67. }