From abc00b810f062566c8b6506cff649c4231256101 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Sun, 16 Oct 2022 19:25:47 +0530 Subject: [PATCH] feat: interpolate environment vats while sending request --- .../bruno-app/src/components/Sidebar/index.js | 2 +- .../src/pageComponents/Index/index.js | 4 +- .../ReduxStore/slices/collections/actions.js | 56 +++++++++++++------ .../bruno-app/src/utils/collections/index.js | 52 +++++++++++++++++ 4 files changed, 94 insertions(+), 20 deletions(-) diff --git a/packages/bruno-app/src/components/Sidebar/index.js b/packages/bruno-app/src/components/Sidebar/index.js index 5a8321307..bb68fb30f 100644 --- a/packages/bruno-app/src/components/Sidebar/index.js +++ b/packages/bruno-app/src/components/Sidebar/index.js @@ -104,7 +104,7 @@ const Sidebar = () => { {/* Need to ut github stars link here */}
- +
v1.25.2 diff --git a/packages/bruno-app/src/pageComponents/Index/index.js b/packages/bruno-app/src/pageComponents/Index/index.js index dc7516a60..b792d5b02 100644 --- a/packages/bruno-app/src/pageComponents/Index/index.js +++ b/packages/bruno-app/src/pageComponents/Index/index.js @@ -35,7 +35,9 @@ export default function Main() { const isDragging = useSelector((state) => state.app.isDragging); const showHomePage = useSelector((state) => state.app.showHomePage); - console.log(useSelector((state) => state.collections.collections)); + // Todo: write a better logging flow that can be used to log by turning on debug flag + // Enable for debugging. + // console.log(useSelector((state) => state.collections.collections)); const className = classnames({ 'is-dragging': isDragging diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js index deb5872ca..8e7b8f17e 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js @@ -15,7 +15,8 @@ import { findParentItemInCollection, findEnvironmentInCollection, isItemAFolder, - refreshUidsInItem + refreshUidsInItem, + interpolateEnvironmentVars } from 'utils/collections'; import { collectionSchema, itemSchema } from '@usebruno/schema'; import { waitForNextTick } from 'utils/common'; @@ -213,26 +214,45 @@ export const saveRequest = (itemUid, collectionUid) => (dispatch, getState) => { }); }; -export const sendRequest = (item, collectionUid) => (dispatch) => { +export const sendRequest = (item, collectionUid) => (dispatch, getState) => { + const state = getState(); + const collection = findCollectionByUid(state.collections.collections, collectionUid); const cancelTokenUid = uuid(); - dispatch(requestSent({ - itemUid: item.uid, - collectionUid: collectionUid, - cancelTokenUid: cancelTokenUid - })); + return new Promise((resolve, reject) => { + if(!collection) { + return reject(new Error('Collection not found')); + } + + dispatch(requestSent({ + itemUid: item.uid, + collectionUid: collectionUid, + cancelTokenUid: cancelTokenUid + })); + + const itemCopy = cloneDeep(item); + const collectionCopy = cloneDeep(collection); - sendNetworkRequest(item, {cancelTokenUid: cancelTokenUid}) - .then((response) => { - if(response && response.status !== -1) { - return dispatch(responseReceived({ - itemUid: item.uid, - collectionUid: collectionUid, - response: response - })); - } - }) - .catch((err) => console.log(err)); + if(collection.activeEnvironmentUid) { + const environment = findEnvironmentInCollection(collectionCopy, collection.activeEnvironmentUid); + if(environment) { + interpolateEnvironmentVars(itemCopy, environment.variables) + } + } + + sendNetworkRequest(itemCopy, {cancelTokenUid: cancelTokenUid}) + .then((response) => { + if(response && response.status !== -1) { + return dispatch(responseReceived({ + itemUid: item.uid, + collectionUid: collectionUid, + response: response + })); + } + }) + .then(resolve) + .catch(reject); + }); }; export const cancelRequest = (cancelTokenUid, item, collection) => (dispatch) => { diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js index ccc5c29bb..f5012672e 100644 --- a/packages/bruno-app/src/utils/collections/index.js +++ b/packages/bruno-app/src/utils/collections/index.js @@ -1,3 +1,4 @@ +import template from 'lodash/template'; import get from 'lodash/get'; import each from 'lodash/each'; import find from 'lodash/find'; @@ -352,3 +353,54 @@ export const refreshUidsInItem = (item) => { export const isLocalCollection = (collection) => { return collection.pathname ? true : false; }; + +export const interpolateEnvironmentVars = (item, variables) => { + const envVars = {}; + const { request } = item; + each(variables, (variable) => { + envVars[variable.name] = variable.value; + }); + + const templateOpts = { + interpolate: /{{([\s\S]+?)}}/g, //interpolate content using markers `{{}}` + evaluate: null, // prevent any js evaluation + escape: null, // disable any escaping + }; + + const interpolate = (str) => template(str, templateOpts)(envVars); + + request.url = interpolate(request.url); + + each(request.headers, (header) => { + header.value = interpolate(header.value); + }); + each(request.params, (param) => { + param.value = interpolate(param.value); + }); + + // Todo: Make interpolation work with body mode json + switch(request.body.mode) { + case 'text': { + request.body.text = interpolate(request.body.text); + break; + } + case 'xml': { + request.body.text = interpolate(request.body.text); + break; + } + case 'multipartForm': { + each(request.body.multipartForm, (param) => { + param.value = interpolate(param.value); + }); + break; + } + case 'formUrlEncoded': { + each(request.body.formUrlEncoded, (param) => { + param.value = interpolate(param.value); + }); + break; + } + } + + return request; +}; \ No newline at end of file