From 7f890597091c9778e216ab73637aa6e7cecec251 Mon Sep 17 00:00:00 2001 From: Samuel Imolorhe Date: Wed, 23 Aug 2023 10:24:10 +0200 Subject: [PATCH] handle updating active environment from request scripts --- .../altair/services/pre-request/evaluator.ts | 4 +- .../services/pre-request/evaluator.worker.ts | 4 + .../altair/services/pre-request/events.ts | 1 + .../pre-request/pre-request.service.ts | 94 ++++++++++--------- site/src/docs/features/settings-pane.md | 3 + 5 files changed, 62 insertions(+), 44 deletions(-) diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts index 2676ff8eeb..a3b83c35e0 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.ts @@ -25,7 +25,7 @@ export class ScriptEvaluator { async executeScript( script: string, data: ScriptContextData, - handlers: ScriptEventHandlers + userAvailableHandlers: ScriptEventHandlers ): Promise { try { const worker = this.getWorker(); @@ -37,7 +37,7 @@ export class ScriptEvaluator { }, this.timeout); const allHandlers: AllScriptEventHandlers = { - ...handlers, + ...userAvailableHandlers, executeComplete: (data: ScriptContextData) => { clearTimeout(handle); resolve(data); diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts index 130d69583f..6191a4220e 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/evaluator.worker.ts @@ -77,6 +77,10 @@ const initExecute = async ( } }); + if (res.__toSetActiveEnvironment) { + // update active environment + makeCall('updateActiveEnvironment', res.__toSetActiveEnvironment); + } makeCall('executeComplete', res); }; diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/events.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/events.ts index 614cd525fd..52db0b77fa 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/events.ts +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/events.ts @@ -16,6 +16,7 @@ export interface ScriptEventHandlers { ) => Promise; getStorageItem: (key: string) => Promise; setStorageItem: (key: string, value: unknown) => Promise; + updateActiveEnvironment: (environmentData: Record) => Promise; } // Extended event handler interface to include internal native events like scriptError as well diff --git a/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts b/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts index 167dd9b2bd..2e17e0999b 100644 --- a/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts +++ b/packages/altair-app/src/app/modules/altair/services/pre-request/pre-request.service.ts @@ -96,6 +96,9 @@ export class PreRequestService { setStorageItem: (key: string, value: unknown) => { return this.setStorageItem(key, value); }, + updateActiveEnvironment: (environmentData: Record) => { + return this.updateActiveEnvironment(environmentData); + }, }); debug.debug('script result:', res); @@ -158,48 +161,9 @@ export class PreRequestService { throw new RequestScriptError(error); } if (clonedMutableData.__toSetActiveEnvironment) { - const activeEnvState = await this.store - .select(getActiveSubEnvironmentState) - .pipe(take(1)) - .toPromise(); - - if (activeEnvState) { - try { - const envVariables = { - ...JSON.parse(activeEnvState.variablesJson), - ...clonedMutableData.__toSetActiveEnvironment, - }; - const activeEnvStateId = activeEnvState.id; - - if (!activeEnvStateId) { - throw new RequestScriptError('Invalid active environment state ID'); - } - - this.store.dispatch( - new environmentsActions.UpdateSubEnvironmentJsonAction({ - id: activeEnvStateId, - value: JSON.stringify(envVariables, null, 2), - }) - ); - this.notifyService.info( - `Updated active environment variables: ${Object.keys( - clonedMutableData.__toSetActiveEnvironment - ).join(', ')}.`, - 'Request script' - ); - } catch (error) { - this.notifyService.errorWithError( - error, - `Could not update active environment variables.`, - 'Request script' - ); - } - } else { - this.notifyService.warning( - 'No active environment selected. Cannot update environment variables', - 'Request script' - ); - } + await this.updateActiveEnvironment( + clonedMutableData.__toSetActiveEnvironment + ); } return clonedMutableData; } @@ -215,4 +179,50 @@ export class PreRequestService { .pipe(take(1)) .toPromise(); } + private async updateActiveEnvironment( + environmentData: Record + ) { + const activeEnvState = await this.store + .select(getActiveSubEnvironmentState) + .pipe(take(1)) + .toPromise(); + + if (activeEnvState) { + try { + const envVariables = { + ...JSON.parse(activeEnvState.variablesJson), + ...environmentData, + }; + const activeEnvStateId = activeEnvState.id; + + if (!activeEnvStateId) { + throw new RequestScriptError('Invalid active environment state ID'); + } + + this.store.dispatch( + new environmentsActions.UpdateSubEnvironmentJsonAction({ + id: activeEnvStateId, + value: JSON.stringify(envVariables, null, 2), + }) + ); + this.notifyService.info( + `Updated active environment variables: ${Object.keys( + environmentData + ).join(', ')}.`, + 'Request script' + ); + } catch (error) { + this.notifyService.errorWithError( + error, + `Could not update active environment variables.`, + 'Request script' + ); + } + } else { + this.notifyService.warning( + 'No active environment selected. Cannot update environment variables', + 'Request script' + ); + } + } } diff --git a/site/src/docs/features/settings-pane.md b/site/src/docs/features/settings-pane.md index 1b047d1dc4..e86f5e884d 100644 --- a/site/src/docs/features/settings-pane.md +++ b/site/src/docs/features/settings-pane.md @@ -61,3 +61,6 @@ Valid plugins in string format include: `altair-graphql-plugin-some-plugin`, `np ### `editor.shortcuts` - Contains shortcut to action mapping _Default: {}_ You can add new editor shortcut mapping following the [CodeMirror key map pattern](https://codemirror.net/doc/manual.html#keymaps). For example, to add a new shortcut to toggle comments, you can add `{ "Ctrl-7": "toggleComment" }`. There are several editor actions you can add shortcuts for including: `showAutocomplete`, `toggleComment`, `showFinder`, `showInDocs`, `fillAllFields`, etc. If you want to disable an in-built shortcut, you can use the `noOp` action. For example to disable `Ctrl-/` from toggling comments, you can use `{ "Ctrl-/": "noOp" }`. + +### `script.allowedCookies` - List of cookies to be accessible in the pre-request script +_Default: []_