Skip to content

Commit 6882ec8

Browse files
feat(recommend): Add trending types and methods (#1396)
Co-authored-by: Clément Vannicatte <20689156+shortcuts@users.noreply.github.com>
1 parent ede7a4b commit 6882ec8

15 files changed

Lines changed: 258 additions & 7 deletions

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
},
106106
{
107107
"path": "packages/recommend/dist/recommend.umd.js",
108-
"maxSize": "4.1KB"
108+
"maxSize": "4.2KB"
109109
}
110110
]
111111
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import{TestSuite}from'../../../client-common/src/__tests__/TestSuite';
2+
3+
constrecommend=newTestSuite('recommend').recommend;
4+
5+
functioncreateMockedClient(){
6+
constclient=recommend('appId','apiKey');
7+
jest.spyOn(client.transporter,'read').mockImplementation(()=>Promise.resolve());
8+
9+
returnclient;
10+
}
11+
12+
describe('getTrendingFacets',()=>{
13+
test('builds the request',async()=>{
14+
constclient=createMockedClient();
15+
16+
awaitclient.getTrendingFacets(
17+
[
18+
{
19+
indexName: 'products',
20+
facetName: 'company',
21+
},
22+
],
23+
{}
24+
);
25+
26+
expect(client.transporter.read).toHaveBeenCalledTimes(1);
27+
expect(client.transporter.read).toHaveBeenCalledWith(
28+
{
29+
cacheable: true,
30+
data: {
31+
requests: [
32+
{
33+
indexName: 'products',
34+
model: 'trending-facets',
35+
facetName: 'company',
36+
threshold: 0,
37+
},
38+
],
39+
},
40+
method: 'POST',
41+
path: '1/indexes/*/recommendations',
42+
},
43+
{}
44+
);
45+
});
46+
});
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import{TestSuite}from'../../../client-common/src/__tests__/TestSuite';
2+
3+
constrecommend=newTestSuite('recommend').recommend;
4+
5+
functioncreateMockedClient(){
6+
constclient=recommend('appId','apiKey');
7+
jest.spyOn(client.transporter,'read').mockImplementation(()=>Promise.resolve());
8+
9+
returnclient;
10+
}
11+
12+
describe('getTrendingItems',()=>{
13+
test('builds the request',async()=>{
14+
constclient=createMockedClient();
15+
16+
awaitclient.getTrendingItems(
17+
[
18+
{
19+
indexName: 'products',
20+
},
21+
],
22+
{}
23+
);
24+
25+
expect(client.transporter.read).toHaveBeenCalledTimes(1);
26+
expect(client.transporter.read).toHaveBeenCalledWith(
27+
{
28+
cacheable: true,
29+
data: {
30+
requests: [
31+
{
32+
indexName: 'products',
33+
model: 'trending-items',
34+
threshold: 0,
35+
},
36+
],
37+
},
38+
method: 'POST',
39+
path: '1/indexes/*/recommendations',
40+
},
41+
{}
42+
);
43+
});
44+
});

‎packages/recommend/src/builds/browser.ts‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import { createBrowserXhrRequester } from '@algolia/requester-browser-xhr';
88
import{createUserAgent}from'@algolia/transporter';
99

1010
import{createRecommendClient}from'../createRecommendClient';
11-
import{getFrequentlyBoughtTogether,getRecommendations,getRelatedProducts}from'../methods';
11+
import{
12+
getFrequentlyBoughtTogether,
13+
getRecommendations,
14+
getRelatedProducts,
15+
getTrendingFacets,
16+
getTrendingItems,
17+
}from'../methods';
1218
import{BaseRecommendClient,RecommendOptions,WithRecommendMethods}from'../types';
1319

1420
exportdefaultfunctionrecommend(
@@ -47,6 +53,8 @@ export default function recommend(
4753
getFrequentlyBoughtTogether,
4854
getRecommendations,
4955
getRelatedProducts,
56+
getTrendingFacets,
57+
getTrendingItems,
5058
},
5159
});
5260
}

‎packages/recommend/src/builds/node.ts‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import { createNodeHttpRequester } from '@algolia/requester-node-http';
77
import{createUserAgent}from'@algolia/transporter';
88

99
import{createRecommendClient}from'../createRecommendClient';
10-
import{getFrequentlyBoughtTogether,getRecommendations,getRelatedProducts}from'../methods';
10+
import{
11+
getFrequentlyBoughtTogether,
12+
getRecommendations,
13+
getRelatedProducts,
14+
getTrendingFacets,
15+
getTrendingItems,
16+
}from'../methods';
1117
import{BaseRecommendClient,RecommendOptions,WithRecommendMethods}from'../types';
1218

