@budibase/server 1.0.212-alpha.10 → 1.0.212-alpha.13
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.88005d52.js → index.8653aa05.js} +164 -165
- package/builder/assets/{index.c6912819.css → index.92958011.css} +2 -2
- package/builder/assets/{vendor.9bf2fcb4.js → vendor.b4361801.js} +163 -163
- package/builder/index.html +3 -3
- package/coverage/clover.xml +414 -394
- package/coverage/coverage-final.json +8 -8
- 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 +111 -12
- 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 +19 -19
- 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 +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- 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 +15 -15
- package/coverage/lcov-report/api/index.js.html +18 -9
- 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 +32 -2
- 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 +58 -34
- package/coverage/lcov-report/automations/steps/index.html +11 -11
- 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 +1 -1
- 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 +1 -1
- package/coverage/lcov-report/constants/index.js.html +1 -1
- 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 +14 -14
- 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 +13 -13
- package/coverage/lcov-report/db/linkedRows/index.js.html +10 -7
- 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 +14 -41
- 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 +52 -52
- 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 +17 -8
- package/coverage/lcov-report/threads/index.html +11 -11
- 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/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 +2 -2
- 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 +1 -1
- 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 +721 -687
- package/dist/api/controllers/application.js +18 -15
- package/dist/api/controllers/automation.js +28 -2
- package/dist/api/index.js +4 -1
- package/dist/api/routes/automation.js +2 -0
- package/dist/automations/logging/index.js +70 -0
- package/dist/automations/steps/filter.js +38 -29
- package/dist/db/linkedRows/index.js +1 -0
- package/dist/db/utils.js +3 -31
- package/dist/environment.js +1 -0
- package/dist/package.json +6 -6
- package/dist/threads/automation.js +5 -2
- package/dist/threads/index.js +15 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/api/controllers/application.ts +18 -14
- package/src/api/controllers/automation.js +35 -2
- package/src/api/index.js +4 -1
- package/src/api/routes/automation.js +10 -0
- package/src/automations/logging/index.ts +35 -0
- package/src/automations/steps/filter.js +36 -28
- package/src/automations/tests/filter.spec.js +2 -1
- package/src/db/linkedRows/index.js +1 -0
- package/src/db/utils.js +4 -13
- package/src/environment.js +1 -0
- package/src/module.d.ts +1 -0
- package/src/threads/automation.js +5 -2
- package/src/threads/index.ts +5 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.0.212-alpha.
|
|
4
|
+
"version": "1.0.212-alpha.13",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"license": "GPL-3.0",
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@apidevtools/swagger-parser": "10.0.3",
|
|
80
|
-
"@budibase/backend-core": "^1.0.212-alpha.
|
|
81
|
-
"@budibase/client": "^1.0.212-alpha.
|
|
82
|
-
"@budibase/pro": "1.0.212-alpha.
|
|
83
|
-
"@budibase/string-templates": "^1.0.212-alpha.
|
|
84
|
-
"@budibase/types": "^1.0.212-alpha.
|
|
80
|
+
"@budibase/backend-core": "^1.0.212-alpha.13",
|
|
81
|
+
"@budibase/client": "^1.0.212-alpha.13",
|
|
82
|
+
"@budibase/pro": "1.0.212-alpha.12",
|
|
83
|
+
"@budibase/string-templates": "^1.0.212-alpha.13",
|
|
84
|
+
"@budibase/types": "^1.0.212-alpha.13",
|
|
85
85
|
"@bull-board/api": "3.7.0",
|
|
86
86
|
"@bull-board/koa": "3.9.4",
|
|
87
87
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -195,5 +195,5 @@
|
|
|
195
195
|
"optionalDependencies": {
|
|
196
196
|
"oracledb": "5.3.0"
|
|
197
197
|
},
|
|
198
|
-
"gitHead": "
|
|
198
|
+
"gitHead": "1b460f45a10f98573cb9fe7ca5269550155c5bed"
|
|
199
199
|
}
|
|
@@ -45,10 +45,12 @@ const { getTenantId, isMultiTenant } = require("@budibase/backend-core/tenancy")
|
|
|
45
45
|
import { syncGlobalUsers } from "./user"
|
|
46
46
|
const { app: appCache } = require("@budibase/backend-core/cache")
|
|
47
47
|
import { cleanupAutomations } from "../../automations/utils"
|
|
48
|
+
import { checkAppMetadata } from "../../automations/logging"
|
|
48
49
|
const {
|
|
49
50
|
getAppDB,
|
|
50
51
|
getProdAppDB,
|
|
51
52
|
updateAppId,
|
|
53
|
+
doInAppContext,
|
|
52
54
|
} = require("@budibase/backend-core/context")
|
|
53
55
|
import { getUniqueRows } from "../../utilities/usageQuota/rows"
|
|
54
56
|
import { quotas } from "@budibase/pro"
|
|
@@ -192,7 +194,7 @@ export const fetch = async (ctx: any) => {
|
|
|
192
194
|
}
|
|
193
195
|
}
|
|
194
196
|
|
|
195
|
-
ctx.body = apps
|
|
197
|
+
ctx.body = await checkAppMetadata(apps)
|
|
196
198
|
}
|
|
197
199
|
|
|
198
200
|
export const fetchAppDefinition = async (ctx: any) => {
|
|
@@ -548,22 +550,24 @@ export const sync = async (ctx: any, next: any) => {
|
|
|
548
550
|
}
|
|
549
551
|
|
|
550
552
|
const updateAppPackage = async (appPackage: any, appId: any) => {
|
|
551
|
-
|
|
552
|
-
|
|
553
|
+
return doInAppContext(appId, async () => {
|
|
554
|
+
const db = getAppDB()
|
|
555
|
+
const application = await db.get(DocumentTypes.APP_METADATA)
|
|
553
556
|
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
557
|
+
const newAppPackage = { ...application, ...appPackage }
|
|
558
|
+
if (appPackage._rev !== application._rev) {
|
|
559
|
+
newAppPackage._rev = application._rev
|
|
560
|
+
}
|
|
558
561
|
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
+
// the locked by property is attached by server but generated from
|
|
563
|
+
// Redis, shouldn't ever store it
|
|
564
|
+
delete newAppPackage.lockedBy
|
|
562
565
|
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
566
|
+
await db.put(newAppPackage)
|
|
567
|
+
// remove any cached metadata, so that it will be updated
|
|
568
|
+
await appCache.invalidateAppMetadata(appId)
|
|
569
|
+
return newAppPackage
|
|
570
|
+
})
|
|
567
571
|
}
|
|
568
572
|
|
|
569
573
|
const createEmptyAppPackage = async (ctx: any, app: any) => {
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
const actions = require("../../automations/actions")
|
|
2
2
|
const triggers = require("../../automations/triggers")
|
|
3
|
-
const {
|
|
3
|
+
const {
|
|
4
|
+
getAutomationParams,
|
|
5
|
+
generateAutomationID,
|
|
6
|
+
DocumentTypes,
|
|
7
|
+
} = require("../../db/utils")
|
|
4
8
|
const {
|
|
5
9
|
checkForWebhooks,
|
|
6
10
|
updateTestHistory,
|
|
@@ -9,8 +13,14 @@ const {
|
|
|
9
13
|
const { deleteEntityMetadata } = require("../../utilities")
|
|
10
14
|
const { MetadataTypes } = require("../../constants")
|
|
11
15
|
const { setTestFlag, clearTestFlag } = require("../../utilities/redis")
|
|
12
|
-
const {
|
|
16
|
+
const {
|
|
17
|
+
getAppDB,
|
|
18
|
+
getProdAppDB,
|
|
19
|
+
doInAppContext,
|
|
20
|
+
} = require("@budibase/backend-core/context")
|
|
13
21
|
const { events } = require("@budibase/backend-core")
|
|
22
|
+
const { app } = require("@budibase/backend-core/cache")
|
|
23
|
+
const { automations } = require("@budibase/pro")
|
|
14
24
|
|
|
15
25
|
const ACTION_DEFS = removeDeprecated(actions.ACTION_DEFINITIONS)
|
|
16
26
|
const TRIGGER_DEFS = removeDeprecated(triggers.TRIGGER_DEFINITIONS)
|
|
@@ -183,6 +193,29 @@ exports.destroy = async function (ctx) {
|
|
|
183
193
|
await events.automation.deleted(oldAutomation)
|
|
184
194
|
}
|
|
185
195
|
|
|
196
|
+
exports.logSearch = async function (ctx) {
|
|
197
|
+
ctx.body = await automations.logs.logSearch(ctx.request.body)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
exports.clearLogError = async function (ctx) {
|
|
201
|
+
const { automationId, appId } = ctx.request.body
|
|
202
|
+
await doInAppContext(appId, async () => {
|
|
203
|
+
const db = getProdAppDB()
|
|
204
|
+
const metadata = await db.get(DocumentTypes.APP_METADATA)
|
|
205
|
+
if (!automationId) {
|
|
206
|
+
delete metadata.automationErrors
|
|
207
|
+
} else if (
|
|
208
|
+
metadata.automationErrors &&
|
|
209
|
+
metadata.automationErrors[automationId]
|
|
210
|
+
) {
|
|
211
|
+
delete metadata.automationErrors[automationId]
|
|
212
|
+
}
|
|
213
|
+
await db.put(metadata)
|
|
214
|
+
await app.invalidateAppMetadata(metadata.appId, metadata)
|
|
215
|
+
ctx.body = { message: `Error logs cleared.` }
|
|
216
|
+
})
|
|
217
|
+
}
|
|
218
|
+
|
|
186
219
|
exports.getActionList = async function (ctx) {
|
|
187
220
|
ctx.body = ACTION_DEFS
|
|
188
221
|
}
|
package/src/api/index.js
CHANGED
|
@@ -51,6 +51,16 @@ router
|
|
|
51
51
|
automationValidator(false),
|
|
52
52
|
controller.create
|
|
53
53
|
)
|
|
54
|
+
.post(
|
|
55
|
+
"/api/automations/logs/search",
|
|
56
|
+
authorized(BUILDER),
|
|
57
|
+
controller.logSearch
|
|
58
|
+
)
|
|
59
|
+
.delete(
|
|
60
|
+
"/api/automations/logs",
|
|
61
|
+
authorized(BUILDER),
|
|
62
|
+
controller.clearLogError
|
|
63
|
+
)
|
|
54
64
|
.delete(
|
|
55
65
|
"/api/automations/:id/:rev",
|
|
56
66
|
paramResource("id"),
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as env from "../../environment"
|
|
2
|
+
import { AutomationResults, Automation, App } from "@budibase/types"
|
|
3
|
+
import { automations } from "@budibase/pro"
|
|
4
|
+
import { db as dbUtils } from "@budibase/backend-core"
|
|
5
|
+
|
|
6
|
+
export async function storeLog(
|
|
7
|
+
automation: Automation,
|
|
8
|
+
results: AutomationResults
|
|
9
|
+
) {
|
|
10
|
+
// can disable this if un-needed in self-host, also only do this for prod apps
|
|
11
|
+
if (env.DISABLE_AUTOMATION_LOGS) {
|
|
12
|
+
return
|
|
13
|
+
}
|
|
14
|
+
await automations.logs.storeLog(automation, results)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export async function checkAppMetadata(apps: App[]) {
|
|
18
|
+
const maxStartDate = await automations.logs.oldestLogDate()
|
|
19
|
+
for (let metadata of apps) {
|
|
20
|
+
if (!metadata.automationErrors) {
|
|
21
|
+
continue
|
|
22
|
+
}
|
|
23
|
+
for (let [key, errors] of Object.entries(metadata.automationErrors)) {
|
|
24
|
+
const updated = []
|
|
25
|
+
for (let error of errors) {
|
|
26
|
+
const startDate = error.split(dbUtils.SEPARATOR)[2]
|
|
27
|
+
if (startDate > maxStartDate) {
|
|
28
|
+
updated.push(error)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
metadata.automationErrors[key] = updated
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return apps
|
|
35
|
+
}
|
|
@@ -50,43 +50,51 @@ exports.definition = {
|
|
|
50
50
|
outputs: {
|
|
51
51
|
properties: {
|
|
52
52
|
success: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
description: "Whether the action was successful",
|
|
55
|
+
},
|
|
56
|
+
result: {
|
|
53
57
|
type: "boolean",
|
|
54
58
|
description: "Whether the logic block passed",
|
|
55
59
|
},
|
|
56
60
|
},
|
|
57
|
-
required: ["success"],
|
|
61
|
+
required: ["success", "result"],
|
|
58
62
|
},
|
|
59
63
|
},
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
exports.run = async function filter({ inputs }) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
value
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
67
|
+
try {
|
|
68
|
+
let { field, condition, value } = inputs
|
|
69
|
+
// coerce types so that we can use them
|
|
70
|
+
if (!isNaN(value) && !isNaN(field)) {
|
|
71
|
+
value = parseFloat(value)
|
|
72
|
+
field = parseFloat(field)
|
|
73
|
+
} else if (!isNaN(Date.parse(value)) && !isNaN(Date.parse(field))) {
|
|
74
|
+
value = Date.parse(value)
|
|
75
|
+
field = Date.parse(field)
|
|
76
|
+
}
|
|
77
|
+
let result = false
|
|
78
|
+
if (typeof field !== "object" && typeof value !== "object") {
|
|
79
|
+
switch (condition) {
|
|
80
|
+
case FilterConditions.EQUAL:
|
|
81
|
+
result = field === value
|
|
82
|
+
break
|
|
83
|
+
case FilterConditions.NOT_EQUAL:
|
|
84
|
+
result = field !== value
|
|
85
|
+
break
|
|
86
|
+
case FilterConditions.GREATER_THAN:
|
|
87
|
+
result = field > value
|
|
88
|
+
break
|
|
89
|
+
case FilterConditions.LESS_THAN:
|
|
90
|
+
result = field < value
|
|
91
|
+
break
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
result = false
|
|
87
95
|
}
|
|
88
|
-
|
|
89
|
-
|
|
96
|
+
return { success: true, result }
|
|
97
|
+
} catch (err) {
|
|
98
|
+
return { success: false, result: false }
|
|
90
99
|
}
|
|
91
|
-
return { success }
|
|
92
100
|
}
|
|
@@ -6,7 +6,8 @@ describe("test the filter logic", () => {
|
|
|
6
6
|
let res = await setup.runStep(setup.actions.FILTER.stepId,
|
|
7
7
|
{ field, condition, value }
|
|
8
8
|
)
|
|
9
|
-
expect(res.
|
|
9
|
+
expect(res.result).toEqual(pass)
|
|
10
|
+
expect(res.success).toEqual(true)
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
it("should be able test equality", async () => {
|
|
@@ -65,6 +65,7 @@ async function getLinksForRows(rows) {
|
|
|
65
65
|
// return duplicates, could be querying for both tables in a relation
|
|
66
66
|
return getUniqueByProp(
|
|
67
67
|
responses
|
|
68
|
+
.filter(el => el != null)
|
|
68
69
|
// create a unique ID which we can use for getting only unique ones
|
|
69
70
|
.map(el => ({ ...el, unique: el.id + el.thisId + el.fieldName })),
|
|
70
71
|
"unique"
|
package/src/db/utils.js
CHANGED
|
@@ -11,6 +11,8 @@ const {
|
|
|
11
11
|
isProdAppID,
|
|
12
12
|
getDevelopmentAppID,
|
|
13
13
|
generateAppID,
|
|
14
|
+
getQueryIndex,
|
|
15
|
+
ViewNames,
|
|
14
16
|
} = require("@budibase/backend-core/db")
|
|
15
17
|
|
|
16
18
|
const UNICODE_MAX = "\ufff0"
|
|
@@ -22,11 +24,7 @@ const AppStatus = {
|
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
const DocumentTypes = {
|
|
25
|
-
|
|
26
|
-
DEV: CoreDocTypes.DEV,
|
|
27
|
-
APP_DEV: CoreDocTypes.APP_DEV,
|
|
28
|
-
APP_METADATA: CoreDocTypes.APP_METADATA,
|
|
29
|
-
ROLE: CoreDocTypes.ROLE,
|
|
27
|
+
...CoreDocTypes,
|
|
30
28
|
TABLE: "ta",
|
|
31
29
|
ROW: "ro",
|
|
32
30
|
USER: "us",
|
|
@@ -45,11 +43,6 @@ const DocumentTypes = {
|
|
|
45
43
|
USER_FLAG: "flag",
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
const ViewNames = {
|
|
49
|
-
LINK: "by_link",
|
|
50
|
-
ROUTING: "screen_routes",
|
|
51
|
-
}
|
|
52
|
-
|
|
53
46
|
const InternalTables = {
|
|
54
47
|
USER_METADATA: "ta_users",
|
|
55
48
|
}
|
|
@@ -89,9 +82,7 @@ exports.generateDevAppID = getDevelopmentAppID
|
|
|
89
82
|
exports.generateRoleID = generateRoleID
|
|
90
83
|
exports.getRoleParams = getRoleParams
|
|
91
84
|
|
|
92
|
-
exports.getQueryIndex =
|
|
93
|
-
return `database/${viewName}`
|
|
94
|
-
}
|
|
85
|
+
exports.getQueryIndex = getQueryIndex
|
|
95
86
|
|
|
96
87
|
/**
|
|
97
88
|
* If creating DB allDocs/query params with only a single top level ID this can be used, this
|
package/src/environment.js
CHANGED
|
@@ -78,6 +78,7 @@ module.exports = {
|
|
|
78
78
|
ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
|
|
79
79
|
DISABLE_THREADING: process.env.DISABLE_THREADING,
|
|
80
80
|
DISABLE_DEVELOPER_LICENSE: process.env.DISABLE_DEVELOPER_LICENSE,
|
|
81
|
+
DISABLE_AUTOMATION_LOGS: process.env.DISABLE_AUTOMATION_LOGS,
|
|
81
82
|
MULTI_TENANCY: process.env.MULTI_TENANCY,
|
|
82
83
|
ENABLE_ANALYTICS: process.env.ENABLE_ANALYTICS,
|
|
83
84
|
SELF_HOSTED: process.env.SELF_HOSTED,
|
package/src/module.d.ts
CHANGED
|
@@ -9,11 +9,12 @@ const { doInTenant } = require("@budibase/backend-core/tenancy")
|
|
|
9
9
|
const { definitions: triggerDefs } = require("../automations/triggerInfo")
|
|
10
10
|
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
|
|
11
11
|
const { AutomationErrors, LoopStepTypes } = require("../constants")
|
|
12
|
+
const { storeLog } = require("../automations/logging")
|
|
12
13
|
const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
|
|
13
14
|
const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId
|
|
14
15
|
|
|
15
16
|
const CRON_STEP_ID = triggerDefs.CRON.stepId
|
|
16
|
-
const STOPPED_STATUS = { success:
|
|
17
|
+
const STOPPED_STATUS = { success: true, status: "STOPPED" }
|
|
17
18
|
const { cloneDeep } = require("lodash/fp")
|
|
18
19
|
const env = require("../environment")
|
|
19
20
|
|
|
@@ -275,7 +276,7 @@ class Orchestrator {
|
|
|
275
276
|
this._context.steps[stepCount] = outputs
|
|
276
277
|
// if filter causes us to stop execution don't break the loop, set a var
|
|
277
278
|
// so that we can finish iterating through the steps and record that it stopped
|
|
278
|
-
if (step.stepId === FILTER_STEP_ID && !outputs.
|
|
279
|
+
if (step.stepId === FILTER_STEP_ID && !outputs.result) {
|
|
279
280
|
stopped = true
|
|
280
281
|
this.updateExecutionOutput(step.id, step.stepId, step.inputs, {
|
|
281
282
|
...outputs,
|
|
@@ -325,6 +326,8 @@ class Orchestrator {
|
|
|
325
326
|
}
|
|
326
327
|
}
|
|
327
328
|
|
|
329
|
+
// store the logs for the automation run
|
|
330
|
+
await storeLog(this._automation, this.executionOutput)
|
|
328
331
|
return this.executionOutput
|
|
329
332
|
}
|
|
330
333
|
}
|
package/src/threads/index.ts
CHANGED
|
@@ -77,7 +77,7 @@ export class Thread {
|
|
|
77
77
|
})
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
static
|
|
80
|
+
static stopThreads() {
|
|
81
81
|
return new Promise<void>(resolve => {
|
|
82
82
|
if (Thread.workerRefs.length === 0) {
|
|
83
83
|
resolve()
|
|
@@ -95,4 +95,8 @@ export class Thread {
|
|
|
95
95
|
Thread.workerRefs = []
|
|
96
96
|
})
|
|
97
97
|
}
|
|
98
|
+
|
|
99
|
+
static async shutdown() {
|
|
100
|
+
await Thread.stopThreads()
|
|
101
|
+
}
|
|
98
102
|
}
|