<?phpnamespace App\Security\Voter\ElearningPlatform;use App\Entity\Futures\Feature;use App\Entity\Futures\FeatureType;use App\Entity\User;use App\Repository\ProductRepository;use App\Service\Subscription\SubscriptionProvider;use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;use Symfony\Component\Security\Core\Authorization\Voter\Voter;/** * @extends Voter<string, mixed> */class FeatureTypeAccessVoter extends Voter{ public const FEATURE_TYPE_ACCESS = 'feature_type_access'; private SubscriptionProvider $subscriptionProvider; private ProductRepository $productRepository; public function __construct( SubscriptionProvider $subscriptionProvider, ProductRepository $productRepository ) { $this->subscriptionProvider = $subscriptionProvider; $this->productRepository = $productRepository; } protected function supports(string $attribute, $subject): bool { return self::FEATURE_TYPE_ACCESS === $attribute && $subject instanceof FeatureType; } protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool { if (false === $subject instanceof FeatureType) { return false; } /** @var User|null $user */ $user = $token->getUser(); if (null === $user) { return false; } $member = $user->getMember(); if (null === $member) { return false; } if (true === $member->isDeleted()) { return false; } // 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 $lastIkigaiSubscription = $this->subscriptionProvider->getLastIkigaiSubscription($member); if (null !== $lastIkigaiSubscription) { $futuresPack = $this->productRepository->findOneBy(['name' => $lastIkigaiSubscription->getFuturesPackName()]); if (null !== $futuresPack) { $features = $futuresPack->getFeatures(); foreach ($features as $feature) { /** @var Feature $feature */ if ($feature->getFeatureType() === $subject && false === $feature->isBundle()) { return true; } } } } // Sinon on regarde s'il a une souscription active sur Futures try { $lastFuturesSubscription = $this->subscriptionProvider->getLastFuturesSubscription($member); } catch (\Throwable $e) { return false; } if (null === $lastFuturesSubscription) { return false; } if (null === $lastFuturesSubscription->getProduct()) { return false; } $features = $lastFuturesSubscription->getProduct()->getFeatures(); foreach ($features as $feature) { /** @var Feature $feature */ if ($feature->getFeatureType() === $subject && false === $feature->isBundle()) { return true; } } return false; }}