Skip to content

Commit d9ef0d9

Browse files
committed
Merge branch 'graphql-256-order-messages' of github.com:Usik2203/magento2 into 2.4-develop-expedited-prs
2 parents ee50e37 + 6084502 commit d9ef0d9

File tree

6 files changed

+357
-21
lines changed

6 files changed

+357
-21
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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\GiftMessageGraphQl\Model\Resolver\Order;
9+
10+
use Magento\Framework\Exception\LocalizedException;
11+
use Magento\Framework\GraphQl\Config\Element\Field;
12+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
13+
use Magento\Framework\GraphQl\Query\Resolver\ContextInterface;
14+
use Magento\Framework\GraphQl\Query\Resolver\Value;
15+
use Magento\Framework\GraphQl\Query\ResolverInterface;
16+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
17+
use Magento\GiftMessage\Api\OrderRepositoryInterface;
18+
19+
/**
20+
* Class for getting GiftMessage from CustomerOrder
21+
*/
22+
class GiftMessage implements ResolverInterface
23+
{
24+
/**
25+
* @var OrderRepositoryInterface
26+
*/
27+
private $orderRepository;
28+
29+
/**
30+
* @param OrderRepositoryInterface $orderRepository
31+
*/
32+
public function __construct(
33+
OrderRepositoryInterface $orderRepository
34+
) {
35+
$this->orderRepository = $orderRepository;
36+
}
37+
38+
/**
39+
* Return information about gift message for order
40+
*
41+
* @param Field $field
42+
* @param ContextInterface $context
43+
* @param ResolveInfo $info
44+
* @param array|null $value
45+
* @param array|null $args
46+
*
47+
* @return array|Value|mixed
48+
* @throws GraphQlInputException
49+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
50+
*/
51+
public function resolve(
52+
Field $field,
53+
$context,
54+
ResolveInfo $info,
55+
array $value = null,
56+
array $args = null
57+
) {
58+
if (!isset($value['id'])) {
59+
throw new GraphQlInputException(__('"id" value should be specified'));
60+
}
61+
62+
try {
63+
$orderGiftMessage = $this->orderRepository->get($value['id']);
64+
} catch (LocalizedException $e) {
65+
throw new GraphQlInputException(__('Can\'t load gift message for order'));
66+
}
67+
68+
if (!isset($orderGiftMessage)) {
69+
return null;
70+
}
71+
72+
return [
73+
'to' => $orderGiftMessage->getRecipient() ?? '',
74+
'from' => $orderGiftMessage->getSender() ?? '',
75+
'message'=> $orderGiftMessage->getMessage() ?? ''
76+
];
77+
}
78+
}
Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
{
2-
"name": "magento/module-gift-message-graph-ql",
3-
"description": "N/A",
4-
"type": "magento2-module",
5-
"require": {
6-
"php": "~7.3.0||~7.4.0",
7-
"magento/framework": "*",
8-
"magento/module-gift-message": "*"
9-
},
10-
"suggest": {
11-
"magento/module-graph-ql": "*"
12-
},
13-
"license": [
14-
"OSL-3.0",
15-
"AFL-3.0"
16-
],
17-
"autoload": {
18-
"files": [
19-
"registration.php"
2+
"name": "magento/module-gift-message-graph-ql",
3+
"description": "N/A",
4+
"type": "magento2-module",
5+
"require": {
6+
"php": "~7.3.0||~7.4.0",
7+
"magento/framework": "*",
8+
"magento/module-gift-message": "*"
9+
},
10+
"suggest": {
11+
"magento/module-graph-ql": "*"
12+
},
13+
"license": [
14+
"OSL-3.0",
15+
"AFL-3.0"
2016
],
21-
"psr-4": {
22-
"Magento\\GiftMessageGraphQl\\": ""
17+
"autoload": {
18+
"files": [
19+
"registration.php"
20+
],
21+
"psr-4": {
22+
"Magento\\GiftMessageGraphQl\\": ""
23+
}
2324
}
24-
}
2525
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ type Cart {
55
gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Cart\\GiftMessage") @doc(description: "The entered gift message for the cart")
66
}
77

8+
#TODO finish this after implementing this schema https://github.com/magento/architecture/blob/master/design-documents/graph-ql/coverage/customer-orders.md
9+
type SalesItemInterface {
10+
gift_message: GiftMessage @doc(description: "The entered gift message for the order item")
11+
}
12+
13+
type CustomerOrder {
14+
gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Order\\GiftMessage") @doc(description: "The entered gift message for the order")
15+
}
16+
817
type GiftMessage {
918
to: String! @doc(description: "Recepient name")
1019
from: String! @doc(description: "Sender name")
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
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\GraphQl\GiftMessage\Order;
9+
10+
use Exception;
11+
use Magento\Framework\Exception\AuthenticationException;
12+
use Magento\Integration\Api\CustomerTokenServiceInterface;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use Magento\TestFramework\TestCase\GraphQlAbstract;
15+
16+
class GiftMessageTest extends GraphQlAbstract
17+
{
18+
/**
19+
* @var CustomerTokenServiceInterface
20+
*/
21+
private $customerTokenService;
22+
23+
protected function setUp(): void
24+
{
25+
parent::setUp();
26+
$this->customerTokenService = Bootstrap::getObjectManager()->get(CustomerTokenServiceInterface::class);
27+
}
28+
29+
/**
30+
* @magentoConfigFixture default_store sales/gift_options/allow_order 1
31+
* @magentoConfigFixture default_store sales/gift_options/allow_items 1
32+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
33+
* @magentoApiDataFixture Magento/GiftMessage/_files/customer/order_with_message.php
34+
* @throws AuthenticationException
35+
* @throws Exception
36+
*/
37+
public function testGiftMessageForOrder()
38+
{
39+
$query = $this->getCustomerOrdersQuery();
40+
$currentEmail = '[email protected]';
41+
$currentPassword = 'password';
42+
$response = $this->graphQlQuery($query, [], '', $this->getCustomerAuthHeaders($currentEmail, $currentPassword));
43+
foreach ($response['customerOrders']['items'] as $order) {
44+
self::assertArrayHasKey('gift_message', $order);
45+
self::assertArrayHasKey('to', $order['gift_message']);
46+
self::assertArrayHasKey('from', $order['gift_message']);
47+
self::assertArrayHasKey('message', $order['gift_message']);
48+
}
49+
}
50+
51+
/**
52+
* @magentoConfigFixture default_store sales/gift_options/allow_order 0
53+
* @magentoConfigFixture default_store sales/gift_options/allow_items 0
54+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
55+
* @magentoApiDataFixture Magento/GiftMessage/_files/customer/order_with_message.php
56+
*/
57+
public function testGiftMessageNotAllowForOrder()
58+
{
59+
$query = $this->getCustomerOrdersQuery();
60+
$currentEmail = '[email protected]';
61+
$currentPassword = 'password';
62+
$this->expectException(\Exception::class);
63+
$this->expectExceptionMessage('Can\'t load gift message for order');
64+
$this->graphQlQuery($query, [], '', $this->getCustomerAuthHeaders($currentEmail, $currentPassword));
65+
}
66+
67+
/**
68+
* @param string $email
69+
* @param string $password
70+
* @return array
71+
* @throws AuthenticationException
72+
*/
73+
private function getCustomerAuthHeaders(string $email, string $password): array
74+
{
75+
$customerToken = $this->customerTokenService->createCustomerAccessToken($email, $password);
76+
return ['Authorization' => 'Bearer ' . $customerToken];
77+
}
78+
79+
/**
80+
* Get Customer Orders query
81+
*
82+
* @return string
83+
*/
84+
private function getCustomerOrdersQuery()
85+
{
86+
return <<<QUERY
87+
query {
88+
customerOrders {
89+
items {
90+
order_number
91+
gift_message {
92+
to
93+
from
94+
message
95+
}
96+
}
97+
}
98+
}
99+
QUERY;
100+
}
101+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\TestFramework\Helper\Bootstrap;
10+
use Magento\GiftMessage\Model\Message;
11+
use Magento\GiftMessage\Model\ResourceModel\Message as MessageResource;
12+
use Magento\Sales\Api\OrderRepositoryInterface;
13+
use Magento\Sales\Model\Order;
14+
use Magento\Sales\Model\Order\Address as OrderAddress;
15+
16+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/product_simple.php');
17+
18+
$addressData = include __DIR__ . '/../../../../Magento/Sales/_files/address_data.php';
19+
20+
$objectManager = Bootstrap::getObjectManager();
21+
22+
/** @var Order $order */
23+
/** @var Order\Payment $payment */
24+
/** @var Order\Item $orderItem */
25+
/** @var array $addressData Data for creating addresses for the orders. */
26+
$orders = [
27+
[
28+
'increment_id' => '999999990',
29+
'state' => Order::STATE_NEW,
30+
'status' => 'processing',
31+
'grand_total' => 120.00,
32+
'subtotal' => 120.00,
33+
'base_grand_total' => 120.00,
34+
'store_id' => 1,
35+
'website_id' => 1,
36+
],
37+
[
38+
'increment_id' => '999999991',
39+
'state' => Order::STATE_PROCESSING,
40+
'status' => 'processing',
41+
'grand_total' => 130.00,
42+
'base_grand_total' => 130.00,
43+
'subtotal' => 130.00,
44+
'total_paid' => 130.00,
45+
'store_id' => 1,
46+
'website_id' => 1,
47+
]
48+
];
49+
50+
/** @var OrderRepositoryInterface $orderRepository */
51+
$orderRepository = $objectManager->create(OrderRepositoryInterface::class);
52+
53+
$payment = $objectManager->create(\Magento\Sales\Model\Order\Payment::class);
54+
$payment->setMethod('checkmo');
55+
$productRepository = $objectManager->create(ProductRepositoryInterface::class);
56+
$product = $productRepository->get('simple');
57+
58+
/** @var array $orderData */
59+
foreach ($orders as $orderData) {
60+
/** @var Magento\Sales\Model\Order $order */
61+
$order = $objectManager->create(Order::class);
62+
63+
// Reset addresses
64+
/** @var Order\Address $billingAddress */
65+
$billingAddress = $objectManager->create(OrderAddress::class, ['data' => $addressData]);
66+
$billingAddress->setAddressType('billing');
67+
68+
$shippingAddress = clone $billingAddress;
69+
$shippingAddress->setId(null)->setAddressType('shipping');
70+
71+
/** @var MessageResource $message */
72+
$message = $objectManager->create(MessageResource::class);
73+
74+
/** @var Message $message */
75+
$messageModel = $objectManager->create(Message::class);
76+
77+
$messageModel->setSender('John Doe');
78+
$messageModel->setRecipient('Jane Roe');
79+
$messageModel->setMessage('Gift Message Text');
80+
$message->save($messageModel);
81+
82+
/** @var Order\Item $orderItem */
83+
$orderItem = $objectManager->create(Order\Item::class);
84+
$orderItem->setProductId($product->getId())
85+
->setQtyOrdered(2)
86+
->setBasePrice($product->getPrice())
87+
->setPrice($product->getPrice())
88+
->setRowTotal($product->getPrice())
89+
->setProductType('simple');
90+
91+
$order
92+
->setData($orderData)
93+
->addItem($orderItem)
94+
->setCustomerIsGuest(false)
95+
->setCustomerId(1)
96+
->setCustomerEmail('[email protected]')
97+
->setBillingAddress($billingAddress)
98+
->setShippingAddress($shippingAddress)
99+
->setPayment($payment);
100+
$order->setGiftMessageId($messageModel->getId());
101+
$orderRepository->save($order);
102+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Framework\Registry;
10+
use Magento\GiftMessage\Model\Message;
11+
use Magento\Sales\Api\Data\OrderInterfaceFactory;
12+
use Magento\Sales\Api\OrderRepositoryInterface;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
15+
$objectManager = Bootstrap::getObjectManager();
16+
17+
/** @var Registry $registry */
18+
$registry = $objectManager->get(Registry::class);
19+
$registry->unregister('isSecureArea');
20+
$registry->register('isSecureArea', true);
21+
22+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
23+
$product = $productRepository->get('simple');
24+
$productRepository->delete($product);
25+
26+
/** @var OrderRepositoryInterface $orderRepository */
27+
$orderRepository = $objectManager->get(OrderRepositoryInterface::class);
28+
/** @var OrderInterfaceFactory $orderFactory */
29+
$orderFactory = $objectManager->create(OrderInterfaceFactory::class);
30+
$orders = [];
31+
$orders[] = $orderFactory->create()->loadByIncrementId('999999990');
32+
$orders[] = $orderFactory->create()->loadByIncrementId('999999991');
33+
34+
foreach ($orders as $order) {
35+
if ($order->getGiftMessageId()) {
36+
$message = $objectManager->create(Message::class);
37+
$message->load($order->getGiftMessageId());
38+
$message->delete();
39+
}
40+
if ($order->getId()) {
41+
$orderRepository->delete($order);
42+
}
43+
}
44+
45+
$registry->unregister('isSecureArea');
46+
$registry->register('isSecureArea', false);

0 commit comments

Comments
 (0)