@budibase/server 1.1.32-alpha.6 → 1.1.32

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 (204) hide show
  1. package/builder/assets/index.133db51f.js +978 -0
  2. package/builder/assets/{index.4d57d3d4.css → index.192adf4c.css} +2 -2
  3. package/builder/assets/{vendor.6bcafa60.js → vendor.162098da.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +696 -381
  6. package/coverage/coverage-final.json +16 -13
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +1 -1
  16. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +18 -18
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +49 -94
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +17 -17
  78. package/coverage/lcov-report/automations/index.html +1 -1
  79. package/coverage/lcov-report/automations/index.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +2 -5
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +14 -5
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +19 -19
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +1 -1
  118. package/coverage/lcov-report/db/utils.js.html +13 -61
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +72 -57
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  128. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  129. package/coverage/lcov-report/middleware/index.html +21 -21
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +43 -43
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  135. package/coverage/lcov-report/threads/automation.js.html +1114 -0
  136. package/coverage/lcov-report/threads/index.html +146 -0
  137. package/coverage/lcov-report/threads/query.js.html +916 -0
  138. package/coverage/lcov-report/threads/utils.js.html +319 -0
  139. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  140. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  141. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  142. package/coverage/lcov-report/utilities/global.js.html +14 -68
  143. package/coverage/lcov-report/utilities/index.html +19 -19
  144. package/coverage/lcov-report/utilities/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +14 -26
  146. package/coverage/lcov-report/utilities/queue/index.html +17 -17
  147. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  148. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  150. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  151. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  152. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  153. package/coverage/lcov-report/utilities/security.js.html +2 -2
  154. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  156. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  157. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  158. package/coverage/lcov-report/utilities/users.js.html +1 -1
  159. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  160. package/coverage/lcov.info +1214 -695
  161. package/dist/api/controllers/deploy/index.js +0 -1
  162. package/dist/api/controllers/query/index.js +1 -1
  163. package/dist/api/controllers/query/validation.js +3 -3
  164. package/dist/api/controllers/row/internalSearch.js +16 -30
  165. package/dist/api/routes/utils/validators.js +1 -1
  166. package/dist/automations/utils.js +1 -47
  167. package/dist/constants/index.js +4 -1
  168. package/dist/db/utils.js +1 -14
  169. package/dist/integrations/base/sql.js +14 -43
  170. package/dist/package.json +8 -8
  171. package/dist/threads/automation.js +54 -147
  172. package/dist/threads/index.js +20 -27
  173. package/dist/threads/query.js +15 -23
  174. package/dist/threads/utils.js +24 -47
  175. package/dist/tsconfig.build.tsbuildinfo +1 -1
  176. package/dist/utilities/global.js +5 -24
  177. package/dist/utilities/queue/inMemoryQueue.js +0 -5
  178. package/package.json +9 -9
  179. package/src/api/controllers/deploy/index.ts +1 -6
  180. package/src/api/controllers/query/index.ts +1 -1
  181. package/src/api/controllers/query/validation.js +3 -3
  182. package/src/api/controllers/row/internalSearch.js +20 -35
  183. package/src/api/routes/tests/user.spec.js +0 -2
  184. package/src/api/routes/utils/validators.js +1 -1
  185. package/src/automations/steps/executeQuery.js +0 -1
  186. package/src/automations/tests/automation.spec.js +2 -2
  187. package/src/automations/utils.ts +1 -54
  188. package/src/constants/index.js +5 -2
  189. package/src/db/utils.js +0 -16
  190. package/src/definitions/datasource.ts +0 -3
  191. package/src/integrations/base/sql.ts +13 -44
  192. package/src/integrations/tests/sql.spec.js +4 -50
  193. package/src/middleware/tests/currentapp.spec.js +0 -11
  194. package/src/threads/{automation.ts → automation.js} +48 -172
  195. package/src/threads/index.ts +23 -31
  196. package/src/threads/{query.ts → query.js} +12 -32
  197. package/src/threads/{utils.ts → utils.js} +12 -31
  198. package/src/utilities/global.js +3 -21
  199. package/src/utilities/queue/inMemoryQueue.js +0 -4
  200. package/builder/assets/index.fdd9c6c9.js +0 -977
  201. package/dist/definitions/automations.js +0 -8
  202. package/dist/threads/definitions.js +0 -2
  203. package/src/definitions/automations.ts +0 -49
  204. package/src/threads/definitions.ts +0 -18
@@ -16,9 +16,7 @@ const { user: userCache } = require("@budibase/backend-core/cache");
16
16
  const { getGlobalDB, isUserInAppTenant, } = require("@budibase/backend-core/tenancy");
17
17
  const env = require("../environment");
18
18
  const { getAppId } = require("@budibase/backend-core/context");
19
- const { groups } = require("@budibase/pro");
20
19
  exports.updateAppRole = (user, { appId } = {}) => {
21
- var _a, _b;
22
20
  appId = appId || getAppId();
23
21
  if (!user || !user.roles) {
24
22
  return user;
@@ -36,34 +34,17 @@ exports.updateAppRole = (user, { appId } = {}) => {
36
34
  if (!user.roleId && user.builder && user.builder.global) {
37
35
  user.roleId = BUILTIN_ROLE_IDS.ADMIN;
38
36
  }
39
- else if (!user.roleId && !((_a = user === null || user === void 0 ? void 0 : user.userGroups) === null || _a === void 0 ? void 0 : _a.length)) {
37
+ else if (!user.roleId) {
40
38
  user.roleId = BUILTIN_ROLE_IDS.PUBLIC;
41
39
  }
42
- else if ((_b = user === null || user === void 0 ? void 0 : user.userGroups) === null || _b === void 0 ? void 0 : _b.length) {
43
- user.roleId = null;
44
- }
45
40
  delete user.roles;
46
41
  return user;
47
42
  };
48
- function checkGroupRoles(user, { appId } = {}) {
49
- return __awaiter(this, void 0, void 0, function* () {
50
- let roleId = yield groups.getGroupRoleId(user, appId);
51
- user.roleId = roleId;
52
- return user;
53
- });
54
- }
55
43
  function processUser(user, { appId } = {}) {
56
- var _a;
57
- return __awaiter(this, void 0, void 0, function* () {
58
- if (user) {
59
- delete user.password;
60
- }
61
- user = yield exports.updateAppRole(user, { appId });
62
- if (!user.roleId && ((_a = user === null || user === void 0 ? void 0 : user.userGroups) === null || _a === void 0 ? void 0 : _a.length)) {
63
- user = yield checkGroupRoles(user, { appId });
64
- }
65
- return user;
66
- });
44
+ if (user) {
45
+ delete user.password;
46
+ }
47
+ return exports.updateAppRole(user, { appId });
67
48
  }
68
49
  exports.getCachedSelf = (ctx, appId) => __awaiter(void 0, void 0, void 0, function* () {
69
50
  // this has to be tenant aware, can't depend on the context to find it out
@@ -114,10 +114,5 @@ class InMemoryQueue {
114
114
  return [];
115
115
  });
116
116
  }
117
- getJob() {
118
- return __awaiter(this, void 0, void 0, function* () {
119
- return {};
120
- });
121
- }
122
117
  }
123
118
  module.exports = InMemoryQueue;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.1.32-alpha.6",
4
+ "version": "1.1.32",
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.1.32-alpha.6",
81
- "@budibase/client": "1.1.32-alpha.6",
82
- "@budibase/pro": "1.1.32-alpha.5",
83
- "@budibase/string-templates": "1.1.32-alpha.6",
84
- "@budibase/types": "1.1.32-alpha.6",
80
+ "@budibase/backend-core": "^1.1.32",
81
+ "@budibase/client": "^1.1.32",
82
+ "@budibase/pro": "1.1.31",
83
+ "@budibase/string-templates": "^1.1.32",
84
+ "@budibase/types": "^1.1.32",
85
85
  "@bull-board/api": "3.7.0",
86
86
  "@bull-board/koa": "3.9.4",
87
87
  "@elastic/elasticsearch": "7.10.0",
@@ -118,7 +118,7 @@
118
118
  "koa-send": "5.0.0",
119
119
  "koa-session": "5.12.0",
120
120
  "koa-static": "5.0.0",
121
- "koa2-ratelimit": "1.1.1",
121
+ "koa2-ratelimit": "1.1.0",
122
122
  "lodash": "4.17.21",
123
123
  "memorystream": "0.3.1",
124
124
  "mongodb": "3.6.3",
@@ -137,7 +137,7 @@
137
137
  "redis": "4",
138
138
  "server-destroy": "1.0.1",
139
139
  "snowflake-promise": "^4.5.0",
140
- "svelte": "3.49.0",
140
+ "svelte": "3.44.1",
141
141
  "swagger-parser": "10.0.3",
142
142
  "to-json-schema": "0.2.5",
143
143
  "uuid": "3.3.2",
@@ -195,5 +195,5 @@
195
195
  "optionalDependencies": {
196
196
  "oracledb": "5.3.0"
197
197
  },
198
- "gitHead": "1e5ddf4e78f604e0d82b5e42e2adbba5a4bfa901"
198
+ "gitHead": "900d5de0723c1b7acf218446507d52755fdf7d83"
199
199
  }
@@ -5,11 +5,7 @@ import {
5
5
  getDevelopmentAppID,
6
6
  } from "@budibase/backend-core/db"
7
7
  import { DocumentTypes, getAutomationParams } from "../../../db/utils"
8
- import {
9
- disableAllCrons,
10
- enableCronTrigger,
11
- clearMetadata,
12
- } from "../../../automations/utils"
8
+ import { disableAllCrons, enableCronTrigger } from "../../../automations/utils"
13
9
  import { app as appCache } from "@budibase/backend-core/cache"
14
10
  import {
15
11
  getAppId,
@@ -84,7 +80,6 @@ async function initDeployedApp(prodAppId: any) {
84
80
  })
85
81
  )
86
82
  ).rows.map((row: any) => row.doc)
