<?php
namespace CioEweLandingCreator\Subscriber;
use CioEweLandingCreator\Core\Content\CioWebsite\CioWebsiteEntity;
use CioEweLandingCreator\Core\Content\CioWebsiteKundenstimmen\CioWebsiteKundenstimmenEntity;
use CioEweLandingCreator\Core\Content\CioWebsiteMitarbeiter\CioWebsiteMitarbeiterEntity;
use CioEweLandingCreator\Core\Content\CioWebsiteNews\CioWebsiteNewsEntity;
use CioEweLandingCreator\Core\Content\CioWebsiteService\CioWebsiteServiceEntity;
use CioEweLandingCreator\Core\Content\CioWebsiteSocialMedia\CioWebsiteSocialMediaEntity;
use GuzzleHttp\Client;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class WebsiteWrittenSubscriber implements EventSubscriberInterface
{
private ContainerInterface $container;
private SystemConfigService $systemConfigService;
public function __construct(ContainerInterface $container, SystemConfigService $systemConfigService)
{
$this->container = $container;
$this->systemConfigService = $systemConfigService;
}
public static function getSubscribedEvents()
{
return [
'cio_masterdata.written' => 'onMasterdataUpdated',
'cio_website.written' => 'onWebsiteUpdated',
'cio_website_news.written' => 'onWebsiteNewsUpdated',
'cio_website_service.written' => 'onWebsiteServiceUpdated',
'cio_website_social_media.written' => 'onWebsiteSocialUpdated',
'cio_website_mitarbeiter.written' => 'onWebsiteMitarbeiterUpdated',
'cio_website_kundenstimmen.written' => 'onWebsiteKundenstimmenUpdated'
];
}
public function onMasterdataUpdated(EntityWrittenEvent $event)
{
foreach ($event->getWriteResults() as $result) {
if ($result->getEntityName() === 'cio_masterdata' && $result->getOperation() === 'update') {
/** @var EntityRepository $websiteRepository */
$websiteRepository = $this->container->get('cio_website.repository');
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('masterdataId', $result->getPrimaryKey()));
$websiteResults = $websiteRepository->search($criteria, $event->getContext())->getElements();
foreach ($websiteResults as $website) {
if ($website instanceof CioWebsiteEntity) {
$this->clearWebsiteCache($website->getId());
}
}
}
}
}
public function onWebsiteUpdated(EntityWrittenEvent $event)
{
$result = $event->getWriteResults();
foreach ($event->getWriteResults() as $result) {
if ($result->getEntityName() === 'cio_website' && $result->getOperation() === 'update') {
$this->clearWebsiteCache($result->getPrimaryKey());
}
}
}
public function onWebsiteNewsUpdated(EntityWrittenEvent $event)
{
$result = $event->getWriteResults();
foreach ($event->getWriteResults() as $result) {
if ($result->getEntityName() === 'cio_website_news') {
/** @var EntityRepositoryInterface $repository */
$repository = $this->container->get('cio_website_news.repository');
/** @var ?CioWebsiteNewsEntity $news */
$news = $repository->search((new Criteria())->addFilter(new EqualsFilter('id', $result->getPrimaryKey())), $event->getContext())->first();
if ($news instanceof CioWebsiteNewsEntity && $news->getWebsiteId()) {
$this->clearWebsiteCache($news->getWebsiteId());
}
}
}
}
public function onWebsiteServiceUpdated(EntityWrittenEvent $event)
{
$result = $event->getWriteResults();
foreach ($event->getWriteResults() as $result) {
if ($result->getEntityName() === 'cio_website_service') {
/** @var EntityRepositoryInterface $repository */
$repository = $this->container->get('cio_website_service.repository');
/** @var ?CioWebsiteServiceEntity $service */
$service = $repository->search((new Criteria())->addFilter(new EqualsFilter('id', $result->getPrimaryKey())), $event->getContext())->first();
if ($service instanceof CioWebsiteServiceEntity && $service->getWebsiteId()) {
$this->clearWebsiteCache($service->getWebsiteId());
}
}
}
}
public function onWebsiteSocialUpdated(EntityWrittenEvent $event)
{
$result = $event->getWriteResults();
foreach ($event->getWriteResults() as $result) {
if ($result->getEntityName() === 'cio_website_social_media') {
/** @var EntityRepositoryInterface $repository */
$repository = $this->container->get('cio_website_social_media.repository');
/** @var ?CioWebsiteSocialMediaEntity $social */
$social = $repository->search((new Criteria())->addFilter(new EqualsFilter('id', $result->getPrimaryKey())), $event->getContext())->first();
if ($social instanceof CioWebsiteSocialMediaEntity && $social->getWebsiteId()) {
$this->clearWebsiteCache($social->getWebsiteId());
}
}
}
}
public function onWebsiteMitarbeiterUpdated(EntityWrittenEvent $event)
{
$result = $event->getWriteResults();
foreach ($event->getWriteResults() as $result) {
if ($result->getEntityName() === 'cio_website_mitarbeiter') {
/** @var EntityRepositoryInterface $repository */
$repository = $this->container->get('cio_website_mitarbeiter.repository');
/** @var ?CioWebsiteMitarbeiterEntity $mitarbeiter */
$mitarbeiter = $repository->search((new Criteria())->addFilter(new EqualsFilter('id', $result->getPrimaryKey())), $event->getContext())->first();
if ($mitarbeiter instanceof CioWebsiteMitarbeiterEntity && $mitarbeiter->getWebsiteId()) {
$this->clearWebsiteCache($mitarbeiter->getWebsiteId());
}
}
}
}
public function onWebsiteKundenstimmenUpdated(EntityWrittenEvent $event)
{
$result = $event->getWriteResults();
foreach ($event->getWriteResults() as $result) {
if ($result->getEntityName() === 'cio_website_kundenstimmen') {
/** @var EntityRepositoryInterface $repository */
$repository = $this->container->get('cio_website_kundenstimmen.repository');
/** @var ?CioWebsiteKundenstimmenEntity $kundenstimme */
$kundenstimme = $repository->search((new Criteria())->addFilter(new EqualsFilter('id', $result->getPrimaryKey())), $event->getContext())->first();
if ($kundenstimme instanceof CioWebsiteKundenstimmenEntity && $kundenstimme->getWebsiteId()) {
$this->clearWebsiteCache($kundenstimme->getWebsiteId());
}
}
}
}
protected function clearWebsiteCache(string $websiteId)
{
$baseUrl = $this->getConfig('cacheRefreshUrlLandingpages');
if (!empty($baseUrl)) {
$client = new Client();
$options = [];
// ignore ssl cert problems only in dev env
if ($_ENV['APP_ENV'] === 'dev') {
$options['verify'] = false;
}
try {
$client->request('GET', str_replace('{websiteId}', $websiteId, $baseUrl), $options);
} catch (\Throwable $e) {}
}
}
protected function getConfig($key)
{
return $this->systemConfigService->get('CioEweLandingCreator.config.' . $key);
}
}