2323use GraphQL \Language \Visitor ;
2424use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
2525use Magento \GraphQl \Model \Query \ContextInterface ;
26+ use Magento \Framework \App \RequestInterface ;
27+ use Magento \Framework \Serialize \SerializerInterface ;
2628
2729class ProductAttributeSortInput
2830{
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+ }
2950 /**
3051 * Plugin to preserve the original order of sort fields
3152 *
@@ -47,43 +68,85 @@ public function beforeResolve(
4768 array $ value = null ,
4869 array $ args = null
4970 ): array {
71+
72+ $ data = $ this ->getDataFromRequest ($ this ->request );
5073 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+ );
5279 }
5380 return [$ field , $ context , $ info , $ value , $ args ];
5481 }
5582
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+
56106 /**
57107 * Get sort fields in the original order
58108 *
59109 * @param ResolveInfo $info
60110 * @param array $sortFields
111+ * @param array|null $requestSortFields
61112 * @return array
62113 * @throws \Exception
63114 */
64- private function getSortFieldsOrder (ResolveInfo $ info , array $ sortFields)
115+ private function getSortFieldsOrder (ResolveInfo $ info , array $ sortFields, ? array $ requestSortFields ): array
65116 {
66117 $ sortFieldsOriginal = [];
67118 Visitor::visit (
68119 $ info ->operation ,
69120 [
70121 'enter ' => [
71- NodeKind::ARGUMENT => function (Node $ node ) use (&$ sortFieldsOriginal , $ sortFields ) {
122+ NodeKind::ARGUMENT => function (Node $ node ) use (
123+ &$ sortFieldsOriginal ,
124+ $ sortFields ,
125+ $ requestSortFields
126+ ) {
72127 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+ }
82145 }
83- }
146+ ]
84147 ]
85- ]
86- );
148+ );
149+ }
87150 return Visitor::stop ();
88151 }
89152 }
0 commit comments