87
- await clearMetadata()
88
83
  console.log("You have " + automations.length + " automations")
89
84
  const promises = []
90
85
  console.log("Disabling prod crons..")
@@ -246,7 +246,7 @@ async function execute(
246
246
  }
247
247
 
248
248
  export async function executeV1(ctx: any) {
249
- return execute(ctx, { rowsOnly: true, isAutomation: false })
249
+ return execute(ctx, { rowsOnly: true })
250
250
  }
251
251
 
252
252
  export async function executeV2(
@@ -1,4 +1,4 @@
1
- const { joiValidator } = require("@budibase/backend-core/auth")
1
+ const joiValidator = require("../../../middleware/joi-validator")
2
2
  const Joi = require("joi")
3
3
 
4
4
  const OPTIONAL_STRING = Joi.string().optional().allow(null).allow("")
@@ -22,7 +22,7 @@ exports.queryValidation = () => {
22
22
  schema: Joi.object({}).required().unknown(true),
23
23
  transformer: OPTIONAL_STRING,
24
24
  flags: Joi.object().optional(),
25
- }).unknown(true)
25
+ })
26
26
  }
27
27
 
28
28
  exports.generateQueryValidation = () => {
@@ -46,5 +46,5 @@ exports.generateQueryPreviewValidation = () => {
46
46
  transformer: OPTIONAL_STRING,
47
47
  parameters: Joi.object({}).required().unknown(true),
48
48
  queryId: OPTIONAL_STRING,
49
- }).unknown(true))
49
+ }))
50
50
  }
