UpdateCustomerAddress.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\CustomerGraphQl\Model\Resolver;
  8. use Magento\Customer\Api\AddressRepositoryInterface;
  9. use Magento\Customer\Api\Data\AddressInterface;
  10. use Magento\CustomerGraphQl\Model\Customer\Address\CustomerAddressDataProvider;
  11. use Magento\CustomerGraphQl\Model\Customer\Address\CustomerAddressUpdateDataValidator;
  12. use Magento\CustomerGraphQl\Model\Customer\Address\GetCustomerAddressForUser;
  13. use Magento\CustomerGraphQl\Model\Customer\CheckCustomerAccount;
  14. use Magento\Framework\Api\DataObjectHelper;
  15. use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
  16. use Magento\Framework\GraphQl\Config\Element\Field;
  17. use Magento\Framework\GraphQl\Query\ResolverInterface;
  18. /**
  19. * Customers address update, used for GraphQL request processing
  20. */
  21. class UpdateCustomerAddress implements ResolverInterface
  22. {
  23. /**
  24. * @var CheckCustomerAccount
  25. */
  26. private $checkCustomerAccount;
  27. /**
  28. * @var AddressRepositoryInterface
  29. */
  30. private $addressRepository;
  31. /**
  32. * @var CustomerAddressDataProvider
  33. */
  34. private $customerAddressDataProvider;
  35. /**
  36. * @var DataObjectHelper
  37. */
  38. private $dataObjectHelper;
  39. /**
  40. * @var CustomerAddressUpdateDataValidator
  41. */
  42. private $customerAddressUpdateDataValidator;
  43. /**
  44. * @var GetCustomerAddressForUser
  45. */
  46. private $getCustomerAddressForUser;
  47. /**
  48. * @param CheckCustomerAccount $checkCustomerAccount
  49. * @param AddressRepositoryInterface $addressRepository
  50. * @param CustomerAddressDataProvider $customerAddressDataProvider
  51. * @param DataObjectHelper $dataObjectHelper
  52. * @param CustomerAddressUpdateDataValidator $customerAddressUpdateDataValidator
  53. * @param GetCustomerAddressForUser $getCustomerAddressForUser
  54. */
  55. public function __construct(
  56. CheckCustomerAccount $checkCustomerAccount,
  57. AddressRepositoryInterface $addressRepository,
  58. CustomerAddressDataProvider $customerAddressDataProvider,
  59. DataObjectHelper $dataObjectHelper,
  60. CustomerAddressUpdateDataValidator $customerAddressUpdateDataValidator,
  61. GetCustomerAddressForUser $getCustomerAddressForUser
  62. ) {
  63. $this->checkCustomerAccount = $checkCustomerAccount;
  64. $this->addressRepository = $addressRepository;
  65. $this->customerAddressDataProvider = $customerAddressDataProvider;
  66. $this->dataObjectHelper = $dataObjectHelper;
  67. $this->customerAddressUpdateDataValidator = $customerAddressUpdateDataValidator;
  68. $this->getCustomerAddressForUser = $getCustomerAddressForUser;
  69. }
  70. /**
  71. * @inheritdoc
  72. */
  73. public function resolve(
  74. Field $field,
  75. $context,
  76. ResolveInfo $info,
  77. array $value = null,
  78. array $args = null
  79. ) {
  80. $currentUserId = $context->getUserId();
  81. $currentUserType = $context->getUserType();
  82. $this->checkCustomerAccount->execute($currentUserId, $currentUserType);
  83. $this->customerAddressUpdateDataValidator->validate($args['input']);
  84. $address = $this->updateCustomerAddress((int)$currentUserId, (int)$args['id'], $args['input']);
  85. return $this->customerAddressDataProvider->getAddressData($address);
  86. }
  87. /**
  88. * Update customer address
  89. *
  90. * @param int $customerId
  91. * @param int $addressId
  92. * @param array $addressData
  93. * @return AddressInterface
  94. */
  95. private function updateCustomerAddress(int $customerId, int $addressId, array $addressData)
  96. {
  97. $address = $this->getCustomerAddressForUser->execute($addressId, $customerId);
  98. $this->dataObjectHelper->populateWithArray($address, $addressData, AddressInterface::class);
  99. if (isset($addressData['region']['region_id'])) {
  100. $address->setRegionId($address->getRegion()->getRegionId());
  101. }
  102. return $this->addressRepository->save($address);
  103. }
  104. }