@budibase/server 0.9.188 → 0.9.190-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +7 -1
- package/__mocks__/mssql.ts +1 -1
- package/__mocks__/oracledb.ts +31 -0
- package/__mocks__/pg.ts +3 -0
- package/builder/assets/bb-space-man.5be51a45.svg +290 -0
- package/builder/assets/index.2bd3b345.js +1316 -0
- package/builder/assets/index.4fb3f887.css +1 -0
- package/builder/assets/oracle.66592424.png +0 -0
- package/builder/assets/vendor.470042a4.js +152 -0
- package/builder/assets/vendor.5e1fe644.css +1 -0
- package/builder/index.html +4 -4
- package/coverage/clover.xml +1608 -1191
- package/coverage/coverage-final.json +97 -93
- package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
- package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
- package/coverage/lcov-report/api/controllers/application.js.html +113 -80
- package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
- package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +4 -4
- package/coverage/lcov-report/api/controllers/datasource.js.html +245 -41
- package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
- package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
- package/coverage/lcov-report/api/controllers/index.html +98 -98
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
- package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
- package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
- package/coverage/lcov-report/api/controllers/query.js.html +79 -229
- package/coverage/lcov-report/api/controllers/role.js.html +9 -9
- package/coverage/lcov-report/api/controllers/routing.js.html +29 -29
- package/coverage/lcov-report/api/controllers/row/external.js.html +17 -8
- package/coverage/lcov-report/api/controllers/row/index.html +26 -26
- package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
- package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
- package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
- package/coverage/lcov-report/api/controllers/screen.js.html +3 -3
- package/coverage/lcov-report/api/controllers/script.js.html +3 -3
- package/coverage/lcov-report/api/controllers/table/external.js.html +1001 -0
- package/coverage/lcov-report/api/controllers/table/index.html +56 -26
- package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
- package/coverage/lcov-report/api/controllers/table/internal.js.html +533 -0
- package/coverage/lcov-report/api/controllers/table/utils.js.html +175 -52
- package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
- package/coverage/lcov-report/api/controllers/user.js.html +390 -33
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +19 -4
- package/coverage/lcov-report/api/controllers/view/index.html +22 -22
- package/coverage/lcov-report/api/controllers/view/index.js.html +52 -13
- package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
- package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +5 -5
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/application.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +2 -2
- package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +4 -4
- package/coverage/lcov-report/api/routes/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +5 -2
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/row.js.html +536 -2
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/static.js.html +2 -2
- package/coverage/lcov-report/api/routes/table.js.html +464 -2
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +17 -2
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +2 -2
- package/coverage/lcov-report/automations/automationUtils.js.html +4 -4
- package/coverage/lcov-report/automations/bullboard.js.html +71 -20
- package/coverage/lcov-report/automations/index.html +35 -50
- package/coverage/lcov-report/automations/index.js.html +2 -2
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +14 -14
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
- package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
- package/coverage/lcov-report/automations/triggers.js.html +22 -10
- package/coverage/lcov-report/automations/utils.js.html +46 -16
- package/coverage/lcov-report/constants/index.html +5 -5
- package/coverage/lcov-report/constants/index.js.html +87 -21
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +2 -2
- package/coverage/lcov-report/db/client.js.html +2 -2
- package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
- package/coverage/lcov-report/db/index.html +2 -2
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
- package/coverage/lcov-report/db/linkedRows/index.html +10 -10
- package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
- package/coverage/lcov-report/db/newid.js.html +4 -4
- package/coverage/lcov-report/db/utils.js.html +75 -75
- package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
- package/coverage/lcov-report/events/index.html +6 -6
- package/coverage/lcov-report/events/index.js.html +1 -1
- package/coverage/lcov-report/events/utils.js.html +5 -5
- package/coverage/lcov-report/index.html +106 -91
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
- package/coverage/lcov-report/middleware/authorized.js.html +19 -16
- package/coverage/lcov-report/middleware/builder.js.html +22 -13
- package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
- package/coverage/lcov-report/middleware/index.html +23 -23
- package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
- package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
- package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
- package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +90 -33
- package/coverage/lcov-report/threads/index.html +141 -0
- package/coverage/lcov-report/threads/index.js.html +278 -0
- package/coverage/lcov-report/threads/query.js.html +278 -0
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
- package/coverage/lcov-report/utilities/global.js.html +38 -23
- package/coverage/lcov-report/utilities/index.html +48 -48
- package/coverage/lcov-report/utilities/index.js.html +49 -16
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +31 -10
- package/coverage/lcov-report/utilities/queue/index.html +14 -14
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +2 -2
- package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
- package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
- package/coverage/lcov-report/utilities/security.js.html +3 -3
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
- package/coverage/lcov.info +2687 -1942
- package/dist/api/controllers/application.js +16 -6
- package/dist/api/controllers/auth.js +3 -3
- package/dist/api/controllers/datasource.js +67 -16
- package/dist/api/controllers/deploy/index.js +2 -0
- package/dist/api/controllers/dev.js +4 -1
- package/dist/api/controllers/query.js +32 -62
- package/dist/api/controllers/row/ExternalRequest.js +83 -36
- package/dist/api/controllers/row/external.js +3 -1
- package/dist/api/controllers/row/utils.js +6 -12
- package/dist/api/controllers/table/external.js +249 -0
- package/dist/api/controllers/table/index.js +49 -123
- package/dist/api/controllers/table/internal.js +146 -0
- package/dist/api/controllers/table/utils.js +62 -28
- package/dist/api/controllers/user.js +123 -11
- package/dist/api/controllers/view/exporters.js +4 -0
- package/dist/api/controllers/view/index.js +14 -2
- package/dist/api/routes/query.js +1 -1
- package/dist/api/routes/row.js +178 -0
- package/dist/api/routes/table.js +150 -1
- package/dist/api/routes/user.js +2 -1
- package/dist/app.js +2 -11
- package/dist/automations/bullboard.js +37 -10
- package/dist/automations/triggers.js +7 -3
- package/dist/automations/utils.js +11 -2
- package/dist/constants/index.js +19 -0
- package/dist/definitions/datasource.js +17 -1
- package/dist/environment.js +13 -0
- package/dist/integrations/base/IntegrationBase.js +2 -0
- package/dist/integrations/base/datasourcePlus.js +2 -0
- package/dist/integrations/base/sql.js +350 -177
- package/dist/integrations/base/sqlTable.js +143 -0
- package/dist/integrations/base/utils.js +30 -0
- package/dist/integrations/index.js +6 -0
- package/dist/integrations/microsoftSqlServer.js +117 -9
- package/dist/integrations/mysql.js +16 -85
- package/dist/integrations/oracle.js +367 -0
- package/dist/integrations/postgres.js +35 -28
- package/dist/integrations/utils.js +71 -9
- package/dist/middleware/authorized.js +2 -1
- package/dist/middleware/builder.js +4 -1
- package/dist/package.json +18 -9
- package/dist/tests/utilities/TestConfiguration.js +2 -1
- package/dist/{automations/thread.js → threads/automation.js} +26 -8
- package/dist/threads/index.js +64 -0
- package/dist/threads/query.js +64 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/csvParser.js +46 -5
- package/dist/utilities/global.js +6 -2
- package/dist/utilities/index.js +11 -0
- package/dist/utilities/queue/inMemoryQueue.js +8 -0
- package/dist/utilities/scriptRunner.js +4 -1
- package/package.json +19 -10
- package/scripts/dev/manage.js +1 -0
- package/scripts/docs/README.md +31 -0
- package/scripts/docs/generate.js +74 -0
- package/scripts/docs/toSwagger.js +320 -0
- package/scripts/integrations/mssql/data/Dockerfile +9 -0
- package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
- package/scripts/integrations/mssql/data/setup.sql +54 -0
- package/scripts/integrations/mssql/docker-compose.yaml +12 -0
- package/scripts/integrations/mssql/reset.sh +3 -0
- package/scripts/integrations/oracle/docker-compose.yml +19 -0
- package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
- package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
- package/scripts/integrations/oracle/oracle.md +90 -0
- package/scripts/integrations/postgres/docker-compose.yml +3 -3
- package/scripts/likeCypress.ts +33 -0
- package/src/api/controllers/application.js +18 -7
- package/src/api/controllers/auth.js +3 -0
- package/src/api/controllers/datasource.js +84 -16
- package/src/api/controllers/deploy/index.js +2 -0
- package/src/api/controllers/dev.js +4 -1
- package/src/api/controllers/query.js +35 -85
- package/src/api/controllers/row/ExternalRequest.ts +99 -38
- package/src/api/controllers/row/external.js +4 -1
- package/src/api/controllers/row/utils.js +8 -11
- package/src/api/controllers/table/external.js +307 -0
- package/src/api/controllers/table/index.js +47 -137
- package/src/api/controllers/table/internal.js +151 -0
- package/src/api/controllers/table/utils.js +74 -33
- package/src/api/controllers/user.js +132 -13
- package/src/api/controllers/view/exporters.js +5 -0
- package/src/api/controllers/view/index.js +15 -2
- package/src/api/routes/query.js +1 -0
- package/src/api/routes/row.js +178 -0
- package/src/api/routes/table.js +154 -0
- package/src/api/routes/tests/application.spec.js +0 -2
- package/src/api/routes/tests/datasource.spec.js +2 -2
- package/src/api/routes/tests/misc.spec.js +5 -1
- package/src/api/routes/tests/query.spec.js +38 -9
- package/src/api/routes/tests/screen.spec.js +1 -1
- package/src/api/routes/user.js +5 -0
- package/src/app.ts +2 -10
- package/src/automations/bullboard.js +28 -11
- package/src/automations/tests/automation.spec.js +3 -4
- package/src/automations/triggers.js +7 -3
- package/src/automations/utils.js +12 -2
- package/src/constants/index.js +22 -0
- package/src/definitions/common.ts +7 -1
- package/src/definitions/datasource.ts +21 -3
- package/src/environment.js +15 -0
- package/src/integrations/airtable.ts +2 -1
- package/src/integrations/arangodb.ts +2 -1
- package/src/integrations/base/IntegrationBase.ts +6 -0
- package/src/integrations/base/datasourcePlus.ts +9 -0
- package/src/integrations/base/sql.ts +375 -218
- package/src/integrations/base/sqlTable.ts +180 -0
- package/src/integrations/base/utils.ts +22 -0
- package/src/integrations/couchdb.ts +2 -1
- package/src/integrations/dynamodb.ts +2 -1
- package/src/integrations/elasticsearch.ts +2 -1
- package/src/integrations/index.ts +7 -0
- package/src/integrations/microsoftSqlServer.ts +145 -13
- package/src/integrations/mongodb.ts +2 -1
- package/src/integrations/mysql.ts +23 -95
- package/src/integrations/oracle.ts +464 -0
- package/src/integrations/postgres.ts +45 -35
- package/src/integrations/rest.ts +2 -1
- package/src/integrations/s3.ts +2 -1
- package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
- package/src/integrations/tests/oracle.spec.js +94 -0
- package/src/integrations/tests/postgres.spec.js +4 -0
- package/src/integrations/utils.ts +78 -8
- package/src/middleware/authorized.js +2 -1
- package/src/middleware/builder.js +4 -1
- package/src/tests/utilities/TestConfiguration.js +2 -1
- package/src/{automations/thread.js → threads/automation.js} +27 -8
- package/src/threads/index.js +66 -0
- package/src/threads/query.js +66 -0
- package/src/utilities/csvParser.js +48 -5
- package/src/utilities/global.js +7 -2
- package/src/utilities/index.js +11 -0
- package/src/utilities/queue/inMemoryQueue.js +7 -0
- package/src/utilities/scriptRunner.js +4 -1
- package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
- package/src/utilities/tests/csvParser.spec.js +3 -0
- package/tsconfig.json +1 -1
- package/builder/assets/index.550fdba7.js +0 -201
- package/builder/assets/index.7469e1e4.css +0 -29
- package/builder/assets/vendor.278a305c.js +0 -9
- package/builder/assets/vendor.d75d5eb7.css +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
if [ "$1" = '/opt/mssql/bin/sqlservr' ]; then
|
|
5
|
+
# If this is the container's first run, initialize the application database
|
|
6
|
+
if [ ! -f /tmp/app-initialized ]; then
|
|
7
|
+
# Initialize the application database asynchronously in a background process. This allows a) the SQL Server process to be the main process in the container, which allows graceful shutdown and other goodies, and b) us to only start the SQL Server process once, as opposed to starting, stopping, then starting it again.
|
|
8
|
+
function initialize_app_database() {
|
|
9
|
+
# Wait a bit for SQL Server to start. SQL Server's process doesn't provide a clever way to check if it's up or not, and it needs to be up before we can import the application database
|
|
10
|
+
sleep 30s
|
|
11
|
+
|
|
12
|
+
echo "RUNNING BUDIBASE SETUP"
|
|
13
|
+
|
|
14
|
+
#run the setup script to create the DB and the schema in the DB
|
|
15
|
+
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Passw0rd -i setup.sql
|
|
16
|
+
|
|
17
|
+
# Note that the container has been initialized so future starts won't wipe changes to the data
|
|
18
|
+
touch /tmp/app-initialized
|
|
19
|
+
}
|
|
20
|
+
initialize_app_database &
|
|
21
|
+
fi
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
exec "$@"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
USE master;
|
|
2
|
+
|
|
3
|
+
IF OBJECT_ID ('dbo.products', 'U') IS NOT NULL
|
|
4
|
+
DROP TABLE products;
|
|
5
|
+
GO
|
|
6
|
+
CREATE TABLE products
|
|
7
|
+
(
|
|
8
|
+
id int IDENTITY(1,1),
|
|
9
|
+
name varchar (20),
|
|
10
|
+
description varchar(30),
|
|
11
|
+
CONSTRAINT pk_products PRIMARY KEY NONCLUSTERED (id)
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
IF OBJECT_ID ('dbo.tasks', 'U') IS NOT NULL
|
|
15
|
+
DROP TABLE tasks;
|
|
16
|
+
GO
|
|
17
|
+
CREATE TABLE tasks
|
|
18
|
+
(
|
|
19
|
+
taskid int IDENTITY(1,1),
|
|
20
|
+
taskname varchar (20),
|
|
21
|
+
productid int,
|
|
22
|
+
CONSTRAINT pk_tasks PRIMARY KEY NONCLUSTERED (taskid),
|
|
23
|
+
CONSTRAINT fk_products FOREIGN KEY (productid) REFERENCES products (id),
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
IF OBJECT_ID ('dbo.people', 'U') IS NOT NULL
|
|
27
|
+
DROP TABLE people;
|
|
28
|
+
GO
|
|
29
|
+
CREATE TABLE people
|
|
30
|
+
(
|
|
31
|
+
name varchar(30),
|
|
32
|
+
age varchar(20),
|
|
33
|
+
CONSTRAINT pk_people PRIMARY KEY NONCLUSTERED (name, age)
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
INSERT products
|
|
37
|
+
(name, description)
|
|
38
|
+
VALUES
|
|
39
|
+
('Bananas', 'Fruit thing');
|
|
40
|
+
|
|
41
|
+
INSERT products
|
|
42
|
+
(name, description)
|
|
43
|
+
VALUES
|
|
44
|
+
('Meat', 'Animal thing');
|
|
45
|
+
|
|
46
|
+
INSERT tasks
|
|
47
|
+
(taskname, productid)
|
|
48
|
+
VALUES
|
|
49
|
+
('Processing', 1);
|
|
50
|
+
|
|
51
|
+
INSERT people
|
|
52
|
+
(name, age)
|
|
53
|
+
VALUES
|
|
54
|
+
('Bob', '30');
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# For more information see:
|
|
2
|
+
# https://container-registry.oracle.com/
|
|
3
|
+
# - Database > Express
|
|
4
|
+
version: "3.8"
|
|
5
|
+
services:
|
|
6
|
+
db:
|
|
7
|
+
restart: always
|
|
8
|
+
platform: linux/x86_64
|
|
9
|
+
image: container-registry.oracle.com/database/express:18.4.0-xe
|
|
10
|
+
environment:
|
|
11
|
+
ORACLE_PWD: oracle
|
|
12
|
+
ports:
|
|
13
|
+
- 1521:1521
|
|
14
|
+
- 5500:5500
|
|
15
|
+
volumes:
|
|
16
|
+
- oracle_data:/opt/oracle/oradata
|
|
17
|
+
|
|
18
|
+
volumes:
|
|
19
|
+
oracle_data:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Must be root to continue
|
|
4
|
+
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
|
|
5
|
+
|
|
6
|
+
# Allow for re-runs
|
|
7
|
+
rm -rf /opt/oracle
|
|
8
|
+
|
|
9
|
+
echo "Installing oracle instant client"
|
|
10
|
+
|
|
11
|
+
# copy and unzip package
|
|
12
|
+
mkdir -p /opt/oracle
|
|
13
|
+
cp scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip /opt/oracle
|
|
14
|
+
cd /opt/oracle
|
|
15
|
+
unzip -qq basiclite-21.4.zip -d .
|
|
16
|
+
rm *.zip
|
|
17
|
+
mv instantclient* instantclient
|
|
18
|
+
|
|
19
|
+
# update runtime link path
|
|
20
|
+
sh -c "echo /opt/oracle/instantclient > /etc/ld.so.conf.d/oracle-instantclient.conf"
|
|
21
|
+
ldconfig /etc/ld.so.conf.d
|
|
22
|
+
|
|
23
|
+
echo "Installation complete"
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Installation
|
|
2
|
+
|
|
3
|
+
## Database
|
|
4
|
+
|
|
5
|
+
**Important**
|
|
6
|
+
- Oracle database is supported only on **x86-64 architecture**
|
|
7
|
+
- Oracle database is **not supported on Mac ARM architecture** (either via docker or linux virtualization)
|
|
8
|
+
|
|
9
|
+
To install oracle express edition simply run `docker-compose up`
|
|
10
|
+
|
|
11
|
+
- A single instance pluggable database (PDB) will be created named `xepdb`
|
|
12
|
+
- The default password is configured in the compose file as `oracle`
|
|
13
|
+
- The `system`, `sys` and `pdbadmin` users all share this password
|
|
14
|
+
|
|
15
|
+
## Instant Client
|
|
16
|
+
|
|
17
|
+
Before oracle can be connected to from nodejs, the oracle client must be installed.
|
|
18
|
+
For more information see https://www.oracle.com/database/technologies/instant-client/downloads.html
|
|
19
|
+
|
|
20
|
+
**Important**
|
|
21
|
+
- Oracle client is supported only on **x86-64 architecture**
|
|
22
|
+
- Oracle client is **not supported on Mac ARM architecture**
|
|
23
|
+
|
|
24
|
+
### Linux
|
|
25
|
+
Run the provided install script for linux from the `server` root path:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
sudo /bin/bash -e scripts/integrations/oracle/instantclient/linux/x86-64/install.sh
|
|
29
|
+
```
|
|
30
|
+
For more information see: https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html#ic_x64_inst
|
|
31
|
+
|
|
32
|
+
### Mac
|
|
33
|
+
**This has not yet been tested**
|
|
34
|
+
|
|
35
|
+
See: https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html#ic_osx_inst
|
|
36
|
+
|
|
37
|
+
# Management
|
|
38
|
+
To connect to oracle sql command line:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
docker exec -it oracle-xe sqlplus -l system/oracle@localhost/xepdb1
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
To create a new schema (where a user is the same as a schema in oracle) named `sales`:
|
|
45
|
+
|
|
46
|
+
```sql
|
|
47
|
+
define USERNAME = sales
|
|
48
|
+
|
|
49
|
+
create user &USERNAME;
|
|
50
|
+
|
|
51
|
+
alter user &USERNAME
|
|
52
|
+
default tablespace users
|
|
53
|
+
temporary tablespace temp
|
|
54
|
+
quota unlimited on users;
|
|
55
|
+
|
|
56
|
+
grant create session,
|
|
57
|
+
create view,
|
|
58
|
+
create sequence,
|
|
59
|
+
create procedure,
|
|
60
|
+
create table,
|
|
61
|
+
create trigger,
|
|
62
|
+
create type,
|
|
63
|
+
create materialized view
|
|
64
|
+
to &USERNAME;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
To set the password for the sales schema use:
|
|
68
|
+
|
|
69
|
+
```sql
|
|
70
|
+
define USERNAME = sales
|
|
71
|
+
define PASSWORD = sales
|
|
72
|
+
|
|
73
|
+
alter user &USERNAME identified by &PASSWORD;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
As before the database schema can now be connected to using:
|
|
77
|
+
```bash
|
|
78
|
+
docker exec -it oracle-xe sqlplus -l sales/sales@localhost:1521/xepdb1
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## HR Schema
|
|
82
|
+
|
|
83
|
+
The `HR` schema is populated with dummy data by default in oracle for testing purposes.
|
|
84
|
+
To connect to the HR schema first update the user password and unlock the account by performing
|
|
85
|
+
```sql
|
|
86
|
+
ALTER USER hr ACCOUNT UNLOCK;
|
|
87
|
+
ALTER USER hr IDENTIFIED BY hr
|
|
88
|
+
```
|
|
89
|
+
You should now be able to connect to the hr schema using the credentials hr/hr
|
|
90
|
+
|
|
@@ -11,7 +11,7 @@ services:
|
|
|
11
11
|
ports:
|
|
12
12
|
- "5432:5432"
|
|
13
13
|
volumes:
|
|
14
|
-
|
|
14
|
+
- pg_data:/var/lib/postgresql/data/
|
|
15
15
|
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
|
|
16
16
|
|
|
17
17
|
pgadmin:
|
|
@@ -24,5 +24,5 @@ services:
|
|
|
24
24
|
ports:
|
|
25
25
|
- "5050:80"
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
volumes:
|
|
28
|
+
pg_data:
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/******************************************************
|
|
2
|
+
* This script just makes it easy to re-create *
|
|
3
|
+
* a cypress like environment for testing the backend *
|
|
4
|
+
******************************************************/
|
|
5
|
+
const path = require("path")
|
|
6
|
+
const tmpdir = path.join(require("os").tmpdir(), ".budibase")
|
|
7
|
+
|
|
8
|
+
const MAIN_PORT = "10001"
|
|
9
|
+
const WORKER_PORT = "10002"
|
|
10
|
+
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
process.env.PORT = MAIN_PORT
|
|
13
|
+
process.env.BUDIBASE_API_KEY = "6BE826CB-6B30-4AEC-8777-2E90464633DE"
|
|
14
|
+
process.env.NODE_ENV = "cypress"
|
|
15
|
+
process.env.ENABLE_ANALYTICS = "false"
|
|
16
|
+
process.env.JWT_SECRET = "budibase"
|
|
17
|
+
process.env.COUCH_URL = `leveldb://${tmpdir}/.data/`
|
|
18
|
+
process.env.SELF_HOSTED = "1"
|
|
19
|
+
process.env.WORKER_URL = `http://localhost:${WORKER_PORT}/`
|
|
20
|
+
process.env.MINIO_URL = `http://localhost:${MAIN_PORT}/`
|
|
21
|
+
process.env.MINIO_ACCESS_KEY = "budibase"
|
|
22
|
+
process.env.MINIO_SECRET_KEY = "budibase"
|
|
23
|
+
process.env.COUCH_DB_USER = "budibase"
|
|
24
|
+
process.env.COUCH_DB_PASSWORD = "budibase"
|
|
25
|
+
process.env.INTERNAL_API_KEY = "budibase"
|
|
26
|
+
process.env.ALLOW_DEV_AUTOMATIONS = "1"
|
|
27
|
+
|
|
28
|
+
// don't make this a variable or top level require
|
|
29
|
+
// it will cause environment module to be loaded prematurely
|
|
30
|
+
const server = require("../src/app")
|
|
31
|
+
process.env.PORT = WORKER_PORT
|
|
32
|
+
const worker = require("../../worker/src/index")
|
|
33
|
+
process.env.PORT = MAIN_PORT
|
|
@@ -15,14 +15,12 @@ const {
|
|
|
15
15
|
generateAppID,
|
|
16
16
|
getLayoutParams,
|
|
17
17
|
getScreenParams,
|
|
18
|
-
generateScreenID,
|
|
19
18
|
generateDevAppID,
|
|
20
19
|
DocumentTypes,
|
|
21
20
|
AppStatus,
|
|
22
21
|
} = require("../../db/utils")
|
|
23
22
|
const { BUILTIN_ROLE_IDS, AccessController } = require("@budibase/auth/roles")
|
|
24
23
|
const { BASE_LAYOUTS } = require("../../constants/layouts")
|
|
25
|
-
const { createHomeScreen } = require("../../constants/screens")
|
|
26
24
|
const { cloneDeep } = require("lodash/fp")
|
|
27
25
|
const { processObject } = require("@budibase/string-templates")
|
|
28
26
|
const {
|
|
@@ -44,6 +42,9 @@ const {
|
|
|
44
42
|
revertClientLibrary,
|
|
45
43
|
} = require("../../utilities/fileSystem/clientLibrary")
|
|
46
44
|
const { getTenantId, isMultiTenant } = require("@budibase/auth/tenancy")
|
|
45
|
+
const { syncGlobalUsers } = require("./user")
|
|
46
|
+
const { app: appCache } = require("@budibase/auth/cache")
|
|
47
|
+
const { cleanupAutomations } = require("../../automations/utils")
|
|
47
48
|
|
|
48
49
|
const URL_REGEX_SLASH = /\/|\\/g
|
|
49
50
|
|
|
@@ -253,6 +254,7 @@ exports.create = async ctx => {
|
|
|
253
254
|
await createApp(appId)
|
|
254
255
|
}
|
|
255
256
|
|
|
257
|
+
await appCache.invalidateAppMetadata(appId, newApplication)
|
|
256
258
|
ctx.status = 200
|
|
257
259
|
ctx.body = newApplication
|
|
258
260
|
}
|
|
@@ -316,8 +318,12 @@ exports.delete = async ctx => {
|
|
|
316
318
|
if (!env.isTest() && !ctx.query.unpublish) {
|
|
317
319
|
await deleteApp(ctx.params.appId)
|
|
318
320
|
}
|
|
321
|
+
if (ctx.query && ctx.query.unpublish) {
|
|
322
|
+
await cleanupAutomations(ctx.params.appId)
|
|
323
|
+
}
|
|
319
324
|
// make sure the app/role doesn't stick around after the app has been deleted
|
|
320
325
|
await removeAppFromUserRoles(ctx, ctx.params.appId)
|
|
326
|
+
await appCache.invalidateAppMetadata(ctx.params.appId)
|
|
321
327
|
|
|
322
328
|
ctx.status = 200
|
|
323
329
|
ctx.body = result
|
|
@@ -328,6 +334,8 @@ exports.sync = async (ctx, next) => {
|
|
|
328
334
|
if (!isDevAppID(appId)) {
|
|
329
335
|
ctx.throw(400, "This action cannot be performed for production apps")
|
|
330
336
|
}
|
|
337
|
+
|
|
338
|
+
// replicate prod to dev
|
|
331
339
|
const prodAppId = getDeployedAppID(appId)
|
|
332
340
|
|
|
333
341
|
try {
|
|
@@ -357,6 +365,10 @@ exports.sync = async (ctx, next) => {
|
|
|
357
365
|
} catch (err) {
|
|
358
366
|
error = err
|
|
359
367
|
}
|
|
368
|
+
|
|
369
|
+
// sync the users
|
|
370
|
+
await syncGlobalUsers(appId)
|
|
371
|
+
|
|
360
372
|
if (error) {
|
|
361
373
|
ctx.throw(400, error)
|
|
362
374
|
} else {
|
|
@@ -380,7 +392,10 @@ const updateAppPackage = async (ctx, appPackage, appId) => {
|
|
|
380
392
|
// Redis, shouldn't ever store it
|
|
381
393
|
delete newAppPackage.lockedBy
|
|
382
394
|
|
|
383
|
-
|
|
395
|
+
const response = await db.put(newAppPackage)
|
|
396
|
+
// remove any cached metadata, so that it will be updated
|
|
397
|
+
await appCache.invalidateAppMetadata(appId)
|
|
398
|
+
return response
|
|
384
399
|
}
|
|
385
400
|
|
|
386
401
|
const createEmptyAppPackage = async (ctx, app) => {
|
|
@@ -392,9 +407,5 @@ const createEmptyAppPackage = async (ctx, app) => {
|
|
|
392
407
|
screensAndLayouts.push(await processObject(cloned, app))
|
|
393
408
|
}
|
|
394
409
|
|
|
395
|
-
const homeScreen = createHomeScreen(app)
|
|
396
|
-
homeScreen._id = generateScreenID()
|
|
397
|
-
screensAndLayouts.push(homeScreen)
|
|
398
|
-
|
|
399
410
|
await db.bulkDocs(screensAndLayouts)
|
|
400
411
|
}
|
|
@@ -14,6 +14,8 @@ exports.fetchSelf = async ctx => {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
const user = await getFullUser(ctx, userId)
|
|
17
|
+
// this shouldn't be returned by the app self
|
|
18
|
+
delete user.roles
|
|
17
19
|
|
|
18
20
|
if (appId) {
|
|
19
21
|
const db = new CouchDB(appId)
|
|
@@ -36,6 +38,7 @@ exports.fetchSelf = async ctx => {
|
|
|
36
38
|
// user has a role of some sort, return them
|
|
37
39
|
else if (err.status === 404) {
|
|
38
40
|
const metadata = {
|
|
41
|
+
...user,
|
|
39
42
|
_id: userId,
|
|
40
43
|
}
|
|
41
44
|
const dbResp = await db.put(metadata)
|
|
@@ -7,8 +7,9 @@ const {
|
|
|
7
7
|
BudibaseInternalDB,
|
|
8
8
|
getTableParams,
|
|
9
9
|
} = require("../../db/utils")
|
|
10
|
+
const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
|
|
10
11
|
const { integrations } = require("../../integrations")
|
|
11
|
-
const {
|
|
12
|
+
const { getDatasourceAndQuery } = require("./row/utils")
|
|
12
13
|
|
|
13
14
|
exports.fetch = async function (ctx) {
|
|
14
15
|
const database = new CouchDB(ctx.appId)
|
|
@@ -43,13 +44,17 @@ exports.buildSchemaFromDb = async function (ctx) {
|
|
|
43
44
|
const db = new CouchDB(ctx.appId)
|
|
44
45
|
const datasource = await db.get(ctx.params.datasourceId)
|
|
45
46
|
|
|
46
|
-
const tables = await buildSchemaHelper(datasource)
|
|
47
|
+
const { tables, error } = await buildSchemaHelper(datasource)
|
|
47
48
|
datasource.entities = tables
|
|
48
49
|
|
|
49
|
-
const
|
|
50
|
-
datasource._rev =
|
|
50
|
+
const dbResp = await db.put(datasource)
|
|
51
|
+
datasource._rev = dbResp.rev
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
const response = { datasource }
|
|
54
|
+
if (error) {
|
|
55
|
+
response.error = error
|
|
56
|
+
}
|
|
57
|
+
ctx.body = response
|
|
53
58
|
}
|
|
54
59
|
|
|
55
60
|
exports.update = async function (ctx) {
|
|
@@ -71,7 +76,7 @@ exports.update = async function (ctx) {
|
|
|
71
76
|
|
|
72
77
|
ctx.status = 200
|
|
73
78
|
ctx.message = "Datasource saved successfully."
|
|
74
|
-
ctx.body = datasource
|
|
79
|
+
ctx.body = { datasource }
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
exports.save = async function (ctx) {
|
|
@@ -85,13 +90,15 @@ exports.save = async function (ctx) {
|
|
|
85
90
|
...ctx.request.body.datasource,
|
|
86
91
|
}
|
|
87
92
|
|
|
93
|
+
let schemaError = null
|
|
88
94
|
if (fetchSchema) {
|
|
89
|
-
|
|
95
|
+
const { tables, error } = await buildSchemaHelper(datasource)
|
|
96
|
+
schemaError = error
|
|
90
97
|
datasource.entities = tables
|
|
91
98
|
}
|
|
92
99
|
|
|
93
|
-
const
|
|
94
|
-
datasource._rev =
|
|
100
|
+
const dbResp = await db.put(datasource)
|
|
101
|
+
datasource._rev = dbResp.rev
|
|
95
102
|
|
|
96
103
|
// Drain connection pools when configuration is changed
|
|
97
104
|
if (datasource.source) {
|
|
@@ -101,17 +108,27 @@ exports.save = async function (ctx) {
|
|
|
101
108
|
}
|
|
102
109
|
}
|
|
103
110
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
111
|
+
const response = { datasource }
|
|
112
|
+
if (schemaError) {
|
|
113
|
+
response.error = schemaError
|
|
114
|
+
}
|
|
115
|
+
ctx.body = response
|
|
107
116
|
}
|
|
108
117
|
|
|
109
118
|
exports.destroy = async function (ctx) {
|
|
110
119
|
const db = new CouchDB(ctx.appId)
|
|
111
120
|
|
|
112
121
|
// Delete all queries for the datasource
|
|
113
|
-
const
|
|
114
|
-
|
|
122
|
+
const queries = await db.allDocs(
|
|
123
|
+
getQueryParams(ctx.params.datasourceId, null)
|
|
124
|
+
)
|
|
125
|
+
await db.bulkDocs(
|
|
126
|
+
queries.rows.map(row => ({
|
|
127
|
+
_id: row.id,
|
|
128
|
+
_rev: row.value.rev,
|
|
129
|
+
_deleted: true,
|
|
130
|
+
}))
|
|
131
|
+
)
|
|
115
132
|
|
|
116
133
|
// delete the datasource
|
|
117
134
|
await db.remove(ctx.params.datasourceId, ctx.params.revId)
|
|
@@ -129,12 +146,29 @@ exports.find = async function (ctx) {
|
|
|
129
146
|
exports.query = async function (ctx) {
|
|
130
147
|
const queryJson = ctx.request.body
|
|
131
148
|
try {
|
|
132
|
-
ctx.body = await
|
|
149
|
+
ctx.body = await getDatasourceAndQuery(ctx.appId, queryJson)
|
|
133
150
|
} catch (err) {
|
|
134
151
|
ctx.throw(400, err)
|
|
135
152
|
}
|
|
136
153
|
}
|
|
137
154
|
|
|
155
|
+
function getErrorTables(errors, errorType) {
|
|
156
|
+
return Object.entries(errors)
|
|
157
|
+
.filter(entry => entry[1] === errorType)
|
|
158
|
+
.map(([name]) => name)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function updateError(error, newError, tables) {
|
|
162
|
+
if (!error) {
|
|
163
|
+
error = ""
|
|
164
|
+
}
|
|
165
|
+
if (error.length > 0) {
|
|
166
|
+
error += "\n"
|
|
167
|
+
}
|
|
168
|
+
error += `${newError} ${tables.join(", ")}`
|
|
169
|
+
return error
|
|
170
|
+
}
|
|
171
|
+
|
|
138
172
|
const buildSchemaHelper = async datasource => {
|
|
139
173
|
const Connector = integrations[datasource.source]
|
|
140
174
|
|
|
@@ -143,5 +177,39 @@ const buildSchemaHelper = async datasource => {
|
|
|
143
177
|
await connector.buildSchema(datasource._id, datasource.entities)
|
|
144
178
|
datasource.entities = connector.tables
|
|
145
179
|
|
|
146
|
-
|
|
180
|
+
// make sure they all have a display name selected
|
|
181
|
+
for (let entity of Object.values(datasource.entities)) {
|
|
182
|
+
if (entity.primaryDisplay) {
|
|
183
|
+
continue
|
|
184
|
+
}
|
|
185
|
+
const notAutoColumn = Object.values(entity.schema).find(
|
|
186
|
+
schema => !schema.autocolumn
|
|
187
|
+
)
|
|
188
|
+
if (notAutoColumn) {
|
|
189
|
+
entity.primaryDisplay = notAutoColumn.name
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const errors = connector.schemaErrors
|
|
194
|
+
let error = null
|
|
195
|
+
if (errors && Object.keys(errors).length > 0) {
|
|
196
|
+
const noKey = getErrorTables(errors, BuildSchemaErrors.NO_KEY)
|
|
197
|
+
const invalidCol = getErrorTables(errors, BuildSchemaErrors.INVALID_COLUMN)
|
|
198
|
+
if (noKey.length) {
|
|
199
|
+
error = updateError(
|
|
200
|
+
error,
|
|
201
|
+
"No primary key constraint found for the following:",
|
|
202
|
+
noKey
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
if (invalidCol.length) {
|
|
206
|
+
const invalidCols = Object.values(InvalidColumns).join(", ")
|
|
207
|
+
error = updateError(
|
|
208
|
+
error,
|
|
209
|
+
`Cannot use columns ${invalidCols} found in following:`,
|
|
210
|
+
invalidCol
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return { tables: connector.tables, error }
|
|
147
215
|
}
|
|
@@ -6,6 +6,7 @@ const {
|
|
|
6
6
|
disableAllCrons,
|
|
7
7
|
enableCronTrigger,
|
|
8
8
|
} = require("../../../automations/utils")
|
|
9
|
+
const { app: appCache } = require("@budibase/auth/cache")
|
|
9
10
|
|
|
10
11
|
// the max time we can wait for an invalidation to complete before considering it failed
|
|
11
12
|
const MAX_PENDING_TIME_MS = 30 * 60000
|
|
@@ -103,6 +104,7 @@ async function deployApp(deployment) {
|
|
|
103
104
|
appDoc.appId = productionAppId
|
|
104
105
|
appDoc.instance._id = productionAppId
|
|
105
106
|
await db.put(appDoc)
|
|
107
|
+
await appCache.invalidateAppMetadata(productionAppId)
|
|
106
108
|
console.log("New app doc written successfully.")
|
|
107
109
|
await initDeployedApp(productionAppId)
|
|
108
110
|
console.log("Deployed app initialised, setting deployment to successful")
|
|
@@ -6,6 +6,7 @@ const { request } = require("../../utilities/workerRequests")
|
|
|
6
6
|
const { clearLock } = require("../../utilities/redis")
|
|
7
7
|
const { Replication } = require("@budibase/auth").db
|
|
8
8
|
const { DocumentTypes } = require("../../db/utils")
|
|
9
|
+
const { app: appCache } = require("@budibase/auth/cache")
|
|
9
10
|
|
|
10
11
|
async function redirect(ctx, method, path = "global") {
|
|
11
12
|
const { devPath } = ctx.params
|
|
@@ -24,7 +25,8 @@ async function redirect(ctx, method, path = "global") {
|
|
|
24
25
|
)
|
|
25
26
|
)
|
|
26
27
|
if (response.status !== 200) {
|
|
27
|
-
|
|
28
|
+
const err = await response.text()
|
|
29
|
+
ctx.throw(400, err)
|
|
28
30
|
}
|
|
29
31
|
const cookie = response.headers.get("set-cookie")
|
|
30
32
|
if (cookie) {
|
|
@@ -106,6 +108,7 @@ exports.revert = async ctx => {
|
|
|
106
108
|
appDoc.appId = appId
|
|
107
109
|
appDoc.instance._id = appId
|
|
108
110
|
await db.put(appDoc)
|
|
111
|
+
await appCache.invalidateAppMetadata(appId)
|
|
109
112
|
ctx.body = {
|
|
110
113
|
message: "Reverted changes successfully.",
|
|
111
114
|
}
|