@@ -19,7 +19,6 @@ class QueryBuilder {
19
19
  empty: {},
20
20
  notEmpty: {},
21
21
  oneOf: {},
22
- contains: {},
23
22
  ...base,
24
23
  }
25
24
  this.limit = 50
@@ -120,11 +119,6 @@ class QueryBuilder {
120
119
  return this
121
120
  }
122
121
 
123
- addContains(key, value) {
124
- this.query.contains[key] = value
125
- return this
126
- }
127
-
128
122
  /**
129
123
  * Preprocesses a value before going into a lucene search.
130
124
  * Transforms strings to lowercase and wraps strings and bools in quotes.
@@ -170,31 +164,6 @@ class QueryBuilder {
170
164
  return `${key}:${builder.preprocess(value, allPreProcessingOpts)}`
171
165
  }
172
166
 
173
- const contains = (key, value) => {
174
- if (!value && value !== 0) {
175
- return null
176
- }
177
- return `${key}:${builder.preprocess(value, { escape: true })}`
178
- }
179
-
180
- const oneOf = (key, value) => {
181
- if (!Array.isArray(value)) {
182
- if (typeof value === "string") {
183
- value = value.split(",")
184
- } else {
185
- return ""
186
- }
187
- }
188
- let orStatement = `${builder.preprocess(value[0], allPreProcessingOpts)}`
189
- for (let i = 1; i < value.length; i++) {
190
- orStatement += ` OR ${builder.preprocess(
191
- value[i],
192
- allPreProcessingOpts
193
- )}`
194
- }
195
- return `${key}:(${orStatement})`
196
- }
197
-
198
167
  function build(structure, queryFn) {
199
168
  for (let [key, value] of Object.entries(structure)) {
200
169
  key = builder.preprocess(key.replace(/ /g, "_"), {
@@ -270,10 +239,26 @@ class QueryBuilder {
270
239
  build(this.query.notEmpty, key => `${key}:["" TO *]`)
271
240
  }
272
241
  if (this.query.oneOf) {
273
- build(this.query.oneOf, oneOf)
274
- }
275
- if (this.query.contains) {
276
- build(this.query.contains, contains)
242
+ build(this.query.oneOf, (key, value) => {
243
+ if (!Array.isArray(value)) {
244
+ if (typeof value === "string") {
245
+ value = value.split(",")
246
+ } else {
247
+ return ""
248
+ }
249
+ }
250
+ let orStatement = `${builder.preprocess(
251
+ value[0],
252
+ allPreProcessingOpts
253
+ )}`
254
+ for (let i = 1; i < value.length; i++) {
255
+ orStatement += ` OR ${builder.preprocess(
256
+ value[i],
257
+ allPreProcessingOpts
258
+ )}`
259
+ }
260
+ return `${key}:(${orStatement})`
261
+ })
277
262
  }
278
263
  // make sure table ID is always added as an AND
279
264
  if (tableId) {
@@ -23,7 +23,6 @@ describe("/users", () => {
23
23
  })
24
24
 
25
25
  describe("fetch", () => {
26
-
27
26
  it("returns a list of users from an instance db", async () => {
28
27
  await config.createUser("uuidx")
29
28
  await config.createUser("uuidy")
@@ -38,7 +37,6 @@ describe("/users", () => {
38
37
  expect(res.body.find(u => u._id === `ro_ta_users_us_uuidy`)).toBeDefined()
39
38
  })
40
39
 
41
-
42
40
  it("should apply authorization to endpoint", async () => {
43
41
  await config.createUser()
44
42
  await checkPermissionsEndpoint({
@@ -1,4 +1,4 @@
1
- const { joiValidator } = require("@budibase/backend-core/auth")
1
+ const joiValidator = require("../../../middleware/joi-validator")
2
2
  const { DataSourceOperation } = require("../../../constants")
3
3
  const { WebhookType } = require("../../../constants")
4
4
  const {
@@ -74,7 +74,6 @@ exports.run = async function ({ inputs, appId, emitter }) {
74
74
  try {
75
75
  await queryController.executeV2(ctx, { isAutomation: true })
76
76
  const { data, ...rest } = ctx.body
77
-
78
77
  return {
79
78
  response: data,
80
79
  info: rest,
@@ -31,7 +31,7 @@ describe("Run through some parts of the automations system", () => {
31
31
  it("should be able to init in builder", async () => {
32
32
  await triggers.externalTrigger(basicAutomation(), { a: 1 })
33
33
  await wait(100)
34
- expect(thread.execute).toHaveBeenCalled()
34
+ expect(thread).toHaveBeenCalled()
35
35
  })
36
36
 
37
37
  it("should be able to init in prod", async () => {
@@ -52,7 +52,7 @@ describe("Run through some parts of the automations system", () => {
52
52
  }
53
53
  })
54
54
  await wait(100)
55
- expect(thread.execute).toHaveBeenCalledWith(makePartial({
55
+ expect(thread).toHaveBeenCalledWith(makePartial({
56
56
  data: {
57
57
  event: {
58
58
  fields: {
@@ -6,16 +6,10 @@ import newid from "../db/newid"
6
6
  import { updateEntityMetadata } from "../utilities"
7
7
  import { MetadataTypes, WebhookType } from "../constants"
8
8
  import { getProdAppID, doWithDB } from "@budibase/backend-core/db"
9
- import { getAutomationMetadataParams } from "../db/utils"
10
9
  import { cloneDeep } from "lodash/fp"
11
- import {
12
- getAppDB,
13
- getAppId,
14
- getProdAppDB,
15
- } from "@budibase/backend-core/context"
10
+ import { getAppDB, getAppId } from "@budibase/backend-core/context"
16
11
  import { tenancy } from "@budibase/backend-core"
17
12
  import { quotas } from "@budibase/pro"
18
- import { Automation } from "@budibase/types"
19
13
 
20
14
  const WH_STEP_ID = definitions.WEBHOOK.stepId
21
15
  const CRON_STEP_ID = definitions.CRON.stepId
@@ -88,26 +82,6 @@ export async function disableAllCrons(appId: any) {
88
82
  return Promise.all(promises)
89
83
  }
90
84
 
91
- export async function disableCron(jobId: string, jobKey: string) {
92
- await queue.removeRepeatableByKey(jobKey)
93
- await queue.removeJobs(jobId)
94
- }
95
-
96
- export async function clearMetadata() {
97
- const db = getProdAppDB()
98
- const automationMetadata = (
99
- await db.allDocs(
100
- getAutomationMetadataParams({
101
- include_docs: true,
102
- })
103
- )
104
- ).rows.map((row: any) => row.doc)
105
- for (let metadata of automationMetadata) {
106
- metadata._deleted = true
107
- }
108
- await db.bulkDocs(automationMetadata)
109
- }
110
-
111
85
  /**
112
86
  * This function handles checking of any cron jobs that need to be enabled/updated.
113
87
  * @param {string} appId The ID of the app in which we are checking for webhooks
@@ -230,30 +204,3 @@ export async function checkForWebhooks({ oldAuto, newAuto }: any) {
230
204
  export async function cleanupAutomations(appId: any) {
231
205
  await disableAllCrons(appId)
232
206
  }
233
-
234
- /**
235
- * Checks if the supplied automation is of a recurring type.
236
- * @param automation The automation to check.
237
- * @return {boolean} if it is recurring (cron).
238
- */
239
- export function isRecurring(automation: Automation) {
240
- return automation.definition.trigger.stepId === definitions.CRON.stepId
241
- }
242
-
243
- export function isErrorInOutput(output: {
244
- steps: { outputs?: { success: boolean } }[]
245
- }) {
246
- let first = true,
247
- error = false
248
- for (let step of output.steps) {
249
- // skip the trigger, its always successful if automation ran
250
- if (first) {
251
- first = false
252
- continue
253
- }
254
- if (!step.outputs?.success) {
255
- error = true
256
- }
257
- }
258
- return error
259
- }
@@ -208,7 +208,10 @@ exports.AutomationErrors = {
208
208
  FAILURE_CONDITION: "FAILURE_CONDITION_MET",
209
209
  }