1319
exportdefaultfunctionrecommend(
@@ -41,6 +47,8 @@ export default function recommend(
4147
getFrequentlyBoughtTogether,
4248
getRecommendations,
4349
getRelatedProducts,
50+
getTrendingFacets,
51+
getTrendingItems,
4452
},
4553
});
4654
}

‎packages/recommend/src/methods/getRecommendations.ts‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import{MethodEnum}from'@algolia/requester-common';
22

3-
import{BaseRecommendClient,RecommendationsQuery,WithRecommendMethods}from'../types';
3+
import{
4+
BaseRecommendClient,
5+
RecommendationsQuery,
6+
TrendingQuery,
7+
WithRecommendMethods,
8+
}from'../types';
49

510
typeGetRecommendations=(
611
base: BaseRecommendClient
712
)=>WithRecommendMethods<BaseRecommendClient>['getRecommendations'];
813

914
exportconstgetRecommendations: GetRecommendations=base=>{
10-
return(queries: readonlyRecommendationsQuery[],requestOptions)=>{
11-
constrequests: readonlyRecommendationsQuery[]=queries.map(query=>({
15+
return(queries: ReadonlyArray<RecommendationsQuery|TrendingQuery>,requestOptions)=>{
16+
constrequests: ReadonlyArray<RecommendationsQuery|TrendingQuery>=queries.map(query=>({
1217
...query,
1318
// The `threshold` param is required by the endpoint to make it easier
1419
// to provide a default value later, so we default it in the client
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import{MethodEnum}from'@algolia/requester-common';
2+
3+
import{BaseRecommendClient,TrendingFacetsQuery,WithRecommendMethods}from'../types';
4+
5+
typeGetTrendingFacets=(
6+
base: BaseRecommendClient
7+
)=>WithRecommendMethods<BaseRecommendClient>['getTrendingFacets'];
8+
9+
exportconstgetTrendingFacets: GetTrendingFacets=base=>{
10+
return(queries: readonlyTrendingFacetsQuery[],requestOptions)=>{
11+
constrequests: readonlyTrendingFacetsQuery[]=queries.map(query=>({
12+
...query,
13+
model: 'trending-facets',
14+
// The `threshold` param is required by the endpoint to make it easier
15+
// to provide a default value later, so we default it in the client
16+
// so that users don't have to provide a value.
17+
threshold: query.threshold||0,
18+
}));
19+
20+
returnbase.transporter.read(
21+
{
22+
method: MethodEnum.Post,
23+
path: '1/indexes/*/recommendations',
24+
data: {
25+
requests,
26+
},
27+
cacheable: true,
28+
},
29+
requestOptions
30+
);
31+
};
32+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import{MethodEnum}from'@algolia/requester-common';
2+
3+
import{BaseRecommendClient,TrendingItemsQuery,WithRecommendMethods}from'../types';
4+
5+
typeGetTrendingItems=(
6+
base: BaseRecommendClient
7+
)=>WithRecommendMethods<BaseRecommendClient>['getTrendingItems'];
8+
9+
exportconstgetTrendingItems: GetTrendingItems=base=>{
10+
return(queries: readonlyTrendingItemsQuery[],requestOptions)=>{
11+
constrequests: readonlyTrendingItemsQuery[]=queries.map(query=>({
12+
...query,
13+
model: 'trending-items',
14+
// The `threshold` param is required by the endpoint to make it easier
15+
// to provide a default value later, so we default it in the client
16+
// so that users don't have to provide a value.
17+
threshold: query.threshold||0,
18+
}));
19+
20+
returnbase.transporter.read(
21+
{
22+
method: MethodEnum.Post,
23+
path: '1/indexes/*/recommendations',
24+
data: {
25+
requests,
26+
},
27+
cacheable: true,
28+
},
29+
requestOptions
30+
);
31+
};
32+
};

‎packages/recommend/src/methods/index.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
export*from'./getFrequentlyBoughtTogether';
66
export*from'./getRecommendations';
77
export*from'./getRelatedProducts';
8+
export*from'./getTrendingFacets';
9+
export*from'./getTrendingItems';
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
exporttypeRecommendModel='related-products'|'bought-together';
1+
exporttypeRecommendModel='related-products'|'bought-together'|TrendingModel;
2+
exporttypeTrendingModel='trending-items'|'trending-facets';

0 commit comments

Comments
 (0)