src/EventSubscriber/UserLoginSubscriber.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Service\Wishlist\CustomerWishlistManager;
  4. use App\Service\Wishlist\SessionWishlistManager;
  5. use Carbon\Carbon;
  6. use Exception;
  7. use Pimcore\Model\DataObject\CoreShopCustomer;
  8. use Pimcore\Model\DataObject\CoreShopUser;
  9. use Pimcore\Model\DataObject\CustomerActivityLog;
  10. use Pimcore\Model\DataObject\Service;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  14. class UserLoginSubscriber implements EventSubscriberInterface
  15. {
  16.     public function __construct(
  17.         private readonly array           $config,
  18.         private readonly LoggerInterface $logger,
  19.         private readonly bool            $wishlistLog false,
  20.     )
  21.     {
  22.     }
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [LoginSuccessEvent::class => 'onLoginSuccess'];
  26.     }
  27.     public function onLoginSuccess(LoginSuccessEvent $event): void
  28.     {
  29.         $user $event->getUser();
  30.         if (!$user instanceof CoreShopUser) {
  31.             return;
  32.         }
  33.         $firewall $event->getFirewallName();
  34.         if ($firewall === 'coreshop_frontend') {
  35.             $this->saveLog($user'web');
  36.             $customer $user->getCustomer();
  37.             $sessionWishlist = new SessionWishlistManager($event->getRequest()->getSession(), $this->logger$this->wishlistLog);
  38.             if ($sessionWishlist->count() && $customer instanceof CoreShopCustomer) {
  39.                 $customerWishlist = new CustomerWishlistManager($customer$this->logger$this->wishlistLog);
  40.                 foreach ($sessionWishlist->getList() as $product) {
  41.                     $customerWishlist->addItem($product);
  42.                 }
  43.                 $sessionWishlist->truncateStorage();
  44.             }
  45.         } elseif ($firewall === 'coreshop_jwt' && $event->getRequest()?->getPathInfo() === '/api/users/deviceinfo') {
  46.             $this->saveLog($user'app');
  47.         }
  48.     }
  49.     private function saveLog(CoreShopUser $userstring $platform): void
  50.     {
  51.         $customer $user->getCustomer();
  52.         if (!$customer instanceof CoreShopCustomer) {
  53.             return;
  54.         }
  55.         $loginDate = new Carbon();
  56.         $log = new CustomerActivityLog();
  57.         $log->setLoginDate($loginDate);
  58.         $log->setPlatform($platform);
  59.         $log->setUser($user);
  60.         $log->setPublished(true);
  61.         $log->setKey(implode('_', [$user->getLoginIdentifier(), $loginDate->format('H-i'), $platform]));
  62.         $customer->setLastLoginDate($loginDate);
  63.         $customer->setLastLoginPlatform($platform);
  64.         try {
  65.             $parent Service::createFolderByPath(implode('/', [
  66.                 $this->config['logPath'],
  67.                 $loginDate->year,
  68.                 $loginDate->format('m'),
  69.                 $loginDate->format('d'),
  70.             ]));
  71.             $log->setParentId($parent?->getId() ?? 1);
  72.             $log->save();
  73.             $customer->save();
  74.         } catch (Exception $e) {
  75.         }
  76.     }
  77. }