@budibase/server 1.0.151-alpha.2 → 1.0.153
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/builder/assets/{index.8716cb1f.js → index.01cadea9.js} +163 -163
- package/builder/index.html +1 -1
- package/coverage/clover.xml +157 -136
- package/coverage/coverage-final.json +5 -5
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +1 -1
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +3 -3
- package/coverage/lcov-report/api/controllers/view/index.html +4 -4
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- 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/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 +1 -1
- package/coverage/lcov-report/api/routes/index.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/migrations.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- 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/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- 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/utils/index.html +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.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 +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +2 -5
- 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 +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +1 -1
- package/coverage/lcov-report/constants/index.html +5 -5
- package/coverage/lcov-report/constants/index.js.html +19 -4
- 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/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +1 -1
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +23 -23
- 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 +1 -1
- package/coverage/lcov-report/middleware/builder.js.html +1 -1
- package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +1 -1
- package/coverage/lcov-report/threads/automation.js.html +117 -63
- package/coverage/lcov-report/threads/index.html +19 -19
- package/coverage/lcov-report/threads/query.js.html +1 -1
- package/coverage/lcov-report/threads/utils.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/utilities/global.js.html +1 -1
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +1 -1
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +261 -228
- package/dist/api/controllers/row/index.js +12 -17
- package/dist/api/controllers/view/exporters.js +1 -1
- package/dist/automations/steps/queryRows.js +0 -1
- package/dist/constants/index.js +4 -0
- package/dist/integrations/base/sql.js +27 -1
- package/dist/package.json +6 -5
- package/dist/threads/automation.js +46 -21
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/src/api/controllers/row/index.ts +19 -15
- package/src/api/controllers/view/exporters.js +1 -1
- package/src/api/routes/tests/row.spec.js +87 -5
- package/src/automations/steps/queryRows.js +0 -1
- package/src/constants/index.js +5 -0
- package/src/integrations/base/sql.ts +28 -1
- package/src/threads/automation.js +49 -31
|
@@ -41,10 +41,10 @@ function patch(ctx) {
|
|
|
41
41
|
const body = ctx.request.body;
|
|
42
42
|
// if it doesn't have an _id then its save
|
|
43
43
|
if (body && !body._id) {
|
|
44
|
-
return save(ctx);
|
|
44
|
+
return (0, exports.save)(ctx);
|
|
45
45
|
}
|
|
46
46
|
try {
|
|
47
|
-
const { row, table } = yield pickApi(tableId).patch(ctx);
|
|
47
|
+
const { row, table } = yield pro_1.quotas.addQuery(() => pickApi(tableId).patch(ctx));
|
|
48
48
|
ctx.status = 200;
|
|
49
49
|
ctx.eventEmitter &&
|
|
50
50
|
ctx.eventEmitter.emitRow(`row:update`, appId, row, table);
|
|
@@ -57,7 +57,7 @@ function patch(ctx) {
|
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
exports.patch = patch;
|
|
60
|
-
const
|
|
60
|
+
const save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
61
61
|
const appId = ctx.appId;
|
|
62
62
|
const tableId = getTableId(ctx);
|
|
63
63
|
const body = ctx.request.body;
|
|
@@ -66,7 +66,7 @@ const saveRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
66
66
|
return patch(ctx);
|
|
67
67
|
}
|
|
68
68
|
try {
|
|
69
|
-
const { row, table } = yield pickApi(tableId).save(ctx);
|
|
69
|
+
const { row, table } = yield pro_1.quotas.addRow(() => pro_1.quotas.addQuery(() => pickApi(tableId).save(ctx)));
|
|
70
70
|
ctx.status = 200;
|
|
71
71
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:save`, appId, row, table);
|
|
72
72
|
ctx.message = `${table.name} saved successfully`;
|
|
@@ -76,17 +76,12 @@ const saveRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
76
76
|
ctx.throw(400, err);
|
|
77
77
|
}
|
|
78
78
|
});
|
|
79
|
-
function save(ctx) {
|
|
80
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
-
yield pro_1.quotas.addRow(() => saveRow(ctx));
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
79
|
exports.save = save;
|
|
85
80
|
function fetchView(ctx) {
|
|
86
81
|
return __awaiter(this, void 0, void 0, function* () {
|
|
87
82
|
const tableId = getTableId(ctx);
|
|
88
83
|
try {
|
|
89
|
-
ctx.body = yield pickApi(tableId).fetchView(ctx);
|
|
84
|
+
ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).fetchView(ctx));
|
|
90
85
|
}
|
|
91
86
|
catch (err) {
|
|
92
87
|
ctx.throw(400, err);
|
|
@@ -98,7 +93,7 @@ function fetch(ctx) {
|
|
|
98
93
|
return __awaiter(this, void 0, void 0, function* () {
|
|
99
94
|
const tableId = getTableId(ctx);
|
|
100
95
|
try {
|
|
101
|
-
ctx.body = yield pickApi(tableId).fetch(ctx);
|
|
96
|
+
ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).fetch(ctx));
|
|
102
97
|
}
|
|
103
98
|
catch (err) {
|
|
104
99
|
ctx.throw(400, err);
|
|
@@ -110,7 +105,7 @@ function find(ctx) {
|
|
|
110
105
|
return __awaiter(this, void 0, void 0, function* () {
|
|
111
106
|
const tableId = getTableId(ctx);
|
|
112
107
|
try {
|
|
113
|
-
ctx.body = yield pickApi(tableId).find(ctx);
|
|
108
|
+
ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).find(ctx));
|
|
114
109
|
}
|
|
115
110
|
catch (err) {
|
|
116
111
|
ctx.throw(400, err);
|
|
@@ -125,7 +120,7 @@ function destroy(ctx) {
|
|
|
125
120
|
const tableId = getTableId(ctx);
|
|
126
121
|
let response, row;
|
|
127
122
|
if (inputs.rows) {
|
|
128
|
-
let { rows } = yield pickApi(tableId).bulkDestroy(ctx);
|
|
123
|
+
let { rows } = yield pro_1.quotas.addQuery(() => pickApi(tableId).bulkDestroy(ctx));
|
|
129
124
|
yield pro_1.quotas.removeRows(rows.length);
|
|
130
125
|
response = rows;
|
|
131
126
|
for (let row of rows) {
|
|
@@ -133,7 +128,7 @@ function destroy(ctx) {
|
|
|
133
128
|
}
|
|
134
129
|
}
|
|
135
130
|
else {
|
|
136
|
-
let resp = yield pickApi(tableId).destroy(ctx);
|
|
131
|
+
let resp = yield pro_1.quotas.addQuery(() => pickApi(tableId).destroy(ctx));
|
|
137
132
|
yield pro_1.quotas.removeRow();
|
|
138
133
|
response = resp.response;
|
|
139
134
|
row = resp.row;
|
|
@@ -151,7 +146,7 @@ function search(ctx) {
|
|
|
151
146
|
const tableId = getTableId(ctx);
|
|
152
147
|
try {
|
|
153
148
|
ctx.status = 200;
|
|
154
|
-
ctx.body = yield pickApi(tableId).search(ctx);
|
|
149
|
+
ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).search(ctx));
|
|
155
150
|
}
|
|
156
151
|
catch (err) {
|
|
157
152
|
ctx.throw(400, err);
|
|
@@ -175,7 +170,7 @@ function fetchEnrichedRow(ctx) {
|
|
|
175
170
|
return __awaiter(this, void 0, void 0, function* () {
|
|
176
171
|
const tableId = getTableId(ctx);
|
|
177
172
|
try {
|
|
178
|
-
ctx.body = yield pickApi(tableId).fetchEnrichedRow(ctx);
|
|
173
|
+
ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).fetchEnrichedRow(ctx));
|
|
179
174
|
}
|
|
180
175
|
catch (err) {
|
|
181
176
|
ctx.throw(400, err);
|
|
@@ -186,7 +181,7 @@ exports.fetchEnrichedRow = fetchEnrichedRow;
|
|
|
186
181
|
const exportRows = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
187
182
|
const tableId = getTableId(ctx);
|
|
188
183
|
try {
|
|
189
|
-
ctx.body = yield pickApi(tableId).exportRows(ctx);
|
|
184
|
+
ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).exportRows(ctx));
|
|
190
185
|
}
|
|
191
186
|
catch (err) {
|
|
192
187
|
ctx.throw(400, err);
|
package/dist/constants/index.js
CHANGED
|
@@ -185,5 +185,9 @@ exports.AutomationErrors = {
|
|
|
185
185
|
MAX_ITERATIONS: "MAX_ITERATIONS_REACHED",
|
|
186
186
|
FAILURE_CONDITION: "FAILURE_CONDITION_MET",
|
|
187
187
|
};
|
|
188
|
+
exports.LoopStepTypes = {
|
|
189
|
+
ARRAY: "Array",
|
|
190
|
+
STRING: "String",
|
|
191
|
+
};
|
|
188
192
|
// pass through the list from the auth/core lib
|
|
189
193
|
exports.ObjectStoreBuckets = ObjectStoreBuckets;
|
|
@@ -24,6 +24,30 @@ const BASE_LIMIT = envLimit || 5000;
|
|
|
24
24
|
// these are invalid dates sent by the client, need to convert them to a real max date
|
|
25
25
|
const MIN_ISO_DATE = "0000-00-00T00:00:00.000Z";
|
|
26
26
|
const MAX_ISO_DATE = "9999-00-00T00:00:00.000Z";
|
|
27
|
+
function likeKey(client, key) {
|
|
28
|
+
if (!key.includes(" ")) {
|
|
29
|
+
return key;
|
|
30
|
+
}
|
|
31
|
+
let start, end;
|
|
32
|
+
switch (client) {
|
|
33
|
+
case utils_1.SqlClients.MY_SQL:
|
|
34
|
+
start = end = "`";
|
|
35
|
+
break;
|
|
36
|
+
case utils_1.SqlClients.ORACLE:
|
|
37
|
+
case utils_1.SqlClients.POSTGRES:
|
|
38
|
+
start = end = '"';
|
|
39
|
+
break;
|
|
40
|
+
case utils_1.SqlClients.MS_SQL:
|
|
41
|
+
start = "[";
|
|
42
|
+
end = "]";
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
throw "Unknown client";
|
|
46
|
+
}
|
|
47
|
+
const parts = key.split(".");
|
|
48
|
+
key = parts.map(part => `${start}${part}${end}`).join(".");
|
|
49
|
+
return key;
|
|
50
|
+
}
|
|
27
51
|
function parse(input) {
|
|
28
52
|
if (Array.isArray(input)) {
|
|
29
53
|
return JSON.stringify(input);
|
|
@@ -118,7 +142,9 @@ class InternalBuilder {
|
|
|
118
142
|
else {
|
|
119
143
|
const rawFnc = `${fnc}Raw`;
|
|
120
144
|
// @ts-ignore
|
|
121
|
-
query = query[rawFnc](`LOWER(${key}) LIKE ?`, [
|
|
145
|
+
query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
|
|
146
|
+
`%${value}%`,
|
|
147
|
+
]);
|
|
122
148
|
}
|
|
123
149
|
});
|
|
124
150
|
}
|
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.152",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"build": "rimraf dist/ && tsc -p tsconfig.build.json && mv dist/src/* dist/ && rimraf dist/src/ && yarn postbuild",
|
|
13
|
+
"debug": "yarn build && node --expose-gc --inspect=9222 dist/index.js",
|
|
13
14
|
"postbuild": "copyfiles -u 1 src/**/*.svelte dist/ && copyfiles -u 1 src/**/*.hbs dist/ && copyfiles -u 1 src/**/*.json dist/",
|
|
14
15
|
"test": "jest --coverage --maxWorkers=2",
|
|
15
16
|
"test:watch": "jest --watch",
|
|
@@ -68,10 +69,10 @@
|
|
|
68
69
|
"license": "GPL-3.0",
|
|
69
70
|
"dependencies": {
|
|
70
71
|
"@apidevtools/swagger-parser": "^10.0.3",
|
|
71
|
-
"@budibase/backend-core": "^1.0.
|
|
72
|
-
"@budibase/client": "^1.0.
|
|
73
|
-
"@budibase/pro": "1.0.
|
|
74
|
-
"@budibase/string-templates": "^1.0.
|
|
72
|
+
"@budibase/backend-core": "^1.0.152",
|
|
73
|
+
"@budibase/client": "^1.0.152",
|
|
74
|
+
"@budibase/pro": "1.0.152",
|
|
75
|
+
"@budibase/string-templates": "^1.0.152",
|
|
75
76
|
"@bull-board/api": "^3.7.0",
|
|
76
77
|
"@bull-board/koa": "^3.7.0",
|
|
77
78
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -18,13 +18,46 @@ const { DocumentTypes } = require("../db/utils");
|
|
|
18
18
|
const { doInTenant } = require("@budibase/backend-core/tenancy");
|
|
19
19
|
const { definitions: triggerDefs } = require("../automations/triggerInfo");
|
|
20
20
|
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
|
|
21
|
-
const { AutomationErrors } = require("../constants");
|
|
21
|
+
const { AutomationErrors, LoopStepTypes } = require("../constants");
|
|
22
22
|
const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId;
|
|
23
23
|
const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId;
|
|
24
24
|
const CRON_STEP_ID = triggerDefs.CRON.stepId;
|
|
25
25
|
const STOPPED_STATUS = { success: false, status: "STOPPED" };
|
|
26
26
|
const { cloneDeep } = require("lodash/fp");
|
|
27
27
|
const env = require("../environment");
|
|
28
|
+
function typecastForLooping(loopStep, input) {
|
|
29
|
+
if (!input || !input.binding) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const isArray = Array.isArray(input.binding), isString = typeof input.binding === "string";
|
|
33
|
+
try {
|
|
34
|
+
switch (loopStep.inputs.option) {
|
|
35
|
+
case LoopStepTypes.ARRAY:
|
|
36
|
+
if (isString) {
|
|
37
|
+
return JSON.parse(input.binding);
|
|
38
|
+
}
|
|
39
|
+
break;
|
|
40
|
+
case LoopStepTypes.STRING:
|
|
41
|
+
if (isArray) {
|
|
42
|
+
return input.binding.join(",");
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw new Error("Unable to cast to correct type");
|
|
49
|
+
}
|
|
50
|
+
return input.binding;
|
|
51
|
+
}
|
|
52
|
+
function getLoopIterations(loopStep, input) {
|
|
53
|
+
const binding = typecastForLooping(loopStep, input);
|
|
54
|
+
if (!loopStep || !binding) {
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
return Array.isArray(binding)
|
|
58
|
+
? binding.length
|
|
59
|
+
: automationUtils.stringSplit(binding).length;
|
|
60
|
+
}
|
|
28
61
|
/**
|
|
29
62
|
* The automation orchestrator is a class responsible for executing automations.
|
|
30
63
|
* It handles the context of the automation and makes sure each step gets the correct
|
|
@@ -95,7 +128,7 @@ class Orchestrator {
|
|
|
95
128
|
this._context.steps.splice(loopStepNumber, 0, Object.assign(Object.assign({}, output), { success: result.success, status: result.status }));
|
|
96
129
|
}
|
|
97
130
|
execute() {
|
|
98
|
-
var _a
|
|
131
|
+
var _a;
|
|
99
132
|
return __awaiter(this, void 0, void 0, function* () {
|
|
100
133
|
let automation = this._automation;
|
|
101
134
|
const app = yield this.getApp();
|
|
@@ -106,7 +139,7 @@ class Orchestrator {
|
|
|
106
139
|
let loopSteps = [];
|
|
107
140
|
for (let step of automation.definition.steps) {
|
|
108
141
|
stepCount++;
|
|
109
|
-
let input;
|
|
142
|
+
let input, iterations = 1, iterationCount = 0;
|
|
110
143
|
if (step.stepId === LOOP_STEP_ID) {
|
|
111
144
|
loopStep = step;
|
|
112
145
|
loopStepNumber = stepCount;
|
|
@@ -114,24 +147,18 @@ class Orchestrator {
|
|
|
114
147
|
}
|
|
115
148
|
if (loopStep) {
|
|
116
149
|
input = yield processObject(loopStep.inputs, this._context);
|
|
150
|
+
iterations = getLoopIterations(loopStep, input);
|
|
117
151
|
}
|
|
118
|
-
let iterations = loopStep
|
|
119
|
-
? Array.isArray(input.binding)
|
|
120
|
-
? input.binding.length
|
|
121
|
-
: automationUtils.stringSplit(input.binding).length
|
|
122
|
-
: 1;
|
|
123
|
-
let iterationCount = 0;
|
|
124
152
|
for (let index = 0; index < iterations; index++) {
|
|
125
153
|
let originalStepInput = cloneDeep(step.inputs);
|
|
126
154
|
// Handle if the user has set a max iteration count or if it reaches the max limit set by us
|
|
127
155
|
if (loopStep) {
|
|
128
156
|
let newInput = yield processObject(loopStep.inputs, cloneDeep(this._context));
|
|
129
|
-
newInput = automationUtils.cleanInputValues(newInput, loopStep.schema.inputs);
|
|
130
157
|
let tempOutput = { items: loopSteps, iterations: iterationCount };
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
158
|
+
try {
|
|
159
|
+
newInput.binding = typecastForLooping(loopStep, newInput);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
135
162
|
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|
|
136
163
|
status: AutomationErrors.INCORRECT_TYPE,
|
|
137
164
|
success: false,
|
|
@@ -179,16 +206,14 @@ class Orchestrator {
|
|
|
179
206
|
break;
|
|
180
207
|
}
|
|
181
208
|
let isFailure = false;
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
209
|
+
const currentItem = (_a = this._context.steps[loopStepNumber]) === null || _a === void 0 ? void 0 : _a.currentItem;
|
|
210
|
+
if (currentItem && typeof currentItem === "object") {
|
|
211
|
+
isFailure = Object.keys(currentItem).some(value => {
|
|
212
|
+
return currentItem[value] === loopStep.inputs.failure;
|
|
186
213
|
});
|
|
187
214
|
}
|
|
188
215
|
else {
|
|
189
|
-
isFailure =
|
|
190
|
-
((_b = this._context.steps[loopStepNumber]) === null || _b === void 0 ? void 0 : _b.currentItem) ===
|
|
191
|
-
loopStep.inputs.failure;
|
|
216
|
+
isFailure = currentItem && currentItem === loopStep.inputs.failure;
|
|
192
217
|
}
|
|
193
218
|
if (isFailure) {
|
|
194
219
|
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|