<?php declare(strict_types=1);
namespace DonCarneTheme\Core\Content\Flow\Dispatching\Action;
use Psr\Log\LoggerInterface;
use DonCarneTheme\Service\GraphQLClient;
use Shopware\Core\Content\Flow\Dispatching\Action\FlowAction;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\Event\FlowEvent;
use Shopware\Core\Framework\Event\SalesChannelAware;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\HttpFoundation\RequestStack;
class NewNewsletterSubscriptionAction extends FlowAction
{
private EntityRepository $newsletterRecipientRepository;
private SystemConfigService $systemConfigService;
private GraphQLClient $graphQLClient;
private LoggerInterface $logger;
private RequestStack $requestStack;
public function __construct(
EntityRepository $newsletterRecipientRepository,
SystemConfigService $systemConfigService,
GraphQLClient $graphQLClient,
LoggerInterface $logger,
RequestStack $requestStack
)
{
$this->systemConfigService = $systemConfigService;
$this->newsletterRecipientRepository = $newsletterRecipientRepository;
$this->graphQLClient = $graphQLClient;
$this->logger = $logger;
$this->requestStack = $requestStack;
}
public static function getName(): string
{
return 'action.send.newsletter.subscription';
}
public static function getSubscribedEvents(): array
{
return [
self::getName() => 'handle',
];
}
public function requirements(): array
{
return [SalesChannelAware::class];
}
public function handle(FlowEvent $event): void
{
$request = $this->requestStack->getMainRequest();
$baseEvent = $event->getEvent();
if (!$baseEvent instanceof SalesChannelAware) {
$this->logger->error("Event is not of type SalesChannelAware");
return;
}
$context = $baseEvent->getContext();
$email = $baseEvent->getNewsletterRecipient()->getEmail();
try {
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('email', $email));
$criteria->addFilter(new EqualsFilter('salesChannelId', $baseEvent->getSalesChannelId()));
$criteria->addSorting(new FieldSorting('createdAt', FieldSorting::DESCENDING));
$criteria->addAssociation('salutation');
$recipient = $this->newsletterRecipientRepository->search($criteria, $context)->first();
if ($recipient) {
$salutationKey = $recipient->getSalutation()->getSalutationKey();
switch ($salutationKey) {
case 'mr':
$salutation = 'MR';
break;
case 'mrs':
$salutation = 'MRS';
break;
default:
$salutation = '';
break;
}
$firstName = $recipient->getFirstName() ?? '';
$lastName = $recipient->getLastName() ?? '';
$hashedEmail = hash('sha1', $email);
$urlTemplate = $this->systemConfigService->get(
'core.newsletter.subscribeUrl',
$baseEvent->getSalesChannelId()
);
$url = str_replace(
[
'%%HASHEDEMAIL%%',
'%%SUBSCRIBEHASH%%',
],
[
$hashedEmail,
$recipient->getHash(),
],
$urlTemplate
);
// 426: this part if code needs to be finished -- waiting CP answer
// $absoluteUrl = $request->attributes->get('sw-storefront-url') . $relativeUrl;
$response = $this->graphQLClient->sendNewsletterData($salutation, $firstName, $lastName, $email, $url)->getResults()->data->sfRequestNewsletter;
// if ($response->success) {
if (true) {
$this->logger->info("Newsletter data correctly sent -- recipient id: ". $recipient->getId());
try {
// $this->newsletterRecipientRepository->upsert([
// [
// 'id' => $recipient->getId(),
// 'customFields' => [
// 'doncarne_newsletter_id' => $recipient->getHash()
// ],
// ]
// ], $context);
$this->logger->info("Newsletter custom fields correctly inserted -- recipient id: ". $recipient->getId());
} catch (\Exception $e) {
$this->logger->error(
"Error inserting custom fields:\n"
. $e->getMessage() . "\n"
. 'Error Code:' . $e->getCode() . "\n"
);
}
} else {
$this->logger->error("GraphQLClient->sendNewsletterData() not successful.");
}
} else {
$this->logger->error("Missing newsletter recipient. Email: $email");
}
} catch (\Exception $e) {
$this->logger->error(
"Error sending newsletter data:\n"
. $e->getMessage() . "\n"
. 'Error Code:' . $e->getCode() . "\n"
);
}
}
}