@budibase/server 2.0.34-alpha.6 → 2.0.34-alpha.7

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.
Files changed (182) hide show
  1. package/__mocks__/node-fetch.ts +12 -2
  2. package/builder/assets/{index.c6699f61.js → index.ffeaa56c.js} +183 -183
  3. package/builder/index.html +1 -1
  4. package/coverage/clover.xml +426 -496
  5. package/coverage/coverage-final.json +47 -49
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  7. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/cloud.js.html +13 -13
  9. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/dev.js.html +20 -20
  11. package/coverage/lcov-report/api/controllers/index.html +9 -24
  12. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  13. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  15. package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
  16. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  18. package/coverage/lcov-report/api/controllers/query/validation.js.html +4 -4
  19. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  21. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  23. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/templates.js.html +6 -6
  33. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  39. package/coverage/lcov-report/api/index.html +1 -1
  40. package/coverage/lcov-report/api/index.js.html +26 -26
  41. package/coverage/lcov-report/api/routes/analytics.js.html +7 -7
  42. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  43. package/coverage/lcov-report/api/routes/automation.js.html +11 -11
  44. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  45. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  46. package/coverage/lcov-report/api/routes/datasource.js.html +9 -9
  47. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  48. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  49. package/coverage/lcov-report/api/routes/index.html +5 -20
  50. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  51. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  52. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  53. package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
  54. package/coverage/lcov-report/api/routes/permission.js.html +9 -9
  55. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  56. package/coverage/lcov-report/api/routes/role.js.html +9 -9
  57. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  58. package/coverage/lcov-report/api/routes/screen.js.html +9 -9
  59. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/table.js.html +10 -10
  61. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  62. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  63. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  64. package/coverage/lcov-report/api/routes/utils/validators.js.html +45 -45
  65. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  66. package/coverage/lcov-report/automations/actions.js.html +1 -1
  67. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  68. package/coverage/lcov-report/automations/bullboard.js.html +25 -10
  69. package/coverage/lcov-report/automations/index.html +16 -16
  70. package/coverage/lcov-report/automations/index.js.html +4 -4
  71. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  72. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  73. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  74. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  75. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  76. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  77. package/coverage/lcov-report/automations/steps/index.html +1 -1
  78. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  88. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  89. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  90. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  91. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  92. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  93. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  94. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggers.js.html +23 -23
  97. package/coverage/lcov-report/constants/index.html +5 -5
  98. package/coverage/lcov-report/constants/index.js.html +4 -16
  99. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  100. package/coverage/lcov-report/constants/screens.js.html +1 -1
  101. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  102. package/coverage/lcov-report/db/index.html +1 -1
  103. package/coverage/lcov-report/db/index.js.html +1 -1
  104. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  105. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  106. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  107. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  108. package/coverage/lcov-report/db/newid.js.html +1 -1
  109. package/coverage/lcov-report/db/utils.js.html +2 -2
  110. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  111. package/coverage/lcov-report/events/index.html +1 -1
  112. package/coverage/lcov-report/events/index.js.html +2 -2
  113. package/coverage/lcov-report/events/utils.js.html +1 -1
  114. package/coverage/lcov-report/index.html +45 -45
  115. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  116. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  117. package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
  118. package/coverage/lcov-report/middleware/builder.js.html +9 -9
  119. package/coverage/lcov-report/middleware/currentapp.js.html +14 -14
  120. package/coverage/lcov-report/middleware/index.html +1 -1
  121. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  122. package/coverage/lcov-report/middleware/publicApi.js.html +5 -5
  123. package/coverage/lcov-report/middleware/resourceId.js.html +22 -22
  124. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  125. package/coverage/lcov-report/middleware/utils.js.html +3 -3
  126. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  127. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  128. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  129. package/coverage/lcov-report/utilities/global.js.html +1 -1
  130. package/coverage/lcov-report/utilities/index.html +20 -20
  131. package/coverage/lcov-report/utilities/index.js.html +2 -2
  132. package/coverage/lcov-report/utilities/plugins.js.html +1 -1
  133. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  134. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  135. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  136. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  137. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  138. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  139. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  140. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  141. package/coverage/lcov-report/utilities/security.js.html +1 -1
  142. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  143. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  144. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  145. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  146. package/coverage/lcov-report/utilities/users.js.html +1 -1
  147. package/coverage/lcov-report/utilities/workerRequests.js.html +46 -46
  148. package/coverage/lcov.info +492 -596
  149. package/dist/api/controllers/webhook.js +88 -89
  150. package/dist/api/routes/utils/validators.js +2 -2
  151. package/dist/api/routes/webhook.js +39 -11
  152. package/dist/app.js +2 -84
  153. package/dist/automations/bullboard.js +7 -2
  154. package/dist/automations/utils.js +5 -37
  155. package/dist/constants/index.js +0 -3
  156. package/dist/package.json +6 -6
  157. package/dist/sdk/app/automations/index.js +29 -0
  158. package/dist/sdk/app/automations/webhook.js +54 -0
  159. package/dist/sdk/app/backups/imports.js +24 -0
  160. package/dist/sdk/index.js +2 -0
  161. package/dist/startup.js +152 -0
  162. package/dist/tests/utilities/TestConfiguration.js +8 -0
  163. package/dist/tsconfig.build.tsbuildinfo +1 -1
  164. package/package.json +7 -7
  165. package/src/api/controllers/{webhook.js → webhook.ts} +33 -48
  166. package/src/api/routes/utils/validators.js +2 -2
  167. package/src/api/routes/{webhook.js → webhook.ts} +7 -6
  168. package/src/app.ts +3 -108
  169. package/src/automations/bullboard.js +6 -1
  170. package/src/automations/utils.ts +12 -20
  171. package/src/constants/index.js +0 -4
  172. package/src/definitions/automations.ts +1 -6
  173. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -3
  174. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +6 -4
  175. package/src/sdk/app/automations/index.ts +5 -0
  176. package/src/sdk/app/automations/webhook.ts +43 -0
  177. package/src/sdk/app/backups/imports.ts +39 -5
  178. package/src/sdk/index.ts +2 -0
  179. package/src/startup.ts +138 -0
  180. package/src/tests/utilities/TestConfiguration.js +7 -0
  181. package/coverage/lcov-report/api/controllers/webhook.js.html +0 -424
  182. 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/packages/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">&nbsp;</span>
