Skip to content

Commit 66a55ba

Browse files
32370 Change the schema
1 parent 1c6f3a0 commit 66a55ba

File tree

5 files changed

+114
-24
lines changed

5 files changed

+114
-24
lines changed

app/code/Magento/SalesGraphQl/Model/Resolver/CustomerOrders.php

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,16 @@
88
namespace Magento\SalesGraphQl\Model\Resolver;
99

1010
use Magento\Framework\Api\SearchCriteriaBuilder;
11-
use Magento\Framework\Api\SortOrder;
12-
use Magento\Framework\Api\SortOrderBuilder;
1311
use Magento\Framework\Exception\InputException;
1412
use Magento\Framework\GraphQl\Config\Element\Field;
1513
use Magento\Framework\GraphQl\Exception\GraphQlAuthorizationException;
1614
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
1715
use Magento\Framework\GraphQl\Query\ResolverInterface;
1816
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
19-
use Magento\Sales\Api\Data\OrderInterface;
2017
use Magento\Sales\Api\OrderRepositoryInterface;
2118
use Magento\SalesGraphQl\Model\Formatter\Order as OrderFormatter;
2219
use Magento\SalesGraphQl\Model\Resolver\CustomerOrders\Query\OrderFilter;
20+
use Magento\SalesGraphQl\Model\Resolver\CustomerOrders\Query\OrderSort;
2321
use Magento\Store\Api\Data\StoreInterface;
2422

2523
/**
@@ -48,29 +46,29 @@ class CustomerOrders implements ResolverInterface
4846
private $orderFormatter;
4947

5048
/**
51-
* @var SortOrderBuilder
49+
* @var OrderSort
5250
*/
53-
private $sortOrderBuilder;
51+
private $orderSort;
5452

5553
/**
5654
* @param OrderRepositoryInterface $orderRepository
5755
* @param SearchCriteriaBuilder $searchCriteriaBuilder
5856
* @param OrderFilter $orderFilter
5957
* @param OrderFormatter $orderFormatter
60-
* @param SortOrderBuilder $sortOrderBuilder
58+
* @param OrderSort $orderSort
6159
*/
6260
public function __construct(
6361
OrderRepositoryInterface $orderRepository,
6462
SearchCriteriaBuilder $searchCriteriaBuilder,
6563
OrderFilter $orderFilter,
6664
OrderFormatter $orderFormatter,
67-
SortOrderBuilder $sortOrderBuilder
65+
OrderSort $orderSort
6866
) {
6967
$this->orderRepository = $orderRepository;
7068
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
7169
$this->orderFilter = $orderFilter;
7270
$this->orderFormatter = $orderFormatter;
73-
$this->sortOrderBuilder = $sortOrderBuilder;
71+
$this->orderSort = $orderSort;
7472
}
7573

7674
/**
@@ -137,12 +135,9 @@ private function getSearchResult(array $args, int $userId, int $storeId)
137135
if (isset($args['pageSize'])) {
138136
$this->searchCriteriaBuilder->setPageSize($args['pageSize']);
139137
}
140-
if (isset($args['changeSortDirection']) && $args['changeSortDirection']) {
141-
$sortOrder = $this->sortOrderBuilder
142-
->setField(OrderInterface::ENTITY_ID)
143-
->setDirection(SortOrder::SORT_DESC)
144-
->create();
145-
$this->searchCriteriaBuilder->setSortOrders([$sortOrder]);
138+
if (isset($args['sort'])) {
139+
$sortOrders = $this->orderSort->createSortOrders($args);
140+
$this->searchCriteriaBuilder->setSortOrders($sortOrders);
146141
}
147142
return $this->orderRepository->getList($this->searchCriteriaBuilder->create());
148143
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\SalesGraphQl\Model\Resolver\CustomerOrders\Query;
9+
10+
use Magento\Framework\Api\SortOrder;
11+
use Magento\Framework\Api\SortOrderBuilder;
12+
use Magento\Framework\GraphQl\Schema\Type\Enum\DataMapperInterface;
13+
use Magento\GiftRegistryGraphQl\Mapper\GiftRegistryDataMapper;
14+
15+
/**
16+
*
17+
*/
18+
class OrderSort
19+
{
20+
private const SORTABLE_FIELD_MAP = 'CustomerOrderSortableField';
21+
22+
/**
23+
* @var DataMapperInterface
24+
*/
25+
private $enumDataMapper;
26+
27+
/**
28+
* @var SortOrderBuilder
29+
*/
30+
private $sortOrderBuilder;
31+
32+
/**
33+
* @param DataMapperInterface $enumDataMapper
34+
* @param SortOrderBuilder $sortOrderBuilder
35+
*/
36+
public function __construct(
37+
DataMapperInterface $enumDataMapper,
38+
SortOrderBuilder $sortOrderBuilder
39+
) {
40+
$this->enumDataMapper = $enumDataMapper;
41+
$this->sortOrderBuilder = $sortOrderBuilder;
42+
}
43+
44+
/**
45+
*
46+
*
47+
* @param array $args
48+
* @return SortOrder[]
49+
*/
50+
public function createSortOrders(array $args): array
51+
{
52+
$sortField = $this->getField($args['sort']['sort_field']);
53+
$sortOrder = $this->sortOrderBuilder
54+
->setField($sortField)
55+
->setDirection($args['sort']['sort_direction'])
56+
->create();
57+
return [$sortOrder];
58+
}
59+
60+
/**
61+
*
62+
*
63+
* @param string $field
64+
* @return string
65+
*/
66+
private function getField(string $field): string
67+
{
68+
$enums = $this->enumDataMapper->getMappedEnums(self::SORTABLE_FIELD_MAP);
69+
70+
return $enums[strtolower($field)];
71+
}
72+
}

