Skip to content

Commit 2747b23

Browse files
authored
ENGCOM-4221: Add configurable product to Cart #224
2 parents 92118f5 + 851dbab commit 2747b23

File tree

6 files changed

+128
-0
lines changed

6 files changed

+128
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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\ConfigurableProductGraphQl\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 configurable products to cart GraphQl resolver
21+
* {@inheritdoc}
22+
*/
23+
class AddConfigurableProductsToCart implements ResolverInterface
24+
{
25+
/**
26+
* @var ArrayManager
27+
*/
28+
private $arrayManager;
29+
30+
/**
31+
* @var GetCartForUser
32+
*/
33+
private $getCartForUser;
34+
35+
/**
36+
* @var AddProductsToCart
37+
*/
38+
private $addProductsToCart;
39+
40+
/**
41+
* @var ExtractDataFromCart
42+
*/
43+
private $extractDataFromCart;
44+
45+
/**
46+
* @param ArrayManager $arrayManager
47+
* @param GetCartForUser $getCartForUser
48+
* @param AddProductsToCart $addProductsToCart
49+
* @param ExtractDataFromCart $extractDataFromCart
50+
*/
51+
public function __construct(
52+
ArrayManager $arrayManager,
53+
GetCartForUser $getCartForUser,
54+
AddProductsToCart $addProductsToCart,
55+
ExtractDataFromCart $extractDataFromCart
56+
) {
57+
$this->arrayManager = $arrayManager;
58+
$this->getCartForUser = $getCartForUser;
59+
$this->addProductsToCart = $addProductsToCart;
60+
$this->extractDataFromCart = $extractDataFromCart;
61+
}
62+
63+
/**
64+
* @inheritdoc
65+
*/
66+
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
67+
{
68+
$cartHash = $this->arrayManager->get('input/cart_id', $args);
69+
$cartItems = $this->arrayManager->get('input/cartItems', $args);
70+
71+
if (!isset($cartHash)) {
72+
throw new GraphQlInputException(__('Missing key "cart_id" in cart data'));
73+
}
74+
75+
if (!isset($cartItems) || !is_array($cartItems) || empty($cartItems)) {
76+
throw new GraphQlInputException(__('Missing key "cartItems" in cart data'));
77+
}
78+
79+
$currentUserId = $context->getUserId();
80+
$cart = $this->getCartForUser->execute((string)$cartHash, $currentUserId);
81+
82+
$this->addProductsToCart->execute($cart, $cartItems);
83+
$cartData = $this->extractDataFromCart->execute($cart);
84+
85+
return [
86+
'cart' => $cartData,
87+
];
88+
}
89+
}

app/code/Magento/ConfigurableProductGraphQl/composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"magento/module-catalog": "*",
88
"magento/module-configurable-product": "*",
99
"magento/module-catalog-graph-ql": "*",
10+
"magento/module-quote-graph-ql": "*",
1011
"magento/framework": "*"
1112
},
1213
"license": [

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

+30
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Copyright © Magento, Inc. All rights reserved.
22
# See COPYING.txt for license details.
3+
type Mutation {
4+
addConfigurableProductsToCart(input: AddConfigurableProductsToCartInput): AddConfigurableProductsToCartOutput @resolver(class: "Magento\\ConfigurableProductGraphQl\\Model\\Resolver\\AddConfigurableProductsToCart")
5+
}
36

47
type ConfigurableProduct implements ProductInterface, PhysicalProductInterface, CustomizableProductInterface @doc(description: "ConfigurableProduct defines basic features of a configurable product and its simple product variants") {
58
variants: [ConfigurableVariant] @doc(description: "An array of variants of products") @resolver(class: "Magento\\ConfigurableProductGraphQl\\Model\\Resolver\\ConfigurableVariant")
@@ -35,3 +38,30 @@ type ConfigurableProductOptionsValues @doc(description: "ConfigurableProductOpti
3538
store_label: String @doc(description: "The label of the product on the current store")
3639
use_default_value: Boolean @doc(description: "Indicates whether to use the default_label")
3740
}
41+
42+
input AddConfigurableProductsToCartInput {
43+
cart_id: String!
44+
cartItems: [ConfigurableProductCartItemInput!]!
45+
}
46+
47+
type AddConfigurableProductsToCartOutput {
48+
cart: Cart!
49+
}
50+
51+
input ConfigurableProductCartItemInput {
52+
data: CartItemDetailsInput!
53+
variant_sku: String!
54+
customizable_options:[CustomizableOptionInput!]
55+
}
56+
57+
type ConfigurableCartItem implements CartItemInterface {
58+
customizable_options: [SelectedCustomizableOption]!
59+
configurable_options: [SelectedConfigurableOption!]!
60+
}
61+
62+
type SelectedConfigurableOption {
63+
id: Int!
64+
option_label: String!
65+
value_id: Int!
66+
value_label: String!
67+
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ public function __construct(
4545
* @param Quote $cart
4646
* @param array $cartItems
4747
* @throws GraphQlInputException
48+
* @throws \Magento\Framework\Exception\LocalizedException
49+
* @throws \Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException
4850
*/
4951
public function execute(Quote $cart, array $cartItems): void
5052
{

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

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public function __construct(
6161
* @return void
6262
* @throws GraphQlNoSuchEntityException
6363
* @throws GraphQlInputException
64+
* @throws \Magento\Framework\Exception\LocalizedException
6465
*/
6566
public function execute(Quote $cart, array $cartItemData): void
6667
{

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

+5
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,8 @@ type CartItemSelectedOptionValuePrice {
214214
units: String!
215215
type: PriceTypeEnum!
216216
}
217+
218+
input CartItemDetailsInput {
219+
sku: String!
220+
qty: Float!
221+
}

0 commit comments

Comments
 (0)