Skip to content

Commit 8ed5018

Browse files
committed
Merge branch 'graphql-update-message-in-quote' into graphql-256-cart-item-coverage
2 parents 81737c0 + 035c157 commit 8ed5018

File tree

5 files changed

+190
-58
lines changed

5 files changed

+190
-58
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
10+
<type name="Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider">
11+
<arguments>
12+
<argument name="extendedConfigData" xsi:type="array">
13+
<item name="allow_order" xsi:type="string">sales/gift_options/allow_order</item>
14+
<item name="allow_items" xsi:type="string">sales/gift_options/allow_items</item>
15+
</argument>
16+
</arguments>
17+
</type>
18+
</config>

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Copyright © Magento, Inc. All rights reserved.
22
# See COPYING.txt for license details.
33

4+
type StoreConfig {
5+
allow_order : String @doc(description: "Allow Gift Messages on order level")
6+
allow_items : String @doc(description: "Allow Gift Messages for order items")
7+
}
8+
49
type Cart {
510
gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Cart\\GiftMessage") @doc(description: "The entered gift message for the cart")
611
}
@@ -26,3 +31,13 @@ type GiftMessage {
2631
from: String! @doc(description: "Sender name")
2732
message: String! @doc(description: "Gift message text")
2833
}
34+
35+
input CartItemUpdateInput {
36+
gift_message: GiftMessageInput @doc(description: "Gift message details for the cart item")
37+
}
38+
39+
input GiftMessageInput {
40+
to: String! @doc(description: "Recepient name")
41+
from: String! @doc(description: "Sender name")
42+
message: String! @doc(description: "Gift message text")
43+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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\QuoteGraphQl\Model\CartItem\DataProvider;
9+
10+
use Magento\Framework\Exception\LocalizedException;
11+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
12+
use Magento\GiftMessage\Api\Data\MessageInterface;
13+
use Magento\GiftMessage\Api\ItemRepositoryInterface;
14+
use Magento\GiftMessage\Helper\Message as GiftMessageHelper;
15+
use Magento\Quote\Api\CartItemRepositoryInterface;
16+
use Magento\Quote\Model\Quote;
17+
use Magento\QuoteGraphQl\Model\Cart\UpdateCartItem;
18+
19+
/**
20+
* Class contain update cart items methods
21+
*/
22+
class UpdateCartItems
23+
{
24+
/**
25+
* @var CartItemRepositoryInterface
26+
*/
27+
private $cartItemRepository;
28+
29+
/**
30+
* @var UpdateCartItem
31+
*/
32+
private $updateCartItem;
33+
34+
/**
35+
* @var ItemRepositoryInterface
36+
*/
37+
private $itemRepository;
38+
39+
/**
40+
* @var GiftMessageHelper
41+
*/
42+
private $giftMessageHelper;
43+
44+
/**
45+
* @param CartItemRepositoryInterface $cartItemRepository
46+
* @param UpdateCartItem $updateCartItem
47+
* @param ItemRepositoryInterface $itemRepository
48+
* @param GiftMessageHelper $giftMessageHelper
49+
*/
50+
public function __construct(
51+
CartItemRepositoryInterface $cartItemRepository,
52+
UpdateCartItem $updateCartItem,
53+
ItemRepositoryInterface $itemRepository,
54+
GiftMessageHelper $giftMessageHelper
55+
) {
56+
$this->cartItemRepository = $cartItemRepository;
57+
$this->updateCartItem = $updateCartItem;
58+
$this->itemRepository = $itemRepository;
59+
$this->giftMessageHelper = $giftMessageHelper;
60+
}
61+
62+
/**
63+
* Process cart items
64+
*
65+
* @param Quote $cart
66+
* @param array $items
67+
* @throws GraphQlInputException
68+
* @throws LocalizedException
69+
*/
70+
public function processCartItems(Quote $cart, array $items): void
71+
{
72+
foreach ($items as $item) {
73+
if (empty($item['cart_item_id'])) {
74+
throw new GraphQlInputException(__('Required parameter "cart_item_id" for "cart_items" is missing.'));
75+
}
76+
77+
$itemId = (int)$item['cart_item_id'];
78+
$customizableOptions = $item['customizable_options'] ?? [];
79+
$cartItem = $cart->getItemById($itemId);
80+
81+
if ($cartItem && $cartItem->getParentItemId()) {
82+
throw new GraphQlInputException(__('Child items may not be updated.'));
83+
}
84+
85+
if (count($customizableOptions) === 0 && !isset($item['quantity'])) {
86+
throw new GraphQlInputException(__('Required parameter "quantity" for "cart_items" is missing.'));
87+
}
88+
89+
$quantity = (float)$item['quantity'];
90+
91+
if ($quantity <= 0.0) {
92+
$this->cartItemRepository->deleteById((int)$cart->getId(), $itemId);
93+
} else {
94+
$this->updateCartItem->execute($cart, $itemId, $quantity, $customizableOptions);
95+
}
96+
97+
if (!empty($item['gift_message'])) {
98+
try {
99+
if (!$this->giftMessageHelper->isMessagesAllowed('items', $cartItem)) {
100+
continue;
101+
}
102+
if (!$this->giftMessageHelper->isMessagesAllowed('item', $cartItem)) {
103+
continue;
104+
}
105+
106+
/** @var MessageInterface $giftItemMessage */
107+
$giftItemMessage = $this->itemRepository->get($cart->getEntityId(), $itemId);
108+
109+
if (empty($giftItemMessage)) {
110+
continue;
111+
}
112+
} catch (LocalizedException $exception) {
113+
throw new GraphQlInputException(__('Gift Message can not be updated.'));
114+
}
115+
116+
$this->updateGiftMessageForItem($cart, $giftItemMessage, $item, $itemId);
117+
}
118+
}
119+
}
120+
121+
/**
122+
* Update Gift Message for Quote item
123+
*
124+
* @param Quote $cart
125+
* @param MessageInterface $giftItemMessage
126+
* @param array $item
127+
* @param int $itemId
128+
*
129+
* @throws GraphQlInputException
130+
*/
131+
private function updateGiftMessageForItem(Quote $cart, MessageInterface $giftItemMessage, array $item, int $itemId)
132+
{
133+
try {
134+
$giftItemMessage->setRecipient($item['gift_message']['to']);
135+
$giftItemMessage->setSender($item['gift_message']['from']);
136+
$giftItemMessage->setMessage($item['gift_message']['message']);
137+
$this->itemRepository->save($cart->getEntityId(), $giftItemMessage, $itemId);
138+
} catch (LocalizedException $exception) {
139+
throw new GraphQlInputException(__('Gift Message can not be updated'));
140+
}
141+
}
142+
}

app/code/Magento/QuoteGraphQl/Model/Resolver/UpdateCartItems.php

Lines changed: 13 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -14,53 +14,43 @@
1414
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
1515
use Magento\Framework\GraphQl\Query\ResolverInterface;
1616
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
17-
use Magento\Quote\Api\CartItemRepositoryInterface;
1817
use Magento\Quote\Api\CartRepositoryInterface;
19-
use Magento\Quote\Model\Quote;
2018
use Magento\QuoteGraphQl\Model\Cart\GetCartForUser;
21-
use Magento\QuoteGraphQl\Model\Cart\UpdateCartItem;
19+
use Magento\QuoteGraphQl\Model\CartItem\DataProvider\UpdateCartItems as UpdateCartItemsProvider;
2220

2321
/**
2422
* @inheritdoc
2523
*/
2624
class UpdateCartItems implements ResolverInterface
2725
{
28-
/**
29-
* @var UpdateCartItem
30-
*/
31-
private $updateCartItem;
32-
3326
/**
3427
* @var GetCartForUser
3528
*/
3629
private $getCartForUser;
3730

3831
/**
39-
* @var CartItemRepositoryInterface
32+
* @var CartRepositoryInterface
4033
*/
41-
private $cartItemRepository;
34+
private $cartRepository;
4235

4336
/**
44-
* @var CartRepositoryInterface
37+
* @var UpdateCartItemsProvider
4538
*/
46-
private $cartRepository;
39+
private $updateCartItems;
4740

4841
/**
49-
* @param GetCartForUser $getCartForUser
50-
* @param CartItemRepositoryInterface $cartItemRepository
51-
* @param UpdateCartItem $updateCartItem
42+
* @param GetCartForUser $getCartForUser
5243
* @param CartRepositoryInterface $cartRepository
44+
* @param UpdateCartItemsProvider $updateCartItems
5345
*/
5446
public function __construct(
5547
GetCartForUser $getCartForUser,
56-
CartItemRepositoryInterface $cartItemRepository,
57-
UpdateCartItem $updateCartItem,
58-
CartRepositoryInterface $cartRepository
48+
CartRepositoryInterface $cartRepository,
49+
UpdateCartItemsProvider $updateCartItems
5950
) {
6051
$this->getCartForUser = $getCartForUser;
61-
$this->cartItemRepository = $cartItemRepository;
62-
$this->updateCartItem = $updateCartItem;
6352
$this->cartRepository = $cartRepository;
53+
$this->updateCartItems = $updateCartItems;
6454
}
6555

6656
/**
@@ -71,20 +61,21 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
7161
if (empty($args['input']['cart_id'])) {
7262
throw new GraphQlInputException(__('Required parameter "cart_id" is missing.'));
7363
}
64+
7465
$maskedCartId = $args['input']['cart_id'];
7566

7667
if (empty($args['input']['cart_items'])
7768
|| !is_array($args['input']['cart_items'])
7869
) {
7970
throw new GraphQlInputException(__('Required parameter "cart_items" is missing.'));
8071
}
81-
$cartItems = $args['input']['cart_items'];
8272

73+
$cartItems = $args['input']['cart_items'];
8374
$storeId = (int)$context->getExtensionAttributes()->getStore()->getId();
8475
$cart = $this->getCartForUser->execute($maskedCartId, $context->getUserId(), $storeId);
8576

8677
try {
87-
$this->processCartItems($cart, $cartItems);
78+
$this->updateCartItems->processCartItems($cart, $cartItems);
8879
$this->cartRepository->save($cart);
8980
} catch (NoSuchEntityException $e) {
9081
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
@@ -98,39 +89,4 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
9889
],
9990
];
10091
}
101-
102-
/**
103-
* Process cart items
104-
*
105-
* @param Quote $cart
106-
* @param array $items
107-
* @throws GraphQlInputException
108-
* @throws LocalizedException
109-
*/
110-
private function processCartItems(Quote $cart, array $items): void
111-
{
112-
foreach ($items as $item) {
113-
if (empty($item['cart_item_id'])) {
114-
throw new GraphQlInputException(__('Required parameter "cart_item_id" for "cart_items" is missing.'));
115-
}
116-
$itemId = (int)$item['cart_item_id'];
117-
$customizableOptions = $item['customizable_options'] ?? [];
118-
119-
$cartItem = $cart->getItemById($itemId);
120-
if ($cartItem && $cartItem->getParentItemId()) {
121-
throw new GraphQlInputException(__('Child items may not be updated.'));
122-
}
123-
124-
if (count($customizableOptions) === 0 && !isset($item['quantity'])) {
125-
throw new GraphQlInputException(__('Required parameter "quantity" for "cart_items" is missing.'));
126-
}
127-
$quantity = (float)$item['quantity'];
128-
129-
if ($quantity <= 0.0) {
130-
$this->cartItemRepository->deleteById((int)$cart->getId(), $itemId);
131-
} else {
132-
$this->updateCartItem->execute($cart, $itemId, $quantity, $customizableOptions);
133-
}
134-
}
135-
}
13692
}

app/code/Magento/QuoteGraphQl/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"magento/module-customer-graph-ql": "*",
1414
"magento/module-sales": "*",
1515
"magento/module-directory": "*",
16-
"magento/module-graph-ql": "*"
16+
"magento/module-graph-ql": "*",
17+
"magento/module-gift-message": "*"
1718
},
1819
"suggest": {
1920
"magento/module-graph-ql-cache": "*"

0 commit comments

Comments
 (0)