Skip to content

Commit 0f41361

Browse files
authored
ENGCOM-4524: #8035: Join extension attributes are not added to Order results (REST api) #21797
2 parents f7f415c + 209f74e commit 0f41361

File tree

3 files changed

+75
-6
lines changed

3 files changed

+75
-6
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: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
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

14+
/**
15+
* Test join directives.
16+
*/
1517
class JoinDirectivesTest extends \Magento\TestFramework\TestCase\WebapiAbstract
1618
{
1719
/**
@@ -44,7 +46,8 @@ protected function setUp()
4446
}
4547

4648
/**
47-
* Rollback rules
49+
* Rollback rules.
50+
*
4851
* @magentoApiDataFixture Magento/SalesRule/_files/rules_rollback.php
4952
* @magentoApiDataFixture Magento/Sales/_files/quote.php
5053
*/
@@ -124,6 +127,49 @@ public function testAutoGeneratedGetList()
124127
$this->assertEquals($expectedExtensionAttributes['email'], $testAttribute['email']);
125128
}
126129

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

0 commit comments

Comments
 (0)