diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/baseRecommendRequest.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/baseRecommendRequest.ts new file mode 100644 index 00000000000..6adb5f7db11 --- /dev/null +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/baseRecommendRequest.ts @@ -0,0 +1,18 @@ +import type { SearchParamsObject } from './searchParamsObject'; + +export type BaseRecommendRequest = { + /** + * The Algolia index name. + */ + indexName: string; + /** + * The threshold to use when filtering recommendations by their score. + */ + threshold: number; + /** + * The max number of recommendations to retrieve. If it\'s set to 0, all the recommendations of the objectID may be returned. + */ + maxRecommendations?: number; + queryParameters?: SearchParamsObject; + fallbackParameters?: SearchParamsObject; +}; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/baseRecommendationRequest.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/baseRecommendationRequest.ts new file mode 100644 index 00000000000..21d6210ec1d --- /dev/null +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/baseRecommendationRequest.ts @@ -0,0 +1,9 @@ +import type { RecommendationModels } from './recommendationModels'; + +export type BaseRecommendationRequest = { + model: RecommendationModels; + /** + * Unique identifier of the object. + */ + objectID: string; +}; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/baseTrendingRequest.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/baseTrendingRequest.ts new file mode 100644 index 00000000000..e8c5b359827 --- /dev/null +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/baseTrendingRequest.ts @@ -0,0 +1,13 @@ +import type { TrendingModels } from './trendingModels'; + +export type BaseTrendingRequest = { + model: TrendingModels; + /** + * The facet name to use for trending models. + */ + facetName?: string; + /** + * The facet value to use for trending models. + */ + facetValue?: string; +}; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/getRecommendationsParams.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/getRecommendationsParams.ts index 4eb8d5fb8df..8afe371b46e 100644 --- a/clients/algoliasearch-client-javascript/packages/recommend/model/getRecommendationsParams.ts +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/getRecommendationsParams.ts @@ -1,4 +1,4 @@ -import type { RecommendationRequest } from './recommendationRequest'; +import type { RecommendationsRequest } from './recommendationsRequest'; /** * The `getRecommendations` parameters. @@ -7,5 +7,5 @@ export type GetRecommendationsParams = { /** * The `getRecommendations` requests. */ - requests: RecommendationRequest[]; + requests: RecommendationsRequest[]; }; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationModels.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationModels.ts new file mode 100644 index 00000000000..a0b12bdda58 --- /dev/null +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationModels.ts @@ -0,0 +1,5 @@ +/** + * The recommendation model to use. + */ + +export type RecommendationModels = 'bought-together' | 'related-products'; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationRequest.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationRequest.ts index 9faca273726..4b1a52793ed 100644 --- a/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationRequest.ts +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationRequest.ts @@ -1,28 +1,5 @@ -import type { SearchParams } from './searchParams'; +import type { BaseRecommendRequest } from './baseRecommendRequest'; +import type { BaseRecommendationRequest } from './baseRecommendationRequest'; -export type RecommendationRequest = { - /** - * The Algolia index name. - */ - indexName: string; - /** - * Unique identifier of the object. - */ - objectID: string; - /** - * The recommendation model to use. - */ - model: RecommendationRequestModel; - /** - * The threshold to use when filtering recommendations by their score. - */ - threshold: number; - /** - * The max number of recommendations to retrieve. If it\'s set to 0, all the recommendations of the objectID may be returned. - */ - maxRecommendations?: number; - queryParameters?: SearchParams; - fallbackParameters?: SearchParams; -}; - -export type RecommendationRequestModel = 'bought-together' | 'related-products'; +export type RecommendationRequest = BaseRecommendationRequest & + BaseRecommendRequest; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationsRequest.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationsRequest.ts new file mode 100644 index 00000000000..cb1d0792e6c --- /dev/null +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/recommendationsRequest.ts @@ -0,0 +1,4 @@ +import type { RecommendationRequest } from './recommendationRequest'; +import type { TrendingRequest } from './trendingRequest'; + +export type RecommendationsRequest = RecommendationRequest | TrendingRequest; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/searchParams.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/searchParamsObject.ts similarity index 83% rename from clients/algoliasearch-client-javascript/packages/recommend/model/searchParams.ts rename to clients/algoliasearch-client-javascript/packages/recommend/model/searchParamsObject.ts index 127265c98f8..ad8f80c0737 100644 --- a/clients/algoliasearch-client-javascript/packages/recommend/model/searchParams.ts +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/searchParamsObject.ts @@ -2,6 +2,6 @@ import type { BaseSearchParams } from './baseSearchParams'; import type { IndexSettingsAsSearchParams } from './indexSettingsAsSearchParams'; import type { RequiredSearchParams } from './requiredSearchParams'; -export type SearchParams = BaseSearchParams & +export type SearchParamsObject = BaseSearchParams & IndexSettingsAsSearchParams & RequiredSearchParams; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/trendingModels.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/trendingModels.ts new file mode 100644 index 00000000000..1a9292d4e6b --- /dev/null +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/trendingModels.ts @@ -0,0 +1,5 @@ +/** + * The trending model to use. + */ + +export type TrendingModels = 'trending-facets' | 'trending-items'; diff --git a/clients/algoliasearch-client-javascript/packages/recommend/model/trendingRequest.ts b/clients/algoliasearch-client-javascript/packages/recommend/model/trendingRequest.ts new file mode 100644 index 00000000000..60b8c26cb70 --- /dev/null +++ b/clients/algoliasearch-client-javascript/packages/recommend/model/trendingRequest.ts @@ -0,0 +1,4 @@ +import type { BaseRecommendRequest } from './baseRecommendRequest'; +import type { BaseTrendingRequest } from './baseTrendingRequest'; + +export type TrendingRequest = BaseRecommendRequest & BaseTrendingRequest; diff --git a/specs/bundled/recommend.yml b/specs/bundled/recommend.yml index b510bc7e9ed..e102dbf76e0 100644 --- a/specs/bundled/recommend.yml +++ b/specs/bundled/recommend.yml @@ -42,13 +42,16 @@ components: message: type: string example: Invalid Application-Id or API-Key + trendingModels: + description: The trending model to use. + type: string + enum: + - trending-facets + - trending-items indexName: type: string example: products description: The Algolia index name. - objectID: - type: string - description: Unique identifier of the object. page: type: integer description: Specify the page to retrieve. @@ -556,11 +559,79 @@ components: set via the settings for a default value and can be overridden via rules. default: {} - searchParams: + searchParamsObject: allOf: - $ref: '#/components/schemas/baseSearchParams' - $ref: '#/components/schemas/requiredSearchParams' - $ref: '#/components/schemas/indexSettingsAsSearchParams' + baseRecommendRequest: + type: object + additionalProperties: false + properties: + indexName: + $ref: '#/components/schemas/indexName' + threshold: + type: integer + minimum: 0 + maximum: 100 + description: The threshold to use when filtering recommendations by their score. + maxRecommendations: + type: integer + default: 0 + description: >- + The max number of recommendations to retrieve. If it's set to 0, all + the recommendations of the objectID may be returned. + queryParameters: + $ref: '#/components/schemas/searchParamsObject' + fallbackParameters: + $ref: '#/components/schemas/searchParamsObject' + required: + - indexName + - threshold + trendingRequest: + allOf: + - type: object + title: baseTrendingRequest + additionalProperties: false + properties: + model: + $ref: '#/components/schemas/trendingModels' + facetName: + type: string + description: The facet name to use for trending models. + facetValue: + type: string + description: The facet value to use for trending models. + required: + - model + - $ref: '#/components/schemas/baseRecommendRequest' + recommendationModels: + description: The recommendation model to use. + type: string + enum: + - related-products + - bought-together + objectID: + type: string + description: Unique identifier of the object. + recommendationRequest: + allOf: + - type: object + title: baseRecommendationRequest + additionalProperties: false + properties: + model: + $ref: '#/components/schemas/recommendationModels' + objectID: + $ref: '#/components/schemas/objectID' + required: + - model + - objectID + - $ref: '#/components/schemas/baseRecommendRequest' + recommendationsRequest: + oneOf: + - $ref: '#/components/schemas/trendingRequest' + - $ref: '#/components/schemas/recommendationRequest' abTestID: type: integer description: >- @@ -1025,43 +1096,7 @@ paths: type: array description: The `getRecommendations` requests. items: - title: recommendationRequest - type: object - additionalProperties: false - properties: - indexName: - $ref: '#/components/schemas/indexName' - objectID: - $ref: '#/components/schemas/objectID' - model: - description: The recommendation model to use. - type: string - enum: - - related-products - - bought-together - threshold: - type: integer - minimum: 0 - maximum: 100 - description: >- - The threshold to use when filtering recommendations by - their score. - maxRecommendations: - type: integer - default: 0 - description: >- - The max number of recommendations to retrieve. If it's - set to 0, all the recommendations of the objectID may - be returned. - queryParameters: - $ref: '#/components/schemas/searchParams' - fallbackParameters: - $ref: '#/components/schemas/searchParams' - required: - - model - - indexName - - objectID - - threshold + $ref: '#/components/schemas/recommendationsRequest' required: - requests responses: diff --git a/specs/recommend/common/schemas/RecommendationsRequest.yml b/specs/recommend/common/schemas/RecommendationsRequest.yml new file mode 100644 index 00000000000..bbcb60641a0 --- /dev/null +++ b/specs/recommend/common/schemas/RecommendationsRequest.yml @@ -0,0 +1,70 @@ +recommendationsRequest: + oneOf: + - $ref: '#/trendingRequest' + - $ref: '#/recommendationRequest' + +trendingRequest: + allOf: + - type: object + title: baseTrendingRequest + additionalProperties: false + properties: + model: + $ref: '#/trendingModels' + facetName: + type: string + description: The facet name to use for trending models. + facetValue: + type: string + description: The facet value to use for trending models. + required: + - model + - $ref: '#/baseRecommendRequest' + +recommendationRequest: + allOf: + - type: object + title: baseRecommendationRequest + additionalProperties: false + properties: + model: + $ref: '#/recommendationModels' + objectID: + $ref: '../../../common/parameters.yml#/objectID' + required: + - model + - objectID + - $ref: '#/baseRecommendRequest' + +baseRecommendRequest: + type: object + additionalProperties: false + properties: + indexName: + $ref: '../../../common/parameters.yml#/indexName' + threshold: + type: integer + minimum: 0 + maximum: 100 + description: The threshold to use when filtering recommendations by their score. + maxRecommendations: + type: integer + default: 0 + description: The max number of recommendations to retrieve. If it's set to 0, all the recommendations of the objectID may be returned. + queryParameters: + $ref: '../../../common/schemas/SearchParams.yml#/searchParamsObject' + fallbackParameters: + $ref: '../../../common/schemas/SearchParams.yml#/searchParamsObject' + required: + - indexName + - threshold + +trendingModels: + description: The trending model to use. + type: string + enum: [trending-facets, trending-items] + +recommendationModels: + description: The recommendation model to use. + type: string + enum: [related-products, bought-together] diff --git a/specs/recommend/common/schemas/SearchParams.yml b/specs/recommend/common/schemas/SearchParams.yml deleted file mode 100644 index ccaa5714e85..00000000000 --- a/specs/recommend/common/schemas/SearchParams.yml +++ /dev/null @@ -1,5 +0,0 @@ -searchParams: - allOf: - - $ref: '../../../common/schemas/SearchParams.yml#/baseSearchParams' - - $ref: '../../../common/schemas/SearchParams.yml#/requiredSearchParams' - - $ref: '../../../common/schemas/IndexSettings.yml#/indexSettingsAsSearchParams' diff --git a/specs/recommend/paths/getRecommendations.yml b/specs/recommend/paths/getRecommendations.yml index 831cc614355..66bba548f15 100644 --- a/specs/recommend/paths/getRecommendations.yml +++ b/specs/recommend/paths/getRecommendations.yml @@ -16,36 +16,7 @@ post: type: array description: The `getRecommendations` requests. items: - title: recommendationRequest - type: object - additionalProperties: false - properties: - indexName: - $ref: '../../common/parameters.yml#/indexName' - objectID: - $ref: '../../common/parameters.yml#/objectID' - model: - description: The recommendation model to use. - type: string - enum: [related-products, bought-together] - threshold: - type: integer - minimum: 0 - maximum: 100 - description: The threshold to use when filtering recommendations by their score. - maxRecommendations: - type: integer - default: 0 - description: The max number of recommendations to retrieve. If it's set to 0, all the recommendations of the objectID may be returned. - queryParameters: - $ref: '../common/schemas/SearchParams.yml#/searchParams' - fallbackParameters: - $ref: '../common/schemas/SearchParams.yml#/searchParams' - required: - - model - - indexName - - objectID - - threshold + $ref: '../common/schemas/RecommendationsRequest.yml#/recommendationsRequest' required: - requests responses: diff --git a/tests/CTS/methods/requests/recommend/getRecommendations.json b/tests/CTS/methods/requests/recommend/getRecommendations.json index ae68ccbb77b..86c1f2aa6d3 100644 --- a/tests/CTS/methods/requests/recommend/getRecommendations.json +++ b/tests/CTS/methods/requests/recommend/getRecommendations.json @@ -1,7 +1,7 @@ [ { "method": "getRecommendations", - "testName": "get recommendations with minimal parameters", + "testName": "get recommendations for recommend model with minimal parameters", "parameters": { "requests": [ { @@ -29,7 +29,7 @@ }, { "method": "getRecommendations", - "testName": "get recommendations with all parameters", + "testName": "get recommendations for recommend model with all parameters", "parameters": { "requests": [ { @@ -37,6 +37,7 @@ "objectID": "objectID", "model": "related-products", "threshold": 42, + "maxRecommendations": 10, "queryParameters": { "query": "myQuery", "facetFilters": ["query"] @@ -58,6 +59,81 @@ "objectID": "objectID", "model": "related-products", "threshold": 42, + "maxRecommendations": 10, + "queryParameters": { + "query": "myQuery", + "facetFilters": ["query"] + }, + "fallbackParameters": { + "query": "myQuery", + "facetFilters": ["fallback"] + } + } + ] + } + } + }, + { + "method": "getRecommendations", + "testName": "get recommendations for trending model with minimal parameters", + "parameters": { + "requests": [ + { + "indexName": "indexName", + "model": "trending-items", + "threshold": 42 + } + ] + }, + "request": { + "path": "/1/indexes/*/recommendations", + "method": "POST", + "data": { + "requests": [ + { + "indexName": "indexName", + "model": "trending-items", + "threshold": 42 + } + ] + } + } + }, + { + "method": "getRecommendations", + "testName": "get recommendations for trending model with all parameters", + "parameters": { + "requests": [ + { + "indexName": "indexName", + "model": "trending-items", + "threshold": 42, + "maxRecommendations": 10, + "facetName": "myFacetName", + "facetValue": "myFacetValue", + "queryParameters": { + "query": "myQuery", + "facetFilters": ["query"] + }, + "fallbackParameters": { + "query": "myQuery", + "facetFilters": ["fallback"] + } + } + ] + }, + "request": { + "path": "/1/indexes/*/recommendations", + "method": "POST", + "data": { + "requests": [ + { + "indexName": "indexName", + "model": "trending-items", + "threshold": 42, + "maxRecommendations": 10, + "facetName": "myFacetName", + "facetValue": "myFacetValue", "queryParameters": { "query": "myQuery", "facetFilters": ["query"] @@ -121,6 +197,7 @@ "objectID": "objectID1", "model": "related-products", "threshold": 21, + "maxRecommendations": 10, "queryParameters": { "query": "myQuery", "facetFilters": ["query1"] @@ -135,6 +212,7 @@ "objectID": "objectID2", "model": "related-products", "threshold": 21, + "maxRecommendations": 10, "queryParameters": { "query": "myQuery", "facetFilters": ["query2"] @@ -156,6 +234,7 @@ "objectID": "objectID1", "model": "related-products", "threshold": 21, + "maxRecommendations": 10, "queryParameters": { "query": "myQuery", "facetFilters": ["query1"] @@ -170,6 +249,7 @@ "objectID": "objectID2", "model": "related-products", "threshold": 21, + "maxRecommendations": 10, "queryParameters": { "query": "myQuery", "facetFilters": ["query2"] diff --git a/tests/output/javascript/src/methods/requests/recommend.test.ts b/tests/output/javascript/src/methods/requests/recommend.test.ts index bb6443d3802..88344632fae 100644 --- a/tests/output/javascript/src/methods/requests/recommend.test.ts +++ b/tests/output/javascript/src/methods/requests/recommend.test.ts @@ -8,7 +8,7 @@ const apiKey = process.env.ALGOLIA_SEARCH_KEY || 'test_api_key'; const client = recommendApi(appId, apiKey, { requester: echoRequester() }); describe('getRecommendations', () => { - test('get recommendations with minimal parameters', async () => { + test('get recommendations for recommend model with minimal parameters', async () => { const req = (await client.getRecommendations({ requests: [ { @@ -35,7 +35,7 @@ describe('getRecommendations', () => { expect(req.searchParams).toEqual(undefined); }); - test('get recommendations with all parameters', async () => { + test('get recommendations for recommend model with all parameters', async () => { const req = (await client.getRecommendations({ requests: [ { @@ -43,6 +43,7 @@ describe('getRecommendations', () => { objectID: 'objectID', model: 'related-products', threshold: 42, + maxRecommendations: 10, queryParameters: { query: 'myQuery', facetFilters: ['query'] }, fallbackParameters: { query: 'myQuery', facetFilters: ['fallback'] }, }, @@ -58,6 +59,59 @@ describe('getRecommendations', () => { objectID: 'objectID', model: 'related-products', threshold: 42, + maxRecommendations: 10, + queryParameters: { query: 'myQuery', facetFilters: ['query'] }, + fallbackParameters: { query: 'myQuery', facetFilters: ['fallback'] }, + }, + ], + }); + expect(req.searchParams).toEqual(undefined); + }); + + test('get recommendations for trending model with minimal parameters', async () => { + const req = (await client.getRecommendations({ + requests: [ + { indexName: 'indexName', model: 'trending-items', threshold: 42 }, + ], + })) as unknown as EchoResponse; + + expect(req.path).toEqual('/1/indexes/*/recommendations'); + expect(req.method).toEqual('POST'); + expect(req.data).toEqual({ + requests: [ + { indexName: 'indexName', model: 'trending-items', threshold: 42 }, + ], + }); + expect(req.searchParams).toEqual(undefined); + }); + + test('get recommendations for trending model with all parameters', async () => { + const req = (await client.getRecommendations({ + requests: [ + { + indexName: 'indexName', + model: 'trending-items', + threshold: 42, + maxRecommendations: 10, + facetName: 'myFacetName', + facetValue: 'myFacetValue', + queryParameters: { query: 'myQuery', facetFilters: ['query'] }, + fallbackParameters: { query: 'myQuery', facetFilters: ['fallback'] }, + }, + ], + })) as unknown as EchoResponse; + + expect(req.path).toEqual('/1/indexes/*/recommendations'); + expect(req.method).toEqual('POST'); + expect(req.data).toEqual({ + requests: [ + { + indexName: 'indexName', + model: 'trending-items', + threshold: 42, + maxRecommendations: 10, + facetName: 'myFacetName', + facetValue: 'myFacetValue', queryParameters: { query: 'myQuery', facetFilters: ['query'] }, fallbackParameters: { query: 'myQuery', facetFilters: ['fallback'] }, }, @@ -113,6 +167,7 @@ describe('getRecommendations', () => { objectID: 'objectID1', model: 'related-products', threshold: 21, + maxRecommendations: 10, queryParameters: { query: 'myQuery', facetFilters: ['query1'] }, fallbackParameters: { query: 'myQuery', facetFilters: ['fallback1'] }, }, @@ -121,6 +176,7 @@ describe('getRecommendations', () => { objectID: 'objectID2', model: 'related-products', threshold: 21, + maxRecommendations: 10, queryParameters: { query: 'myQuery', facetFilters: ['query2'] }, fallbackParameters: { query: 'myQuery', facetFilters: ['fallback2'] }, }, @@ -136,6 +192,7 @@ describe('getRecommendations', () => { objectID: 'objectID1', model: 'related-products', threshold: 21, + maxRecommendations: 10, queryParameters: { query: 'myQuery', facetFilters: ['query1'] }, fallbackParameters: { query: 'myQuery', facetFilters: ['fallback1'] }, }, @@ -144,6 +201,7 @@ describe('getRecommendations', () => { objectID: 'objectID2', model: 'related-products', threshold: 21, + maxRecommendations: 10, queryParameters: { query: 'myQuery', facetFilters: ['query2'] }, fallbackParameters: { query: 'myQuery', facetFilters: ['fallback2'] }, },