13
13
use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
14
14
use Magento \Quote \Model \Quote ;
15
15
use Magento \QuoteGraphQl \Model \Cart \ExtractQuoteAddressData ;
16
+ use Magento \Framework \GraphQl \Schema \Type \TypeRegistry ;
17
+ use Magento \Framework \App \ObjectManager ;
16
18
17
19
/**
18
20
* @inheritdoc
@@ -24,12 +26,21 @@ class ShippingAddresses implements ResolverInterface
24
26
*/
25
27
private $ extractQuoteAddressData ;
26
28
29
+ /**
30
+ * @var TypeRegistry
31
+ */
32
+ private $ typeRegistry ;
33
+
27
34
/**
28
35
* @param ExtractQuoteAddressData $extractQuoteAddressData
36
+ * @param TypeRegistry|null $typeRegistry
29
37
*/
30
- public function __construct (ExtractQuoteAddressData $ extractQuoteAddressData )
31
- {
38
+ public function __construct (
39
+ ExtractQuoteAddressData $ extractQuoteAddressData ,
40
+ TypeRegistry $ typeRegistry = null
41
+ ) {
32
42
$ this ->extractQuoteAddressData = $ extractQuoteAddressData ;
43
+ $ this ->typeRegistry = $ typeRegistry ?: ObjectManager::getInstance ()->get (TypeRegistry::class);
33
44
}
34
45
35
46
/**
@@ -47,9 +58,38 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
47
58
48
59
if (count ($ shippingAddresses )) {
49
60
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
+ }
51
66
}
52
67
}
53
68
return $ addressesData ;
54
69
}
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
+ }
55
95
}
0 commit comments