diff -Nru magento/module-quote-graph-ql-orig/Model/Resolver/CartItemErrors.php magento/module-quote-graph-ql/Model/Resolver/CartItemErrors.php --- magento/module-quote-graph-ql-orig/Model/Resolver/CartItemErrors.php 1970-01-01 01:00:00 +++ magento/module-quote-graph-ql/Model/Resolver/CartItemErrors.php 2022-12-12 11:08:22 @@ -0,0 +1,86 @@ +enumLookup = $enumLookup; + } + + /** + * @inheritdoc + */ + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) + { + if (!isset($value['model'])) { + throw new LocalizedException(__('"model" value should be specified')); + } + /** @var Item $cartItem */ + $cartItem = $value['model']; + + return $this->getItemErrors($cartItem); + } + + /** + * Get error messages for cart item + * + * @param Item $cartItem + * @return string[]|null + * @throws RuntimeException + */ + private function getItemErrors(Item $cartItem): ?array + { + $hasError = (bool) $cartItem->getData('has_error'); + if (!$hasError) { + return null; + } + + $errors = []; + foreach ($cartItem->getErrorInfos() as $error) { + $errorType = $error['code'] ?? self::ERROR_UNDEFINED; + $message = $error['message'] ?? $cartItem->getMessage(); + $errorEnumCode = $this->enumLookup->getEnumValueFromField( + 'CartItemErrorType', + (string)$errorType + ); + $errors[$message] = [ + 'code' => $errorEnumCode, + 'message' => $message + ]; + } + + return array_values($errors); + } +} diff -Nru magento/module-quote-graph-ql-orig/Model/Resolver/CartItems.php magento/module-quote-graph-ql/Model/Resolver/CartItems.php --- magento/module-quote-graph-ql-orig/Model/Resolver/CartItems.php 2021-07-13 21:08:00 +++ magento/module-quote-graph-ql/Model/Resolver/CartItems.php 2022-12-12 10:53:20 @@ -54,13 +54,6 @@ $cart = $value['model']; $itemsData = []; - if ($cart->getData('has_error')) { - $errors = $cart->getErrors(); - foreach ($errors as $error) { - $itemsData[] = new GraphQlInputException(__($error->getText())); - } - } - $cartProductsData = $this->getCartProductsData($cart); $cartItems = $cart->getAllVisibleItems(); /** @var QuoteItem $cartItem */ diff -Nru magento/module-quote-graph-ql-orig/etc/graphql/di.xml magento/module-quote-graph-ql/etc/graphql/di.xml --- magento/module-quote-graph-ql-orig/etc/graphql/di.xml 2021-07-13 21:08:00 +++ magento/module-quote-graph-ql/etc/graphql/di.xml 2022-12-12 11:06:31 @@ -20,4 +20,15 @@ + + + + + 0 + 1 + 2 + + + + diff -Nru magento/module-quote-graph-ql-orig/etc/schema.graphqls magento/module-quote-graph-ql/etc/schema.graphqls --- magento/module-quote-graph-ql-orig/etc/schema.graphqls 2021-07-13 21:08:00 +++ magento/module-quote-graph-ql/etc/schema.graphqls 2022-12-12 11:06:31 @@ -335,6 +335,18 @@ quantity: Float! prices: CartItemPrices @resolver(class: "\\Magento\\QuoteGraphQl\\Model\\Resolver\\CartItemPrices") product: ProductInterface! + errors: [CartItemError!] @resolver(class: "\\Magento\\QuoteGraphQl\\Model\\Resolver\\CartItemErrors") @doc(description: "An array of errors encountered while loading the cart item") +} + +type CartItemError { + code: CartItemErrorType! @doc(description: "An error code that describes the error encountered") + message: String! @doc(description: "A localized error message") +} + +enum CartItemErrorType { + UNDEFINED + ITEM_QTY + ITEM_INCREMENTS } type Discount @doc(description:"Defines an individual discount. A discount can be applied to the cart as a whole or to an item.") {