diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/Rest.svelte b/packages/builder/src/components/backend/DatasourceNavigator/icons/Rest.svelte new file mode 100644 index 0000000000..f4c8863fd4 --- /dev/null +++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/Rest.svelte @@ -0,0 +1,36 @@ + + + + + + diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js index ff38782288..6d469e0904 100644 --- a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js +++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js @@ -8,6 +8,7 @@ import Airtable from "./Airtable.svelte" import SqlServer from "./SQLServer.svelte" import MySQL from "./MySQL.svelte" import ArangoDB from "./ArangoDB.svelte" +import Rest from "./Rest.svelte" export default { POSTGRES: Postgres, @@ -20,4 +21,5 @@ export default { AIRTABLE: Airtable, MYSQL: MySQL, ARANGODB: ArangoDB, + REST: Rest, } diff --git a/packages/builder/src/components/integration/KeyValueBuilder.svelte b/packages/builder/src/components/integration/KeyValueBuilder.svelte new file mode 100644 index 0000000000..92a66f8813 --- /dev/null +++ b/packages/builder/src/components/integration/KeyValueBuilder.svelte @@ -0,0 +1,45 @@ + + + +
+ {#each fields as field, idx} + + + deleteEntry(idx)} /> + {/each} +
+ + + diff --git a/packages/builder/src/components/integration/QueryFieldsBuilder.svelte b/packages/builder/src/components/integration/QueryFieldsBuilder.svelte index e7653f3c6b..3de8d317ad 100644 --- a/packages/builder/src/components/integration/QueryFieldsBuilder.svelte +++ b/packages/builder/src/components/integration/QueryFieldsBuilder.svelte @@ -8,6 +8,7 @@ Select, } from "@budibase/bbui" import Editor from "./QueryEditor.svelte" + import KeyValueBuilder from "./KeyValueBuilder.svelte" export let fields = {} export let schema @@ -27,53 +28,21 @@ fields.customData = detail.value } - function updateSubfieldName({ names, definition }) { - console.log(names, definition) - const temp = definition[names.old] - definition[names.new] = temp - delete definition[names.old] - // fields = fields - } - - // function addCustomField() { - - // } - - // function removeCustomField() { - - // }
{#each schemaKeys as field} - {#if schema.fields[field]?.type === "object"} -
- {#each Object.keys(fields[field] || {}) as subfield} - updateSubfieldName({ - names: { - new: e.target.value, - old: subfield - }, - definition: fields[field] - })} - /> - - { - delete fields[field][subfield] - fields[field] = fields[field] - }} /> - {/each} -
- { - // set new empty field - fields[field] = { - ...fields[field] || {}, - [""]: "" - } - }} /> + + {:else if schema.fields[field]?.type === "json"} + + fields[field] = detail.value} + readOnly={!editable} + value={fields[field]} /> {:else} - form { - width: 600px; - } - .field { margin-bottom: var(--spacing-m); display: grid; @@ -109,11 +74,4 @@ align-items: center; } - .inner-fields { - margin-bottom: var(--spacing-m); - display: grid; - grid-template-columns: 1fr 1fr 20px; - grid-gap: var(--spacing-m); - align-items: center; - } diff --git a/packages/builder/src/components/integration/QueryViewer.svelte b/packages/builder/src/components/integration/QueryViewer.svelte index 0f38f7650f..c53441941b 100644 --- a/packages/builder/src/components/integration/QueryViewer.svelte +++ b/packages/builder/src/components/integration/QueryViewer.svelte @@ -181,7 +181,13 @@ {#if data} {#if tab === 'JSON'} -
{JSON.stringify(data[0], undefined, 2)}
+
+              {#if !data[0]}
+                Please run your query to fetch some data.
+              {:else}
+                {JSON.stringify(data[0], undefined, 2)}
+              {/if}
+            
{:else if tab === 'PREVIEW'} {:else if tab === 'SCHEMA'} diff --git a/packages/server/src/api/index.js b/packages/server/src/api/index.js index 7b063cb522..d5cec9c819 100644 --- a/packages/server/src/api/index.js +++ b/packages/server/src/api/index.js @@ -53,6 +53,8 @@ router.use(async (ctx, next) => { router.get("/health", ctx => (ctx.status = 200)) +router.post("/yeet", ctx => (ctx.body = ctx.request.body)) + router.use(authRoutes.routes()) router.use(authRoutes.allowedMethods()) diff --git a/packages/server/src/integrations/Integration.js b/packages/server/src/integrations/Integration.js index 601a58d087..07d6d159b0 100644 --- a/packages/server/src/integrations/Integration.js +++ b/packages/server/src/integrations/Integration.js @@ -10,4 +10,5 @@ exports.FIELD_TYPES = { PASSWORD: "password", LIST: "list", OBJECT: "object", + JSON: "json", } diff --git a/packages/server/src/integrations/airtable.js b/packages/server/src/integrations/airtable.js index 088f642d51..2a581527a8 100644 --- a/packages/server/src/integrations/airtable.js +++ b/packages/server/src/integrations/airtable.js @@ -50,7 +50,7 @@ const SCHEMA = { }, }, delete: { - type: FIELD_TYPES.JSON, + type: QUERY_TYPES.JSON, }, }, } diff --git a/packages/server/src/integrations/rest.js b/packages/server/src/integrations/rest.js index 48ceb032c8..6b56303c51 100644 --- a/packages/server/src/integrations/rest.js +++ b/packages/server/src/integrations/rest.js @@ -11,6 +11,20 @@ const SCHEMA = { }, }, query: { + create: { + type: QUERY_TYPES.FIELDS, + fields: { + path: { + type: FIELD_TYPES.STRING, + }, + headers: { + type: FIELD_TYPES.OBJECT, + }, + requestBody: { + type: FIELD_TYPES.JSON, + }, + }, + }, read: { type: QUERY_TYPES.FIELDS, fields: { @@ -22,6 +36,34 @@ const SCHEMA = { }, }, }, + update: { + type: QUERY_TYPES.FIELDS, + fields: { + path: { + type: FIELD_TYPES.STRING, + }, + headers: { + type: FIELD_TYPES.OBJECT, + }, + requestBody: { + type: FIELD_TYPES.JSON, + }, + }, + }, + delete: { + type: QUERY_TYPES.FIELDS, + fields: { + path: { + type: FIELD_TYPES.STRING, + }, + headers: { + type: FIELD_TYPES.OBJECT, + }, + requestBody: { + type: FIELD_TYPES.JSON, + }, + }, + }, }, } @@ -30,9 +72,15 @@ class RestIntegration { this.config = config } - // create(query) { - // return this.query(query) - // } + async create({ path, headers = {}, requestBody }) { + const response = await fetch(this.config.url + path, { + method: "POST", + headers, + body: requestBody, + }) + + return await response.json() + } async read({ path, headers = {} }) { const response = await fetch(this.config.url + path, { @@ -42,13 +90,24 @@ class RestIntegration { return await response.json() } - // update(query) { - // return this.query(query) - // } + async update({ path, headers = {}, requestBody }) { + const response = await fetch(this.config.url + path, { + method: "POST", + headers, + body: requestBody, + }) - // delete(query) { - // return this.query(query) - // } + return await response.json() + } + + async delete({ path, headers = {} }) { + const response = await fetch(this.config.url + path, { + method: "DELETE", + headers, + }) + + return await response.json() + } } module.exports = {