Skip to content

Commit a8cd032

Browse files
committed
MC-19746: The shipping address contains null values when there's no shipping address set on a cart
- add validator to check if address was set
1 parent 2667d93 commit a8cd032

File tree

1 file changed

+43
-3
lines changed

1 file changed

+43
-3
lines changed

app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddresses.php

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1414
use Magento\Quote\Model\Quote;
1515
use Magento\QuoteGraphQl\Model\Cart\ExtractQuoteAddressData;
16+
use Magento\Framework\GraphQl\Schema\Type\TypeRegistry;
17+
use Magento\Framework\App\ObjectManager;
1618

1719
/**
1820
* @inheritdoc
@@ -24,12 +26,21 @@ class ShippingAddresses implements ResolverInterface
2426
*/
2527
private $extractQuoteAddressData;
2628

29+
/**
30+
* @var TypeRegistry
31+
*/
32+
private $typeRegistry;
33+
2734
/**
2835
* @param ExtractQuoteAddressData $extractQuoteAddressData
36+
* @param TypeRegistry|null $typeRegistry
2937
*/
30-
public function __construct(ExtractQuoteAddressData $extractQuoteAddressData)
31-
{
38+
public function __construct(
39+
ExtractQuoteAddressData $extractQuoteAddressData,
40+
TypeRegistry $typeRegistry = null
41+
) {
3242
$this->extractQuoteAddressData = $extractQuoteAddressData;
43+
$this->typeRegistry = $typeRegistry ?: ObjectManager::getInstance()->get(TypeRegistry::class);
3344
}
3445

3546
/**
@@ -47,9 +58,38 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
4758

4859
if (count($shippingAddresses)) {
4960
foreach ($shippingAddresses as $shippingAddress) {
50-
$addressesData[] = $this->extractQuoteAddressData->execute($shippingAddress);
61+
$address = $this->extractQuoteAddressData->execute($shippingAddress);
62+
63+
if ($this->validateAddressFromSchema($address)) {
64+
$addressesData[] = $address;
65+
}
5166
}
5267
}
5368
return $addressesData;
5469
}
70+
71+
/**
72+
* Validate data from address against mandatory fields from graphql schema for address
73+
*
74+
* @param array $address
75+
* @return bool
76+
*/
77+
private function validateAddressFromSchema(array $address) : bool
78+
{
79+
/** @var \Magento\Framework\GraphQL\Schema\Type\Input\InputObjectType $cartAddressInput */
80+
$cartAddressInput = $this->typeRegistry->get('CartAddressInput');
81+
$fields = $cartAddressInput->getFields();
82+
83+
foreach ($fields as $field) {
84+
if ($field->getType() instanceof \Magento\Framework\GraphQL\Schema\Type\NonNull) {
85+
// an array key has to exist but it's value should not be null
86+
if (array_key_exists($field->name, $address)
87+
&& !is_array($address[$field->name])
88+
&& !isset($address[$field->name])) {
89+
return false;
90+
}
91+
}
92+
}
93+
return true;
94+
}
5595
}

0 commit comments

Comments
 (0)