<?php
namespace App\Subscriber\Sharing;
use App\Entity\Content\AbstractObject;
use App\Enum\ChannelEnum;
use App\Service\Sharing\SharingHandlerInterface;
use Cms\CoreBundle\Util\Doctrine\EntityManager;
use Platform\QueueBundle\Event\AsyncEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class SharingSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManager
*/
private EntityManager $em;
/**
* @var SharingHandlerInterface
*/
private SharingHandlerInterface $sharingHandler;
/**
* @param EntityManager $em
* @param SharingHandlerInterface $sharingHandler
*/
public function __construct(EntityManager $em, SharingHandlerInterface $sharingHandler)
{
$this->em = $em;
$this->sharingHandler = $sharingHandler;
}
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents(): array
{
return [
SharingHandlerInterface::EVENTS__SHARE_CHANNEL => ['onShareChannel', 0],
];
}
/**
* @param AsyncEvent $event
*/
public function onShareChannel(AsyncEvent $event): void
{
$object = $this->em->getRepository(AbstractObject::class)->find(
$event->getBody()->get('object'),
);
if ( ! $object instanceof AbstractObject) {
throw new \RuntimeException();
}
$event->getOutput()->writeln(
sprintf(
'Sharing to channel %s...',
array_search(
$channel = $event->getBody()->get('channel'),
ChannelEnum::SOCIAL_CHANNELS,
true,
),
)
);
$this->sharingHandler->handleChannel(
$object,
$channel,
);
$event->getOutput()->writeln('Shared to channel.');
}
}