diff --git a/api/src/handlers/search-runner.js b/api/src/handlers/search-runner.js index dbdd1f3a..078fc543 100644 --- a/api/src/handlers/search-runner.js +++ b/api/src/handlers/search-runner.js @@ -65,10 +65,24 @@ const doSearch = async (event, searchParams = {}) => { .authFilter(event) .toJson(); + const searchModels = modelsToTargets(models); + const searchQuery = sanitizeQueryString(event.queryStringParameters); + + if (format === "_explain") { + return { + statusCode: 200, + body: JSON.stringify({ + models: searchModels, + body: JSON.parse(filteredSearchContext), + query: searchQuery, + }), + }; + } + const esResponse = await search( - modelsToTargets(models), + searchModels, filteredSearchContext, - sanitizeQueryString(event.queryStringParameters) + searchQuery ); return await responseTransformer.transformSearchResult(esResponse, pager); diff --git a/api/test/integration/search.test.js b/api/test/integration/search.test.js index d46896e5..21083883 100644 --- a/api/test/integration/search.test.js +++ b/api/test/integration/search.test.js @@ -262,5 +262,25 @@ describe("Search routes", () => { "?_source_includes=title%2Caccession_number" ); }); + + it("returns the query when as=_explain is specified", async () => { + const originalQuery = { + query: { query_string: { query: "*" } }, + }; + const event = helpers + .mockEvent("GET", "/search") + .queryParams({ as: "_explain" }) + .render(); + const authQuery = new RequestPipeline(originalQuery) + .authFilter(helpers.preprocess(event)) + .toJson(); + const expectedQuery = JSON.parse(authQuery); + + const result = await handler(event); + expect(result.statusCode).to.eq(200); + const resultBody = JSON.parse(result.body); + expect(resultBody.models).to.eq("dc-v2-work"); + expect(resultBody.body).to.deep.equal(expectedQuery); + }); }); });