diff --git a/vendor/magento/module-customer-segment/Observer/ProcessEventGenericObserver.php b/vendor/magento/module-customer-segment/Observer/ProcessEventGenericObserver.php new file mode 100644 index 00000000000..34569c7b1e5 --- /dev/null +++ b/vendor/magento/module-customer-segment/Observer/ProcessEventGenericObserver.php @@ -0,0 +1,140 @@ +storeManager = $storeManager; + $this->customerSegmentCustomer = $customerSegmentCustomer; + $this->customerRegistry = $customerRegistry; + $this->userContext = $userContext; + $this->customerFactory = $customerFactory; + $this->eventDataObjectNames = $eventDataObjectNames; + } + + /** + * Match customer segments on supplied event for currently logged in customer or visitor and current website. + * + * @param Observer $observer + * @return void + */ + public function execute(Observer $observer) + { + $customer = null; + $customerId = null; + $eventName = $observer->getEvent()->getName(); + $dataObjectName = $this->eventDataObjectNames[$eventName] ?? self::DEFAULT_EVENT_DATA_OBJECT_NAME; + $dataObject = $observer->getData($dataObjectName); + if ($dataObject !== null) { + if ($dataObject instanceof Customer) { + $customer = $dataObject; + } elseif ($dataObject instanceof CustomerInterface) { + $customerId = (int) $dataObject->getId(); + } elseif ($dataObject instanceof AbstractModel) { + $customerId = (int) $dataObject->getCustomerId(); + } + } + if ($customerId) { + $customer = $this->customerRegistry->retrieve($customerId); + } + if ($customer === null) { + $customer = $this->getAuthenticatedCustomer(); + } + + $this->customerSegmentCustomer->processEvent( + $eventName, + $customer, + $this->storeManager->getStore()->getWebsite() + ); + } + + /** + * Get current authenticated customer model + * + * @return Customer + * @throws NoSuchEntityException + */ + private function getAuthenticatedCustomer(): Customer + { + if ($this->userContext->getUserId() + && $this->userContext->getUserType() === UserContextInterface::USER_TYPE_CUSTOMER + ) { + $customer = $this->customerRegistry->retrieve($this->userContext->getUserId()); + } else { + $customer = $this->customerFactory->create(); + } + return $customer; + } +} diff --git a/vendor/magento/module-customer-segment/etc/di.xml b/vendor/magento/module-customer-segment/etc/di.xml index ed271602e8b..c4af19facfb 100644 --- a/vendor/magento/module-customer-segment/etc/di.xml +++ b/vendor/magento/module-customer-segment/etc/di.xml @@ -24,4 +24,11 @@ + + + + customer + + + diff --git a/vendor/magento/module-customer-segment/etc/graphql/events.xml b/vendor/magento/module-customer-segment/etc/graphql/events.xml new file mode 100644 index 00000000000..28909ebf206 --- /dev/null +++ b/vendor/magento/module-customer-segment/etc/graphql/events.xml @@ -0,0 +1,15 @@ + + + + + + + + + +