diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml
index 75e890abc..3f0ecd84c 100644
--- a/.github/workflows/budibase_ci.yml
+++ b/.github/workflows/budibase_ci.yml
@@ -43,13 +43,13 @@ jobs:
verbose: true
- run: yarn test:e2e:ci
- - name: Build and Push Staging Docker Image
+ - name: Build and Push Development Docker Image
# Only run on push
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/develop' }}
run: |
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
yarn build
- yarn build:docker:staging
+ yarn build:docker:develop
env:
DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }}
diff --git a/hosting/envoy.dev.yaml.hbs b/hosting/envoy.dev.yaml.hbs
index 080311ee4..76417b3e0 100644
--- a/hosting/envoy.dev.yaml.hbs
+++ b/hosting/envoy.dev.yaml.hbs
@@ -38,6 +38,11 @@ static_resources:
route:
cluster: server-dev
+ - match: { prefix: "/app/" }
+ route:
+ cluster: server-dev
+ prefix_rewrite: "/"
+
# the below three cases are needed to make sure
# all traffic prefixed for the builder is passed through
# correctly.
diff --git a/hosting/envoy.yaml b/hosting/envoy.yaml
index 20e912434..d7b34f4d5 100644
--- a/hosting/envoy.yaml
+++ b/hosting/envoy.yaml
@@ -139,5 +139,5 @@ static_resources:
address:
socket_address:
address: watchtower-service
- port_value: 6161
+ port_value: 8080
diff --git a/hosting/scripts/linux/release-to-docker-hub.sh b/hosting/scripts/linux/release-to-docker-hub.sh
index b1a79c964..b3c380f72 100755
--- a/hosting/scripts/linux/release-to-docker-hub.sh
+++ b/hosting/scripts/linux/release-to-docker-hub.sh
@@ -8,9 +8,5 @@ echo "Tagging images with SHA: $GITHUB_SHA and tag: $tag"
docker tag app-service budibase/apps:$tag
docker tag worker-service budibase/worker:$tag
-# Tag with git sha
-docker tag app-service budibase/apps:$GITHUB_SHA
-docker tag worker-service budibase/worker:$GITHUB_SHA
-
-docker push budibase/apps
-docker push budibase/worker
+docker push budibase/apps:$tag
+docker push budibase/worker:$tag
diff --git a/lerna.json b/lerna.json
index de9808a22..297aaa41b 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "0.9.51",
+ "version": "0.9.53",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/package.json b/package.json
index aa4cc3e79..5a0a0d749 100644
--- a/package.json
+++ b/package.json
@@ -41,6 +41,6 @@
"test:e2e": "lerna run cy:test",
"test:e2e:ci": "lerna run cy:ci",
"build:docker": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh && cd -",
- "build:docker:staging": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh staging && cd -"
+ "build:docker:develop": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh develop && cd -"
}
}
diff --git a/packages/auth/package.json b/packages/auth/package.json
index 0cf7ae32e..5fbde7f1b 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/auth",
- "version": "0.9.51",
+ "version": "0.9.53",
"description": "Authentication middlewares for budibase builder and apps",
"main": "src/index.js",
"author": "Budibase",
diff --git a/packages/auth/src/middleware/authenticated.js b/packages/auth/src/middleware/authenticated.js
index 5d9056b19..64494f709 100644
--- a/packages/auth/src/middleware/authenticated.js
+++ b/packages/auth/src/middleware/authenticated.js
@@ -22,6 +22,12 @@ function buildNoAuthRegex(patterns) {
})
}
+function finalise(ctx, { authenticated, user, internal } = {}) {
+ ctx.isAuthenticated = authenticated || false
+ ctx.user = user
+ ctx.internal = internal || false
+}
+
module.exports = (noAuthPatterns = [], opts) => {
const noAuthOptions = noAuthPatterns ? buildNoAuthRegex(noAuthPatterns) : []
return async (ctx, next) => {
@@ -36,35 +42,39 @@ module.exports = (noAuthPatterns = [], opts) => {
return next()
}
try {
- const apiKey = ctx.request.headers["x-budibase-api-key"]
// check the actual user is authenticated first
const authCookie = getCookie(ctx, Cookies.Auth)
-
- // this is an internal request, no user made it
- if (apiKey && apiKey === env.INTERNAL_API_KEY) {
- ctx.isAuthenticated = true
- ctx.internal = true
- } else if (authCookie) {
+ let authenticated = false,
+ user = null,
+ internal = false
+ if (authCookie) {
try {
const db = database.getDB(StaticDatabases.GLOBAL.name)
- const user = await db.get(authCookie.userId)
+ user = await db.get(authCookie.userId)
delete user.password
- ctx.isAuthenticated = true
- ctx.user = user
+ authenticated = true
} catch (err) {
// remove the cookie as the use does not exist anymore
clearCookie(ctx, Cookies.Auth)
}
}
+ const apiKey = ctx.request.headers["x-budibase-api-key"]
+ // this is an internal request, no user made it
+ if (!authenticated && apiKey && apiKey === env.INTERNAL_API_KEY) {
+ authenticated = true
+ internal = true
+ }
// be explicit
- if (ctx.isAuthenticated !== true) {
- ctx.isAuthenticated = false
+ if (authenticated !== true) {
+ authenticated = false
}
+ // isAuthenticated is a function, so use a variable to be able to check authed state
+ finalise(ctx, { authenticated, user, internal })
return next()
} catch (err) {
// allow configuring for public access
if (opts && opts.publicAllowed) {
- ctx.isAuthenticated = false
+ finalise(ctx, { authenticated: false })
} else {
ctx.throw(err.status || 403, err)
}
diff --git a/packages/bbui/package.json b/packages/bbui/package.json
index 3325b2308..847a310c9 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": "0.9.51",
+ "version": "0.9.53",
"license": "AGPL-3.0",
"svelte": "src/index.js",
"module": "dist/bbui.es.js",
diff --git a/packages/bbui/src/Table/StringRenderer.svelte b/packages/bbui/src/Table/StringRenderer.svelte
index 275683961..6fd731f5e 100644
--- a/packages/bbui/src/Table/StringRenderer.svelte
+++ b/packages/bbui/src/Table/StringRenderer.svelte
@@ -2,7 +2,7 @@
export let value
-
{value}
+{typeof value === "object" ? JSON.stringify(value) : value}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
index 6d469e090..e25159593 100644
--- a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
+++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
@@ -9,8 +9,10 @@ import SqlServer from "./SQLServer.svelte"
import MySQL from "./MySQL.svelte"
import ArangoDB from "./ArangoDB.svelte"
import Rest from "./Rest.svelte"
+import Budibase from "./Budibase.svelte"
export default {
+ BUDIBASE: Budibase,
POSTGRES: Postgres,
DYNAMODB: DynamoDB,
MONGODB: MongoDB,
diff --git a/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte b/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte
index a03f07e74..180d03f7f 100644
--- a/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte
+++ b/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte
@@ -23,16 +23,17 @@
}
async function saveDatasource() {
- const { type, ...config } = integration
+ const { type, plus, ...config } = integration
// Create datasource
const response = await datasources.save({
name,
source: type,
config,
+ plus,
})
notifications.success(`Datasource ${name} created successfully.`)
- analytics.captureEvent("Datasource Created", { name })
+ analytics.captureEvent("Datasource Created", { name, type })
// Navigate to new datasource
$goto(`./datasource/${response._id}`)
diff --git a/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte b/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte
index fa8733a8b..4291738d3 100644
--- a/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte
+++ b/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte
@@ -6,6 +6,8 @@
import EditViewPopover from "./popovers/EditViewPopover.svelte"
import NavItem from "components/common/NavItem.svelte"
+ export let sourceId
+
$: selectedView = $views.selected && $views.selected.name
function selectTable(table) {
@@ -31,12 +33,13 @@
{#if $database?._id}
- {#each $tables.list as table, idx}
+ {#each $tables.list.filter(table => table.sourceId === sourceId) as table, idx}
0}
icon={table._id === TableNames.USERS ? "UserGroup" : "Table"}
text={table.name}
- selected={selectedView === `all_${table._id}`}
+ selected={$tables.selected?._id === table._id}
on:click={() => selectTable(table)}
>
{#if table._id !== TableNames.USERS}
@@ -45,7 +48,7 @@
{#each Object.keys(table.views || {}) as viewName, idx (idx)}
diff --git a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
index 17d5aa204..2513c6c7e 100644
--- a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
+++ b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
@@ -1,15 +1,15 @@
+
+
+
+
+
+
diff --git a/packages/builder/src/components/deploy/DeployModal.svelte b/packages/builder/src/components/deploy/DeployModal.svelte
index bade2605d..6e1b5f76e 100644
--- a/packages/builder/src/components/deploy/DeployModal.svelte
+++ b/packages/builder/src/components/deploy/DeployModal.svelte
@@ -1,10 +1,10 @@
+
+
+ This action doesn't require any additional settings.
+
+
+
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js
index a3e43cb04..b8114461f 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js
@@ -4,6 +4,7 @@ import DeleteRow from "./DeleteRow.svelte"
import ExecuteQuery from "./ExecuteQuery.svelte"
import TriggerAutomation from "./TriggerAutomation.svelte"
import ValidateForm from "./ValidateForm.svelte"
+import LogOut from "./LogOut.svelte"
// Defines which actions are available to configure in the front end.
// Unfortunately the "name" property is used as the identifier so please don't
@@ -37,4 +38,8 @@ export default [
name: "Validate Form",
component: ValidateForm,
},
+ {
+ name: "Log Out",
+ component: LogOut,
+ },
]
diff --git a/packages/builder/src/constants/index.js b/packages/builder/src/constants/index.js
index 8a0e8fd60..aefc1fab0 100644
--- a/packages/builder/src/constants/index.js
+++ b/packages/builder/src/constants/index.js
@@ -31,3 +31,5 @@ export const LAYOUT_NAMES = {
PUBLIC: "layout_private_master",
},
}
+
+export const BUDIBASE_INTERNAL_DB = "bb_internal"
diff --git a/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte
index 6910d3e92..6ce765d42 100644
--- a/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte
@@ -1,49 +1,27 @@
-
-
-
-
-
+
+
@@ -54,7 +32,7 @@
diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/[query]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/[query]/_layout.svelte
index 4d6acc22a..4fa864ce7 100644
--- a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/[query]/_layout.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/[query]/_layout.svelte
@@ -1,13 +1 @@
-
-
diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte
index 98379607c..f805a5724 100644
--- a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte
@@ -1,7 +1,7 @@
-{#if datasource}
+{#if datasource && integration}
@@ -66,6 +86,34 @@
on:change={setUnsaved}
/>
+ {#if datasource.plus}
+
+
+
+ This datasource can determine tables automatically. Budibase can fetch
+ your tables directly from the database and you can use them without
+ having to write any queries at all.
+
+
+ {#if datasource.entities}
+ {#each Object.keys(datasource.entities) as entity}
+
onClickTable(datasource.entities[entity])}
+ >
+
{entity}
+
Primary Key: {datasource.entities[entity].primary}
+
→
+
+ {/each}
+ {/if}
+
+ {/if}