Skip to content

Commit 291bc0b

Browse files
committed
Add virtual products to cart
1 parent d1ebc17 commit 291bc0b

File tree

3 files changed

+124
-1
lines changed

3 files changed

+124
-1
lines changed

app/code/Magento/QuoteGraphQl/Model/Cart/ExtractDataFromCart.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,36 @@
77

88
namespace Magento\QuoteGraphQl\Model\Cart;
99

10+
use Magento\Framework\Exception\NoSuchEntityException;
1011
use Magento\Quote\Model\Quote;
1112
use Magento\Quote\Model\Quote\Item as QuoteItem;
13+
use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface;
1214

1315
/**
1416
* Extract data from cart
1517
*/
1618
class ExtractDataFromCart
1719
{
20+
/**
21+
* @var QuoteIdToMaskedQuoteIdInterface
22+
*/
23+
private $quoteIdToMaskedQuoteId;
24+
25+
/**
26+
* @param QuoteIdToMaskedQuoteIdInterface $quoteIdToMaskedQuoteId
27+
*/
28+
public function __construct(
29+
QuoteIdToMaskedQuoteIdInterface $quoteIdToMaskedQuoteId
30+
) {
31+
$this->quoteIdToMaskedQuoteId = $quoteIdToMaskedQuoteId;
32+
}
33+
1834
/**
1935
* Extract data from cart
2036
*
2137
* @param Quote $cart
2238
* @return array
39+
* @throws NoSuchEntityException
2340
*/
2441
public function execute(Quote $cart): array
2542
{
@@ -41,7 +58,8 @@ public function execute(Quote $cart): array
4158
}
4259

4360
return [
44-
'items' => $items,
61+
'cart_id' => $this->quoteIdToMaskedQuoteId->execute((int)$cart->getId()),
62+
'items' => $items
4563
];
4664
}
4765
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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\Resolver;
9+
10+
use Magento\Framework\GraphQl\Config\Element\Field;
11+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
12+
use Magento\Framework\GraphQl\Query\ResolverInterface;
13+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
14+
use Magento\Framework\Stdlib\ArrayManager;
15+
use Magento\QuoteGraphQl\Model\Cart\AddProductsToCart;
16+
use Magento\QuoteGraphQl\Model\Cart\ExtractDataFromCart;
17+
use Magento\QuoteGraphQl\Model\Cart\GetCartForUser;
18+
19+
/**
20+
* Add virtual products to cart GraphQl resolver
21+
*
22+
* {@inheritdoc}
23+
*/
24+
class AddVirtualProductsToCart implements ResolverInterface
25+
{
26+
/**
27+
* @var ArrayManager
28+
*/
29+
private $arrayManager;
30+
31+
/**
32+
* @var GetCartForUser
33+
*/
34+
private $getCartForUser;
35+
36+
/**
37+
* @var AddProductsToCart
38+
*/
39+
private $addProductsToCart;
40+
41+
/**
42+
* @var ExtractDataFromCart
43+
*/
44+
private $extractDataFromCart;
45+
46+
/**
47+
* @param ArrayManager $arrayManager
48+
* @param GetCartForUser $getCartForUser
49+
* @param AddProductsToCart $addProductsToCart
50+
* @param ExtractDataFromCart $extractDataFromCart
51+
*/
52+
public function __construct(
53+
ArrayManager $arrayManager,
54+
GetCartForUser $getCartForUser,
55+
AddProductsToCart $addProductsToCart,
56+
ExtractDataFromCart $extractDataFromCart
57+
) {
58+
$this->arrayManager = $arrayManager;
59+
$this->getCartForUser = $getCartForUser;
60+
$this->addProductsToCart = $addProductsToCart;
61+
$this->extractDataFromCart = $extractDataFromCart;
62+
}
63+
64+
/**
65+
* @inheritdoc
66+
*/
67+
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
68+
{
69+
$cartHash = $this->arrayManager->get('input/cart_id', $args);
70+
$cartItems = $this->arrayManager->get('input/cartItems', $args);
71+
72+
if (!isset($cartHash)) {
73+
throw new GraphQlInputException(__('Missing key "cart_id" in cart data'));
74+
}
75+
76+
if (!isset($cartItems) || !is_array($cartItems) || empty($cartItems)) {
77+
throw new GraphQlInputException(__('Missing key "cartItems" in cart data'));
78+
}
79+
80+
$currentUserId = $context->getUserId();
81+
$cart = $this->getCartForUser->execute((string)$cartHash, $currentUserId);
82+
83+
$this->addProductsToCart->execute($cart, $cartItems);
84+
$cartData = $this->extractDataFromCart->execute($cart);
85+
86+
return [
87+
'cart' => $cartData,
88+
];
89+
}
90+
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type Mutation {
1515
setBillingAddressOnCart(input: SetBillingAddressOnCartInput): SetBillingAddressOnCartOutput
1616
setShippingMethodsOnCart(input: SetShippingMethodsOnCartInput): SetShippingMethodsOnCartOutput @resolver(class: "\\Magento\\QuoteGraphQl\\Model\\Resolver\\SetShippingMethodsOnCart")
1717
addSimpleProductsToCart(input: AddSimpleProductsToCartInput): AddSimpleProductsToCartOutput @resolver(class: "Magento\\QuoteGraphQl\\Model\\Resolver\\AddSimpleProductsToCart")
18+
addVirtualProductsToCart(input: AddVirtualProductsToCartInput): AddVirtualProductsToCartOutput @resolver(class: "Magento\\QuoteGraphQl\\Model\\Resolver\\AddVirtualProductsToCart")
1819
}
1920

2021
input SetShippingAddressesOnCartInput {
@@ -167,11 +168,21 @@ input AddSimpleProductsToCartInput {
167168
cartItems: [SimpleProductCartItemInput!]!
168169
}
169170

171+
input AddVirtualProductsToCartInput {
172+
cart_id: String!
173+
cartItems: [VirtualProductCartItemInput!]!
174+
}
175+
170176
input SimpleProductCartItemInput {
171177
data: CartItemInput!
172178
customizable_options:[CustomizableOptionInput!]
173179
}
174180

181+
input VirtualProductCartItemInput {
182+
data: CartItemInput!
183+
customizable_options:[CustomizableOptionInput!]
184+
}
185+
175186
input CustomizableOptionInput {
176187
id: Int!
177188
value: String!
@@ -181,6 +192,10 @@ type AddSimpleProductsToCartOutput {
181192
cart: Cart!
182193
}
183194

195+
type AddVirtualProductsToCartOutput {
196+
cart: Cart!
197+
}
198+
184199
type SimpleCartItem implements CartItemInterface @doc(description: "Simple Cart Item") {
185200
customizable_options: [SelectedCustomizableOption] @resolver(class: "Magento\\QuoteGraphQl\\Model\\Resolver\\CustomizableOptions")
186201
}

0 commit comments

Comments
 (0)