<?php
declare(strict_types=1);
namespace App\CoreBundle\EventSubscriber;
use App\CoreBundle\Command\WooDeleteCouponCommand;
use App\CoreBundle\Command\WooSyncCouponCommand;
use App\CoreBundle\Component\WooCommerce\WooCommerce;
use App\CoreBundle\Model\Coupon\Coupon;
use App\CoreBundle\Model\Coupon\CouponDataFactoryInterface;
use App\CoreBundle\Model\Coupon\CouponEvent;
use App\CoreBundle\Model\Coupon\CouponFacade;
use App\CoreBundle\Model\Coupon\Variant\CouponVariantFacade;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Process\Process;
class CouponEventSubscriber implements EventSubscriberInterface
{
/**
* @var \App\CoreBundle\Component\WooCommerce\WooCommerce
*/
private $wooCommerce;
/**
* @var \App\CoreBundle\Command\WooSyncCouponCommand
*/
private $wooSyncCouponCommand;
/**
* @var \App\CoreBundle\Command\WooDeleteCouponCommand
*/
private $wooDeleteCouponCommand;
/**
* @var \App\CoreBundle\Model\Coupon\CouponDataFactoryInterface
*/
private $couponDataFactory;
/**
* @param \App\CoreBundle\Component\WooCommerce\WooCommerce $wooCommerce
* @param \App\CoreBundle\Command\WooSyncCouponCommand $wooSyncCouponCommand
* @param \App\CoreBundle\Command\WooDeleteCouponCommand $wooDeleteCouponCommand
* @param \App\CoreBundle\Model\Coupon\CouponFacade $couponFacade
* @param \App\CoreBundle\Model\Coupon\CouponDataFactoryInterface $couponDataFactory
*/
public function __construct(
WooCommerce $wooCommerce,
WooSyncCouponCommand $wooSyncCouponCommand,
WooDeleteCouponCommand $wooDeleteCouponCommand,
CouponFacade $couponFacade,
CouponDataFactoryInterface $couponDataFactory
)
{
$this->wooCommerce = $wooCommerce;
$this->wooSyncCouponCommand = $wooSyncCouponCommand;
$this->wooDeleteCouponCommand = $wooDeleteCouponCommand;
$this->couponFacade = $couponFacade;
$this->couponDataFactory = $couponDataFactory;
}
/**
* @param \App\CoreBundle\Model\Coupon\CouponEvent $couponVariant
*/
public function syncAllCoupons(CouponEvent $couponVariant): void
{
$command = $this->wooSyncCouponCommand->getShellCommand();
$process = \Symfony\Component\Process\Process::fromShellCommandline($command);
$process->start();
}
/**
* @param \App\CoreBundle\Model\Coupon\CouponEvent $couponVariant
*/
public function deleteCoupon(CouponEvent $couponVariant): void
{
$coupon = $couponVariant->getCoupon();
if ($coupon instanceof Coupon) {
$command = $this->wooDeleteCouponCommand->getShellCommand($coupon->getId());
$process = \Symfony\Component\Process\Process::fromShellCommandline($command);
$process->start();
$this->waitProcess($process);
}
}
public function waitProcess(Process $process)
{
while ($process) {
if ($process->isRunning() === true) {
break;
}
$process = null;
}
sleep(1);
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
CouponEvent::CREATE => 'syncAllCoupons',
CouponEvent::UPDATE => 'syncAllCoupons',
CouponEvent::DELETE => 'deleteCoupon',
];
}
}