@budibase/server 2.0.34-alpha.6 → 2.0.34-alpha.8
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/__mocks__/node-fetch.ts +12 -2
- package/builder/assets/{index.c6699f61.js → index.ae21af7e.js} +183 -183
- package/builder/index.html +1 -1
- package/coverage/clover.xml +426 -496
- package/coverage/coverage-final.json +47 -49
- package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +13 -13
- package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +20 -20
- package/coverage/lcov-report/api/controllers/index.html +9 -24
- package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
- package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
- 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 +4 -4
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
- 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/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 +6 -6
- 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/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +26 -26
- package/coverage/lcov-report/api/routes/analytics.js.html +7 -7
- package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
- package/coverage/lcov-report/api/routes/automation.js.html +11 -11
- package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
- package/coverage/lcov-report/api/routes/component.js.html +8 -8
- package/coverage/lcov-report/api/routes/datasource.js.html +9 -9
- package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
- package/coverage/lcov-report/api/routes/dev.js.html +13 -13
- package/coverage/lcov-report/api/routes/index.html +5 -20
- package/coverage/lcov-report/api/routes/integration.js.html +8 -8
- package/coverage/lcov-report/api/routes/layout.js.html +8 -8
- package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
- package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
- package/coverage/lcov-report/api/routes/permission.js.html +9 -9
- package/coverage/lcov-report/api/routes/query.js.html +10 -10
- package/coverage/lcov-report/api/routes/role.js.html +9 -9
- package/coverage/lcov-report/api/routes/routing.js.html +8 -8
- package/coverage/lcov-report/api/routes/screen.js.html +9 -9
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +10 -10
- package/coverage/lcov-report/api/routes/templates.js.html +8 -8
- package/coverage/lcov-report/api/routes/user.js.html +8 -8
- package/coverage/lcov-report/api/routes/utils/index.html +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.js.html +45 -45
- package/coverage/lcov-report/api/routes/view.js.html +10 -10
- 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 +25 -10
- package/coverage/lcov-report/automations/index.html +16 -16
- package/coverage/lcov-report/automations/index.js.html +4 -4
- 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 +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 +23 -23
- package/coverage/lcov-report/constants/index.html +5 -5
- package/coverage/lcov-report/constants/index.js.html +4 -16
- 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 +2 -2
- 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 +2 -2
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +45 -45
- 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 +5 -5
- package/coverage/lcov-report/middleware/builder.js.html +9 -9
- package/coverage/lcov-report/middleware/currentapp.js.html +14 -14
- 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 +5 -5
- package/coverage/lcov-report/middleware/resourceId.js.html +22 -22
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +3 -3
- 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 +20 -20
- package/coverage/lcov-report/utilities/index.js.html +2 -2
- package/coverage/lcov-report/utilities/plugins.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 +6 -6
- 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 +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 +46 -46
- package/coverage/lcov.info +492 -596
- package/dist/api/controllers/webhook.js +88 -89
- package/dist/api/routes/utils/validators.js +2 -2
- package/dist/api/routes/webhook.js +39 -11
- package/dist/app.js +2 -84
- package/dist/automations/bullboard.js +7 -2
- package/dist/automations/utils.js +5 -37
- package/dist/constants/index.js +0 -3
- package/dist/package.json +6 -6
- package/dist/sdk/app/automations/index.js +29 -0
- package/dist/sdk/app/automations/webhook.js +54 -0
- package/dist/sdk/app/backups/imports.js +24 -0
- package/dist/sdk/index.js +2 -0
- package/dist/startup.js +152 -0
- package/dist/tests/utilities/TestConfiguration.js +8 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/api/controllers/{webhook.js → webhook.ts} +33 -48
- package/src/api/routes/utils/validators.js +2 -2
- package/src/api/routes/{webhook.js → webhook.ts} +7 -6
- package/src/app.ts +3 -108
- package/src/automations/bullboard.js +6 -1
- package/src/automations/utils.ts +12 -20
- package/src/constants/index.js +0 -4
- package/src/definitions/automations.ts +1 -6
- package/src/migrations/functions/tests/syncQuotas.spec.js +1 -3
- package/src/migrations/functions/tests/userEmailViewCasing.spec.js +6 -4
- package/src/sdk/app/automations/index.ts +5 -0
- package/src/sdk/app/automations/webhook.ts +43 -0
- package/src/sdk/app/backups/imports.ts +39 -5
- package/src/sdk/index.ts +2 -0
- package/src/startup.ts +138 -0
- package/src/tests/utilities/TestConfiguration.js +7 -0
- package/coverage/lcov-report/api/controllers/webhook.js.html +0 -424
- package/coverage/lcov-report/api/routes/webhook.js.html +0 -163
package/src/startup.ts
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as env from "./environment"
|
|
2
|
+
import redis from "./utilities/redis"
|
|
3
|
+
import {
|
|
4
|
+
createAdminUser,
|
|
5
|
+
generateApiKey,
|
|
6
|
+
getChecklist,
|
|
7
|
+
} from "./utilities/workerRequests"
|
|
8
|
+
import {
|
|
9
|
+
installation,
|
|
10
|
+
pinoSettings,
|
|
11
|
+
tenancy,
|
|
12
|
+
logging,
|
|
13
|
+
} from "@budibase/backend-core"
|
|
14
|
+
import fs from "fs"
|
|
15
|
+
import { watch } from "./watch"
|
|
16
|
+
import automations from "./automations"
|
|
17
|
+
import fileSystem from "./utilities/fileSystem"
|
|
18
|
+
import eventEmitter from "./events"
|
|
19
|
+
import * as migrations from "./migrations"
|
|
20
|
+
import bullboard from "./automations/bullboard"
|
|
21
|
+
import * as pro from "@budibase/pro"
|
|
22
|
+
import api from "./api"
|
|
23
|
+
import sdk from "./sdk"
|
|
24
|
+
const pino = require("koa-pino-logger")
|
|
25
|
+
|
|
26
|
+
let STARTUP_RAN = false
|
|
27
|
+
|
|
28
|
+
async function initRoutes(app: any) {
|
|
29
|
+
app.use(pino(pinoSettings()))
|
|
30
|
+
|
|
31
|
+
if (!env.isTest()) {
|
|
32
|
+
const plugin = await bullboard.init()
|
|
33
|
+
app.use(plugin)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
app.context.eventEmitter = eventEmitter
|
|
37
|
+
app.context.auth = {}
|
|
38
|
+
|
|
39
|
+
// api routes
|
|
40
|
+
app.use(api.router.routes())
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function initPro() {
|
|
44
|
+
await pro.init({
|
|
45
|
+
backups: {
|
|
46
|
+
processing: {
|
|
47
|
+
exportAppFn: sdk.backups.exportApp,
|
|
48
|
+
importAppFn: sdk.backups.importApp,
|
|
49
|
+
statsFn: sdk.backups.calculateBackupStats,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function shutdown(server?: any) {
|
|
56
|
+
server.close()
|
|
57
|
+
server.destroy()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function startup(app?: any, server?: any) {
|
|
61
|
+
if (STARTUP_RAN) {
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
STARTUP_RAN = true
|
|
65
|
+
if (server) {
|
|
66
|
+
console.log(`Budibase running on ${JSON.stringify(server.address())}`)
|
|
67
|
+
env._set("PORT", server.address().port)
|
|
68
|
+
}
|
|
69
|
+
eventEmitter.emitPort(env.PORT)
|
|
70
|
+
fileSystem.init()
|
|
71
|
+
await redis.init()
|
|
72
|
+
|
|
73
|
+
// run migrations on startup if not done via http
|
|
74
|
+
// not recommended in a clustered environment
|
|
75
|
+
if (!env.HTTP_MIGRATIONS && !env.isTest()) {
|
|
76
|
+
try {
|
|
77
|
+
await migrations.migrate()
|
|
78
|
+
} catch (e) {
|
|
79
|
+
logging.logAlert("Error performing migrations. Exiting.", e)
|
|
80
|
+
shutdown()
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// check and create admin user if required
|
|
85
|
+
if (
|
|
86
|
+
env.SELF_HOSTED &&
|
|
87
|
+
!env.MULTI_TENANCY &&
|
|
88
|
+
env.BB_ADMIN_USER_EMAIL &&
|
|
89
|
+
env.BB_ADMIN_USER_PASSWORD
|
|
90
|
+
) {
|
|
91
|
+
const checklist = await getChecklist()
|
|
92
|
+
if (!checklist?.adminUser?.checked) {
|
|
93
|
+
try {
|
|
94
|
+
const tenantId = tenancy.getTenantId()
|
|
95
|
+
const user = await createAdminUser(
|
|
96
|
+
env.BB_ADMIN_USER_EMAIL,
|
|
97
|
+
env.BB_ADMIN_USER_PASSWORD,
|
|
98
|
+
tenantId
|
|
99
|
+
)
|
|
100
|
+
// Need to set up an API key for automated integration tests
|
|
101
|
+
if (env.isTest()) {
|
|
102
|
+
await generateApiKey(user._id)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
console.log(
|
|
106
|
+
"Admin account automatically created for",
|
|
107
|
+
env.BB_ADMIN_USER_EMAIL
|
|
108
|
+
)
|
|
109
|
+
} catch (e) {
|
|
110
|
+
logging.logAlert("Error creating initial admin user. Exiting.", e)
|
|
111
|
+
shutdown()
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// monitor plugin directory if required
|
|
117
|
+
if (
|
|
118
|
+
env.SELF_HOSTED &&
|
|
119
|
+
!env.MULTI_TENANCY &&
|
|
120
|
+
env.PLUGINS_DIR &&
|
|
121
|
+
fs.existsSync(env.PLUGINS_DIR)
|
|
122
|
+
) {
|
|
123
|
+
watch()
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// check for version updates
|
|
127
|
+
await installation.checkInstallVersion()
|
|
128
|
+
|
|
129
|
+
// get the references to the queue promises, don't await as
|
|
130
|
+
// they will never end, unless the processing stops
|
|
131
|
+
let queuePromises = []
|
|
132
|
+
queuePromises.push(automations.init())
|
|
133
|
+
queuePromises.push(initPro())
|
|
134
|
+
if (app) {
|
|
135
|
+
// bring routes online as final step once everything ready
|
|
136
|
+
await initRoutes(app)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -26,6 +26,7 @@ const context = require("@budibase/backend-core/context")
|
|
|
26
26
|
const { generateDevInfoID, SEPARATOR } = require("@budibase/backend-core/db")
|
|
27
27
|
const { encrypt } = require("@budibase/backend-core/encryption")
|
|
28
28
|
const { DocumentType, generateUserMetadataID } = require("../../db/utils")
|
|
29
|
+
const { startup } = require("../../startup")
|
|
29
30
|
|
|
30
31
|
const GLOBAL_USER_ID = "us_uuid1"
|
|
31
32
|
const EMAIL = "babs@babs.com"
|
|
@@ -41,6 +42,9 @@ class TestConfiguration {
|
|
|
41
42
|
this.server = require("../../app")
|
|
42
43
|
// we need the request for logging in, involves cookies, hard to fake
|
|
43
44
|
this.request = supertest(this.server)
|
|
45
|
+
this.started = true
|
|
46
|
+
} else {
|
|
47
|
+
this.started = false
|
|
44
48
|
}
|
|
45
49
|
this.appId = null
|
|
46
50
|
this.allApps = []
|
|
@@ -95,6 +99,9 @@ class TestConfiguration {
|
|
|
95
99
|
|
|
96
100
|
// use a new id as the name to avoid name collisions
|
|
97
101
|
async init(appName = newid()) {
|
|
102
|
+
if (!this.started) {
|
|
103
|
+
await startup()
|
|
104
|
+
}
|
|
98
105
|
this.user = await this.globalUser()
|
|
99
106
|
this.globalUserId = this.user._id
|
|
100
107
|
this.userMetadataId = generateUserMetadataID(this.globalUserId)
|
|
@@ -1,424 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for api/controllers/webhook.js</title>
|
|
7
|
-
<meta charset="utf-8" />
|
|
8
|
-
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
-
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
-
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
-
<style type='text/css'>
|
|
13
|
-
.coverage-summary .sorter {
|
|
14
|
-
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
-
}
|
|
16
|
-
</style>
|
|
17
|
-
</head>
|
|
18
|
-
|
|
19
|
-
<body>
|
|
20
|
-
<div class='wrapper'>
|
|
21
|
-
<div class='pad1'>
|
|
22
|
-
<h1><a href="../../index.html">All files</a> / <a href="index.html">api/controllers</a> webhook.js</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">91.66% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>55/60</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">40% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>4/10</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">100% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>7/7</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">91.52% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>54/59</span>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
</div>
|
|
54
|
-
<p class="quiet">
|
|
55
|
-
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
-
</p>
|
|
57
|
-
<template id="filterTemplate">
|
|
58
|
-
<div class="quiet">
|
|
59
|
-
Filter:
|
|
60
|
-
<input oninput="onInput()" type="search" id="fileSearch">
|
|
61
|
-
</div>
|
|
62
|
-
</template>
|
|
63
|
-
</div>
|
|
64
|
-
<div class='status-line high'></div>
|
|
65
|
-
<pre><table class="coverage">
|
|
66
|
-
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
-
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
-
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
-
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
-
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
-
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
-
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
-
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
-
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
-
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
-
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
-
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
-
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
-
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
-
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
-
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
-
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
-
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
-
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
-
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
-
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
-
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
-
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
-
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
-
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
-
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
-
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
-
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
-
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
-
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
-
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
-
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
-
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
-
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
-
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
-
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
-
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
-
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
-
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
-
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
-
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
-
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
-
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
-
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
-
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
-
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
-
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
-
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
-
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
-
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
-
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
-
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
-
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
-
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
-
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
-
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
-
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
-
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
-
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
-
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
-
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
-
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
-
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
-
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
-
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
-
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
-
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
-
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
-
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
-
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
-
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">45x</span>
|
|
180
|
-
<span class="cline-any cline-yes">45x</span>
|
|
181
|
-
<span class="cline-any cline-yes">45x</span>
|
|
182
|
-
<span class="cline-any cline-yes">45x</span>
|
|
183
|
-
<span class="cline-any cline-yes">45x</span>
|
|
184
|
-
<span class="cline-any cline-yes">45x</span>
|
|
185
|
-
<span class="cline-any cline-yes">45x</span>
|
|
186
|
-
<span class="cline-any cline-neutral"> </span>
|
|
187
|
-
<span class="cline-any cline-yes">45x</span>
|
|
188
|
-
<span class="cline-any cline-neutral"> </span>
|
|
189
|
-
<span class="cline-any cline-neutral"> </span>
|
|
190
|
-
<span class="cline-any cline-yes">1x</span>
|
|
191
|
-
<span class="cline-any cline-yes">1x</span>
|
|
192
|
-
<span class="cline-any cline-yes">1x</span>
|
|
193
|
-
<span class="cline-any cline-neutral"> </span>
|
|
194
|
-
<span class="cline-any cline-neutral"> </span>
|
|
195
|
-
<span class="cline-any cline-neutral"> </span>
|
|
196
|
-
<span class="cline-any cline-neutral"> </span>
|
|
197
|
-
<span class="cline-any cline-neutral"> </span>
|
|
198
|
-
<span class="cline-any cline-yes">45x</span>
|
|
199
|
-
<span class="cline-any cline-neutral"> </span>
|
|
200
|
-
<span class="cline-any cline-yes">45x</span>
|
|
201
|
-
<span class="cline-any cline-yes">2x</span>
|
|
202
|
-
<span class="cline-any cline-yes">2x</span>
|
|
203
|
-
<span class="cline-any cline-neutral"> </span>
|
|
204
|
-
<span class="cline-any cline-neutral"> </span>
|
|
205
|
-
<span class="cline-any cline-neutral"> </span>
|
|
206
|
-
<span class="cline-any cline-neutral"> </span>
|
|
207
|
-
<span class="cline-any cline-yes">2x</span>
|
|
208
|
-
<span class="cline-any cline-neutral"> </span>
|
|
209
|
-
<span class="cline-any cline-neutral"> </span>
|
|
210
|
-
<span class="cline-any cline-yes">45x</span>
|
|
211
|
-
<span class="cline-any cline-yes">10x</span>
|
|
212
|
-
<span class="cline-any cline-yes">10x</span>
|
|
213
|
-
<span class="cline-any cline-yes">10x</span>
|
|
214
|
-
<span class="cline-any cline-neutral"> </span>
|
|
215
|
-
<span class="cline-any cline-neutral"> </span>
|
|
216
|
-
<span class="cline-any cline-yes">10x</span>
|
|
217
|
-
<span class="cline-any cline-no"> </span>
|
|
218
|
-
<span class="cline-any cline-neutral"> </span>
|
|
219
|
-
<span class="cline-any cline-yes">10x</span>
|
|
220
|
-
<span class="cline-any cline-neutral"> </span>
|
|
221
|
-
<span class="cline-any cline-yes">10x</span>
|
|
222
|
-
<span class="cline-any cline-yes">10x</span>
|
|
223
|
-
<span class="cline-any cline-yes">10x</span>
|
|
224
|
-
<span class="cline-any cline-neutral"> </span>
|
|
225
|
-
<span class="cline-any cline-neutral"> </span>
|
|
226
|
-
<span class="cline-any cline-neutral"> </span>
|
|
227
|
-
<span class="cline-any cline-neutral"> </span>
|
|
228
|
-
<span class="cline-any cline-neutral"> </span>
|
|
229
|
-
<span class="cline-any cline-yes">45x</span>
|
|
230
|
-
<span class="cline-any cline-yes">1x</span>
|
|
231
|
-
<span class="cline-any cline-yes">1x</span>
|
|
232
|
-
<span class="cline-any cline-neutral"> </span>
|
|
233
|
-
<span class="cline-any cline-neutral"> </span>
|
|
234
|
-
<span class="cline-any cline-yes">45x</span>
|
|
235
|
-
<span class="cline-any cline-yes">1x</span>
|
|
236
|
-
<span class="cline-any cline-yes">1x</span>
|
|
237
|
-
<span class="cline-any cline-yes">1x</span>
|
|
238
|
-
<span class="cline-any cline-yes">1x</span>
|
|
239
|
-
<span class="cline-any cline-neutral"> </span>
|
|
240
|
-
<span class="cline-any cline-yes">1x</span>
|
|
241
|
-
<span class="cline-any cline-yes">1x</span>
|
|
242
|
-
<span class="cline-any cline-yes">1x</span>
|
|
243
|
-
<span class="cline-any cline-yes">1x</span>
|
|
244
|
-
<span class="cline-any cline-neutral"> </span>
|
|
245
|
-
<span class="cline-any cline-yes">1x</span>
|
|
246
|
-
<span class="cline-any cline-neutral"> </span>
|
|
247
|
-
<span class="cline-any cline-neutral"> </span>
|
|
248
|
-
<span class="cline-any cline-yes">1x</span>
|
|
249
|
-
<span class="cline-any cline-yes">1x</span>
|
|
250
|
-
<span class="cline-any cline-neutral"> </span>
|
|
251
|
-
<span class="cline-any cline-neutral"> </span>
|
|
252
|
-
<span class="cline-any cline-neutral"> </span>
|
|
253
|
-
<span class="cline-any cline-neutral"> </span>
|
|
254
|
-
<span class="cline-any cline-yes">1x</span>
|
|
255
|
-
<span class="cline-any cline-neutral"> </span>
|
|
256
|
-
<span class="cline-any cline-yes">1x</span>
|
|
257
|
-
<span class="cline-any cline-neutral"> </span>
|
|
258
|
-
<span class="cline-any cline-neutral"> </span>
|
|
259
|
-
<span class="cline-any cline-yes">45x</span>
|
|
260
|
-
<span class="cline-any cline-yes">1x</span>
|
|
261
|
-
<span class="cline-any cline-yes">1x</span>
|
|
262
|
-
<span class="cline-any cline-yes">1x</span>
|
|
263
|
-
<span class="cline-any cline-yes">1x</span>
|
|
264
|
-
<span class="cline-any cline-yes">1x</span>
|
|
265
|
-
<span class="cline-any cline-neutral"> </span>
|
|
266
|
-
<span class="cline-any cline-yes">1x</span>
|
|
267
|
-
<span class="cline-any cline-no"> </span>
|
|
268
|
-
<span class="cline-any cline-neutral"> </span>
|
|
269
|
-
<span class="cline-any cline-yes">1x</span>
|
|
270
|
-
<span class="cline-any cline-yes">1x</span>
|
|
271
|
-
<span class="cline-any cline-neutral"> </span>
|
|
272
|
-
<span class="cline-any cline-neutral"> </span>
|
|
273
|
-
<span class="cline-any cline-yes">1x</span>
|
|
274
|
-
<span class="cline-any cline-neutral"> </span>
|
|
275
|
-
<span class="cline-any cline-neutral"> </span>
|
|
276
|
-
<span class="cline-any cline-neutral"> </span>
|
|
277
|
-
<span class="cline-any cline-neutral"> </span>
|
|
278
|
-
<span class="cline-any cline-neutral"> </span>
|
|
279
|
-
<span class="cline-any cline-yes">1x</span>
|
|
280
|
-
<span class="cline-any cline-yes">1x</span>
|
|
281
|
-
<span class="cline-any cline-neutral"> </span>
|
|
282
|
-
<span class="cline-any cline-neutral"> </span>
|
|
283
|
-
<span class="cline-any cline-neutral"> </span>
|
|
284
|
-
<span class="cline-any cline-no"> </span>
|
|
285
|
-
<span class="cline-any cline-no"> </span>
|
|
286
|
-
<span class="cline-any cline-no"> </span>
|
|
287
|
-
<span class="cline-any cline-neutral"> </span>
|
|
288
|
-
<span class="cline-any cline-neutral"> </span>
|
|
289
|
-
<span class="cline-any cline-neutral"> </span>
|
|
290
|
-
<span class="cline-any cline-neutral"> </span>
|
|
291
|
-
<span class="cline-any cline-neutral"> </span>
|
|
292
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">const { generateWebhookID, getWebhookParams } = require("../../db/utils")
|
|
293
|
-
const toJsonSchema = require("to-json-schema")
|
|
294
|
-
const validate = require("jsonschema").validate
|
|
295
|
-
const { WebhookType } = require("../../constants")
|
|
296
|
-
const triggers = require("../../automations/triggers")
|
|
297
|
-
const { getProdAppID } = require("@budibase/backend-core/db")
|
|
298
|
-
const { getAppDB, updateAppId } = require("@budibase/backend-core/context")
|
|
299
|
-
|
|
300
|
-
const AUTOMATION_DESCRIPTION = "Generated from Webhook Schema"
|
|
301
|
-
|
|
302
|
-
function Webhook(name, type, target) {
|
|
303
|
-
this.live = true
|
|
304
|
-
this.name = name
|
|
305
|
-
this.action = {
|
|
306
|
-
type,
|
|
307
|
-
target,
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
exports.Webhook = Webhook
|
|
312
|
-
|
|
313
|
-
exports.fetch = async ctx => {
|
|
314
|
-
const db = getAppDB()
|
|
315
|
-
const response = await db.allDocs(
|
|
316
|
-
getWebhookParams(null, {
|
|
317
|
-
include_docs: true,
|
|
318
|
-
})
|
|
319
|
-
)
|
|
320
|
-
ctx.body = response.rows.map(row => row.doc)
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
exports.save = async ctx => {
|
|
324
|
-
const db = getAppDB()
|
|
325
|
-
const webhook = ctx.request.body
|
|
326
|
-
webhook.appId = ctx.appId
|
|
327
|
-
|
|
328
|
-
// check that the webhook exists
|
|
329
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (webhook._id) {
|
|
330
|
-
<span class="cstat-no" title="statement not covered" > await db.get(webhook._id)</span>
|
|
331
|
-
} else {
|
|
332
|
-
webhook._id = generateWebhookID()
|
|
333
|
-
}
|
|
334
|
-
const response = await db.put(webhook)
|
|
335
|
-
webhook._rev = response.rev
|
|
336
|
-
ctx.body = {
|
|
337
|
-
message: "Webhook created successfully",
|
|
338
|
-
webhook,
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
exports.destroy = async ctx => {
|
|
343
|
-
const db = getAppDB()
|
|
344
|
-
ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
exports.buildSchema = async ctx => {
|
|
348
|
-
await updateAppId(ctx.params.instance)
|
|
349
|
-
const db = getAppDB()
|
|
350
|
-
const webhook = await db.get(ctx.params.id)
|
|
351
|
-
webhook.bodySchema = toJsonSchema(ctx.request.body)
|
|
352
|
-
// update the automation outputs
|
|
353
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (webhook.action.type === WebhookType.AUTOMATION) {
|
|
354
|
-
let automation = await db.get(webhook.action.target)
|
|
355
|
-
const autoOutputs = automation.definition.trigger.schema.outputs
|
|
356
|
-
let properties = webhook.bodySchema.properties
|
|
357
|
-
// reset webhook outputs
|
|
358
|
-
autoOutputs.properties = {
|
|
359
|
-
body: autoOutputs.properties.body,
|
|
360
|
-
}
|
|
361
|
-
for (let prop of Object.keys(properties)) {
|
|
362
|
-
autoOutputs.properties[prop] = {
|
|
363
|
-
type: properties[prop].type,
|
|
364
|
-
description: AUTOMATION_DESCRIPTION,
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
await db.put(automation)
|
|
368
|
-
}
|
|
369
|
-
ctx.body = await db.put(webhook)
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
exports.trigger = async ctx => {
|
|
373
|
-
const prodAppId = getProdAppID(ctx.params.instance)
|
|
374
|
-
await updateAppId(prodAppId)
|
|
375
|
-
try {
|
|
376
|
-
const db = getAppDB()
|
|
377
|
-
const webhook = await db.get(ctx.params.id)
|
|
378
|
-
// validate against the schema
|
|
379
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (webhook.bodySchema) {
|
|
380
|
-
<span class="cstat-no" title="statement not covered" > validate(ctx.request.body, webhook.bodySchema)</span>
|
|
381
|
-
}
|
|
382
|
-
const target = await db.get(webhook.action.target)
|
|
383
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (webhook.action.type === WebhookType.AUTOMATION) {
|
|
384
|
-
// trigger with both the pure request and then expand it
|
|
385
|
-
// incase the user has produced a schema to bind to
|
|
386
|
-
await triggers.externalTrigger(target, {
|
|
387
|
-
body: ctx.request.body,
|
|
388
|
-
...ctx.request.body,
|
|
389
|
-
appId: prodAppId,
|
|
390
|
-
})
|
|
391
|
-
}
|
|
392
|
-
ctx.status = 200
|
|
393
|
-
ctx.body = {
|
|
394
|
-
message: "Webhook trigger fired successfully",
|
|
395
|
-
}
|
|
396
|
-
} catch (err) {
|
|
397
|
-
<span class="cstat-no" title="statement not covered" > if (err.status === 404) {</span>
|
|
398
|
-
<span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
|
|
399
|
-
<span class="cstat-no" title="statement not covered" > ctx.body = {</span>
|
|
400
|
-
message: "Application not deployed yet.",
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
</pre></td></tr></table></pre>
|
|
406
|
-
|
|
407
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
408
|
-
</div><!-- /wrapper -->
|
|
409
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
410
|
-
Code coverage generated by
|
|
411
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
412
|
-
at Thu Oct 27 2022 10:29:24 GMT+0000 (Coordinated Universal Time)
|
|
413
|
-
</div>
|
|
414
|
-
<script src="../../prettify.js"></script>
|
|
415
|
-
<script>
|
|
416
|
-
window.onload = function () {
|
|
417
|
-
prettyPrint();
|
|
418
|
-
};
|
|
419
|
-
</script>
|
|
420
|
-
<script src="../../sorter.js"></script>
|
|
421
|
-
<script src="../../block-navigation.js"></script>
|
|
422
|
-
</body>
|
|
423
|
-
</html>
|
|
424
|
-
|