app/code/Magento/SalesGraphQl/etc/graphql/di.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,13 @@
4242
</argument>
4343
</arguments>
4444
</type>
45+
<type name="Magento\Framework\GraphQl\Schema\Type\Enum\DefaultDataMapper">
46+
<arguments>
47+
<argument name="map" xsi:type="array">
48+
<item name="CustomerOrderSortableField" xsi:type="array">
49+
<item name="order_id" xsi:type="string">entity_id</item>
50+
</item>
51+
</argument>
52+
</arguments>
53+
</type>
4554
</config>

app/code/Magento/SalesGraphQl/etc/schema.graphqls

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,23 @@ type Customer {
2525
filter: CustomerOrdersFilterInput @doc(description: "Defines the filter to use for searching customer orders"),
2626
currentPage: Int = 1 @doc(description: "Specifies which page of results to return. The default value is 1"),
2727
pageSize: Int = 20 @doc(description: "Specifies the maximum number of results to return at once. The default value is 20"),
28-
changeSortDirection: Boolean = false @doc(description: "Changes sort direction by entity_id to DESC. The default value is false"),
28+
sort: CustomerOrderSortInput @doc(description: "Specifies which field to sort on, and whether to return the results in ascending or descending order.")
2929
): CustomerOrders @resolver(class: "Magento\\SalesGraphQl\\Model\\Resolver\\CustomerOrders") @cache(cacheable: false)
3030
}
3131

3232
input CustomerOrdersFilterInput @doc(description: "Identifies the filter to use for filtering orders.") {
3333
number: FilterStringTypeInput @doc(description: "Filters by order number.")
3434
}
3535

36+
input CustomerOrderSortInput @doc(description: "CustomerOrderSortInput specifies the field to use for sorting search results and indicates whether the results are sorted in ascending or descending order.") {
37+
sort_field: CustomerOrderSortableField! @doc(description: "Specifies the field to use for sorting")
38+
sort_direction: SortEnum! @doc(description: "This enumeration indicates whether to return results in ascending or descending order")
39+
}
40+
41+
enum CustomerOrderSortableField @doc(description: "Specifies the field to use for sorting") {
42+
ORDER_ID @doc(description: "Sorts customer order by ID")
43+
}
44+
3645
type CustomerOrders @doc(description: "The collection of orders that match the conditions defined in the filter") {
3746
items: [CustomerOrder]! @doc(description: "An array of customer orders")
3847
page_info: SearchResultPageInfo @doc(description: "An object that includes the current_page, page_info, and page_size values specified in the query")

dev/tests/api-functional/testsuite/Magento/GraphQl/Sales/RetrieveOrdersByOrderNumberTest.php

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -414,16 +414,21 @@ public function testGetCustomerDescendingSortedOrders()
414414
{
415415
$query = <<<QUERY
416416
{
417-
customer {
418-
orders(changeSortDirection:true) {
419-
items {
420-
id
421-
number
422-
status
423-
order_date
424-
}
425-
}
417+
customer {
418+
orders(
419+
sort: {
420+
sort_field: ORDER_ID,
421+
sort_direction: DESC
422+
}
423+
) {
424+
items {
425+
id
426+
number
427+
status
428+
order_date
429+
}
426430
}
431+
}
427432
}
428433
QUERY;
429434

0 commit comments

Comments
 (0)