src/Security/Voter/PredictAi/PredictAiBetaAccessVoter.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter\PredictAi;
  3. use App\Entity\Product;
  4. use App\Entity\User;
  5. use App\Service\Subscription\SubscriptionProvider;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. /**
  9.  * Voter permettant de vérifier l'accès à la fonctionnalité de Predict AI par le membre connecté.
  10.  */
  11. /**
  12.  * @extends Voter<string, mixed>
  13.  */
  14. class PredictAiBetaAccessVoter extends Voter
  15. {
  16.     public const PREDICT_AI_BETA_ACCESS 'predict_ai_beta_access';
  17.     private SubscriptionProvider $subscriptionProvider;
  18.     public function __construct(
  19.         SubscriptionProvider $subscriptionProvider
  20.     ) {
  21.         $this->subscriptionProvider $subscriptionProvider;
  22.     }
  23.     protected function supports(string $attribute$subject): bool
  24.     {
  25.         return self::PREDICT_AI_BETA_ACCESS === $attribute;
  26.     }
  27.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  28.     {
  29.         /** @var User|null $user */
  30.         $user $token->getUser();
  31.         if (null === $user) {
  32.             return false;
  33.         }
  34.         $member $user->getMember();
  35.         if (null === $member) {
  36.             return false;
  37.         }
  38.         // On ne donne accès qu'aux membres ayant un premiumm (1, 6, 12 mois), les full en 6/12 mois et IKIGAI+ (premium par défaut)
  39.         // (en fait on ne donne simplement pas l'accès aux full en 1 mois)
  40.         // D'abord on récupère la dernière souscription active sur un pack IKIGAI
  41.         $lastIkigaiSubscription $this->subscriptionProvider->getLastIkigaiSubscription($member);
  42.         // Si c'est un IKIGAI + c'est forcément un pack premium
  43.         if (null !== $lastIkigaiSubscription
  44.             && null !== $lastIkigaiSubscription->getProduct()
  45.             && Product::IKIGAI_PLUS_KEY === $lastIkigaiSubscription->getProduct()->getName()
  46.         ) {
  47.             return true;
  48.         }
  49.         // Ensuite on teste la dernière souscription active sur un pack Futures
  50.         $lastFuturesSubscription $this->subscriptionProvider->getLastFuturesSubscription($membertrue);
  51.         // Si le membre n'a pas d'abonnement Futures en cours ou que le produit rattaché n'existe pas
  52.         if (null === $lastFuturesSubscription || null === $lastFuturesSubscription->getProduct()) {
  53.             return false;
  54.         }
  55.         // Si le membre a un abonnement Futures en cours et que la durée est 6 ou 12 mois
  56.         if ($lastFuturesSubscription->getDurationTotal() > 1) {
  57.             return true;
  58.         }
  59.         // Si le membre a un abonnement Futures en cours et que le produit est un premium
  60.         if (Product::PREMIUM_KEY === $lastFuturesSubscription->getProduct()->getName()) {
  61.             return true;
  62.         }
  63.         return false;
  64.     }
  65. }