From 7b09cbe8c8d64163040fd91313ae57c0ecd33875 Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Wed, 2 Dec 2020 12:40:14 -0700 Subject: [PATCH] Wrap KibanaRequest execution context in a getter. --- .../expressions/load_index_pattern.test.ts | 11 ++++++++++- .../index_patterns/expressions/load_index_pattern.ts | 3 ++- src/plugins/data/server/search/expressions/esaggs.ts | 7 ++++++- src/plugins/expressions/common/execution/execution.ts | 1 + src/plugins/expressions/common/execution/types.ts | 8 ++++---- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/plugins/data/server/index_patterns/expressions/load_index_pattern.test.ts b/src/plugins/data/server/index_patterns/expressions/load_index_pattern.test.ts index 1c25ba43647c286..944bd06d648911c 100644 --- a/src/plugins/data/server/index_patterns/expressions/load_index_pattern.test.ts +++ b/src/plugins/data/server/index_patterns/expressions/load_index_pattern.test.ts @@ -38,9 +38,18 @@ describe('indexPattern expression function', () => { test('returns serialized index pattern', async () => { const indexPatternDefinition = getFunctionDefinition({ getStartDependencies }); const result = await indexPatternDefinition().fn(null, { id: '1' }, { - kibanaRequest: {}, + getKibanaRequest: () => ({}), } as any); expect(result.type).toEqual('index_pattern'); expect(result.value.title).toEqual('value'); }); + + test('throws if getKibanaRequest is not available', async () => { + const indexPatternDefinition = getFunctionDefinition({ getStartDependencies }); + expect(async () => { + await indexPatternDefinition().fn(null, { id: '1' }, {} as any); + }).rejects.toThrowErrorMatchingInlineSnapshot( + `"A KibanaRequest is required to execute this search on the server. Please provide a request object to the expression execution params."` + ); + }); }); diff --git a/src/plugins/data/server/index_patterns/expressions/load_index_pattern.ts b/src/plugins/data/server/index_patterns/expressions/load_index_pattern.ts index 25e7d07f650cd3e..8cf8492f77a3f75 100644 --- a/src/plugins/data/server/index_patterns/expressions/load_index_pattern.ts +++ b/src/plugins/data/server/index_patterns/expressions/load_index_pattern.ts @@ -46,7 +46,8 @@ export function getFunctionDefinition({ }) { return (): IndexPatternLoadExpressionFunctionDefinition => ({ ...getIndexPatternLoadMeta(), - async fn(input, args, { kibanaRequest }) { + async fn(input, args, { getKibanaRequest }) { + const kibanaRequest = getKibanaRequest ? getKibanaRequest() : null; if (!kibanaRequest) { throw new Error( i18n.translate('data.indexPatterns.indexPatternLoad.error.kibanaRequest', { diff --git a/src/plugins/data/server/search/expressions/esaggs.ts b/src/plugins/data/server/search/expressions/esaggs.ts index bc67ce666666dcd..04cfcd1eef04388 100644 --- a/src/plugins/data/server/search/expressions/esaggs.ts +++ b/src/plugins/data/server/search/expressions/esaggs.ts @@ -48,7 +48,12 @@ export function getFunctionDefinition({ }): () => EsaggsExpressionFunctionDefinition { return () => ({ ...getEsaggsMeta(), - async fn(input, args, { inspectorAdapters, abortSignal, getSearchSessionId, kibanaRequest }) { + async fn( + input, + args, + { inspectorAdapters, abortSignal, getSearchSessionId, getKibanaRequest } + ) { + const kibanaRequest = getKibanaRequest ? getKibanaRequest() : null; if (!kibanaRequest) { throw new Error( i18n.translate('data.search.esaggs.error.kibanaRequest', { diff --git a/src/plugins/expressions/common/execution/execution.ts b/src/plugins/expressions/common/execution/execution.ts index e53a6f7d58e1ccb..4d183361c79e8f6 100644 --- a/src/plugins/expressions/common/execution/execution.ts +++ b/src/plugins/expressions/common/execution/execution.ts @@ -152,6 +152,7 @@ export class Execution< this.context = { getSearchContext: () => this.execution.params.searchContext || {}, getSearchSessionId: () => execution.params.searchSessionId, + getKibanaRequest: () => execution.params.kibanaRequest, variables: execution.params.variables || {}, types: executor.getTypes(), abortSignal: this.abortController.signal, diff --git a/src/plugins/expressions/common/execution/types.ts b/src/plugins/expressions/common/execution/types.ts index 153af08c169c311..a41f97118c4b2b2 100644 --- a/src/plugins/expressions/common/execution/types.ts +++ b/src/plugins/expressions/common/execution/types.ts @@ -63,11 +63,11 @@ export interface ExecutionContext< getSearchSessionId: () => string | undefined; /** - * Makes a `KibanaRequest` object available to expression functions. Useful for - * functions which are running on the server and need to perform operations that - * are scoped to a specific user. + * Getter to retrieve the `KibanaRequest` object inside an expression function. + * Useful for functions which are running on the server and need to perform + * operations that are scoped to a specific user. */ - kibanaRequest?: KibanaRequest; + getKibanaRequest?: () => KibanaRequest; /** * Allows to fetch saved objects from ElasticSearch. In browser `getSavedObject`