<?php
namespace Customize\EventSubscriber;
use Eccube\Service\CartService;
use Eccube\Repository\ProductClassRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class LpStarterCleanupSubscriber implements EventSubscriberInterface
{
// default TTL (2 hours)
private const DEFAULT_TTL = 7200;
public function __construct(
private CartService $cartService,
private ProductClassRepository $productClassRepository
) {}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 0],
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) return;
$request = $event->getRequest();
$session = $request->getSession();
if (!$session) return;
// Allow setting ttl via query ONCE, and persist it
if ($request->query->has('lp_cleanup_ttl')) {
$ttl = max(0, (int) $request->query->get('lp_cleanup_ttl'));
$session->set('lp_cleanup_ttl', $ttl);
}
// Optional: force cleanup param
if ($request->query->getBoolean('lp_force_cleanup')) {
$this->clearLpCart($session);
return;
}
// Only act for LP flow
if ($session->get('lp_flow') !== '1') return;
$addedAt = (int) $session->get('lp_starter_added_at', 0);
if ($addedAt <= 0) return;
$ttl = (int) $session->get('lp_cleanup_ttl', self::DEFAULT_TTL);
if ($ttl <= 0) return;
if (time() - $addedAt < $ttl) return;
$this->clearLpCart($session);
}
private function clearLpCart($session): void
{
if (method_exists($this->cartService, 'clear')) {
$this->cartService->clear();
$this->cartService->save();
}
// remove flags so we don't keep clearing forever
$session->remove('lp_flow');
$session->remove('lp_starter_added_at');
$session->remove('lp_cleanup_ttl');
}
private function clearLpFlags($session): void
{
foreach ([
'lp_starter_seeded',
'lp_starter_seeded_at',
'lp_starter_pc_id',
'lp_starter_seed_reason',
] as $k) {
$session->remove($k);
}
}
}