From 8ba80d99b1f0cd5e89f5cc33c04d36033f0410b3 Mon Sep 17 00:00:00 2001 From: Joseph McElroy Date: Mon, 30 Jan 2023 16:59:43 +0000 Subject: [PATCH] Engines: Customise route fn (#924) * engines-connector * update dependencies * updates based on PR comments * support to customise the engine _search url --- .../src/handlers/__test__/transporter.test.ts | 42 +++++++++++++++++++ .../src/handlers/search/Configuration.ts | 1 - .../src/handlers/search/index.ts | 5 ++- .../src/handlers/transporter.ts | 26 ++++++------ .../search-ui-engines-connector/src/types.ts | 1 + 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/packages/search-ui-engines-connector/src/handlers/__test__/transporter.test.ts b/packages/search-ui-engines-connector/src/handlers/__test__/transporter.test.ts index 4166e7bf..17e54ac5 100644 --- a/packages/search-ui-engines-connector/src/handlers/__test__/transporter.test.ts +++ b/packages/search-ui-engines-connector/src/handlers/__test__/transporter.test.ts @@ -50,4 +50,46 @@ describe("EngineTransporter", () => { expect(response.hits.hits[0]._source.title).toEqual("My title"); }); }); + + it("perform a request overriding getRoute", () => { + const transporter = new EngineTransporter( + "http://localhost:9200", + "my_engine", + "apikey", + (host, engineName) => `${host}/internal/${engineName}/search` + ); + + const body = { + query: { + match_all: {} + } + }; + + nock("http://localhost:9200", { + reqheaders: { + authorization: "ApiKey apikey" + } + }) + .post("/internal/my_engine/search") + .reply(200, () => ({ + hits: { + hits: [ + { + _id: "1", + _source: { + title: "My title" + } + } + ] + } + })); + + return transporter + .performRequest({ + body + } as SearchRequest) + .then((response: SearchResponse) => { + expect(response.hits.hits).toHaveLength(1); + }); + }); }); diff --git a/packages/search-ui-engines-connector/src/handlers/search/Configuration.ts b/packages/search-ui-engines-connector/src/handlers/search/Configuration.ts index 96ab012c..13f60d98 100644 --- a/packages/search-ui-engines-connector/src/handlers/search/Configuration.ts +++ b/packages/search-ui-engines-connector/src/handlers/search/Configuration.ts @@ -12,7 +12,6 @@ import { BaseFilters, Filter as SKFilter, GeoDistanceOptionsFacet, - MultiMatchQuery, MultiQueryOptionsFacet, RefinementSelectFacet, SearchkitConfig diff --git a/packages/search-ui-engines-connector/src/handlers/search/index.ts b/packages/search-ui-engines-connector/src/handlers/search/index.ts index 90ce59d1..54748b6f 100644 --- a/packages/search-ui-engines-connector/src/handlers/search/index.ts +++ b/packages/search-ui-engines-connector/src/handlers/search/index.ts @@ -4,6 +4,7 @@ import type { ResponseState } from "@elastic/search-ui"; import Searchkit from "@searchkit/sdk"; +import { EngineRouteFn } from "../../types"; import { EngineTransporter } from "../transporter"; import buildConfiguration, { buildBaseFilters } from "./Configuration"; import buildRequest from "./Request"; @@ -15,6 +16,7 @@ interface SearchHandlerConfiguration { host: string; engineName: string; apiKey: string; + engineRouteFn?: EngineRouteFn; } export default async function handleRequest( @@ -32,7 +34,8 @@ export default async function handleRequest( const transporter = new EngineTransporter( host, engineName, - configuration.apiKey + configuration.apiKey, + configuration.engineRouteFn ); const request = Searchkit(searchkitConfig, transporter); diff --git a/packages/search-ui-engines-connector/src/handlers/transporter.ts b/packages/search-ui-engines-connector/src/handlers/transporter.ts index 339ed6c3..9f8c155e 100644 --- a/packages/search-ui-engines-connector/src/handlers/transporter.ts +++ b/packages/search-ui-engines-connector/src/handlers/transporter.ts @@ -1,28 +1,30 @@ import type { SearchkitTransporter } from "@searchkit/sdk"; -import { SearchRequest, SearchResponse } from "../types"; +import { SearchRequest, SearchResponse, EngineRouteFn } from "../types"; + +function defaultEngineRoute(host: string, engineName: string): string { + return `${host}/api/engines/${engineName}/_search`; +} export class EngineTransporter implements SearchkitTransporter { constructor( private host: string, private engineName: string, - private apiKey: string + private apiKey: string, + private getRoute: EngineRouteFn = defaultEngineRoute ) {} async performRequest(requestBody: SearchRequest): Promise { if (!fetch) throw new Error("Fetch is not supported in this browser / environment"); - const response = await fetch( - this.host + `/api/engines/${this.engineName}/_search`, - { - method: "POST", - body: JSON.stringify(requestBody), - headers: { - "Content-Type": "application/json", - Authorization: `ApiKey ${this.apiKey}` - } + const response = await fetch(this.getRoute(this.host, this.engineName), { + method: "POST", + body: JSON.stringify(requestBody), + headers: { + "Content-Type": "application/json", + Authorization: `ApiKey ${this.apiKey}` } - ); + }); const json = await response.json(); return json; } diff --git a/packages/search-ui-engines-connector/src/types.ts b/packages/search-ui-engines-connector/src/types.ts index 8b7973e5..522201c0 100644 --- a/packages/search-ui-engines-connector/src/types.ts +++ b/packages/search-ui-engines-connector/src/types.ts @@ -2,3 +2,4 @@ import type { estypes } from "@elastic/elasticsearch"; export type SearchRequest = estypes.SearchRequest; export type SearchResponse = estypes.SearchResponse>; +export type EngineRouteFn = (host: string, engineName: string) => string;