23
23
use GraphQL \Language \Visitor ;
24
24
use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
25
25
use Magento \GraphQl \Model \Query \ContextInterface ;
26
+ use Magento \Framework \App \RequestInterface ;
27
+ use Magento \Framework \Serialize \SerializerInterface ;
26
28
27
29
class ProductAttributeSortInput
28
30
{
31
+ /**
32
+ * @var RequestInterface
33
+ */
34
+ private $ request ;
35
+
36
+ /**
37
+ * @var SerializerInterface
38
+ */
39
+ private $ jsonSerializer ;
40
+
41
+ /**
42
+ * @param RequestInterface $request
43
+ * @param SerializerInterface $jsonSerializer
44
+ */
45
+ public function __construct (RequestInterface $ request , SerializerInterface $ jsonSerializer )
46
+ {
47
+ $ this ->request = $ request ;
48
+ $ this ->jsonSerializer = $ jsonSerializer ;
49
+ }
29
50
/**
30
51
* Plugin to preserve the original order of sort fields
31
52
*
@@ -47,43 +68,85 @@ public function beforeResolve(
47
68
array $ value = null ,
48
69
array $ args = null
49
70
): array {
71
+
72
+ $ data = $ this ->getDataFromRequest ($ this ->request );
50
73
if (isset ($ args ['sort ' ])) {
51
- $ args ['sort ' ] = $ this ->getSortFieldsOrder ($ info , $ args ['sort ' ]);
74
+ $ args ['sort ' ] = $ this ->getSortFieldsOrder (
75
+ $ info ,
76
+ $ args ['sort ' ],
77
+ isset ($ data ['variables ' ]['sort ' ]) ? array_keys ($ data ['variables ' ]['sort ' ]) : null
78
+ );
52
79
}
53
80
return [$ field , $ context , $ info , $ value , $ args ];
54
81
}
55
82
83
+ /**
84
+ * Get data from request body or query string
85
+ *
86
+ * @param RequestInterface $request
87
+ * @return array
88
+ */
89
+ private function getDataFromRequest (RequestInterface $ request ): array
90
+ {
91
+ if ($ request ->isPost ()) {
92
+ $ data = $ this ->jsonSerializer ->unserialize ($ request ->getContent ());
93
+ } elseif ($ request ->isGet ()) {
94
+ $ data = $ request ->getParams ();
95
+ $ data ['variables ' ] = isset ($ data ['variables ' ]) ?
96
+ $ this ->jsonSerializer ->unserialize ($ data ['variables ' ]) : null ;
97
+ $ data ['variables ' ] = is_array ($ data ['variables ' ]) ?
98
+ $ data ['variables ' ] : null ;
99
+ } else {
100
+ return [];
101
+ }
102
+
103
+ return $ data ;
104
+ }
105
+
56
106
/**
57
107
* Get sort fields in the original order
58
108
*
59
109
* @param ResolveInfo $info
60
110
* @param array $sortFields
111
+ * @param array|null $requestSortFields
61
112
* @return array
62
113
* @throws \Exception
63
114
*/
64
- private function getSortFieldsOrder (ResolveInfo $ info , array $ sortFields)
115
+ private function getSortFieldsOrder (ResolveInfo $ info , array $ sortFields, ? array $ requestSortFields ): array
65
116
{
66
117
$ sortFieldsOriginal = [];
67
118
Visitor::visit (
68
119
$ info ->operation ,
69
120
[
70
121
'enter ' => [
71
- NodeKind::ARGUMENT => function (Node $ node ) use (&$ sortFieldsOriginal , $ sortFields ) {
122
+ NodeKind::ARGUMENT => function (Node $ node ) use (
123
+ &$ sortFieldsOriginal ,
124
+ $ sortFields ,
125
+ $ requestSortFields
126
+ ) {
72
127
if ($ node ->name ->value === 'sort ' ) {
73
- Visitor::visit (
74
- $ node ->value ,
75
- [
76
- 'enter ' => [
77
- NodeKind::OBJECT_FIELD =>
78
- function (Node $ node ) use (&$ sortFieldsOriginal , $ sortFields ) {
79
- if (isset ($ sortFields [$ node ->name ->value ])) {
80
- $ sortFieldsOriginal [$ node ->name ->value ] =
81
- $ sortFields [$ node ->name ->value ];
128
+ if (isset ($ requestSortFields )) {
129
+ foreach ($ requestSortFields as $ fieldName ) {
130
+ if (isset ($ sortFields [$ fieldName ])) {
131
+ $ sortFieldsOriginal [$ fieldName ] = $ sortFields [$ fieldName ];
132
+ }
133
+ }
134
+ } else {
135
+ Visitor::visit (
136
+ $ node ->value ,
137
+ [
138
+ 'enter ' => [
139
+ NodeKind::OBJECT_FIELD =>
140
+ function (Node $ node ) use (&$ sortFieldsOriginal , $ sortFields ) {
141
+ if (isset ($ sortFields [$ node ->name ->value ])) {
142
+ $ sortFieldsOriginal [$ node ->name ->value ] =
143
+ $ sortFields [$ node ->name ->value ];
144
+ }
82
145
}
83
- }
146
+ ]
84
147
]
85
- ]
86
- );
148
+ );
149
+ }
87
150
return Visitor::stop ();
88
151
}
89
152
}
0 commit comments