diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related.php new file mode 100644 index 0000000000000..bd0199db2c2d2 --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related.php @@ -0,0 +1,43 @@ +getName(); + + return [ + 'model' => $product, + 'product_list_type' => $productListType + ]; + } +} diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/CrossSellProducts.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/CrossSellProducts.php new file mode 100644 index 0000000000000..59d619222399a --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/CrossSellProducts.php @@ -0,0 +1,60 @@ +dataProvider = $dataProvider; + } + + /** + * Fetches the data from persistence models and format it according to the GraphQL schema. + * + * @param \Magento\Framework\GraphQl\Config\Element\Field $field + * @param ContextInterface $context + * @param ResolveInfo $info + * @param array|null $value + * @param array|null $args + * @throws \Exception + * @return mixed|Value + */ + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) + { + $product = $value['model']; + $this->dataProvider->addFieldToSelect(self::FIELDS); + $collection = $this->dataProvider->getData($product); + + $count = 0; + foreach ($collection as $item) { + $data[$count] = $item->getData(); + $data[$count]['model'] = $item; + $count++; + } + return $data; + } + +} \ No newline at end of file diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/RelatedProducts.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/RelatedProducts.php new file mode 100644 index 0000000000000..bfaed0279b59c --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/RelatedProducts.php @@ -0,0 +1,71 @@ +dataProvider = $dataProvider; + } + + /** + * Fetches the data from persistence models and format it according to the GraphQL schema. + * + * @param \Magento\Framework\GraphQl\Config\Element\Field $field + * @param ContextInterface $context + * @param ResolveInfo $info + * @param array|null $value + * @param array|null $args + * @throws \Exception + * @return mixed|Value + */ + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) + { + $product = $value['model']; + $this->dataProvider->addFieldToSelect(self::FIELDS); + $collection = $this->dataProvider->getData($product); + + $count = 0; + $data = []; + foreach ($collection as $item) { + $data[$count] = $item->getData(); + $data[$count]['model'] = $item; + $count++; + } + return $data; + } + +} \ No newline at end of file diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/UpSellProducts.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/UpSellProducts.php new file mode 100644 index 0000000000000..82980eb338b47 --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Related/UpSellProducts.php @@ -0,0 +1,70 @@ +dataProvider = $dataProvider; + } + + /** + * Fetches the data from persistence models and format it according to the GraphQL schema. + * + * @param \Magento\Framework\GraphQl\Config\Element\Field $field + * @param ContextInterface $context + * @param ResolveInfo $info + * @param array|null $value + * @param array|null $args + * @throws \Exception + * @return mixed|Value + */ + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) + { + $product = $value['model']; + $this->dataProvider->addFieldToSelect(self::FIELDS); + $collection = $this->dataProvider->getData($product); + + $count = 0; + $data = []; + foreach ($collection as $item) { + $data[$count] = $item->getData(); + $data[$count]['model'] = $item; + $count++; + } + return $data; + } + +} \ No newline at end of file diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/AbstractDataProvider.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/AbstractDataProvider.php new file mode 100644 index 0000000000000..4dcff69e07aaa --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/AbstractDataProvider.php @@ -0,0 +1,70 @@ +fields = $field; + } + + + /** + * @return array + */ + public function getFields(): array + { + return $this->fields; + } + + /** + * @return mixed + */ + public function getCollection() + { + return $this->collection; + } + + /** + * @param $product + * @return mixed + */ + public function getData($product) + { + $this->prepareCollection($product); + return $this->collection; + + } + + /** + * @param $product + */ + protected function prepareCollection($product): void + { + $this->collection = $product->getRelatedProducts(); + $this->collection->addAttributeToSelect($this->getFields()); + } + + +} \ No newline at end of file diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/CrossSellDataProvider.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/CrossSellDataProvider.php new file mode 100644 index 0000000000000..cc238d1179699 --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/CrossSellDataProvider.php @@ -0,0 +1,26 @@ +collection = $product->getCrossSellProductCollection(); + $this->collection->addAttributeToSelect($this->getFields()); + } + +} \ No newline at end of file diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/RelatedDataProvider.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/RelatedDataProvider.php new file mode 100644 index 0000000000000..3adc193c1c2bb --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/RelatedDataProvider.php @@ -0,0 +1,18 @@ +collection = $product->getRelatedProductCollection(); + $this->collection->addAttributeToSelect($this->getFields()); + } + + +} \ No newline at end of file diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/UpSellDataProvider.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/UpSellDataProvider.php new file mode 100644 index 0000000000000..03bd7793fab32 --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Related/UpSellDataProvider.php @@ -0,0 +1,25 @@ +collection = $product->getUpSellProductCollection(); + $this->collection->addAttributeToSelect($this->getFields()); + } +} \ No newline at end of file diff --git a/app/code/Magento/CatalogGraphQl/etc/schema.graphqls b/app/code/Magento/CatalogGraphQl/etc/schema.graphqls index e2eab9121e332..c56bfb4574c6d 100644 --- a/app/code/Magento/CatalogGraphQl/etc/schema.graphqls +++ b/app/code/Magento/CatalogGraphQl/etc/schema.graphqls @@ -225,10 +225,10 @@ type ProductPrices @doc(description: "The ProductPrices object contains the regu regularPrice: Price @doc(description: "The base price of a product.") } -type ProductLinks implements ProductLinksInterface @doc(description: "ProductLinks is an implementation of ProductLinksInterface.") { +type Related implements ProductLinksInterface @doc(description: "Related is an implementation of ProductLinksInterface.") { } -interface ProductLinksInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\ProductLinkTypeResolverComposite") @doc(description:"ProductLinks contains information about linked products, including the link type and product type of each item.") { +interface ProductLinksInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\ProductLinkTypeResolverComposite") @doc(description:"Related contains information about linked products, including the link type and product type of each item.") { sku: String @doc(description: "The identifier of the linked product") link_type: String @doc(description: "One of related, associated, upsell, or crosssell") linked_product_sku: String @doc(description: "The SKU of the linked product") @@ -269,8 +269,11 @@ interface ProductInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\ country_of_manufacture: String @doc(description: "The product's country of origin") type_id: String @doc(description: "One of simple, virtual, bundle, downloadable, grouped, or configurable") websites: [Website] @doc(description: "An array of websites in which the product is available") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Websites") - product_links: [ProductLinksInterface] @doc(description: "An array of ProductLinks objects") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductLinks") + product_links: [ProductLinksInterface] @doc(description: "An array of Related objects") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Related") media_gallery_entries: [MediaGalleryEntry] @doc(description: "An array of MediaGalleryEntry objects") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\MediaGalleryEntries") + related_products: RelatedProduct @doc(description: "RelatedProduct") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Related") + upsell_products: UpsellProduct @doc(description: "RelatedProduct") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Related") + crosssell_products: CrosssellProduct @doc(description: "RelatedProduct") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Related") tier_prices: [ProductTierPrices] @doc(description: "An array of ProductTierPrices objects") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\TierPrices") price: ProductPrices @doc(description: "A ProductPrices object, indicating the price of an item") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Price") gift_message_available: String @doc(description: "Indicates whether a gift message is available") @@ -526,6 +529,15 @@ type MediaGalleryEntry @doc(description: "MediaGalleryEntry defines characteris content: ProductMediaGalleryEntriesContent @doc(description: "Contains a ProductMediaGalleryEntriesContent object") video_content: ProductMediaGalleryEntriesVideoContent @doc(description: "Contains a ProductMediaGalleryEntriesVideoContent object") } +type RelatedProduct @doc(description: "RelatedProduct"){ + items: [ProductInterface] @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Related\\RelatedProducts") +} +type UpsellProduct @doc(description: "UpsellProduct"){ + items: [ProductInterface] @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Related\\UpSellProducts") +} +type CrosssellProduct @doc(description: "CrosssellProduct"){ + items: [ProductInterface] @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Related\\CrossSellProducts") +} type LayerFilter { name: String @doc(description: "Layered navigation filter name")