187
- <span class="cline-any cline-yes">45x</span>
188
- <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
194
- <span class="cline-any cline-neutral">&nbsp;</span>
195
- <span class="cline-any cline-neutral">&nbsp;</span>
196
- <span class="cline-any cline-neutral">&nbsp;</span>
197
- <span class="cline-any cline-neutral">&nbsp;</span>
198
- <span class="cline-any cline-yes">45x</span>
199
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
204
- <span class="cline-any cline-neutral">&nbsp;</span>
205
- <span class="cline-any cline-neutral">&nbsp;</span>
206
- <span class="cline-any cline-neutral">&nbsp;</span>
207
- <span class="cline-any cline-yes">2x</span>
208
- <span class="cline-any cline-neutral">&nbsp;</span>
209
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
215
- <span class="cline-any cline-neutral">&nbsp;</span>
216
- <span class="cline-any cline-yes">10x</span>
217
- <span class="cline-any cline-no">&nbsp;</span>
218
- <span class="cline-any cline-neutral">&nbsp;</span>
219
- <span class="cline-any cline-yes">10x</span>
220
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
225
- <span class="cline-any cline-neutral">&nbsp;</span>
226
- <span class="cline-any cline-neutral">&nbsp;</span>
227
- <span class="cline-any cline-neutral">&nbsp;</span>
228
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
233
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</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">&nbsp;</span>
245
- <span class="cline-any cline-yes">1x</span>
246
- <span class="cline-any cline-neutral">&nbsp;</span>
247
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
251
- <span class="cline-any cline-neutral">&nbsp;</span>
252
- <span class="cline-any cline-neutral">&nbsp;</span>
253
- <span class="cline-any cline-neutral">&nbsp;</span>
254
- <span class="cline-any cline-yes">1x</span>
255
- <span class="cline-any cline-neutral">&nbsp;</span>
256
- <span class="cline-any cline-yes">1x</span>
257
- <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
266
- <span class="cline-any cline-yes">1x</span>
267
- <span class="cline-any cline-no">&nbsp;</span>
268
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
272
- <span class="cline-any cline-neutral">&nbsp;</span>
273
- <span class="cline-any cline-yes">1x</span>
274
- <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-no">&nbsp;</span>
285
- <span class="cline-any cline-no">&nbsp;</span>
286
- <span class="cline-any cline-no">&nbsp;</span>
287
- <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-neutral">&nbsp;</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
- &nbsp;
300
- const AUTOMATION_DESCRIPTION = "Generated from Webhook Schema"
301
- &nbsp;
302
- function Webhook(name, type, target) {
303
- this.live = true
304
- this.name = name
305
- this.action = {
306
- type,
307
- target,
308
- }
309
- }
310
- &nbsp;
311
- exports.Webhook = Webhook
312
- &nbsp;
313
- exports.fetch = async ctx =&gt; {
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 =&gt; row.doc)
321
- }
322
- &nbsp;
323
- exports.save = async ctx =&gt; {
324
- const db = getAppDB()
325
- const webhook = ctx.request.body
326
- webhook.appId = ctx.appId
327
- &nbsp;
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
- &nbsp;
342
- exports.destroy = async ctx =&gt; {
343
- const db = getAppDB()
344
- ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
345
- }
346
- &nbsp;
347
- exports.buildSchema = async ctx =&gt; {
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
- &nbsp;
372
- exports.trigger = async ctx =&gt; {
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
- &nbsp;</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
-