src/Security/Voter/ElearningPlatform/FeatureTypeAccessVoter.php line 16

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter\ElearningPlatform;
  3. use App\Entity\Futures\Feature;
  4. use App\Entity\Futures\FeatureType;
  5. use App\Entity\User;
  6. use App\Repository\ProductRepository;
  7. use App\Service\Subscription\SubscriptionProvider;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. /**
  11.  * @extends Voter<string, mixed>
  12.  */
  13. class FeatureTypeAccessVoter extends Voter
  14. {
  15.     public const FEATURE_TYPE_ACCESS 'feature_type_access';
  16.     private SubscriptionProvider $subscriptionProvider;
  17.     private ProductRepository $productRepository;
  18.     public function __construct(
  19.         SubscriptionProvider $subscriptionProvider,
  20.         ProductRepository $productRepository
  21.     ) {
  22.         $this->subscriptionProvider $subscriptionProvider;
  23.         $this->productRepository $productRepository;
  24.     }
  25.     protected function supports(string $attribute$subject): bool
  26.     {
  27.         return self::FEATURE_TYPE_ACCESS === $attribute && $subject instanceof FeatureType;
  28.     }
  29.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  30.     {
  31.         if (false === $subject instanceof FeatureType) {
  32.             return false;
  33.         }
  34.         /** @var User|null $user */
  35.         $user $token->getUser();
  36.         if (null === $user) {
  37.             return false;
  38.         }
  39.         $member $user->getMember();
  40.         if (null === $member) {
  41.             return false;
  42.         }
  43.         if (true === $member->isDeleted()) {
  44.             return false;
  45.         }
  46.         // Dans le cas d'un IKIGAI ou IKIGAI+ on vérifie l'accès sur le pack du membre et non sur le produit de la souscription
  47.         $lastIkigaiSubscription $this->subscriptionProvider->getLastIkigaiSubscription($member);
  48.         if (null !== $lastIkigaiSubscription) {
  49.             $futuresPack $this->productRepository->findOneBy(['name' => $lastIkigaiSubscription->getFuturesPackName()]);
  50.             if (null !== $futuresPack) {
  51.                 $features $futuresPack->getFeatures();
  52.                 foreach ($features as $feature) {
  53.                     /** @var Feature $feature */
  54.                     if ($feature->getFeatureType() === $subject && false === $feature->isBundle()) {
  55.                         return true;
  56.                     }
  57.                 }
  58.             }
  59.         }
  60.         // Sinon on regarde s'il a une souscription active sur Futures
  61.         try {
  62.             $lastFuturesSubscription $this->subscriptionProvider->getLastFuturesSubscription($member);
  63.         } catch (\Throwable $e) {
  64.             return false;
  65.         }
  66.         if (null === $lastFuturesSubscription) {
  67.             return false;
  68.         }
  69.         if (null === $lastFuturesSubscription->getProduct()) {
  70.             return false;
  71.         }
  72.         $features $lastFuturesSubscription->getProduct()->getFeatures();
  73.         foreach ($features as $feature) {
  74.             /** @var Feature $feature */
  75.             if ($feature->getFeatureType() === $subject && false === $feature->isBundle()) {
  76.                 return true;
  77.             }
  78.         }
  79.         return false;
  80.     }
  81. }