diff --git a/CHANGELOG.md b/CHANGELOG.md index 87a103bf..2993afb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] +- Parameter `groupBy` into `recommendations` and `productRecommendations` resolvers and `groupByProduct` in `crossSelling` search client. ## [1.67.1] - 2023-10-18 diff --git a/node/clients/search.ts b/node/clients/search.ts index c29c10ce..8365fc79 100644 --- a/node/clients/search.ts +++ b/node/clients/search.ts @@ -308,9 +308,9 @@ export class Search extends AppClient { metric: 'search-category', }) - public crossSelling = (id: string, type: SearchCrossSellingTypes) => + public crossSelling = (id: string, type: SearchCrossSellingTypes, groupByProduct = true) => this.get( - `/pub/products/crossselling/${type}/${id}?groupByProduct=true`, + `/pub/products/crossselling/${type}/${id}?groupByProduct=${groupByProduct}`, { metric: 'search-crossSelling', } diff --git a/node/package.json b/node/package.json index fbbf4ea3..b8bbca00 100644 --- a/node/package.json +++ b/node/package.json @@ -46,7 +46,7 @@ "@types/node": "^12.0.0", "@types/qs": "^6.5.1", "@types/ramda": "^0.26.21", - "@vtex/api": "6.45.22", + "@vtex/api": "6.46.1", "@vtex/tsconfig": "^0.6.0", "eslint": "^5.15.3", "eslint-config-vtex": "^10.1.0", diff --git a/node/resolvers/search/index.ts b/node/resolvers/search/index.ts index d28bbab7..48985eb7 100644 --- a/node/resolvers/search/index.ts +++ b/node/resolvers/search/index.ts @@ -58,9 +58,15 @@ enum CrossSellingInput { accessories = 'accessories', } +enum CrossSellingGroupByInput { + PRODUCT = 'PRODUCT', + NONE = 'NONE', +} + interface ProductRecommendationArg { identifier?: ProductIndentifier type?: CrossSellingInput + groupBy?: CrossSellingGroupByInput } interface ProductsByIdentifierArgs { @@ -585,7 +591,7 @@ export const queries = { productRecommendations: async ( _: any, - { identifier, type }: ProductRecommendationArg, + { identifier, type, groupBy }: ProductRecommendationArg, ctx: Context ) => { if (identifier == null || type == null) { @@ -598,9 +604,12 @@ export const queries = { productId = product!.productId } + const groupByProduct = groupBy === CrossSellingGroupByInput.PRODUCT ? true : false + const products = await ctx.clients.search.crossSelling( productId, - searchType + searchType, + groupByProduct ) searchFirstElements(products, 0, ctx.clients.search) diff --git a/node/resolvers/search/product.ts b/node/resolvers/search/product.ts index d9fec90a..0e2aef30 100644 --- a/node/resolvers/search/product.ts +++ b/node/resolvers/search/product.ts @@ -235,7 +235,10 @@ export const resolvers = { return objToNameValue('name', 'values', omit(notPG, product)) }, - recommendations: (product: SearchProduct) => product, + recommendations: (product: SearchProduct, args: any) => { + const { groupBy } = args + return { product, groupBy } + }, description: formatTranslatableProp( 'description', diff --git a/node/resolvers/search/recommendation.ts b/node/resolvers/search/recommendation.ts index 71cba121..a46072ba 100644 --- a/node/resolvers/search/recommendation.ts +++ b/node/resolvers/search/recommendation.ts @@ -1,28 +1,64 @@ -import { SearchCrossSellingTypes } from './utils' +import { GroupByCrossSellingTypes, SearchCrossSellingTypes } from './utils' + +interface RecommendationParentProps { + product: SearchProduct + groupBy: string +} export const resolvers = { Recommendation: { buy: ( - { productId }: SearchProduct, + { product: {productId}, + groupBy = GroupByCrossSellingTypes.PRODUCT + }: RecommendationParentProps, _: any, { clients: { search } }: Context ) => - search.crossSelling( + { + const groupByProduct = + groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false + + return search.crossSelling( productId, - SearchCrossSellingTypes.whoboughtalsobought - ), + SearchCrossSellingTypes.whoboughtalsobought, + groupByProduct + ) + }, similars: ( - { productId }: SearchProduct, + { product: {productId}, + groupBy = GroupByCrossSellingTypes.PRODUCT + }: RecommendationParentProps, _: any, { clients: { search } }: Context - ) => search.crossSelling(productId, SearchCrossSellingTypes.similars), + ) => + { + const groupByProduct = + groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false + + return search.crossSelling( + productId, + SearchCrossSellingTypes.similars, + groupByProduct + ) + }, view: ( - { productId }: SearchProduct, + { product: {productId}, + groupBy = GroupByCrossSellingTypes.PRODUCT + }: RecommendationParentProps, _: any, { clients: { search } }: Context ) => - search.crossSelling(productId, SearchCrossSellingTypes.whosawalsosaw), + { + const groupByProduct = + groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false + + return search.crossSelling( + productId, + SearchCrossSellingTypes.whosawalsosaw, + groupByProduct + ) + }, }, } diff --git a/node/resolvers/search/utils.ts b/node/resolvers/search/utils.ts index 97d0008f..75d262bb 100644 --- a/node/resolvers/search/utils.ts +++ b/node/resolvers/search/utils.ts @@ -14,6 +14,11 @@ export enum SearchCrossSellingTypes { suggestions = 'suggestions', } +export enum GroupByCrossSellingTypes { + PRODUCT = 'PRODUCT', + NONE = 'NONE', +} + const pageTypeMapping: Record = { Brand: 'brand', Department: 'department', diff --git a/node/yarn.lock b/node/yarn.lock index 7abe0a79..dc79d503 100644 --- a/node/yarn.lock +++ b/node/yarn.lock @@ -780,10 +780,10 @@ lodash.unescape "4.0.1" semver "5.5.0" -"@vtex/api@6.45.22": - version "6.45.22" - resolved "https://registry.yarnpkg.com/@vtex/api/-/api-6.45.22.tgz#fa9bbfde1a4d4fbbaf6cce9f6dbc9bb9ee929ba3" - integrity sha512-g5cGUDhF4FADgSMpQmce/bnIZumwGlPG2cabwbQKIQ+cCFMZqOEM/n+YQb1+S8bCyHkzW3u/ZABoyCKi5/nxxg== +"@vtex/api@6.46.1": + version "6.46.1" + resolved "https://registry.yarnpkg.com/@vtex/api/-/api-6.46.1.tgz#55a8755ae48f5400e7f1ed1921cd547950bb7a2a" + integrity sha512-geoxVvyWoQpOQ70Zmx3M8SBkRoGOS/bp9Gy26M+iCue63jofVSwmFz1zf66EaHA1PKOJNRgQPFwY+oeDE1U2lQ== dependencies: "@types/koa" "^2.11.0" "@types/koa-compose" "^3.2.3"