custom/plugins/SwagSocialShopping/src/EventListener/ReferralCodeHandler.php line 62

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. /*
  3.  * (c) shopware AG <info@shopware.com>
  4.  *
  5.  * For the full copyright and license information, please view the LICENSE
  6.  * file that was distributed with this source code.
  7.  */
  8. namespace SwagSocialShopping\EventListener;
  9. use Shopware\Core\Checkout\Customer\CustomerDefinition;
  10. use Shopware\Core\Checkout\Order\OrderDefinition;
  11. use Shopware\Core\Framework\Context;
  12. use Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry;
  13. use Shopware\Core\Framework\DataAbstractionLayer\EntityWriteResult;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  16. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  17. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  18. use Shopware\Core\Framework\Routing\KernelListenerPriorities;
  19. use Shopware\Core\Framework\Uuid\Uuid;
  20. use Shopware\Core\PlatformRequest;
  21. use Shopware\Storefront\Framework\Routing\StorefrontRouteScope;
  22. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\RequestStack;
  25. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  26. use Symfony\Component\HttpKernel\KernelEvents;
  27. class ReferralCodeHandler implements EventSubscriberInterface
  28. {
  29.     private const REFERRAL_CODE_KEY 'referralCode';
  30.     private const ENTITIES = [
  31.         CustomerDefinition::ENTITY_NAME,
  32.         OrderDefinition::ENTITY_NAME,
  33.     ];
  34.     private DefinitionInstanceRegistry $registry;
  35.     private RequestStack $requestStack;
  36.     public function __construct(
  37.         DefinitionInstanceRegistry $registry,
  38.         RequestStack $requestStack
  39.     ) {
  40.         $this->registry $registry;
  41.         $this->requestStack $requestStack;
  42.     }
  43.     public static function getSubscribedEvents(): array
  44.     {
  45.         return [
  46.             KernelEvents::CONTROLLER => [[
  47.                 'storeReferralCode',
  48.                 KernelListenerPriorities::KERNEL_CONTROLLER_EVENT_SCOPE_VALIDATE_POST,
  49.             ]],
  50.             EntityWrittenContainerEvent::class => 'createReferralCodes',
  51.         ];
  52.     }
  53.     public function storeReferralCode(ControllerEvent $event): void
  54.     {
  55.         $request $event->getRequest();
  56.         if (!$this->isStorefrontScope($request)) {
  57.             return;
  58.         }
  59.         $referralCode $request->get(self::REFERRAL_CODE_KEY);
  60.         if (!$referralCode) {
  61.             return;
  62.         }
  63.         $session $request->getSession();
  64.         $session->set(self::REFERRAL_CODE_KEY$referralCode);
  65.     }
  66.     public function createReferralCodes(EntityWrittenContainerEvent $containerEvent): void
  67.     {
  68.         $request $this->requestStack->getMainRequest();
  69.         if (!$request || !$this->isStorefrontScope($request)) {
  70.             return;
  71.         }
  72.         $referralCode $this->requestStack->getSession()
  73.             ->get(self::REFERRAL_CODE_KEY);
  74.         $context $containerEvent->getContext();
  75.         if (!$referralCode || !$this->isValidReferralCode($referralCode$context)) {
  76.             return;
  77.         }
  78.         foreach (self::ENTITIES as $name) {
  79.             $event $containerEvent->getEventByEntityName($name);
  80.             if (!$event) {
  81.                 continue;
  82.             }
  83.             $data $this->getWrittenData($referralCode$event);
  84.             if (empty($data)) {
  85.                 return;
  86.             }
  87.             $repository $this->registry->getRepository('swag_social_shopping_' $name);
  88.             $repository->upsert($data$context);
  89.         }
  90.     }
  91.     private function isValidReferralCode(string $referralCodeContext $context): bool
  92.     {
  93.         if (!Uuid::isValid($referralCode)) {
  94.             return false;
  95.         }
  96.         $repository $this->registry->getRepository('sales_channel');
  97.         return (bool) $repository->search(new Criteria([$referralCode]), $context)->first();
  98.     }
  99.     private function isStorefrontScope(Request $request): bool
  100.     {
  101.         $scope $request->attributes
  102.             ->get(PlatformRequest::ATTRIBUTE_ROUTE_SCOPE, []);
  103.         if ($scope instanceof RouteScope) {
  104.             $scope $scope->getScopes();
  105.         }
  106.         return \in_array(StorefrontRouteScope::ID$scopetrue);
  107.     }
  108.     private function getWrittenData(string $referralCodeEntityWrittenEvent $event): array
  109.     {
  110.         $data = [];
  111.         foreach ($event->getWriteResults() as $entityWriteResult) {
  112.             if ($entityWriteResult->getOperation() !== EntityWriteResult::OPERATION_INSERT) {
  113.                 continue;
  114.             }
  115.             $payload $entityWriteResult->getPayload();
  116.             if (empty($payload)) {
  117.                 continue;
  118.             }
  119.             $data[] = [
  120.                 $event->getEntityName() . 'Id' => $payload['id'],
  121.                 $event->getEntityName() . 'VersionId' => $payload['versionId'] ?? null,
  122.                 'referralCode' => $referralCode,
  123.             ];
  124.         }
  125.         return $data;
  126.     }
  127. }