diff --git a/.github/workflows/deploy-single-image.yml b/.github/workflows/deploy-single-image.yml index 0bd5c71a40..8bf8f232c5 100644 --- a/.github/workflows/deploy-single-image.yml +++ b/.github/workflows/deploy-single-image.yml @@ -57,3 +57,12 @@ jobs: platforms: linux/amd64,linux/arm64 tags: budibase/budibase,budibase/budibase:v${{ env.RELEASE_VERSION }} file: ./hosting/single/Dockerfile + - name: Tag and release Budibase Azure App Service docker image + uses: docker/build-push-action@v2 + with: + context: . + push: true + platforms: linux/amd64 + build-args: TARGETBUILD=aas + tags: budibase/budibase-aas,budibase/budibase-aas:v${{ env.RELEASE_VERSION }} + file: ./hosting/single/Dockerfile diff --git a/hosting/scripts/build-target-paths.sh b/hosting/scripts/build-target-paths.sh index d1c9b5cd05..4c165d12e7 100644 --- a/hosting/scripts/build-target-paths.sh +++ b/hosting/scripts/build-target-paths.sh @@ -3,15 +3,15 @@ echo ${TARGETBUILD} > /buildtarget.txt if [[ "${TARGETBUILD}" = "aas" ]]; then # Azure AppService uses /home for persisent data & SSH on port 2222 - mkdir -p /home/budibase/{minio,couchdb} - mkdir -p /home/budibase/couchdb/data - chown -R couchdb:couchdb /home/budibase/couchdb/ + mkdir -p /home/{search,minio,couch} + mkdir -p /home/couch/{dbs,views} + chown -R couchdb:couchdb /home/couch/ apt update apt-get install -y openssh-server - sed -i 's#dir=/opt/couchdb/data/search#dir=/home/budibase/couchdb/data/search#' /opt/clouseau/clouseau.ini - sed -i 's#/minio/minio server /minio &#/minio/minio server /home/budibase/minio &#' /runner.sh - sed -i 's#database_dir = ./data#database_dir = /home/budibase/couchdb/data#' /opt/couchdb/etc/default.ini - sed -i 's#view_index_dir = ./data#view_index_dir = /home/budibase/couchdb/data#' /opt/couchdb/etc/default.ini + sed -i 's#dir=/opt/couchdb/data/search#dir=/home/search#' /opt/clouseau/clouseau.ini + sed -i 's#/minio/minio server /minio &#/minio/minio server /home/minio &#' /runner.sh + sed -i 's#database_dir = ./data#database_dir = /home/couch/dbs#' /opt/couchdb/etc/default.ini + sed -i 's#view_index_dir = ./data#view_index_dir = /home/couch/views#' /opt/couchdb/etc/default.ini sed -i "s/#Port 22/Port 2222/" /etc/ssh/sshd_config /etc/init.d/ssh restart fi diff --git a/hosting/single/Dockerfile b/hosting/single/Dockerfile index 772ae2a8ab..4e3239d960 100644 --- a/hosting/single/Dockerfile +++ b/hosting/single/Dockerfile @@ -122,8 +122,7 @@ RUN yarn cache clean -f EXPOSE 80 EXPOSE 443 -VOLUME /opt/couchdb/data -VOLUME /minio +VOLUME /data # setup letsencrypt certificate RUN apt-get install -y certbot python3-certbot-nginx diff --git a/hosting/single/runner.sh b/hosting/single/runner.sh index f8c1fc5e56..9abb2fd093 100644 --- a/hosting/single/runner.sh +++ b/hosting/single/runner.sh @@ -24,8 +24,8 @@ if [ ! -f "/data/.env" ]; then fi # make these directories in runner, incase of mount -mkdir -p /data/couch/dbs /data/couch/views -chown couchdb:couchdb /data/couch /data/couch/dbs /data/couch/views +mkdir -p /data/couch/{dbs,views} /home/couch/{dbs,views} +chown -R couchdb:couchdb /data/couch /home/couch redis-server --requirepass $REDIS_PASSWORD & /opt/clouseau/bin/clouseau & /minio/minio server /data/minio & diff --git a/lerna.json b/lerna.json index 67cbc31eff..8b496b2dd5 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.1.10-alpha.4", + "version": "1.1.14", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 1131086a2f..40caf74457 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "1.1.10-alpha.4", + "version": "1.1.14", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -20,7 +20,7 @@ "test:watch": "jest --watchAll" }, "dependencies": { - "@budibase/types": "^1.1.10-alpha.4", + "@budibase/types": "^1.1.14", "@techpass/passport-openidconnect": "0.3.2", "aws-sdk": "2.1030.0", "bcrypt": "5.0.1", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 834ee29c4b..9b8ecc8693 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.1.10-alpha.4", + "version": "1.1.14", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "^1.2.1", - "@budibase/string-templates": "^1.1.10-alpha.4", + "@budibase/string-templates": "^1.1.14", "@spectrum-css/actionbutton": "^1.0.1", "@spectrum-css/actiongroup": "^1.0.1", "@spectrum-css/avatar": "^3.0.2", diff --git a/packages/builder/package.json b/packages/builder/package.json index cd86c2414d..3fe238c8ef 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.1.10-alpha.4", + "version": "1.1.14", "license": "GPL-3.0", "private": true, "scripts": { @@ -69,10 +69,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.1.10-alpha.4", - "@budibase/client": "^1.1.10-alpha.4", - "@budibase/frontend-core": "^1.1.10-alpha.4", - "@budibase/string-templates": "^1.1.10-alpha.4", + "@budibase/bbui": "^1.1.14", + "@budibase/client": "^1.1.14", + "@budibase/frontend-core": "^1.1.14", + "@budibase/string-templates": "^1.1.14", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/builder/src/analytics/IntercomClient.js b/packages/builder/src/analytics/IntercomClient.js index 6d5bf9e93e..1c98b479cc 100644 --- a/packages/builder/src/analytics/IntercomClient.js +++ b/packages/builder/src/analytics/IntercomClient.js @@ -52,8 +52,8 @@ export default class IntercomClient { * @param {Object} user - user to identify * @returns Intercom global object */ - show(user = {}) { - if (!this.initialised || !user?.admin) return + show(user = {}, enabled) { + if (!this.initialised || !enabled) return return window.Intercom("boot", { app_id: this.token, diff --git a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte index 9c987c89d8..05cae46cfc 100644 --- a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte +++ b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte @@ -12,6 +12,7 @@ notifications, Modal, } from "@budibase/bbui" + import { ActionStepID } from "constants/backend/automations" export let automation let testDataModal @@ -82,7 +83,7 @@ in:fly|local={{ x: 500, duration: 500 }} out:fly|local={{ x: 500, duration: 500 }} > - {#if block.stepId !== "LOOP"} + {#if block.stepId !== ActionStepID.LOOP} {/if} diff --git a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowItem.svelte b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowItem.svelte index 291575f3f2..412683721f 100644 --- a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowItem.svelte +++ b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowItem.svelte @@ -10,11 +10,15 @@ Select, ActionButton, notifications, + Label, } from "@budibase/bbui" import AutomationBlockSetup from "../../SetupPanel/AutomationBlockSetup.svelte" import CreateWebhookModal from "components/automation/Shared/CreateWebhookModal.svelte" import ActionModal from "./ActionModal.svelte" import FlowItemHeader from "./FlowItemHeader.svelte" + import RoleSelect from "components/design/settings/controls/RoleSelect.svelte" + import { ActionStepID, TriggerStepID } from "constants/backend/automations" + import { permissions } from "stores/backend" export let block export let testDataModal @@ -23,9 +27,12 @@ let actionModal let blockComplete let showLooping = false + let role + $: automationId = $automationStore.selectedAutomation?.automation._id $: showBindingPicker = - block.stepId === "CREATE_ROW" || block.stepId === "UPDATE_ROW" + block.stepId === ActionStepID.CREATE_ROW || + block.stepId === ActionStepID.UPDATE_ROW $: isTrigger = block.type === "TRIGGER" @@ -45,6 +52,32 @@ x => x.blockToLoop === block.id ) + $: setPermissions(role) + $: getPermissions(automationId) + + async function setPermissions(role) { + if (!role || !automationId) { + return + } + await permissions.save({ + level: "execute", + role, + resource: automationId, + }) + } + + async function getPermissions(automationId) { + if (!automationId) { + return + } + const perms = await permissions.forResource(automationId) + if (!perms["execute"]) { + role = "BASIC" + } else { + role = perms["execute"] + } + } + async function removeLooping() { loopingSelected = false let loopBlock = @@ -205,6 +238,10 @@ {/if} + {#if block.stepId === TriggerStepID.APP} + + + {/if} import { Icon, Divider, Tabs, Tab, TextArea, Label } from "@budibase/bbui" import FlowItemHeader from "./FlowChart/FlowItemHeader.svelte" + import { ActionStepID } from "constants/backend/automations" export let automation export let testResults @@ -10,7 +11,7 @@ let blocks function prepTestResults(results) { - return results?.steps.filter(x => x.stepId !== "LOOP" || []) + return results?.steps.filter(x => x.stepId !== ActionStepID.LOOP || []) } function textArea(results, message) { @@ -30,7 +31,7 @@ } blocks = blocks .concat(automation.definition.steps || []) - .filter(x => x.stepId !== "LOOP") + .filter(x => x.stepId !== ActionStepID.LOOP) } else if (filteredResults) { blocks = filteredResults || [] // make sure there is an ID for each block being displayed @@ -45,7 +46,7 @@
{#each blocks as block, idx}
- {#if block.stepId !== "LOOP"} + {#if block.stepId !== ActionStepID.LOOP} x.stepId !== "LOOP") + .filter(x => x.stepId !== ActionStepID.LOOP) } else if (testResults) { blocks = testResults.steps || [] } diff --git a/packages/builder/src/components/automation/AutomationPanel/CreateAutomationModal.svelte b/packages/builder/src/components/automation/AutomationPanel/CreateAutomationModal.svelte index 9543a9c552..eb148534f3 100644 --- a/packages/builder/src/components/automation/AutomationPanel/CreateAutomationModal.svelte +++ b/packages/builder/src/components/automation/AutomationPanel/CreateAutomationModal.svelte @@ -11,6 +11,7 @@ Body, Icon, } from "@budibase/bbui" + import { TriggerStepID } from "constants/backend/automations" let name let selectedTrigger @@ -35,7 +36,7 @@ ) automationStore.actions.addBlockToAutomation(newBlock) - if (triggerVal.stepId === "WEBHOOK") { + if (triggerVal.stepId === TriggerStepID.WEBHOOK) { webhookModal.show } diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index c149b6a00e..8b34cf8cd2 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -30,6 +30,7 @@ import { LuceneUtils } from "@budibase/frontend-core" import { getSchemaForTable } from "builderStore/dataBinding" import { Utils } from "@budibase/frontend-core" + import { TriggerStepID, ActionStepID } from "constants/backend/automations" export let block export let testData @@ -54,12 +55,13 @@ $: schema = getSchemaForTable(tableId, { searchableSchema: true }).schema $: schemaFields = Object.values(schema || {}) $: queryLimit = tableId?.includes("datasource") ? "∞" : "1000" + $: isTrigger = block?.type === "TRIGGER" const onChange = Utils.sequential(async (e, key) => { try { if (isTestModal) { // Special case for webhook, as it requires a body, but the schema already brings back the body's contents - if (stepId === "WEBHOOK") { + if (stepId === TriggerStepID.WEBHOOK) { automationStore.actions.addTestDataToAutomation({ body: { [key]: e.detail, @@ -100,9 +102,9 @@ // Extract all outputs from all previous steps as available bindins let bindings = [] for (let idx = 0; idx < blockIdx; idx++) { - let wasLoopBlock = allSteps[idx]?.stepId === "LOOP" + let wasLoopBlock = allSteps[idx]?.stepId === ActionStepID.LOOP let isLoopBlock = - allSteps[idx]?.stepId === "LOOP" && + allSteps[idx]?.stepId === ActionStepID.LOOP && allSteps.find(x => x.blockToLoop === block.id) // If the previous block was a loop block, decerement the index so the following @@ -261,6 +263,7 @@ /> {:else if value.customType === "table"} onChange(e, key)} /> @@ -343,7 +346,7 @@ -{#if stepId === "WEBHOOK"} +{#if stepId === TriggerStepID.WEBHOOK} {/if} diff --git a/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte b/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte index 1b410cd86a..93b8394b49 100644 --- a/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte +++ b/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte @@ -1,5 +1,5 @@
- - + (touched = true)} /> + {#if touched && !value} + + {/if}
diff --git a/packages/builder/src/components/automation/SetupPanel/TableSelector.svelte b/packages/builder/src/components/automation/SetupPanel/TableSelector.svelte index ceb28a37ca..1645ded66b 100644 --- a/packages/builder/src/components/automation/SetupPanel/TableSelector.svelte +++ b/packages/builder/src/components/automation/SetupPanel/TableSelector.svelte @@ -2,10 +2,16 @@ import { tables } from "stores/backend" import { Select } from "@budibase/bbui" import { createEventDispatcher } from "svelte" + import { TableNames } from "constants" const dispatch = createEventDispatcher() export let value + export let isTrigger + + $: filteredTables = $tables.list.filter(table => { + return !isTrigger || table._id !== TableNames.USERS + }) const onChange = e => { value = e.detail @@ -16,7 +22,7 @@