File: /home/petsclubcc/magento/vendor/magento/module-customer/Model/ResourceModel/CustomerRepository.php
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Customer\Model\ResourceModel;
use Magento\Customer\Api\CustomerMetadataInterface;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\Api\ImageProcessorInterface;
use Magento\Framework\Api\SearchCriteriaInterface;
use Magento\Framework\Api\SortOrder;
/**
* Customer repository.
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInterface
{
/**
* @var \Magento\Customer\Model\CustomerFactory
*/
protected $customerFactory;
/**
* @var \Magento\Customer\Model\Data\CustomerSecureFactory
*/
protected $customerSecureFactory;
/**
* @var \Magento\Customer\Model\CustomerRegistry
*/
protected $customerRegistry;
/**
* @var \Magento\Customer\Model\ResourceModel\AddressRepository
*/
protected $addressRepository;
/**
* @var \Magento\Customer\Model\ResourceModel\Customer
*/
protected $customerResourceModel;
/**
* @var \Magento\Customer\Api\CustomerMetadataInterface
*/
protected $customerMetadata;
/**
* @var \Magento\Customer\Api\Data\CustomerSearchResultsInterfaceFactory
*/
protected $searchResultsFactory;
/**
* @var \Magento\Framework\Event\ManagerInterface
*/
protected $eventManager;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Framework\Api\ExtensibleDataObjectConverter
*/
protected $extensibleDataObjectConverter;
/**
* @var DataObjectHelper
*/
protected $dataObjectHelper;
/**
* @var ImageProcessorInterface
*/
protected $imageProcessor;
/**
* @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface
*/
protected $extensionAttributesJoinProcessor;
/**
* @param \Magento\Customer\Model\CustomerFactory $customerFactory
* @param \Magento\Customer\Model\Data\CustomerSecureFactory $customerSecureFactory
* @param \Magento\Customer\Model\CustomerRegistry $customerRegistry
* @param \Magento\Customer\Model\ResourceModel\AddressRepository $addressRepository
* @param \Magento\Customer\Model\ResourceModel\Customer $customerResourceModel
* @param \Magento\Customer\Api\CustomerMetadataInterface $customerMetadata
* @param \Magento\Customer\Api\Data\CustomerSearchResultsInterfaceFactory $searchResultsFactory
* @param \Magento\Framework\Event\ManagerInterface $eventManager
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter
* @param DataObjectHelper $dataObjectHelper
* @param ImageProcessorInterface $imageProcessor
* @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
\Magento\Customer\Model\CustomerFactory $customerFactory,
\Magento\Customer\Model\Data\CustomerSecureFactory $customerSecureFactory,
\Magento\Customer\Model\CustomerRegistry $customerRegistry,
\Magento\Customer\Model\ResourceModel\AddressRepository $addressRepository,
\Magento\Customer\Model\ResourceModel\Customer $customerResourceModel,
\Magento\Customer\Api\CustomerMetadataInterface $customerMetadata,
\Magento\Customer\Api\Data\CustomerSearchResultsInterfaceFactory $searchResultsFactory,
\Magento\Framework\Event\ManagerInterface $eventManager,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter,
DataObjectHelper $dataObjectHelper,
ImageProcessorInterface $imageProcessor,
\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
) {
$this->customerFactory = $customerFactory;
$this->customerSecureFactory = $customerSecureFactory;
$this->customerRegistry = $customerRegistry;
$this->addressRepository = $addressRepository;
$this->customerResourceModel = $customerResourceModel;
$this->customerMetadata = $customerMetadata;
$this->searchResultsFactory = $searchResultsFactory;
$this->eventManager = $eventManager;
$this->storeManager = $storeManager;
$this->extensibleDataObjectConverter = $extensibleDataObjectConverter;
$this->dataObjectHelper = $dataObjectHelper;
$this->imageProcessor = $imageProcessor;
$this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
}
/**
* {@inheritdoc}
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function save(\Magento\Customer\Api\Data\CustomerInterface $customer, $passwordHash = null)
{
$prevCustomerData = null;
if ($customer->getId()) {
$prevCustomerData = $this->getById($customer->getId());
}
$customer = $this->imageProcessor->save(
$customer,
CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER,
$prevCustomerData
);
$origAddresses = $customer->getAddresses();
$customer->setAddresses([]);
$customerData = $this->extensibleDataObjectConverter->toNestedArray(
$customer,
[],
'\Magento\Customer\Api\Data\CustomerInterface'
);
$customer->setAddresses($origAddresses);
$customerModel = $this->customerFactory->create(['data' => $customerData]);
$storeId = $customerModel->getStoreId();
if ($storeId === null) {
$customerModel->setStoreId($this->storeManager->getStore()->getId());
}
$customerModel->setId($customer->getId());
// Need to use attribute set or future updates can cause data loss
if (!$customerModel->getAttributeSetId()) {
$customerModel->setAttributeSetId(
\Magento\Customer\Api\CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER
);
}
// Populate model with secure data
if ($customer->getId()) {
$customerSecure = $this->customerRegistry->retrieveSecureData($customer->getId());
$customerModel->setRpToken($customerSecure->getRpToken());
$customerModel->setRpTokenCreatedAt($customerSecure->getRpTokenCreatedAt());
$customerModel->setPasswordHash($customerSecure->getPasswordHash());
$customerModel->setFailuresNum($customerSecure->getFailuresNum());
$customerModel->setFirstFailure($customerSecure->getFirstFailure());
$customerModel->setLockExpires($customerSecure->getLockExpires());
} else {
if ($passwordHash) {
$customerModel->setPasswordHash($passwordHash);
}
}
// If customer email was changed, reset RpToken info
if ($prevCustomerData
&& $prevCustomerData->getEmail() !== $customerModel->getEmail()
) {
$customerModel->setRpToken(null);
$customerModel->setRpTokenCreatedAt(null);
}
$customerModel->save();
$this->customerRegistry->push($customerModel);
$customerId = $customerModel->getId();
if ($customer->getAddresses() !== null) {
if ($customer->getId()) {
$existingAddresses = $this->getById($customer->getId())->getAddresses();
$getIdFunc = function ($address) {
return $address->getId();
};
$existingAddressIds = array_map($getIdFunc, $existingAddresses);
} else {
$existingAddressIds = [];
}
$savedAddressIds = [];
foreach ($customer->getAddresses() as $address) {
$address->setCustomerId($customerId)
->setRegion($address->getRegion());
$this->addressRepository->save($address);
if ($address->getId()) {
$savedAddressIds[] = $address->getId();
}
}
$addressIdsToDelete = array_diff($existingAddressIds, $savedAddressIds);
foreach ($addressIdsToDelete as $addressId) {
$this->addressRepository->deleteById($addressId);
}
}
$savedCustomer = $this->get($customer->getEmail(), $customer->getWebsiteId());
$this->eventManager->dispatch(
'customer_save_after_data_object',
['customer_data_object' => $savedCustomer, 'orig_customer_data_object' => $customer]
);
return $savedCustomer;
}
/**
* {@inheritdoc}
*/
public function get($email, $websiteId = null)
{
$customerModel = $this->customerRegistry->retrieveByEmail($email, $websiteId);
return $customerModel->getDataModel();
}
/**
* {@inheritdoc}
*/
public function getById($customerId)
{
$customerModel = $this->customerRegistry->retrieve($customerId);
return $customerModel->getDataModel();
}
/**
* {@inheritdoc}
*/
public function getList(SearchCriteriaInterface $searchCriteria)
{
$searchResults = $this->searchResultsFactory->create();
$searchResults->setSearchCriteria($searchCriteria);
/** @var \Magento\Customer\Model\ResourceModel\Customer\Collection $collection */
$collection = $this->customerFactory->create()->getCollection();
$this->extensionAttributesJoinProcessor->process($collection, 'Magento\Customer\Api\Data\CustomerInterface');
// This is needed to make sure all the attributes are properly loaded
foreach ($this->customerMetadata->getAllAttributesMetadata() as $metadata) {
$collection->addAttributeToSelect($metadata->getAttributeCode());
}
// Needed to enable filtering on name as a whole
$collection->addNameToSelect();
// Needed to enable filtering based on billing address attributes
$collection->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left')
->joinAttribute('company', 'customer_address/company', 'default_billing', null, 'left');
//Add filters from root filter group to the collection
foreach ($searchCriteria->getFilterGroups() as $group) {
$this->addFilterGroupToCollection($group, $collection);
}
$searchResults->setTotalCount($collection->getSize());
$sortOrders = $searchCriteria->getSortOrders();
if ($sortOrders) {
/** @var SortOrder $sortOrder */
foreach ($searchCriteria->getSortOrders() as $sortOrder) {
$collection->addOrder(
$sortOrder->getField(),
($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
);
}
}
$collection->setCurPage($searchCriteria->getCurrentPage());
$collection->setPageSize($searchCriteria->getPageSize());
$customers = [];
/** @var \Magento\Customer\Model\Customer $customerModel */
foreach ($collection as $customerModel) {
$customers[] = $customerModel->getDataModel();
}
$searchResults->setItems($customers);
return $searchResults;
}
/**
* {@inheritdoc}
*/
public function delete(\Magento\Customer\Api\Data\CustomerInterface $customer)
{
return $this->deleteById($customer->getId());
}
/**
* {@inheritdoc}
*/
public function deleteById($customerId)
{
$customerModel = $this->customerRegistry->retrieve($customerId);
$customerModel->delete();
$this->customerRegistry->remove($customerId);
return true;
}
/**
* Helper function that adds a FilterGroup to the collection.
*
* @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
* @param \Magento\Customer\Model\ResourceModel\Customer\Collection $collection
* @return void
* @throws \Magento\Framework\Exception\InputException
*/
protected function addFilterGroupToCollection(
\Magento\Framework\Api\Search\FilterGroup $filterGroup,
\Magento\Customer\Model\ResourceModel\Customer\Collection $collection
) {
$fields = [];
foreach ($filterGroup->getFilters() as $filter) {
$condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
$fields[] = ['attribute' => $filter->getField(), $condition => $filter->getValue()];
}
if ($fields) {
$collection->addFieldToFilter($fields);
}
}
}