210
210
 
211
+ exports.LoopStepTypes = {
212
+ ARRAY: "Array",
213
+ STRING: "String",
214
+ }
215
+
211
216
  // pass through the list from the auth/core lib
212
217
  exports.ObjectStoreBuckets = ObjectStoreBuckets
213
-
214
- exports.MAX_AUTOMATION_RECURRING_ERRORS = 5
package/src/db/utils.js CHANGED
@@ -41,7 +41,6 @@ const DocumentTypes = {
41
41
  METADATA: "metadata",
42
42
  MEM_VIEW: "view",
43
43
  USER_FLAG: "flag",
44
- AUTOMATION_METADATA: "meta_au",
45
44
  }
46
45
 
47
46
  const InternalTables = {
@@ -312,21 +311,6 @@ exports.generateQueryID = datasourceId => {
312
311
  }${SEPARATOR}${datasourceId}${SEPARATOR}${newid()}`
313
312
  }
314
313
 
315
- /**
316
- * Generates a metadata ID for automations, used to track errors in recurring
317
- * automations etc.
318
- */
319
- exports.generateAutomationMetadataID = automationId => {
320
- return `${DocumentTypes.AUTOMATION_METADATA}${SEPARATOR}${automationId}`
321
- }
322
-
323
- /**
324
- * Retrieve all automation metadata in an app database.
325
- */
326
- exports.getAutomationMetadataParams = (otherProps = {}) => {
327
- return getDocParams(DocumentTypes.AUTOMATION_METADATA, null, otherProps)
328
- }
329
-
330
314
  /**
331
315
  * Gets parameters for retrieving a query, this is a utility function for the getDocParams function.
332
316
  */
@@ -131,9 +131,6 @@ export interface SearchFilters {
131
131
  oneOf?: {
132
132
  [key: string]: any[]
133
133
  }
134
- contains?: {
135
- [key: string]: any
136
- }
137
134
  }
138
135
 
139
136
  export interface SortJson {
@@ -142,21 +142,6 @@ class InternalBuilder {
142
142
  }
143
143
  }
144
144
  }
145
-
146
- const like = (key: string, value: any) => {
147
- const fnc = allOr ? "orWhere" : "where"
148
- // postgres supports ilike, nothing else does
149
- if (this.client === SqlClients.POSTGRES) {
150
- query = query[fnc](key, "ilike", `%${value}%`)
151
- } else {
152
- const rawFnc = `${fnc}Raw`
153
- // @ts-ignore
154
- query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
155
- `%${value}%`,
156
- ])
157
- }
158
- }
159
-
160
145
  if (!filters) {
161
146
  return query
162
147
  }
@@ -183,7 +168,19 @@ class InternalBuilder {
183
168
  })
184
169
  }
185
170
  if (filters.fuzzy) {
186
- iterate(filters.fuzzy, like)
171
+ iterate(filters.fuzzy, (key, value) => {
172
+ const fnc = allOr ? "orWhere" : "where"
173
+ // postgres supports ilike, nothing else does
174
+ if (this.client === SqlClients.POSTGRES) {
175
+ query = query[fnc](key, "ilike", `%${value}%`)
176
+ } else {
177
+ const rawFnc = `${fnc}Raw`
178
+ // @ts-ignore
179
+ query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
180
+ `%${value}%`,
181
+ ])
182
+ }
183
+ })
187
184
  }
188
185
  if (filters.range) {
189
186
  iterate(filters.range, (key, value) => {
@@ -226,34 +223,6 @@ class InternalBuilder {
226
223
  query = query[fnc](key)
227
224
  })
228
225
  }
229
- if (filters.contains) {
230
- const fnc = allOr ? "orWhere" : "where"
231
- const rawFnc = `${fnc}Raw`
232
- if (this.client === SqlClients.POSTGRES) {
233
- iterate(filters.contains, (key: string, value: any) => {
234
- const fieldNames = key.split(/\./g)
235
- const tableName = fieldNames[0]
236
- const columnName = fieldNames[1]
237
- if (typeof value === "string") {
238
- value = `"${value}"`
239
- }
240
- // @ts-ignore
241
- query = query[rawFnc](
242
- `"${tableName}"."${columnName}"::jsonb @> '[${value}]'`
243
- )
244
- })
245
- } else if (this.client === SqlClients.MY_SQL) {
246
- iterate(filters.contains, (key: string, value: any) => {
247
- if (typeof value === "string") {
248
- value = `"${value}"`
249
- }
250
- // @ts-ignore
251
- query = query[rawFnc](`JSON_CONTAINS(${key}, '${value}')`)
252
- })
253
- } else {
254
- iterate(filters.contains, like)
255
- }
256
- }
257
226
  return query
258
227
  }
259
228
 
@@ -1,5 +1,4 @@
1
1
  const Sql = require("../base/sql")
2
- const { SqlClients } = require("../utils")
3
2
 
4
3
  const TABLE_NAME = "test"
5
4
 
@@ -47,7 +46,7 @@ function generateDeleteJson(table = TABLE_NAME, filters = {}) {
47
46
 
48
47
  describe("SQL query builder", () => {
49
48
  const limit = 500
50
- const client = SqlClients.POSTGRES
49
+ const client = "pg"
51
50
  let sql
52
51
 
53
52
  beforeEach(() => {
@@ -174,15 +173,15 @@ describe("SQL query builder", () => {
174
173
  })
175
174
 
176
175
  it("should work with MS-SQL", () => {
177
- const query = new Sql(SqlClients.MS_SQL, 10)._query(generateReadJson())
176
+ const query = new Sql("mssql", 10)._query(generateReadJson())
178
177
  expect(query).toEqual({
179
178
  bindings: [10],
180
179
  sql: `select * from (select top (@p0) * from [${TABLE_NAME}]) as [${TABLE_NAME}]`
181
180
  })
182
181
  })
183
182
 
184
- it("should work with MySQL", () => {
185
- const query = new Sql(SqlClients.MY_SQL, 10)._query(generateReadJson())
183
+ it("should work with mySQL", () => {
184
+ const query = new Sql("mysql", 10)._query(generateReadJson())
186
185
  expect(query).toEqual({
187
186
  bindings: [10],
188
187
  sql: `select * from (select * from \`${TABLE_NAME}\` limit ?) as \`${TABLE_NAME}\``
@@ -239,49 +238,4 @@ describe("SQL query builder", () => {
239
238
  sql: `select * from (select * from "${TABLE_NAME}" where "${TABLE_NAME}"."property" > $1 limit $2) as "${TABLE_NAME}"`
240
239
  })
241
240
  })
