From cafef57ac94c857cc5464f03ef2d9efe5f81db76 Mon Sep 17 00:00:00 2001 From: Iago Date: Fri, 8 Mar 2024 15:41:30 -0300 Subject: [PATCH 1/4] feat: possibility to choose how to group products in recommendations --- CHANGELOG.md | 1 + node/clients/search.ts | 7 +++--- node/package.json | 2 +- node/resolvers/search/index.ts | 13 ++++++++-- node/resolvers/search/product.ts | 5 +++- node/resolvers/search/recommendation.ts | 32 +++++++++++++++++-------- node/resolvers/search/utils.ts | 5 ++++ node/yarn.lock | 8 +++---- 8 files changed, 52 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87a103bf..654ceb6e 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` client. ## [1.67.1] - 2023-10-18 diff --git a/node/clients/search.ts b/node/clients/search.ts index c29c10ce..1cd9a9b5 100644 --- a/node/clients/search.ts +++ b/node/clients/search.ts @@ -308,13 +308,14 @@ export class Search extends AppClient { metric: 'search-category', }) - public crossSelling = (id: string, type: SearchCrossSellingTypes) => - this.get( - `/pub/products/crossselling/${type}/${id}?groupByProduct=true`, + public crossSelling = (id: string, type: SearchCrossSellingTypes, groupByProduct = true) =>{ + return this.get( + `/pub/products/crossselling/${type}/${id}?groupByProduct=${groupByProduct}`, { metric: 'search-crossSelling', } ) + } public filtersInCategoryFromId = (id: string | number) => this.get( 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..c8122ac2 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..f8bfda1e 100644 --- a/node/resolvers/search/recommendation.ts +++ b/node/resolvers/search/recommendation.ts @@ -1,28 +1,40 @@ -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( - productId, - SearchCrossSellingTypes.whoboughtalsobought - ), + { + const groupByProduct = groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false + return search.crossSelling(productId, 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" From 92f3a609cb3cbda9107d80200c23b93d3ee05338 Mon Sep 17 00:00:00 2001 From: Iago Date: Fri, 8 Mar 2024 15:41:46 -0300 Subject: [PATCH 2/4] feat: possibility to choose how to group products in recommendations --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 654ceb6e..2993afb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +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` client. +- Parameter `groupBy` into `recommendations` and `productRecommendations` resolvers and `groupByProduct` in `crossSelling` search client. ## [1.67.1] - 2023-10-18 From cdb4c84910728e065474993c865d679acadbec31 Mon Sep 17 00:00:00 2001 From: Iago Date: Fri, 8 Mar 2024 15:53:33 -0300 Subject: [PATCH 3/4] feat: possibility to choose how to group products in recommendations --- node/resolvers/search/product.ts | 2 +- node/resolvers/search/recommendation.ts | 44 +++++++++++++++++++------ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/node/resolvers/search/product.ts b/node/resolvers/search/product.ts index c8122ac2..0e2aef30 100644 --- a/node/resolvers/search/product.ts +++ b/node/resolvers/search/product.ts @@ -237,7 +237,7 @@ export const resolvers = { recommendations: (product: SearchProduct, args: any) => { const { groupBy } = args - return {product, groupBy} + return { product, groupBy } }, description: formatTranslatableProp( diff --git a/node/resolvers/search/recommendation.ts b/node/resolvers/search/recommendation.ts index f8bfda1e..a46072ba 100644 --- a/node/resolvers/search/recommendation.ts +++ b/node/resolvers/search/recommendation.ts @@ -1,40 +1,64 @@ import { GroupByCrossSellingTypes, SearchCrossSellingTypes } from './utils' interface RecommendationParentProps { - product: SearchProduct, + product: SearchProduct groupBy: string } export const resolvers = { Recommendation: { buy: ( - { product: {productId} , groupBy = GroupByCrossSellingTypes.PRODUCT}: RecommendationParentProps, + { product: {productId}, + groupBy = GroupByCrossSellingTypes.PRODUCT + }: RecommendationParentProps, _: any, { clients: { search } }: Context ) => { - const groupByProduct = groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false - return search.crossSelling(productId, SearchCrossSellingTypes.whoboughtalsobought, groupByProduct) + const groupByProduct = + groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false + + return search.crossSelling( + productId, + SearchCrossSellingTypes.whoboughtalsobought, + groupByProduct + ) }, similars: ( - { product: {productId} , groupBy = GroupByCrossSellingTypes.PRODUCT}: RecommendationParentProps, + { product: {productId}, + groupBy = GroupByCrossSellingTypes.PRODUCT + }: RecommendationParentProps, _: any, { clients: { search } }: Context ) => { - const groupByProduct = groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false - return search.crossSelling(productId, SearchCrossSellingTypes.similars, groupByProduct) + const groupByProduct = + groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false + + return search.crossSelling( + productId, + SearchCrossSellingTypes.similars, + groupByProduct + ) }, view: ( - { product: {productId} , groupBy = GroupByCrossSellingTypes.PRODUCT}: RecommendationParentProps, + { product: {productId}, + groupBy = GroupByCrossSellingTypes.PRODUCT + }: RecommendationParentProps, _: any, { clients: { search } }: Context ) => { - const groupByProduct = groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false - return search.crossSelling(productId, SearchCrossSellingTypes.whosawalsosaw, groupByProduct) + const groupByProduct = + groupBy === GroupByCrossSellingTypes.PRODUCT ? true : false + + return search.crossSelling( + productId, + SearchCrossSellingTypes.whosawalsosaw, + groupByProduct + ) }, }, } From 289729ca54162875494cfe606f026cd5165d53f2 Mon Sep 17 00:00:00 2001 From: Iago Date: Fri, 8 Mar 2024 15:55:46 -0300 Subject: [PATCH 4/4] feat: possibility to choose how to group products in recommendations --- node/clients/search.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/node/clients/search.ts b/node/clients/search.ts index 1cd9a9b5..8365fc79 100644 --- a/node/clients/search.ts +++ b/node/clients/search.ts @@ -308,14 +308,13 @@ export class Search extends AppClient { metric: 'search-category', }) - public crossSelling = (id: string, type: SearchCrossSellingTypes, groupByProduct = true) =>{ - return this.get( + public crossSelling = (id: string, type: SearchCrossSellingTypes, groupByProduct = true) => + this.get( `/pub/products/crossselling/${type}/${id}?groupByProduct=${groupByProduct}`, { metric: 'search-crossSelling', } ) - } public filtersInCategoryFromId = (id: string | number) => this.get(