Skip to content

Commit 961e05c

Browse files
nmalevanecal.kravchuk
authored and
al.kravchuk
committed
#8035: Join extension attributes are not added to Order results (REST api)
1 parent 92118f5 commit 961e05c

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
@@ -6,7 +6,9 @@
66

77
namespace Magento\Sales\Model;
88

9+
use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
910
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
11+
use Magento\Framework\App\ObjectManager;
1012
use Magento\Framework\Exception\InputException;
1113
use Magento\Framework\Exception\NoSuchEntityException;
1214
use Magento\Sales\Api\Data\OrderExtensionFactory;
@@ -16,7 +18,6 @@
1618
use Magento\Sales\Api\Data\ShippingAssignmentInterface;
1719
use Magento\Sales\Model\Order\ShippingAssignmentBuilder;
1820
use Magento\Sales\Model\ResourceModel\Metadata;
19-
use Magento\Framework\App\ObjectManager;
2021
use Magento\Tax\Api\OrderTaxManagementInterface;
2122
use Magento\Payment\Api\Data\PaymentAdditionalInfoInterface;
2223
use Magento\Payment\Api\Data\PaymentAdditionalInfoInterfaceFactory;
@@ -74,6 +75,11 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
7475
*/
7576
private $serializer;
7677

78+
/**
79+
* @var JoinProcessorInterface
80+
*/
81+
private $extensionAttributesJoinProcessor;
82+
7783
/**
7884
* Constructor
7985
*
@@ -84,6 +90,7 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
8490
* @param OrderTaxManagementInterface|null $orderTaxManagement
8591
* @param PaymentAdditionalInfoInterfaceFactory|null $paymentAdditionalInfoFactory
8692
* @param JsonSerializer|null $serializer
93+
* @param JoinProcessorInterface $extensionAttributesJoinProcessor
8794
*/
8895
public function __construct(
8996
Metadata $metadata,
@@ -92,7 +99,8 @@ public function __construct(
9299
\Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory = null,
93100
OrderTaxManagementInterface $orderTaxManagement = null,
94101
PaymentAdditionalInfoInterfaceFactory $paymentAdditionalInfoFactory = null,
95-
JsonSerializer $serializer = null
102+
JsonSerializer $serializer = null,
103+
JoinProcessorInterface $extensionAttributesJoinProcessor = null
96104
) {
97105
$this->metadata = $metadata;
98106
$this->searchResultFactory = $searchResultFactory;
@@ -106,6 +114,8 @@ public function __construct(
106114
->get(PaymentAdditionalInfoInterfaceFactory::class);
107115
$this->serializer = $serializer ?: ObjectManager::getInstance()
108116
->get(JsonSerializer::class);
117+
$this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor
118+
?: ObjectManager::getInstance()->get(JoinProcessorInterface::class);
109119
}
110120

111121
/**
@@ -198,6 +208,7 @@ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCr
198208
{
199209
/** @var \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult */
200210
$searchResult = $this->searchResultFactory->create();
211+
$this->extensionAttributesJoinProcessor->process($searchResult);
201212
$this->collectionProcessor->process($searchCriteria, $searchResult);
202213
$searchResult->setSearchCriteria($searchCriteria);
203214
foreach ($searchResult->getItems() as $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)