Skip to content

Commit b63a4cd

Browse files
ENGCOM-6500: #14663 Updating Customer through rest/all/V1/customers/:id resets group_id if group_id not passed in payload #25958
2 parents 4e6f316 + e5c4bac commit b63a4cd

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Magento\Customer\Model\Data\CustomerSecureFactory;
1818
use Magento\Customer\Model\Delegation\Data\NewOperation;
1919
use Magento\Customer\Model\Delegation\Storage as DelegatedStorage;
20+
use Magento\Customer\Model\ResourceModel\Customer\Collection;
2021
use Magento\Framework\Api\DataObjectHelper;
2122
use Magento\Framework\Api\ExtensibleDataObjectConverter;
2223
use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
@@ -31,6 +32,8 @@
3132
/**
3233
* Customer repository.
3334
*
35+
* CRUD operations for customer entity
36+
*
3437
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
3538
* @SuppressWarnings(PHPMD.TooManyFields)
3639
*/
@@ -187,8 +190,7 @@ public function save(CustomerInterface $customer, $passwordHash = null)
187190
{
188191
/** @var NewOperation|null $delegatedNewOperation */
189192
$delegatedNewOperation = !$customer->getId() ? $this->delegatedStorage->consumeNewOperation() : null;
190-
$prevCustomerData = null;
191-
$prevCustomerDataArr = null;
193+
$prevCustomerData = $prevCustomerDataArr = null;
192194
if ($customer->getId()) {
193195
$prevCustomerData = $this->getById($customer->getId());
194196
$prevCustomerDataArr = $prevCustomerData->__toArray();
@@ -214,6 +216,7 @@ public function save(CustomerInterface $customer, $passwordHash = null)
214216
$prevCustomerData ? $prevCustomerData->getStoreId() : $this->storeManager->getStore()->getId()
215217
);
216218
}
219+
$this->setCustomerGroupId($customerModel, $customerArr, $prevCustomerDataArr);
217220
// Need to use attribute set or future updates can cause data loss
218221
if (!$customerModel->getAttributeSetId()) {
219222
$customerModel->setAttributeSetId(CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER);
@@ -452,4 +455,18 @@ private function setValidationFlag($customerArray, $customerModel)
452455
$customerModel->setData('ignore_validation_flag', true);
453456
}
454457
}
458+
459+
/**
460+
* Set customer group id
461+
*
462+
* @param Customer $customerModel
463+
* @param array $customerArr
464+
* @param array $prevCustomerDataArr
465+
*/
466+
private function setCustomerGroupId($customerModel, $customerArr, $prevCustomerDataArr)
467+
{
468+
if (!isset($customerArr['group_id']) && $prevCustomerDataArr && isset($prevCustomerDataArr['group_id'])) {
469+
$customerModel->setGroupId($prevCustomerDataArr['group_id']);
470+
}
471+
}
455472
}

app/code/Magento/Customer/Test/Unit/Model/ResourceModel/CustomerRepositoryTest.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ public function testSave()
211211
'setFirstFailure',
212212
'setLockExpires',
213213
'save',
214+
'setGroupId'
214215
]
215216
);
216217

@@ -245,9 +246,15 @@ public function testSave()
245246
$this->customer->expects($this->atLeastOnce())
246247
->method('getId')
247248
->willReturn($customerId);
248-
$this->customer->expects($this->atLeastOnce())
249+
$this->customer->expects($this->at(4))
249250
->method('__toArray')
250251
->willReturn([]);
252+
$this->customer->expects($this->at(3))
253+
->method('__toArray')
254+
->willReturn(['group_id' => 1]);
255+
$customerModel->expects($this->once())
256+
->method('setGroupId')
257+
->with(1);
251258
$this->customerRegistry->expects($this->atLeastOnce())
252259
->method('retrieve')
253260
->with($customerId)

0 commit comments

Comments
 (0)