<?php
namespace App\EventSubscriber\Scorm;
use App\Entity\Scholar\Lesson\Lesson;
use App\Entity\Scholar\Module\Module;
use App\Entity\Scholar\Training\Training;
use App\Enum\Scorm\ScormVersion;
use App\Service\Scorm\Exception\ScormApiException;
use App\Service\Scorm\Exception\ScormGeneratorException;
use App\Service\Scorm\ScormService;
use App\Service\Scorm\ScormTerminateTracker;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Contracts\EventDispatcher\Event;
class ScormSubscriber implements EventSubscriberInterface
{
public function __construct(
private ScormService $scormService,
private ScormTerminateTracker $scormTerminateTracker,
private LoggerInterface $logger,
)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::TERMINATE => 'terminate',
];
}
public function terminate(Event $event): void
{
$queued = $this->scormTerminateTracker->extractQueue();
if (empty($queued) || !$this->scormService->isEnabledAutoProcess()) {
return;
}
foreach ($queued as $queuedObject) {
try {
if ($queuedObject instanceof Lesson) {
$this->scormService->ensureScorm($queuedObject, ScormVersion::V12);
$this->scormService->ensureScorm($queuedObject, ScormVersion::V2004);
} else if ($queuedObject instanceof Module) {
$this->scormService->ensureModuleProduct($queuedObject, ScormVersion::V12);
$this->scormService->ensureModuleProduct($queuedObject, ScormVersion::V2004);
} else if ($queuedObject instanceof Training) {
$this->scormService->ensureTrainingProduct($queuedObject, ScormVersion::V12);
$this->scormService->ensureTrainingProduct($queuedObject, ScormVersion::V2004);
}
} catch (ScormGeneratorException|ScormApiException|\Exception $exception) {
$this->logger->error($exception);
}
}
}
}