src/EventSubscribers/Coaching/CoachingUserSubscriber.php line 191

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscribers\Coaching;
  3. use App\Entity\Coaching\CoachingUser;
  4. use App\Entity\Coaching\Transaction;
  5. use App\Events\Coaching\CoachingUser\CoachingAutologinGeneratedEvent;
  6. use App\Events\Coaching\CoachingUser\CoachingUserCreatedOnWebsiteEvent;
  7. use App\Events\Coaching\CoachingUser\CoachingUserReactivatedEvent;
  8. use App\Events\Coaching\CoachingUser\CoachingUserRegisteredEvent;
  9. use App\Events\Coaching\CoachingUser\CoachingUserSoftRegisteredEvent;
  10. use App\Events\Coaching\CoachingUser\CoachingUserSubscribedEvent;
  11. use App\Events\Coaching\CoachingUser\CoachingUserUnregisteredEvent;
  12. use App\Events\Coaching\CoachingUser\CoachingUserUnsubscribedEvent;
  13. use App\Events\Coaching\CoachingUser\CoachingUserUpdatedEvent;
  14. use App\Services\EmailManager;
  15. use App\Tools\Encryption;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Doctrine\ORM\EntityRepository;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  20. class CoachingUserSubscriber implements EventSubscriberInterface
  21. {
  22.     const
  23.         COACHING_USER_SOFT_REGISTER 'coaching.user.soft.register',
  24.         COACHING_USER_REGISTER 'coaching.user.register',
  25.         COACHING_USER_SUBSCRIBE 'coaching.user.subscribe',
  26.         COACHING_USER_UNSUBSCRIBE 'coaching.user.unsubscribe',
  27.         COACHING_USER_UNREGISTER 'coaching.user.unregister',
  28.         COACHING_USER_UPDATE 'coaching.user.update',
  29.         COACHING_AUTOLOGIN_GENERATED 'coaching.autologin.generated',
  30.         COACHING_USER_REACTIVATE 'coaching.user.reactivate',
  31.         COACHING_USER_CREATED_ON_WEBSITE 'coaching.user.created.on.website'
  32.     ;
  33.     private EmailManager $emailManager;
  34.     private EntityRepository $transactionRepository;
  35.     /**
  36.      * CoachingUserSubscriber constructor.
  37.      */
  38.     public function __construct(
  39.         private EntityManagerInterface $entityManager,
  40.         private UserPasswordHasherInterface $encoder,
  41.         private Encryption $encryption,
  42.         EmailManager $emailManager
  43.     ) {
  44.         $this->emailManager $emailManager;
  45.         $this->transactionRepository $entityManager->getRepository(Transaction::class);
  46.     }
  47.     /**
  48.      * @return array
  49.      */
  50.     public static function getSubscribedEvents()
  51.     {
  52.         return array(
  53.             self::COACHING_USER_REGISTER => "userRegistration",
  54.             self::COACHING_USER_SOFT_REGISTER => "userSoftRegistration",
  55.             self::COACHING_USER_UNREGISTER => "userUnRegistration",
  56.             self::COACHING_USER_SUBSCRIBE => "userSubscription",
  57.             self::COACHING_USER_UNSUBSCRIBE => "userUnSubscription",
  58.             self::COACHING_USER_UPDATE => "userUpdate",
  59.             self::COACHING_AUTOLOGIN_GENERATED => "autologinGenerated",
  60.             self::COACHING_USER_REACTIVATE => "userReactivation",
  61.             self::COACHING_USER_CREATED_ON_WEBSITE => "userCreatedOnWebsite"
  62.         );
  63.     }
  64.     /**
  65.      * @param CoachingUserCreatedOnWebsiteEvent $event
  66.      */
  67.     public function userCreatedOnWebsite(CoachingUserCreatedOnWebsiteEvent $event)
  68.     {
  69.         // here we need to send the email for this user.
  70.         $this->emailManager->sendCoachingRegistrationEmail(
  71.             $event->getUser()->getUser(),
  72.             [
  73.                 'password' => $event->getPlainPassword()
  74.             ]
  75.         );
  76.     }
  77.     /**
  78.      * @param CoachingUserRegisteredEvent $event
  79.      */
  80.     public function userRegistration(CoachingUserRegisteredEvent $event)
  81.     {
  82.         $this->createCoachingUserPassword($event->getUser());
  83.         $transaction = new Transaction();
  84.         $transaction->setUser($event->getUser());
  85.         $transaction->setType(Transaction::TYPE_REGISTER);
  86.         $transaction->setStatus($this->getApiCallStatus($event->getApiResult()));
  87.         $dateEnd = new \DateTime('+30 DAYS');
  88.         $transaction->setSubscriptionEndDate($this->getNewEndDate($event->getUser(), $dateEnd));
  89.         $this->entityManager->persist($transaction);
  90.         $this->entityManager->flush();
  91.     }
  92.     /**
  93.      * @param CoachingUserSoftRegisteredEvent $event
  94.      */
  95.     public function userSoftRegistration(CoachingUserSoftRegisteredEvent $event)
  96.     {
  97.         $this->createCoachingUserPassword($event->getUser());
  98.         $transaction = new Transaction();
  99.         $transaction->setUser($event->getUser());
  100.         $transaction->setType(Transaction::TYPE_SOFT_REGISTER);
  101.         $transaction->setStatus($this->getApiCallStatus($event->getApiResult()));
  102.         $dateEnd = new \DateTime('+30 DAYS');
  103.         $transaction->setSubscriptionEndDate($dateEnd);
  104.         $this->entityManager->persist($transaction);
  105.         $this->entityManager->flush();
  106.     }
  107.     /**
  108.      * @param CoachingUserUnregisteredEvent $event
  109.      */
  110.     public function userUnRegistration(CoachingUserUnregisteredEvent $event)
  111.     {
  112.         $transaction = new Transaction();
  113.         $transaction->setUser($event->getUser());
  114.         $transaction->setType(Transaction::TYPE_UNREGISTER);
  115.         $transaction->setStatus($this->getApiCallStatus($event->getApiResult()));
  116.         $transaction->setSubscriptionEndDate($this->getNewEndDate($event->getUser()));
  117.         $this->entityManager->persist($transaction);
  118.         $this->entityManager->flush();
  119.     }
  120.     /**
  121.      * @param CoachingUserReactivatedEvent $event
  122.      */
  123.     public function userReactivation(CoachingUserReactivatedEvent $event)
  124.     {
  125.         $coachingUser $event->getCoachingUser();
  126.         $coachingUser->setUnregistered(false);
  127.         $transaction = new Transaction();
  128.         $transaction->setUser($coachingUser);
  129.         $transaction->setType(Transaction::TYPE_REACTIVATE);
  130.         $transaction->setStatus($this->getApiCallStatus($event->getApiResult()));
  131.         $dateEnd = new \DateTime('+30 DAYS');
  132.         $transaction->setSubscriptionEndDate($dateEnd);
  133.         $this->entityManager->persist($coachingUser);
  134.         $this->entityManager->persist($transaction);
  135.         $this->entityManager->flush();
  136.     }
  137.     /**
  138.      * @param CoachingUserSubscribedEvent $event
  139.      */
  140.     public function userSubscription(CoachingUserSubscribedEvent $event)
  141.     {
  142.         $transaction = new Transaction();
  143.         $transaction->setUser($event->getUser());
  144.         $transaction->setType(Transaction::TYPE_SUBSCRIBE);
  145.         $transaction->setStatus($this->getApiCallStatus($event->getApiResult()));
  146.         $transaction->setSubscriptionEndDate($event->getDateEnd());
  147.         $this->entityManager->persist($transaction);
  148.         $this->entityManager->flush();
  149.     }
  150.     /**
  151.      * @param CoachingUserUnsubscribedEvent $event
  152.      */
  153.     public function userUnSubscription(CoachingUserUnsubscribedEvent $event)
  154.     {
  155.         $transaction = new Transaction();
  156.         $transaction->setUser($event->getUser());
  157.         $transaction->setType(Transaction::TYPE_UNSUBSCRIBE);
  158.         $transaction->setStatus($this->getApiCallStatus($event->getApiResult()));
  159.         $dateEnd = new \DateTime();
  160.         $transaction->setSubscriptionEndDate($dateEnd);
  161.         $this->entityManager->persist($transaction);
  162.         $this->entityManager->flush();
  163.     }
  164.     /**
  165.      * @param CoachingUserUpdatedEvent $event
  166.      */
  167.     public function userUpdate(CoachingUserUpdatedEvent $event)
  168.     {
  169.         $transaction = new Transaction();
  170.         $transaction->setUser($event->getUser());
  171.         $transaction->setType(Transaction::TYPE_UPDATE);
  172.         $transaction->setStatus($this->getApiCallStatus($event->getApiResult()));
  173.         $transaction->setSubscriptionEndDate($this->getNewEndDate($event->getUser()));
  174.         $this->entityManager->persist($transaction);
  175.         $this->entityManager->flush();
  176.     }
  177.     /**
  178.      * @param CoachingAutologinGeneratedEvent $event
  179.      */
  180.     public function autologinGenerated(CoachingAutologinGeneratedEvent $event)
  181.     {
  182.         $transaction = new Transaction();
  183.         $transaction->setUser($event->getUser());
  184.         $transaction->setType(Transaction::TYPE_AUTOLOGIN);
  185.         if ($event->getApiResult()) {
  186.             $transaction->setStatus("SUCCESS");
  187.         } else {
  188.             $transaction->setStatus("ERROR");
  189.         }
  190.         $transaction->setSubscriptionEndDate($this->getNewEndDate($event->getUser()));
  191.         $this->entityManager->persist($transaction);
  192.         $this->entityManager->flush();
  193.     }
  194.     /**
  195.      * @param array $result
  196.      * @return mixed|string
  197.      */
  198.     private function getApiCallStatus(array $result)
  199.     {
  200.         static $status_list = [
  201.             'success' => Transaction::STATUS_OK,
  202.             'failed' => Transaction::STATUS_FAILED,
  203.             'error' => Transaction::STATUS_ERROR,
  204.         ];
  205.         return $status $status_list[$result['status']] ?? Transaction::STATUS_PENDING;
  206.     }
  207.     /**
  208.      * @param CoachingUser $user
  209.      * @return Transaction|null
  210.      */
  211.     private function getLastTransaction(CoachingUser $user)
  212.     {
  213.         return $lastTransaction $this->transactionRepository->getLastTransactionForUser($user);
  214.     }
  215.     /**
  216.      * Assign the correct end date for his current coaching.
  217.      *
  218.      * @param CoachingUser $user
  219.      * @return \DateTime
  220.      */
  221.     private function getNewEndDate(CoachingUser $user\DateTimeInterface $fallBackIfNoTransaction null)
  222.     {
  223.         $lastTransaction $this->getLastTransaction($user);
  224.         if ($lastTransaction instanceof Transaction) {
  225.             return $lastTransaction->getSubscriptionEndDate();
  226.         }
  227.         if ($fallBackIfNoTransaction instanceof \DateTime) {
  228.             return $fallBackIfNoTransaction;
  229.         }
  230.         if ($fallBackIfNoTransaction instanceof \DateTimeImmutable) {
  231.             // The entity accept only datetime, and a datetimeImmutable can be passed, change object type.
  232.             return new \DateTime("@" $fallBackIfNoTransaction->format("U"));
  233.         }
  234.         return new \DateTime();
  235.     }
  236.     /**
  237.      * @param CoachingUser $user
  238.      * @return CoachingUser|void
  239.      */
  240.     protected function createCoachingUserPassword(CoachingUser $user)
  241.     {
  242.         if (!empty($user->getPassword())) {
  243.             return;
  244.         }
  245.         if (empty($user->getPlainPassword())) {
  246.             $user->setPlainPassword($this->encryption->decrypt($user->getUser()->getEncryptedPassword()));
  247.         }
  248.         $user->setPassword($this->encoder->hashPassword($user$user->getPlainPassword()));
  249.         return $user;
  250.     }
  251. }