<?php
namespace App\EventSubscriber;
use App\Service\Wishlist\CustomerWishlistManager;
use App\Service\Wishlist\SessionWishlistManager;
use Carbon\Carbon;
use Exception;
use Pimcore\Model\DataObject\CoreShopCustomer;
use Pimcore\Model\DataObject\CoreShopUser;
use Pimcore\Model\DataObject\CustomerActivityLog;
use Pimcore\Model\DataObject\Service;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
class UserLoginSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly array $config,
private readonly LoggerInterface $logger,
private readonly bool $wishlistLog = false,
)
{
}
public static function getSubscribedEvents(): array
{
return [LoginSuccessEvent::class => 'onLoginSuccess'];
}
public function onLoginSuccess(LoginSuccessEvent $event): void
{
$user = $event->getUser();
if (!$user instanceof CoreShopUser) {
return;
}
$firewall = $event->getFirewallName();
if ($firewall === 'coreshop_frontend') {
$this->saveLog($user, 'web');
$customer = $user->getCustomer();
$sessionWishlist = new SessionWishlistManager($event->getRequest()->getSession(), $this->logger, $this->wishlistLog);
if ($sessionWishlist->count() && $customer instanceof CoreShopCustomer) {
$customerWishlist = new CustomerWishlistManager($customer, $this->logger, $this->wishlistLog);
foreach ($sessionWishlist->getList() as $product) {
$customerWishlist->addItem($product);
}
$sessionWishlist->truncateStorage();
}
} elseif ($firewall === 'coreshop_jwt' && $event->getRequest()?->getPathInfo() === '/api/users/deviceinfo') {
$this->saveLog($user, 'app');
}
}
private function saveLog(CoreShopUser $user, string $platform): void
{
$customer = $user->getCustomer();
if (!$customer instanceof CoreShopCustomer) {
return;
}
$loginDate = new Carbon();
$log = new CustomerActivityLog();
$log->setLoginDate($loginDate);
$log->setPlatform($platform);
$log->setUser($user);
$log->setPublished(true);
$log->setKey(implode('_', [$user->getLoginIdentifier(), $loginDate->format('H-i'), $platform]));
$customer->setLastLoginDate($loginDate);
$customer->setLastLoginPlatform($platform);
try {
$parent = Service::createFolderByPath(implode('/', [
$this->config['logPath'],
$loginDate->year,
$loginDate->format('m'),
$loginDate->format('d'),
]));
$log->setParentId($parent?->getId() ?? 1);
$log->save();
$customer->save();
} catch (Exception $e) {
}
}
}