242
-
243
- it("should use like expression for MS-SQL when filter is contains", () => {
244
- const query = new Sql(SqlClients.MS_SQL, 10)._query(generateReadJson({
245
- filters: {
246
- contains: {
247
- age: 20,
248
- name: "John"
249
- }
250
- }
251
- }))
252
- expect(query).toEqual({
253
- bindings: [10, "%20%", "%John%"],
254
- sql: `select * from (select top (@p0) * from [${TABLE_NAME}] where LOWER(${TABLE_NAME}.age) LIKE @p1 and LOWER(${TABLE_NAME}.name) LIKE @p2) as [${TABLE_NAME}]`
255
- })
256
- })
257
-
258
- it("should use JSON_CONTAINS expression for MySQL when filter is contains", () => {
259
- const query = new Sql(SqlClients.MY_SQL, 10)._query(generateReadJson({
260
- filters: {
261
- contains: {
262
- age: 20,
263
- name: "John"
264
- }
265
- }
266
- }))
267
- expect(query).toEqual({
268
- bindings: [10],
269
- sql: `select * from (select * from \`${TABLE_NAME}\` where JSON_CONTAINS(${TABLE_NAME}.age, '20') and JSON_CONTAINS(${TABLE_NAME}.name, '"John"') limit ?) as \`${TABLE_NAME}\``
270
- })
271
- })
272
-
273
- it("should use jsonb operator expression for PostgreSQL when filter is contains", () => {
274
- const query = new Sql(SqlClients.POSTGRES, 10)._query(generateReadJson({
275
- filters: {
276
- contains: {
277
- age: 20,
278
- name: "John"
279
- }
280
- }
281
- }))
282
- expect(query).toEqual({
283
- bindings: [10],
284
- sql: `select * from (select * from \"${TABLE_NAME}\" where \"${TABLE_NAME}\".\"age\"::jsonb @> '[20]' and \"${TABLE_NAME}\".\"name\"::jsonb @> '["John"]' limit $1) as \"${TABLE_NAME}\"`
285
- })
286
- })
287
241
  })
@@ -1,6 +1,5 @@
1
1
  mockAuthWithNoCookie()
2
2
  mockWorker()
3
- mockUserGroups()
4
3
 
5
4
  jest.mock("@budibase/backend-core/db", () => {
6
5
  const coreDb = jest.requireActual("@budibase/backend-core/db")
@@ -30,16 +29,6 @@ function mockReset() {
30
29
  mockWorker()
31
30
  }
32
31
 
33
- function mockUserGroups() {
34
- jest.mock("@budibase/pro", () => ({
35
- groups: {
36
- getGroupRoleId: () => {
37
- return "BASIC"
38
- },
39
- },
40
- }))
41
- }
42
-
43
32
  function mockAuthWithNoCookie() {
44
33
  jest.resetModules()
45
34
  mockWorker()