@budibase/server 0.9.185-alpha.0 → 0.9.185-alpha.12
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 +1 -1
- package/builder/assets/bb-space-man.5be51a45.svg +290 -0
- package/builder/assets/index.4a7c5636.css +1 -0
- package/builder/assets/index.708945dd.js +1316 -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 +1060 -928
- package/coverage/coverage-final.json +90 -88
- 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 +43 -13
- package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
- 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 +31 -7
- 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 +75 -75
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +3 -3
- 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 +48 -210
- package/coverage/lcov-report/api/controllers/role.js.html +9 -9
- package/coverage/lcov-report/api/controllers/routing.js.html +3 -3
- package/coverage/lcov-report/api/controllers/row/external.js.html +12 -6
- package/coverage/lcov-report/api/controllers/row/index.html +18 -18
- 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 +2 -2
- package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
- package/coverage/lcov-report/api/controllers/script.js.html +3 -3
- package/coverage/lcov-report/api/controllers/table/external.js.html +65 -8
- package/coverage/lcov-report/api/controllers/table/index.html +42 -42
- package/coverage/lcov-report/api/controllers/table/index.js.html +66 -12
- package/coverage/lcov-report/api/controllers/table/internal.js.html +49 -10
- package/coverage/lcov-report/api/controllers/table/utils.js.html +57 -45
- package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
- package/coverage/lcov-report/api/controllers/user.js.html +33 -18
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +9 -9
- package/coverage/lcov-report/api/controllers/view/index.js.html +5 -5
- 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 +1 -1
- 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 +1 -1
- 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 +35 -2
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- 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 +3 -3
- package/coverage/lcov-report/automations/bullboard.js.html +71 -20
- package/coverage/lcov-report/automations/index.html +33 -48
- 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 +42 -12
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +5 -2
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/db/utils.js.html +1 -1
- 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 +94 -79
- 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 +5 -5
- package/coverage/lcov-report/middleware/builder.js.html +16 -7
- package/coverage/lcov-report/middleware/currentapp.js.html +6 -6
- package/coverage/lcov-report/middleware/index.html +21 -21
- 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 +1 -1
- package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +83 -32
- package/coverage/lcov-report/threads/index.html +141 -0
- package/coverage/lcov-report/threads/index.js.html +260 -0
- package/coverage/lcov-report/threads/query.js.html +269 -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 +2 -2
- package/coverage/lcov-report/utilities/index.html +34 -34
- package/coverage/lcov-report/utilities/index.js.html +12 -9
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +30 -9
- 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 +1 -1
- 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 +1753 -1527
- package/dist/api/controllers/application.js +11 -1
- package/dist/api/controllers/datasource.js +6 -2
- package/dist/api/controllers/deploy/index.js +2 -0
- package/dist/api/controllers/dev.js +4 -1
- package/dist/api/controllers/query.js +27 -57
- package/dist/api/controllers/row/ExternalRequest.js +2 -2
- package/dist/api/controllers/row/external.js +1 -0
- package/dist/api/controllers/table/external.js +17 -0
- package/dist/api/controllers/table/index.js +21 -2
- package/dist/api/controllers/table/internal.js +10 -1
- package/dist/api/controllers/table/utils.js +28 -27
- package/dist/api/controllers/user.js +10 -6
- package/dist/api/routes/query.js +1 -1
- package/dist/api/routes/table.js +7 -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 +1 -0
- package/dist/definitions/datasource.js +1 -0
- package/dist/integrations/base/IntegrationBase.js +2 -0
- package/dist/integrations/base/sql.js +48 -8
- package/dist/integrations/base/sqlTable.js +1 -2
- package/dist/integrations/mysql.js +3 -1
- package/dist/integrations/postgres.js +2 -2
- package/dist/middleware/builder.js +4 -1
- package/dist/package.json +7 -6
- package/dist/{automations/thread.js → threads/automation.js} +23 -7
- package/dist/threads/index.js +58 -0
- package/dist/threads/query.js +61 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/csvParser.js +46 -5
- package/dist/utilities/index.js +1 -0
- package/dist/utilities/queue/inMemoryQueue.js +8 -0
- package/dist/utilities/scriptRunner.js +4 -1
- package/package.json +8 -7
- package/scripts/likeCypress.ts +33 -0
- package/src/api/controllers/application.js +11 -1
- package/src/api/controllers/datasource.js +10 -2
- package/src/api/controllers/deploy/index.js +2 -0
- package/src/api/controllers/dev.js +4 -1
- package/src/api/controllers/query.js +26 -80
- package/src/api/controllers/row/ExternalRequest.ts +6 -2
- package/src/api/controllers/row/external.js +2 -0
- package/src/api/controllers/table/external.js +19 -0
- package/src/api/controllers/table/index.js +20 -2
- package/src/api/controllers/table/internal.js +14 -1
- package/src/api/controllers/table/utils.js +36 -32
- package/src/api/controllers/user.js +15 -10
- package/src/api/routes/query.js +1 -0
- package/src/api/routes/table.js +11 -0
- package/src/api/routes/tests/misc.spec.js +5 -1
- 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 +1 -0
- package/src/definitions/datasource.ts +3 -2
- 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 +2 -1
- package/src/integrations/base/sql.ts +51 -9
- package/src/integrations/base/sqlTable.ts +1 -4
- package/src/integrations/couchdb.ts +2 -1
- package/src/integrations/dynamodb.ts +2 -1
- package/src/integrations/elasticsearch.ts +2 -1
- package/src/integrations/mongodb.ts +2 -1
- package/src/integrations/mysql.ts +1 -1
- package/src/integrations/postgres.ts +5 -5
- package/src/integrations/rest.ts +2 -1
- package/src/integrations/s3.ts +2 -1
- package/src/middleware/builder.js +4 -1
- package/src/{automations/thread.js → threads/automation.js} +24 -7
- package/src/threads/index.js +60 -0
- package/src/threads/query.js +63 -0
- package/src/utilities/csvParser.js +48 -5
- package/src/utilities/index.js +1 -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.0e6a5c20.js +0 -201
- package/builder/assets/index.cf21e4d2.css +0 -29
- package/builder/assets/vendor.278a305c.js +0 -9
- package/builder/assets/vendor.d75d5eb7.css +0 -1
|
@@ -27,6 +27,8 @@ const { getAllLocks } = require("../../utilities/redis");
|
|
|
27
27
|
const { updateClientLibrary, backupClientLibrary, revertClientLibrary, } = require("../../utilities/fileSystem/clientLibrary");
|
|
28
28
|
const { getTenantId, isMultiTenant } = require("@budibase/auth/tenancy");
|
|
29
29
|
const { syncGlobalUsers } = require("./user");
|
|
30
|
+
const { app: appCache } = require("@budibase/auth/cache");
|
|
31
|
+
const { cleanupAutomations } = require("../../automations/utils");
|
|
30
32
|
const URL_REGEX_SLASH = /\/|\\/g;
|
|
31
33
|
// utility function, need to do away with this
|
|
32
34
|
function getLayouts(db) {
|
|
@@ -214,6 +216,7 @@ exports.create = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
214
216
|
if (!env.isTest()) {
|
|
215
217
|
yield createApp(appId);
|
|
216
218
|
}
|
|
219
|
+
yield appCache.invalidateAppMetadata(appId, newApplication);
|
|
217
220
|
ctx.status = 200;
|
|
218
221
|
ctx.body = newApplication;
|
|
219
222
|
});
|
|
@@ -268,8 +271,12 @@ exports.delete = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
268
271
|
if (!env.isTest() && !ctx.query.unpublish) {
|
|
269
272
|
yield deleteApp(ctx.params.appId);
|
|
270
273
|
}
|
|
274
|
+
if (ctx.query && ctx.query.unpublish) {
|
|
275
|
+
yield cleanupAutomations(ctx.params.appId);
|
|
276
|
+
}
|
|
271
277
|
// make sure the app/role doesn't stick around after the app has been deleted
|
|
272
278
|
yield removeAppFromUserRoles(ctx, ctx.params.appId);
|
|
279
|
+
yield appCache.invalidateAppMetadata(ctx.params.appId);
|
|
273
280
|
ctx.status = 200;
|
|
274
281
|
ctx.body = result;
|
|
275
282
|
});
|
|
@@ -331,7 +338,10 @@ const updateAppPackage = (ctx, appPackage, appId) => __awaiter(void 0, void 0, v
|
|
|
331
338
|
// the locked by property is attached by server but generated from
|
|
332
339
|
// Redis, shouldn't ever store it
|
|
333
340
|
delete newAppPackage.lockedBy;
|
|
334
|
-
|
|
341
|
+
const response = yield db.put(newAppPackage);
|
|
342
|
+
// remove any cached metadata, so that it will be updated
|
|
343
|
+
yield appCache.invalidateAppMetadata(appId);
|
|
344
|
+
return response;
|
|
335
345
|
});
|
|
336
346
|
const createEmptyAppPackage = (ctx, app) => __awaiter(void 0, void 0, void 0, function* () {
|
|
337
347
|
const db = new CouchDB(app.appId);
|
|
@@ -97,8 +97,12 @@ exports.destroy = function (ctx) {
|
|
|
97
97
|
return __awaiter(this, void 0, void 0, function* () {
|
|
98
98
|
const db = new CouchDB(ctx.appId);
|
|
99
99
|
// Delete all queries for the datasource
|
|
100
|
-
const
|
|
101
|
-
yield db.bulkDocs(
|
|
100
|
+
const queries = yield db.allDocs(getQueryParams(ctx.params.datasourceId, null));
|
|
101
|
+
yield db.bulkDocs(queries.rows.map(row => ({
|
|
102
|
+
_id: row.id,
|
|
103
|
+
_rev: row.value.rev,
|
|
104
|
+
_deleted: true,
|
|
105
|
+
})));
|
|
102
106
|
// delete the datasource
|
|
103
107
|
yield db.remove(ctx.params.datasourceId, ctx.params.revId);
|
|
104
108
|
ctx.message = `Datasource deleted.`;
|
|
@@ -13,6 +13,7 @@ const Deployment = require("./Deployment");
|
|
|
13
13
|
const { Replication, getDeployedAppID } = require("@budibase/auth/db");
|
|
14
14
|
const { DocumentTypes, getAutomationParams } = require("../../../db/utils");
|
|
15
15
|
const { disableAllCrons, enableCronTrigger, } = require("../../../automations/utils");
|
|
16
|
+
const { app: appCache } = require("@budibase/auth/cache");
|
|
16
17
|
// the max time we can wait for an invalidation to complete before considering it failed
|
|
17
18
|
const MAX_PENDING_TIME_MS = 30 * 60000;
|
|
18
19
|
const DeploymentStatus = {
|
|
@@ -95,6 +96,7 @@ function deployApp(deployment) {
|
|
|
95
96
|
appDoc.appId = productionAppId;
|
|
96
97
|
appDoc.instance._id = productionAppId;
|
|
97
98
|
yield db.put(appDoc);
|
|
99
|
+
yield appCache.invalidateAppMetadata(productionAppId);
|
|
98
100
|
console.log("New app doc written successfully.");
|
|
99
101
|
yield initDeployedApp(productionAppId);
|
|
100
102
|
console.log("Deployed app initialised, setting deployment to successful");
|
|
@@ -16,6 +16,7 @@ const { request } = require("../../utilities/workerRequests");
|
|
|
16
16
|
const { clearLock } = require("../../utilities/redis");
|
|
17
17
|
const { Replication } = require("@budibase/auth").db;
|
|
18
18
|
const { DocumentTypes } = require("../../db/utils");
|
|
19
|
+
const { app: appCache } = require("@budibase/auth/cache");
|
|
19
20
|
function redirect(ctx, method, path = "global") {
|
|
20
21
|
return __awaiter(this, void 0, void 0, function* () {
|
|
21
22
|
const { devPath } = ctx.params;
|
|
@@ -25,7 +26,8 @@ function redirect(ctx, method, path = "global") {
|
|
|
25
26
|
body: ctx.request.body,
|
|
26
27
|
}, true));
|
|
27
28
|
if (response.status !== 200) {
|
|
28
|
-
|
|
29
|
+
const err = yield response.text();
|
|
30
|
+
ctx.throw(400, err);
|
|
29
31
|
}
|
|
30
32
|
const cookie = response.headers.get("set-cookie");
|
|
31
33
|
if (cookie) {
|
|
@@ -102,6 +104,7 @@ exports.revert = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
102
104
|
appDoc.appId = appId;
|
|
103
105
|
appDoc.instance._id = appId;
|
|
104
106
|
yield db.put(appDoc);
|
|
107
|
+
yield appCache.invalidateAppMetadata(appId);
|
|
105
108
|
ctx.body = {
|
|
106
109
|
message: "Reverted changes successfully.",
|
|
107
110
|
};
|
|
@@ -11,10 +11,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
const { processString } = require("@budibase/string-templates");
|
|
12
12
|
const CouchDB = require("../../db");
|
|
13
13
|
const { generateQueryID, getQueryParams } = require("../../db/utils");
|
|
14
|
-
const { integrations } = require("../../integrations");
|
|
15
14
|
const { BaseQueryVerbs } = require("../../constants");
|
|
16
15
|
const env = require("../../environment");
|
|
17
|
-
const
|
|
16
|
+
const { Thread, ThreadType } = require("../../threads");
|
|
17
|
+
const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 });
|
|
18
18
|
// simple function to append "readable" to all read queries
|
|
19
19
|
function enrichQueries(input) {
|
|
20
20
|
const wasArray = Array.isArray(input);
|
|
@@ -26,38 +26,6 @@ function enrichQueries(input) {
|
|
|
26
26
|
}
|
|
27
27
|
return wasArray ? queries : queries[0];
|
|
28
28
|
}
|
|
29
|
-
function formatResponse(resp) {
|
|
30
|
-
if (typeof resp === "string") {
|
|
31
|
-
try {
|
|
32
|
-
resp = JSON.parse(resp);
|
|
33
|
-
}
|
|
34
|
-
catch (err) {
|
|
35
|
-
resp = { response: resp };
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return resp;
|
|
39
|
-
}
|
|
40
|
-
function runAndTransform(integration, queryVerb, enrichedQuery, transformer) {
|
|
41
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
-
let rows = formatResponse(yield integration[queryVerb](enrichedQuery));
|
|
43
|
-
// transform as required
|
|
44
|
-
if (transformer) {
|
|
45
|
-
const runner = new ScriptRunner(transformer, { data: rows });
|
|
46
|
-
rows = runner.execute();
|
|
47
|
-
}
|
|
48
|
-
// needs to an array for next step
|
|
49
|
-
if (!Array.isArray(rows)) {
|
|
50
|
-
rows = [rows];
|
|
51
|
-
}
|
|
52
|
-
// map into JSON if just raw primitive here
|
|
53
|
-
if (rows.find(row => typeof row !== "object")) {
|
|
54
|
-
rows = rows.map(value => ({ value }));
|
|
55
|
-
}
|
|
56
|
-
// get all the potential fields in the schema
|
|
57
|
-
let keys = rows.flatMap(Object.keys);
|
|
58
|
-
return { rows, keys };
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
29
|
exports.fetch = function (ctx) {
|
|
62
30
|
return __awaiter(this, void 0, void 0, function* () {
|
|
63
31
|
const db = new CouchDB(ctx.appId);
|
|
@@ -135,21 +103,22 @@ exports.preview = function (ctx) {
|
|
|
135
103
|
return __awaiter(this, void 0, void 0, function* () {
|
|
136
104
|
const db = new CouchDB(ctx.appId);
|
|
137
105
|
const datasource = yield db.get(ctx.request.body.datasourceId);
|
|
138
|
-
const Integration = integrations[datasource.source];
|
|
139
|
-
if (!Integration) {
|
|
140
|
-
ctx.throw(400, "Integration type does not exist.");
|
|
141
|
-
}
|
|
142
106
|
const { fields, parameters, queryVerb, transformer } = ctx.request.body;
|
|
143
107
|
const enrichedQuery = yield enrichQueryFields(fields, parameters);
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
108
|
+
try {
|
|
109
|
+
const { rows, keys } = yield Runner.run({
|
|
110
|
+
datasource,
|
|
111
|
+
queryVerb,
|
|
112
|
+
query: enrichedQuery,
|
|
113
|
+
transformer,
|
|
114
|
+
});
|
|
115
|
+
ctx.body = {
|
|
116
|
+
rows,
|
|
117
|
+
schemaFields: [...new Set(keys)],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
ctx.throw(400, err);
|
|
153
122
|
}
|
|
154
123
|
});
|
|
155
124
|
};
|
|
@@ -158,18 +127,19 @@ exports.execute = function (ctx) {
|
|
|
158
127
|
const db = new CouchDB(ctx.appId);
|
|
159
128
|
const query = yield db.get(ctx.params.queryId);
|
|
160
129
|
const datasource = yield db.get(query.datasourceId);
|
|
161
|
-
const Integration = integrations[datasource.source];
|
|
162
|
-
if (!Integration) {
|
|
163
|
-
ctx.throw(400, "Integration type does not exist.");
|
|
164
|
-
}
|
|
165
130
|
const enrichedQuery = yield enrichQueryFields(query.fields, ctx.request.body.parameters);
|
|
166
|
-
const integration = new Integration(datasource.config);
|
|
167
131
|
// call the relevant CRUD method on the integration class
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
132
|
+
try {
|
|
133
|
+
const { rows } = yield Runner.run({
|
|
134
|
+
datasource,
|
|
135
|
+
queryVerb: query.queryVerb,
|
|
136
|
+
query: enrichedQuery,
|
|
137
|
+
transformer: query.transformer,
|
|
138
|
+
});
|
|
139
|
+
ctx.body = rows;
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
ctx.throw(400, err);
|
|
173
143
|
}
|
|
174
144
|
});
|
|
175
145
|
};
|
|
@@ -510,7 +510,7 @@ var External;
|
|
|
510
510
|
throw `Unable to process query, table "${tableName}" not defined.`;
|
|
511
511
|
}
|
|
512
512
|
// look for specific components of config which may not be considered acceptable
|
|
513
|
-
let { id, row, filters, sort, paginate } = cleanupConfig(config, table);
|
|
513
|
+
let { id, row, filters, sort, paginate, rows } = cleanupConfig(config, table);
|
|
514
514
|
filters = buildFilters(id, filters || {}, table);
|
|
515
515
|
const relationships = this.buildRelationships(table);
|
|
516
516
|
// clean up row on ingress using schema
|
|
@@ -534,7 +534,7 @@ var External;
|
|
|
534
534
|
sort,
|
|
535
535
|
paginate,
|
|
536
536
|
relationships,
|
|
537
|
-
body: row,
|
|
537
|
+
body: row || rows,
|
|
538
538
|
// pass an id filter into extra, purely for mysql/returning
|
|
539
539
|
extra: {
|
|
540
540
|
idFilter: buildFilters(id || generateIdForRow(row, table), {}, table),
|
|
@@ -41,6 +41,7 @@ function handleRequest(appId, operation, tableId, opts = {}) {
|
|
|
41
41
|
return new ExternalRequest(appId, operation, tableId, opts.datasource).run(opts);
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
|
+
exports.handleRequest = handleRequest;
|
|
44
45
|
exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
45
46
|
const appId = ctx.appId;
|
|
46
47
|
const inputs = ctx.request.body;
|
|
@@ -14,6 +14,8 @@ const { getTable, generateForeignKey, generateJunctionTableName, foreignKeyStruc
|
|
|
14
14
|
const { DataSourceOperation, FieldTypes, RelationshipTypes, } = require("../../../constants");
|
|
15
15
|
const { makeExternalQuery } = require("../../../integrations/base/utils");
|
|
16
16
|
const { cloneDeep } = require("lodash/fp");
|
|
17
|
+
const csvParser = require("../../../utilities/csvParser");
|
|
18
|
+
const { handleRequest } = require("../row/external");
|
|
17
19
|
function makeTableRequest(datasource, operation, table, tables, oldTable = null) {
|
|
18
20
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19
21
|
const json = {
|
|
@@ -223,3 +225,18 @@ exports.destroy = function (ctx) {
|
|
|
223
225
|
return tableToDelete;
|
|
224
226
|
});
|
|
225
227
|
};
|
|
228
|
+
exports.bulkImport = function (ctx) {
|
|
229
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
230
|
+
const appId = ctx.appId;
|
|
231
|
+
const table = yield getTable(appId, ctx.params.tableId);
|
|
232
|
+
const { dataImport } = ctx.request.body;
|
|
233
|
+
if (!dataImport || !dataImport.schema || !dataImport.csvString) {
|
|
234
|
+
ctx.throw(400, "Provided data import information is invalid.");
|
|
235
|
+
}
|
|
236
|
+
const rows = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
|
|
237
|
+
yield handleRequest(appId, DataSourceOperation.BULK_CREATE, table._id, {
|
|
238
|
+
rows,
|
|
239
|
+
});
|
|
240
|
+
return table;
|
|
241
|
+
});
|
|
242
|
+
};
|
|
@@ -73,10 +73,29 @@ exports.destroy = function (ctx) {
|
|
|
73
73
|
ctx.body = { message: `Table ${tableId} deleted.` };
|
|
74
74
|
});
|
|
75
75
|
};
|
|
76
|
+
exports.bulkImport = function (ctx) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const tableId = ctx.params.tableId;
|
|
79
|
+
yield pickApi({ tableId }).bulkImport(ctx);
|
|
80
|
+
// right now we don't trigger anything for bulk import because it
|
|
81
|
+
// can only be done in the builder, but in the future we may need to
|
|
82
|
+
// think about events for bulk items
|
|
83
|
+
ctx.status = 200;
|
|
84
|
+
ctx.body = { message: `Bulk rows created.` };
|
|
85
|
+
});
|
|
86
|
+
};
|
|
76
87
|
exports.validateCSVSchema = function (ctx) {
|
|
77
88
|
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
-
|
|
79
|
-
const
|
|
89
|
+
// tableId being specified means its an import to an existing table
|
|
90
|
+
const { csvString, schema = {}, tableId } = ctx.request.body;
|
|
91
|
+
let existingTable;
|
|
92
|
+
if (tableId) {
|
|
93
|
+
existingTable = yield getTable(ctx.appId, tableId);
|
|
94
|
+
}
|
|
95
|
+
let result = yield csvParser.parse(csvString, schema);
|
|
96
|
+
if (existingTable) {
|
|
97
|
+
result = csvParser.updateSchema({ schema: result, existingTable });
|
|
98
|
+
}
|
|
80
99
|
ctx.body = { schema: result };
|
|
81
100
|
});
|
|
82
101
|
};
|
|
@@ -23,7 +23,7 @@ const CouchDB = require("../../../db");
|
|
|
23
23
|
const linkRows = require("../../../db/linkedRows");
|
|
24
24
|
const { getRowParams, generateTableID } = require("../../../db/utils");
|
|
25
25
|
const { FieldTypes } = require("../../../constants");
|
|
26
|
-
const { TableSaveFunctions, hasTypeChanged } = require("./utils");
|
|
26
|
+
const { TableSaveFunctions, hasTypeChanged, getTable, handleDataImport, } = require("./utils");
|
|
27
27
|
exports.save = function (ctx) {
|
|
28
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
29
29
|
const appId = ctx.appId;
|
|
@@ -139,3 +139,12 @@ exports.destroy = function (ctx) {
|
|
|
139
139
|
return tableToDelete;
|
|
140
140
|
});
|
|
141
141
|
};
|
|
142
|
+
exports.bulkImport = function (ctx) {
|
|
143
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
const appId = ctx.appId;
|
|
145
|
+
const table = yield getTable(appId, ctx.params.tableId);
|
|
146
|
+
const { dataImport } = ctx.request.body;
|
|
147
|
+
yield handleDataImport(appId, ctx.user, table, dataImport);
|
|
148
|
+
return table;
|
|
149
|
+
});
|
|
150
|
+
};
|
|
@@ -66,37 +66,38 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
|
|
|
66
66
|
return tableToSave;
|
|
67
67
|
};
|
|
68
68
|
exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0, void 0, void 0, function* () {
|
|
69
|
+
if (!dataImport || !dataImport.csvString) {
|
|
70
|
+
return table;
|
|
71
|
+
}
|
|
69
72
|
const db = new CouchDB(appId);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
for
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
schema.constraints.inclusion
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
];
|
|
92
|
-
}
|
|
73
|
+
// Populate the table with rows imported from CSV in a bulk update
|
|
74
|
+
const data = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
|
|
75
|
+
let finalData = [];
|
|
76
|
+
for (let i = 0; i < data.length; i++) {
|
|
77
|
+
let row = data[i];
|
|
78
|
+
row._id = generateRowID(table._id);
|
|
79
|
+
row.tableId = table._id;
|
|
80
|
+
const processed = inputProcessing(user, table, row, {
|
|
81
|
+
noAutoRelationships: true,
|
|
82
|
+
});
|
|
83
|
+
table = processed.table;
|
|
84
|
+
row = processed.row;
|
|
85
|
+
for (let [fieldName, schema] of Object.entries(table.schema)) {
|
|
86
|
+
// check whether the options need to be updated for inclusion as part of the data import
|
|
87
|
+
if (schema.type === FieldTypes.OPTIONS &&
|
|
88
|
+
(!schema.constraints.inclusion ||
|
|
89
|
+
schema.constraints.inclusion.indexOf(row[fieldName]) === -1)) {
|
|
90
|
+
schema.constraints.inclusion = [
|
|
91
|
+
...schema.constraints.inclusion,
|
|
92
|
+
row[fieldName],
|
|
93
|
+
];
|
|
93
94
|
}
|
|
94
|
-
finalData.push(row);
|
|
95
95
|
}
|
|
96
|
-
|
|
97
|
-
let response = yield db.put(table);
|
|
98
|
-
table._rev = response._rev;
|
|
96
|
+
finalData.push(row);
|
|
99
97
|
}
|
|
98
|
+
yield db.bulkDocs(finalData);
|
|
99
|
+
let response = yield db.put(table);
|
|
100
|
+
table._rev = response._rev;
|
|
100
101
|
return table;
|
|
101
102
|
});
|
|
102
103
|
exports.handleSearchIndexes = (appId, table) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -94,6 +94,7 @@ exports.syncUser = function (ctx) {
|
|
|
94
94
|
.map(([appId]) => appId);
|
|
95
95
|
}
|
|
96
96
|
for (let prodAppId of prodAppIds) {
|
|
97
|
+
const roleId = roles[prodAppId];
|
|
97
98
|
const devAppId = getDevelopmentAppID(prodAppId);
|
|
98
99
|
for (let appId of [prodAppId, devAppId]) {
|
|
99
100
|
if (!(yield doesDatabaseExist(appId))) {
|
|
@@ -113,14 +114,17 @@ exports.syncUser = function (ctx) {
|
|
|
113
114
|
tableId: InternalTables.USER_METADATA,
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
|
-
|
|
117
|
-
if (
|
|
118
|
-
|
|
117
|
+
// assign the roleId for the metadata doc
|
|
118
|
+
if (roleId) {
|
|
119
|
+
metadata.roleId = roleId;
|
|
119
120
|
}
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
let combined = !deleting
|
|
122
|
+
? combineMetadataAndUser(user, metadata)
|
|
123
|
+
: Object.assign(Object.assign({}, metadata), { status: UserStatus.INACTIVE, metadata: BUILTIN_ROLE_IDS.PUBLIC });
|
|
124
|
+
// if its null then there was no updates required
|
|
125
|
+
if (combined) {
|
|
126
|
+
yield db.put(combined);
|
|
122
127
|
}
|
|
123
|
-
yield db.put(combined);
|
|
124
128
|
}
|
|
125
129
|
}
|
|
126
130
|
ctx.body = {
|
package/dist/api/routes/query.js
CHANGED
|
@@ -41,7 +41,7 @@ router
|
|
|
41
41
|
.get("/api/queries", authorized(BUILDER), queryController.fetch)
|
|
42
42
|
.post("/api/queries", bodySubResource("datasourceId", "_id"), authorized(BUILDER), generateQueryValidation(), queryController.save)
|
|
43
43
|
.post("/api/queries/preview", bodyResource("datasourceId"), authorized(BUILDER), generateQueryPreviewValidation(), queryController.preview)
|
|
44
|
-
.get("/api/queries/:queryId", authorized(PermissionTypes.QUERY, PermissionLevels.READ), queryController.find)
|
|
44
|
+
.get("/api/queries/:queryId", paramResource("queryId"), authorized(PermissionTypes.QUERY, PermissionLevels.READ), queryController.find)
|
|
45
45
|
.post("/api/queries/:queryId", paramResource("queryId"), authorized(PermissionTypes.QUERY, PermissionLevels.WRITE), queryController.execute)
|
|
46
46
|
.delete("/api/queries/:queryId/:revId", paramResource("queryId"), authorized(BUILDER), queryController.destroy);
|
|
47
47
|
module.exports = router;
|
package/dist/api/routes/table.js
CHANGED
|
@@ -27,5 +27,11 @@ router
|
|
|
27
27
|
// allows control over updating a table
|
|
28
28
|
bodyResource("_id"), authorized(BUILDER), generateSaveValidator(), tableController.save)
|
|
29
29
|
.post("/api/tables/csv/validate", authorized(BUILDER), tableController.validateCSVSchema)
|
|
30
|
-
.delete("/api/tables/:tableId/:revId", paramResource("tableId"), authorized(BUILDER), tableController.destroy)
|
|
30
|
+
.delete("/api/tables/:tableId/:revId", paramResource("tableId"), authorized(BUILDER), tableController.destroy)
|
|
31
|
+
// this is currently builder only, but in the future
|
|
32
|
+
// it could be carried out by an end user in app,
|
|
33
|
+
// however some thought will need to be had about
|
|
34
|
+
// implications for automations (triggers)
|
|
35
|
+
// new trigger type, bulk rows created
|
|
36
|
+
.post("/api/tables/:tableId/import", paramResource("tableId"), authorized(BUILDER), tableController.bulkImport);
|
|
31
37
|
module.exports = router;
|
package/dist/app.js
CHANGED
|
@@ -41,17 +41,8 @@ app.use(pino({
|
|
|
41
41
|
level: env.LOG_LEVEL || "error",
|
|
42
42
|
}));
|
|
43
43
|
if (!env.isTest()) {
|
|
44
|
-
const
|
|
45
|
-
app.use(
|
|
46
|
-
if (ctx.path.startsWith(bullboard.pathPrefix)) {
|
|
47
|
-
ctx.status = 200;
|
|
48
|
-
ctx.respond = false;
|
|
49
|
-
bullApp(ctx.req, ctx.res);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
yield next();
|
|
53
|
-
}
|
|
54
|
-
}));
|
|
44
|
+
const plugin = bullboard.init();
|
|
45
|
+
app.use(plugin);
|
|
55
46
|
}
|
|
56
47
|
app.context.eventEmitter = eventEmitter;
|
|
57
48
|
app.context.auth = {};
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
const { createBullBoard } = require("@bull-board/api");
|
|
12
|
+
const { BullAdapter } = require("@bull-board/api/bullAdapter");
|
|
13
|
+
const { KoaAdapter } = require("@bull-board/koa");
|
|
5
14
|
const env = require("../environment");
|
|
6
15
|
const Queue = env.isTest()
|
|
7
16
|
? require("../utilities/queue/inMemoryQueue")
|
|
@@ -9,19 +18,37 @@ const Queue = env.isTest()
|
|
|
9
18
|
const { JobQueues } = require("../constants");
|
|
10
19
|
const { utils } = require("@budibase/auth/redis");
|
|
11
20
|
const { opts, redisProtocolUrl } = utils.getRedisOptions();
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
const CLEANUP_PERIOD_MS = 60 * 1000;
|
|
22
|
+
const queueConfig = redisProtocolUrl || { redis: opts };
|
|
23
|
+
let cleanupInternal = null;
|
|
24
|
+
let automationQueue = new Queue(JobQueues.AUTOMATIONS, queueConfig);
|
|
25
|
+
function cleanup() {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
yield automationQueue.clean(CLEANUP_PERIOD_MS, "completed");
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const PATH_PREFIX = "/bulladmin";
|
|
15
31
|
exports.init = () => {
|
|
16
|
-
|
|
32
|
+
// cleanup the events every 5 minutes
|
|
33
|
+
if (!cleanupInternal) {
|
|
34
|
+
cleanupInternal = setInterval(cleanup, CLEANUP_PERIOD_MS);
|
|
35
|
+
// fire off an initial cleanup
|
|
36
|
+
cleanup().catch(err => {
|
|
37
|
+
console.error(`Unable to cleanup automation queue initially - ${err}`);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
17
40
|
// Set up queues for bull board admin
|
|
18
41
|
const queues = [automationQueue];
|
|
19
42
|
const adapters = [];
|
|
43
|
+
const serverAdapter = new KoaAdapter();
|
|
20
44
|
for (let queue of queues) {
|
|
21
45
|
adapters.push(new BullAdapter(queue));
|
|
22
46
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
47
|
+
createBullBoard({
|
|
48
|
+
queues: adapters,
|
|
49
|
+
serverAdapter,
|
|
50
|
+
});
|
|
51
|
+
serverAdapter.setBasePath(PATH_PREFIX);
|
|
52
|
+
return serverAdapter.registerPlugin();
|
|
26
53
|
};
|
|
27
54
|
exports.queue = automationQueue;
|
|
@@ -20,6 +20,10 @@ const { checkTestFlag } = require("../utilities/redis");
|
|
|
20
20
|
const utils = require("./utils");
|
|
21
21
|
const env = require("../environment");
|
|
22
22
|
const TRIGGER_DEFINITIONS = definitions;
|
|
23
|
+
const JOB_OPTS = {
|
|
24
|
+
removeOnComplete: true,
|
|
25
|
+
removeOnFail: true,
|
|
26
|
+
};
|
|
23
27
|
function queueRelevantRowAutomations(event, eventType) {
|
|
24
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
29
|
if (event.appId == null) {
|
|
@@ -47,7 +51,7 @@ function queueRelevantRowAutomations(event, eventType) {
|
|
|
47
51
|
}
|
|
48
52
|
if (automationTrigger.inputs &&
|
|
49
53
|
automationTrigger.inputs.tableId === event.row.tableId) {
|
|
50
|
-
yield queue.add({ automation, event });
|
|
54
|
+
yield queue.add({ automation, event }, JOB_OPTS);
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
57
|
});
|
|
@@ -85,7 +89,7 @@ exports.externalTrigger = function (automation, params, { getResponses } = {}) {
|
|
|
85
89
|
automation.definition.trigger != null &&
|
|
86
90
|
automation.definition.trigger.stepId === definitions.APP.stepId &&
|
|
87
91
|
automation.definition.trigger.stepId === "APP" &&
|
|
88
|
-
!checkTestFlag(automation._id)) {
|
|
92
|
+
!(yield checkTestFlag(automation._id))) {
|
|
89
93
|
// values are likely to be submitted as strings, so we shall convert to correct type
|
|
90
94
|
const coercedFields = {};
|
|
91
95
|
const fields = automation.definition.trigger.inputs.fields;
|
|
@@ -99,7 +103,7 @@ exports.externalTrigger = function (automation, params, { getResponses } = {}) {
|
|
|
99
103
|
return utils.processEvent({ data });
|
|
100
104
|
}
|
|
101
105
|
else {
|
|
102
|
-
return queue.add(data);
|
|
106
|
+
return queue.add(data, JOB_OPTS);
|
|
103
107
|
}
|
|
104
108
|
});
|
|
105
109
|
};
|
|
@@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const
|
|
11
|
+
const { Thread, ThreadType } = require("../threads");
|
|
12
12
|
const { definitions } = require("./triggerInfo");
|
|
13
13
|
const webhooks = require("../api/controllers/webhook");
|
|
14
14
|
const CouchDB = require("../db");
|
|
@@ -19,10 +19,11 @@ const { MetadataTypes } = require("../constants");
|
|
|
19
19
|
const { getDeployedAppID } = require("@budibase/auth/db");
|
|
20
20
|
const WH_STEP_ID = definitions.WEBHOOK.stepId;
|
|
21
21
|
const CRON_STEP_ID = definitions.CRON.stepId;
|
|
22
|
+
const Runner = new Thread(ThreadType.AUTOMATION);
|
|
22
23
|
exports.processEvent = (job) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
24
|
try {
|
|
24
25
|
// need to actually await these so that an error can be captured properly
|
|
25
|
-
return yield
|
|
26
|
+
return yield Runner.run(job);
|
|
26
27
|
}
|
|
27
28
|
catch (err) {
|
|
28
29
|
console.error(`${job.data.automation.appId} automation ${job.data.automation._id} was unable to run - ${err}`);
|
|
@@ -146,3 +147,11 @@ exports.checkForWebhooks = ({ appId, oldAuto, newAuto }) => __awaiter(void 0, vo
|
|
|
146
147
|
}
|
|
147
148
|
return newAuto;
|
|
148
149
|
});
|
|
150
|
+
/**
|
|
151
|
+
* When removing an app/unpublishing it need to make sure automations are cleaned up (cron).
|
|
152
|
+
* @param appId {string} the app that is being removed.
|
|
153
|
+
* @return {Promise<void>} clean is complete if this succeeds.
|
|
154
|
+
*/
|
|
155
|
+
exports.cleanupAutomations = (appId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
156
|
+
yield exports.disableAllCrons(appId);
|
|
157
|
+
});
|
package/dist/constants/index.js
CHANGED
|
@@ -7,6 +7,7 @@ var Operation;
|
|
|
7
7
|
Operation["READ"] = "READ";
|
|
8
8
|
Operation["UPDATE"] = "UPDATE";
|
|
9
9
|
Operation["DELETE"] = "DELETE";
|
|
10
|
+
Operation["BULK_CREATE"] = "BULK_CREATE";
|
|
10
11
|
Operation["CREATE_TABLE"] = "CREATE_TABLE";
|
|
11
12
|
Operation["UPDATE_TABLE"] = "UPDATE_TABLE";
|
|
12
13
|
Operation["DELETE_TABLE"] = "DELETE_TABLE";
|