Skip to content

Commit 50c52d9

Browse files
author
Oleksii Korshenko
authored
MAGETWO-87292: 8035: Join extension attributes are not added to Order results (REST api) #1168
2 parents 5f951f4 + 3ab885f commit 50c52d9

File tree

3 files changed

+70
-5
lines changed

3 files changed

+70
-5
lines changed

app/code/Magento/Sales/Model/OrderRepository.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
*/
66
namespace Magento\Sales\Model;
77

8+
use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
89
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
10+
use Magento\Framework\App\ObjectManager;
911
use Magento\Framework\Exception\InputException;
1012
use Magento\Framework\Exception\NoSuchEntityException;
1113
use Magento\Sales\Api\Data\OrderExtensionFactory;
@@ -15,7 +17,6 @@
1517
use Magento\Sales\Api\Data\ShippingAssignmentInterface;
1618
use Magento\Sales\Model\Order\ShippingAssignmentBuilder;
1719
use Magento\Sales\Model\ResourceModel\Metadata;
18-
use Magento\Framework\App\ObjectManager;
1920

2021
/**
2122
* Repository class
@@ -54,26 +55,35 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
5455
*/
5556
protected $registry = [];
5657

58+
/**
59+
* @var JoinProcessorInterface
60+
*/
61+
private $extensionAttributesJoinProcessor;
62+
5763
/**
5864
* Constructor
5965
*
6066
* @param Metadata $metadata
6167
* @param SearchResultFactory $searchResultFactory
6268
* @param CollectionProcessorInterface|null $collectionProcessor
6369
* @param \Magento\Sales\Api\Data\OrderExtensionFactory|null $orderExtensionFactory
70+
* @param JoinProcessorInterface $extensionAttributesJoinProcessor
6471
*/
6572
public function __construct(
6673
Metadata $metadata,
6774
SearchResultFactory $searchResultFactory,
6875
CollectionProcessorInterface $collectionProcessor = null,
69-
\Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory = null
76+
\Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory = null,
77+
JoinProcessorInterface $extensionAttributesJoinProcessor = null
7078
) {
7179
$this->metadata = $metadata;
7280
$this->searchResultFactory = $searchResultFactory;
7381
$this->collectionProcessor = $collectionProcessor ?: ObjectManager::getInstance()
7482
->get(\Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class);
7583
$this->orderExtensionFactory = $orderExtensionFactory ?: ObjectManager::getInstance()
7684
->get(\Magento\Sales\Api\Data\OrderExtensionFactory::class);
85+
$this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor
86+
?: ObjectManager::getInstance()->get(JoinProcessorInterface::class);
7787
}
7888

7989
/**
@@ -112,6 +122,7 @@ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCr
112122
/** @var \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult */
113123
$searchResult = $this->searchResultFactory->create();
114124
$this->collectionProcessor->process($searchCriteria, $searchResult);
125+
$this->extensionAttributesJoinProcessor->process($searchResult);
115126
$searchResult->setSearchCriteria($searchCriteria);
116127
foreach ($searchResult->getItems() as $order) {
117128
$this->setShippingAssignments($order);

dev/tests/api-functional/_files/Magento/TestModuleJoinDirectives/etc/extension_attributes.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,16 @@
3131
</join>
3232
</attribute>
3333
</extension_attributes>
34+
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
35+
<attribute code="orderApiTestAttribute" type="Magento\User\Api\Data\UserInterface">
36+
<join reference_table="admin_user"
37+
join_on_field="store_id"
38+
reference_field="user_id"
39+
>
40+
<field>firstname</field>
41+
<field>lastname</field>
42+
<field>email</field>
43+
</join>
44+
</attribute>
45+
</extension_attributes>
3446
</config>

dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66

77
namespace Magento\Webapi;
88

9+
use Magento\Framework\Api\FilterBuilder;
910
use Magento\Framework\Api\SearchCriteriaBuilder;
10-
use Magento\Framework\Api\SortOrderBuilder;
1111
use Magento\Framework\Api\SortOrder;
12-
use Magento\Framework\Api\SearchCriteria;
13-
use Magento\Framework\Api\FilterBuilder;
12+
use Magento\Framework\Api\SortOrderBuilder;
1413

1514
class JoinDirectivesTest extends \Magento\TestFramework\TestCase\WebapiAbstract
1615
{
@@ -124,6 +123,49 @@ public function testAutoGeneratedGetList()
124123
$this->assertEquals($expectedExtensionAttributes['email'], $testAttribute['email']);
125124
}
126125

126+
/**
127+
* Test get list of orders with extension attributes.
128+
*
129+
* @magentoApiDataFixture Magento/Sales/_files/order.php
130+
*/
131+
public function testGetOrdertList()
132+
{
133+
$filter = $this->filterBuilder
134+
->setField('increment_id')
135+
->setValue('100000001')
136+
->setConditionType('eq')
137+
->create();
138+
$this->searchBuilder->addFilters([$filter]);
139+
$searchData = $this->searchBuilder->create()->__toArray();
140+
141+
$requestData = ['searchCriteria' => $searchData];
142+
143+
$restResourcePath = '/V1/orders/';
144+
$soapService = 'salesOrderRepositoryV1';
145+
$expectedExtensionAttributes = $this->getExpectedExtensionAttributes();
146+
147+
$serviceInfo = [
148+
'rest' => [
149+
'resourcePath' => $restResourcePath . '?' . http_build_query($requestData),
150+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
151+
],
152+
'soap' => [
153+
'service' => $soapService,
154+
'operation' => $soapService . 'GetList',
155+
],
156+
];
157+
$searchResult = $this->_webApiCall($serviceInfo, $requestData);
158+
159+
$this->assertArrayHasKey('items', $searchResult);
160+
$itemData = array_pop($searchResult['items']);
161+
$this->assertArrayHasKey('extension_attributes', $itemData);
162+
$this->assertArrayHasKey('order_api_test_attribute', $itemData['extension_attributes']);
163+
$testAttribute = $itemData['extension_attributes']['order_api_test_attribute'];
164+
$this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute['first_name']);
165+
$this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute['last_name']);
166+
$this->assertEquals($expectedExtensionAttributes['email'], $testAttribute['email']);
167+
}
168+
127169
/**
128170
* Retrieve the admin user's information.
129171
*

0 commit comments

Comments
 (0)