diff --git a/packages/builder/src/builderStore/dataBinding.js b/packages/builder/src/builderStore/dataBinding.js index 8cbc629291..cddb061e24 100644 --- a/packages/builder/src/builderStore/dataBinding.js +++ b/packages/builder/src/builderStore/dataBinding.js @@ -49,6 +49,42 @@ export const getBindableProperties = (asset, componentId) => { ] } +/** + * Gets all rest bindable data fields + */ +export const getRestBindings = () => { + const userBindings = getUserBindings() + return [...userBindings] +} + +/** + * Utility - coverting a map of readable bindings to runtime + */ +export const readableToRuntimeMap = (bindings, ctx) => { + if (!bindings || !ctx) { + return {} + } + return Object.keys(ctx).reduce((acc, key) => { + let parsedQuery = readableToRuntimeBinding(bindings, ctx[key]) + acc[key] = parsedQuery + return acc + }, {}) +} + +/** + * Utility - coverting a map of runtime bindings to readable + */ +export const runtimeToReadableMap = (bindings, ctx) => { + if (!bindings || !ctx) { + return {} + } + return Object.keys(ctx).reduce((acc, key) => { + let parsedQuery = runtimeToReadableBinding(bindings, ctx[key]) + acc[key] = parsedQuery + return acc + }, {}) +} + /** * Gets the bindable properties exposed by a certain component. */ @@ -298,7 +334,6 @@ const getUserBindings = () => { providerId: "user", }) }) - return bindings } diff --git a/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/rest/RestExtraConfigForm.svelte b/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/rest/RestExtraConfigForm.svelte index 2c8b699849..e049e0cbdf 100644 --- a/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/rest/RestExtraConfigForm.svelte +++ b/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/rest/RestExtraConfigForm.svelte @@ -10,11 +10,31 @@ import KeyValueBuilder from "components/integration/KeyValueBuilder.svelte" import RestAuthenticationBuilder from "./auth/RestAuthenticationBuilder.svelte" import ViewDynamicVariables from "./variables/ViewDynamicVariables.svelte" + import { + getRestBindings, + readableToRuntimeBinding, + runtimeToReadableMap, + } from "builderStore/dataBinding" + import { cloneDeep } from "lodash/fp" export let datasource export let queries let addHeader + + let parsedHeaders = runtimeToReadableMap( + getRestBindings(), + cloneDeep(datasource?.config?.defaultHeaders) + ) + + const onDefaultHeaderUpdate = headers => { + const flatHeaders = cloneDeep(headers).reduce((acc, entry) => { + acc[entry.name] = readableToRuntimeBinding(getRestBindings(), entry.value) + return acc + }, {}) + + datasource.config.defaultHeaders = flatHeaders + } @@ -30,8 +50,8 @@ onDefaultHeaderUpdate(evt.detail)} noAddButton />
diff --git a/packages/builder/src/components/integration/QueryBindingBuilder.svelte b/packages/builder/src/components/integration/QueryBindingBuilder.svelte index 9bcf9d36f8..7f6bd5ffd5 100644 --- a/packages/builder/src/components/integration/QueryBindingBuilder.svelte +++ b/packages/builder/src/components/integration/QueryBindingBuilder.svelte @@ -57,7 +57,8 @@ placeholder="Default" thin disabled={bindable} - bind:value={binding.default} + on:change={evt => onBindingChange(binding.name, evt.detail)} + value={runtimeToReadableBinding(bindings, binding.default)} /> {#if bindable} - +{#key $params.selectedDatasource} + +{/key} diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/rest/[query]/index.svelte b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/rest/[query]/index.svelte index 2baa6aab41..ab01d4224e 100644 --- a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/rest/[query]/index.svelte +++ b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/rest/[query]/index.svelte @@ -40,13 +40,22 @@ import { cloneDeep } from "lodash/fp" import { RawRestBodyTypes } from "constants/backend" + import { + getRestBindings, + readableToRuntimeBinding, + runtimeToReadableBinding, + runtimeToReadableMap, + readableToRuntimeMap, + } from "builderStore/dataBinding" + let query, datasource let breakQs = {}, - bindings = {} + requestBindings = {} let saveId, url let response, schema, enabledHeaders let authConfigId let dynamicVariables, addVariableModal, varBinding + let restBindings = getRestBindings() $: datasourceType = datasource?.source $: integrationInfo = $integrations[datasourceType] @@ -63,8 +72,10 @@ Object.keys(schema || {}).length !== 0 || Object.keys(query?.schema || {}).length !== 0 + $: runtimeUrlQueries = readableToRuntimeMap(restBindings, breakQs) + function getSelectedQuery() { - return cloneDeep( + const cloneQuery = cloneDeep( $queries.list.find(q => q._id === $queries.selected) || { datasourceId: $params.selectedDatasource, parameters: [], @@ -76,6 +87,30 @@ queryVerb: "read", } ) + + if (cloneQuery?.fields?.headers) { + cloneQuery.fields.headers = runtimeToReadableMap( + restBindings, + cloneQuery.fields.headers + ) + } + + if (cloneQuery?.fields?.requestBody) { + cloneQuery.fields.requestBody = runtimeToReadableBinding( + restBindings, + cloneQuery.fields.requestBody + ) + } + + if (cloneQuery?.parameters) { + const flatParams = restUtils.queryParametersToKeyValue( + cloneQuery.parameters + ) + const updatedParams = runtimeToReadableMap(restBindings, flatParams) + cloneQuery.parameters = restUtils.keyValueToQueryParameters(updatedParams) + } + + return cloneQuery } function checkQueryName(inputUrl = null) { @@ -89,7 +124,9 @@ if (!base) { return base } - const qs = restUtils.buildQueryString(qsObj) + const qs = restUtils.buildQueryString( + runtimeToReadableMap(restBindings, qsObj) + ) let newUrl = base if (base.includes("?")) { newUrl = base.split("?")[0] @@ -98,14 +135,30 @@ } function buildQuery() { - const newQuery = { ...query } - const queryString = restUtils.buildQueryString(breakQs) + const newQuery = cloneDeep(query) + const queryString = restUtils.buildQueryString(runtimeUrlQueries) + newQuery.fields.headers = readableToRuntimeMap( + restBindings, + newQuery.fields.headers + ) + newQuery.fields.requestBody = readableToRuntimeBinding( + restBindings, + newQuery.fields.requestBody + ) newQuery.fields.path = url.split("?")[0] newQuery.fields.queryString = queryString newQuery.fields.authConfigId = authConfigId newQuery.fields.disabledHeaders = restUtils.flipHeaderState(enabledHeaders) newQuery.schema = restUtils.fieldsToSchema(schema) - newQuery.parameters = restUtils.keyValueToQueryParameters(bindings) + + const parsedRequestBindings = readableToRuntimeMap( + restBindings, + requestBindings + ) + newQuery.parameters = restUtils.keyValueToQueryParameters( + parsedRequestBindings + ) + return newQuery } @@ -127,7 +180,7 @@ async function runQuery() { try { - response = await queries.preview(buildQuery(query)) + response = await queries.preview(buildQuery()) if (response.rows.length === 0) { notifications.info("Request did not return any data") } else { @@ -250,6 +303,8 @@ const datasourceUrl = datasource?.config.url const qs = query?.fields.queryString breakQs = restUtils.breakQueryString(qs) + breakQs = runtimeToReadableMap(restBindings, breakQs) + const path = query.fields.path if ( datasourceUrl && @@ -260,7 +315,7 @@ } url = buildUrl(query.fields.path, breakQs) schema = restUtils.schemaToFields(query.schema) - bindings = restUtils.queryParametersToKeyValue(query.parameters) + requestBindings = restUtils.queryParametersToKeyValue(query.parameters) authConfigId = getAuthConfigId() if (!query.fields.disabledHeaders) { query.fields.disabledHeaders = {} @@ -344,7 +399,7 @@