<?php
declare(strict_types=1);
namespace WnsSecurityComplianceSuite\Logging\Subscriber;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Event\PluginLifecycleEvent;
use Shopware\Core\Framework\Plugin\Event\PluginPostActivateEvent;
use Shopware\Core\Framework\Plugin\Event\PluginPostDeactivateEvent;
use Shopware\Core\Framework\Plugin\Event\PluginPostInstallEvent;
use Shopware\Core\Framework\Plugin\Event\PluginPostUninstallEvent;
use Shopware\Core\Framework\Plugin\Event\PluginPostUpdateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use WnsSecurityComplianceSuite\Logging\DTO\Log;
use WnsSecurityComplianceSuite\Logging\Enum\EventTypes;
use WnsSecurityComplianceSuite\Logging\Provider\SourceInfoProvider;
use WnsSecurityComplianceSuite\Logging\Service\ActionLogger;
final class PluginActionSubscriber implements EventSubscriberInterface
{
private ActionLogger $actionLogger;
private SourceInfoProvider $sourceInfoProvider;
public function __construct(
ActionLogger $actionLogger,
SourceInfoProvider $sourceInfoProvider
) {
$this->actionLogger = $actionLogger;
$this->sourceInfoProvider = $sourceInfoProvider;
}
public static function getSubscribedEvents()
{
return [
PluginPostInstallEvent::class => 'onPluginAction',
PluginPostActivateEvent::class => 'onPluginAction',
PluginPostDeactivateEvent::class => 'onPluginAction',
PluginPostUninstallEvent::class => 'onPluginAction',
PluginPostUpdateEvent::class => 'onPluginAction',
];
}
/**
* @param PluginPostInstallEvent|PluginPostActivateEvent|PluginPostDeactivateEvent|PluginPostUninstallEvent|PluginPostUpdateEvent $event
*/
public function onPluginAction(PluginLifecycleEvent $event): void
{
/** @var InstallContext $context */
$context = $event->getContext();
$plugin = $context->getPlugin();
$detail = [
'plugin' => $plugin->getName(),
'version' => $context->getCurrentPluginVersion(),
];
$log = new Log(
$this->getEventType(\get_class($event)),
$this->sourceInfoProvider->getSourceDTO($event->getContext()->getContext()->getSource()),
$detail,
new \DateTimeImmutable(),
);
$this->actionLogger->log($log, null);
}
private function getEventType(string $event): string
{
switch ($event) {
case PluginPostInstallEvent::class:
return EventTypes::PLUGIN_INSTALL;
case PluginPostActivateEvent::class:
return EventTypes::PLUGIN_ACTIVATE;
case PluginPostDeactivateEvent::class:
return EventTypes::PLUGIN_DEACTIVATE;
case PluginPostUninstallEvent::class:
return EventTypes::PLUGIN_UNINSTALL;
case PluginPostUpdateEvent::class:
return EventTypes::PLUGIN_UPDATE;
default:
return $event;
}
}
}