@budibase/server 1.0.49-alpha.8 → 1.0.49-alpha.9

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 (183) hide show
  1. package/builder/assets/{index.94a9250f.js → index.ad5370ae.js} +181 -181
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +91 -96
  4. package/coverage/coverage-final.json +1 -1
  5. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/application.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/index.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  49. package/coverage/lcov-report/api/index.html +1 -1
  50. package/coverage/lcov-report/api/index.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/index.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  81. package/coverage/lcov-report/automations/actions.js.html +1 -1
  82. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  83. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  84. package/coverage/lcov-report/automations/index.html +1 -1
  85. package/coverage/lcov-report/automations/index.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/index.html +1 -1
  95. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  113. package/coverage/lcov-report/automations/utils.js.html +1 -1
  114. package/coverage/lcov-report/constants/index.html +1 -1
  115. package/coverage/lcov-report/constants/index.js.html +1 -1
  116. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  117. package/coverage/lcov-report/constants/screens.js.html +1 -1
  118. package/coverage/lcov-report/db/client.js.html +1 -1
  119. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  120. package/coverage/lcov-report/db/index.html +1 -1
  121. package/coverage/lcov-report/db/index.js.html +1 -1
  122. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  123. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  126. package/coverage/lcov-report/db/newid.js.html +1 -1
  127. package/coverage/lcov-report/db/utils.js.html +1 -1
  128. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  129. package/coverage/lcov-report/events/index.html +1 -1
  130. package/coverage/lcov-report/events/index.js.html +1 -1
  131. package/coverage/lcov-report/events/utils.js.html +1 -1
  132. package/coverage/lcov-report/index.html +13 -13
  133. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  134. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  135. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  136. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  137. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  138. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  139. package/coverage/lcov-report/middleware/index.html +1 -1
  140. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  141. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  142. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  143. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  144. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  145. package/coverage/lcov-report/threads/automation.js.html +1 -1
  146. package/coverage/lcov-report/threads/index.html +14 -14
  147. package/coverage/lcov-report/threads/index.js.html +1 -1
  148. package/coverage/lcov-report/threads/query.js.html +10 -31
  149. package/coverage/lcov-report/threads/utils.js.html +1 -1
  150. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  151. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  152. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  153. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  154. package/coverage/lcov-report/utilities/global.js.html +1 -1
  155. package/coverage/lcov-report/utilities/index.html +1 -1
  156. package/coverage/lcov-report/utilities/index.js.html +1 -1
  157. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  158. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  159. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  160. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  161. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  162. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  164. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  165. package/coverage/lcov-report/utilities/security.js.html +1 -1
  166. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  167. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  168. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  169. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  170. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  171. package/coverage/lcov-report/utilities/users.js.html +1 -1
  172. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  173. package/coverage/lcov.info +155 -164
  174. package/dist/api/controllers/row/ExternalRequest.js +14 -4
  175. package/dist/integrations/base/sql.js +43 -8
  176. package/dist/package.json +4 -4
  177. package/dist/threads/query.js +2 -8
  178. package/dist/tsconfig.tsbuildinfo +1 -1
  179. package/package.json +5 -5
  180. package/scripts/integrations/postgres/init.sql +11 -6
  181. package/src/api/controllers/row/ExternalRequest.ts +14 -1
  182. package/src/integrations/base/sql.ts +55 -14
  183. package/src/threads/query.js +2 -9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.49-alpha.8",
4
+ "version": "1.0.49-alpha.9",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -70,9 +70,9 @@
70
70
  "license": "GPL-3.0",
71
71
  "dependencies": {
72
72
  "@apidevtools/swagger-parser": "^10.0.3",
73
- "@budibase/backend-core": "^1.0.49-alpha.8",
74
- "@budibase/client": "^1.0.49-alpha.8",
75
- "@budibase/string-templates": "^1.0.49-alpha.8",
73
+ "@budibase/backend-core": "^1.0.49-alpha.9",
74
+ "@budibase/client": "^1.0.49-alpha.9",
75
+ "@budibase/string-templates": "^1.0.49-alpha.9",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",
@@ -168,5 +168,5 @@
168
168
  "optionalDependencies": {
169
169
  "oracledb": "^5.3.0"
170
170
  },
171
- "gitHead": "86af297d87bd114438935a66cb8f5d63685a6aaf"
171
+ "gitHead": "797136cabc9f23bbf61bb17736fcf12b0e750dc8"
172
172
  }
@@ -9,12 +9,16 @@ CREATE TABLE Persons (
9
9
  );
10
10
  CREATE TABLE Tasks (
11
11
  TaskID SERIAL PRIMARY KEY,
12
- PersonID INT,
12
+ ExecutorID INT,
13
+ QaID INT,
13
14
  Completed BOOLEAN,
14
15
  TaskName varchar(255),
15
- CONSTRAINT fkPersons
16
- FOREIGN KEY(PersonID)
17
- REFERENCES Persons(PersonID)
16
+ CONSTRAINT fkexecutor
17
+ FOREIGN KEY(ExecutorID)
18
+ REFERENCES Persons(PersonID),
19
+ CONSTRAINT fkqa
20
+ FOREIGN KEY(QaID)
21
+ REFERENCES Persons(PersonID)
18
22
  );
19
23
  CREATE TABLE Products (
20
24
  ProductID SERIAL PRIMARY KEY,
@@ -32,8 +36,9 @@ CREATE TABLE Products_Tasks (
32
36
  PRIMARY KEY (ProductID, TaskID)
33
37
  );
34
38
  INSERT INTO Persons (FirstName, LastName, Address, City) VALUES ('Mike', 'Hughes', '123 Fake Street', 'Belfast');
35
- INSERT INTO Tasks (PersonID, TaskName, Completed) VALUES (1, 'assembling', TRUE);
36
- INSERT INTO Tasks (PersonID, TaskName, Completed) VALUES (1, 'processing', FALSE);
39
+ INSERT INTO Persons (FirstName, LastName, Address, City) Values ('John', 'Smith', '64 Updown Road', 'Dublin');
40
+ INSERT INTO Tasks (ExecutorID, QaID, TaskName, Completed) VALUES (1, 2, 'assembling', TRUE);
41
+ INSERT INTO Tasks (ExecutorID, QaID, TaskName, Completed) VALUES (2, 1, 'processing', FALSE);
37
42
  INSERT INTO Products (ProductName) VALUES ('Computers');
38
43
  INSERT INTO Products (ProductName) VALUES ('Laptops');
39
44
  INSERT INTO Products (ProductName) VALUES ('Chairs');
@@ -184,7 +184,7 @@ module External {
184
184
  thisRow._id = generateIdForRow(row, table)
185
185
  thisRow.tableId = table._id
186
186
  thisRow._rev = "rev"
187
- return thisRow
187
+ return processFormulas(table, thisRow)
188
188
  }
189
189
 
190
190
  function fixArrayTypes(row: Row, table: Table) {
@@ -327,8 +327,12 @@ module External {
327
327
  * This iterates through the returned rows and works out what elements of the rows
328
328
  * actually match up to another row (based on primary keys) - this is pretty specific
329
329
  * to SQL and the way that SQL relationships are returned based on joins.
330
+ * This is complicated, but the idea is that when a SQL query returns all the relations
331
+ * will be separate rows, with all of the data in each row. We have to decipher what comes
332
+ * from where (which tables) and how to convert that into budibase columns.
330
333
  */
331
334
  updateRelationshipColumns(
335
+ table: Table,
332
336
  row: Row,
333
337
  rows: { [key: string]: Row },
334
338
  relationships: RelationshipsJson[]
@@ -339,6 +343,13 @@ module External {
339
343
  if (!linkedTable) {
340
344
  continue
341
345
  }
346
+ const fromColumn = `${table.name}.${relationship.from}`
347
+ const toColumn = `${linkedTable.name}.${relationship.to}`
348
+ // this is important when working with multiple relationships
349
+ // between the same tables, don't want to overlap/multiply the relations
350
+ if (!relationship.through && row[fromColumn] !== row[toColumn]) {
351
+ continue
352
+ }
342
353
  let linked = basicProcessing(row, linkedTable)
343
354
  if (!linked._id) {
344
355
  continue
@@ -386,6 +397,7 @@ module External {
386
397
  // this is a relationship of some sort
387
398
  if (finalRows[rowId]) {
388
399
  finalRows = this.updateRelationshipColumns(
400
+ table,
389
401
  row,
390
402
  finalRows,
391
403
  relationships
@@ -399,6 +411,7 @@ module External {
399
411
  finalRows[thisRow._id] = thisRow
400
412
  // do this at end once its been added to the final rows
401
413
  finalRows = this.updateRelationshipColumns(
414
+ table,
402
415
  row,
403
416
  finalRows,
404
417
  relationships
@@ -191,29 +191,70 @@ class InternalBuilder {
191
191
  if (!relationships) {
192
192
  return query
193
193
  }
194
+ const tableSets: Record<string, [any]> = {}
195
+ // aggregate into table sets (all the same to tables)
194
196
  for (let relationship of relationships) {
195
- const from = relationship.from,
196
- to = relationship.to,
197
- toTable = relationship.tableName
198
- if (!relationship.through) {
197
+ const keyObj: { toTable: string; throughTable: string | undefined } = {
198
+ toTable: relationship.tableName,
199
+ throughTable: undefined,
200
+ }
201
+ if (relationship.through) {
202
+ keyObj.throughTable = relationship.through
203
+ }
204
+ const key = JSON.stringify(keyObj)
205
+ if (tableSets[key]) {
206
+ tableSets[key].push(relationship)
207
+ } else {
208
+ tableSets[key] = [relationship]
209
+ }
210
+ }
211
+ for (let [key, relationships] of Object.entries(tableSets)) {
212
+ const { toTable, throughTable } = JSON.parse(key)
213
+ if (!throughTable) {
199
214
  // @ts-ignore
200
- query = query.leftJoin(
215
+ query = query.join(
201
216
  toTable,
202
- `${fromTable}.${from}`,
203
- `${toTable}.${to}`
217
+ function () {
218
+ for (let relationship of relationships) {
219
+ const from = relationship.from,
220
+ to = relationship.to
221
+ // @ts-ignore
222
+ this.orOn(`${fromTable}.${from}`, "=", `${toTable}.${to}`)
223
+ }
224
+ },
225
+ "left"
204
226
  )
205
227
  } else {
206
- const throughTable = relationship.through
207
- const fromPrimary = relationship.fromPrimary
208
- const toPrimary = relationship.toPrimary
209
228
  query = query
210
229
  // @ts-ignore
211
- .leftJoin(
230
+ .join(
212
231
  throughTable,
213
- `${fromTable}.${fromPrimary}`,
214
- `${throughTable}.${from}`
232
+ function () {
233
+ for (let relationship of relationships) {
234
+ const fromPrimary = relationship.fromPrimary
235
+ const from = relationship.from
236
+ // @ts-ignore
237
+ this.orOn(
238
+ `${fromTable}.${fromPrimary}`,
239
+ "=",
240
+ `${throughTable}.${from}`
241
+ )
242
+ }
243
+ },
244
+ "left"
245
+ )
246
+ .join(
247
+ toTable,
248
+ function () {
249
+ for (let relationship of relationships) {
250
+ const toPrimary = relationship.toPrimary
251
+ const to = relationship.to
252
+ // @ts-ignore
253
+ this.orOn(`${toTable}.${toPrimary}`, `${throughTable}.${to}`)
254
+ }
255
+ },
256
+ "left"
215
257
  )
216
- .leftJoin(toTable, `${toTable}.${toPrimary}`, `${throughTable}.${to}`)
217
258
  }
218
259
  }
219
260
  return query.limit(BASE_LIMIT)
@@ -5,9 +5,6 @@ const { integrations } = require("../integrations")
5
5
  const { processStringSync } = require("@budibase/string-templates")
6
6
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
7
7
 
8
- const IS_TRIPLE_BRACE = new RegExp(/^{{3}.*}{3}$/)
9
- const IS_HANDLEBARS = new RegExp(/^{{2}.*}{2}$/)
10
-
11
8
  class QueryRunner {
12
9
  constructor(input, flags = { noRecursiveQuery: false }) {
13
10
  this.datasource = input.datasource
@@ -188,12 +185,8 @@ class QueryRunner {
188
185
  enrichedQuery[key] = this.enrichQueryFields(fields[key], parameters)
189
186
  } else if (typeof fields[key] === "string") {
190
187
  // enrich string value as normal
191
- let value = fields[key]
192
- // add triple brace to avoid escaping e.g. '=' in cookie header
193
- if (IS_HANDLEBARS.test(value) && !IS_TRIPLE_BRACE.test(value)) {
194
- value = `{${value}}`
195
- }
196
- enrichedQuery[key] = processStringSync(value, parameters, {
188
+ enrichedQuery[key] = processStringSync(fields[key], parameters, {
189
+ noEscaping: true,
197
190
  noHelpers: true,
198
191
  })
199
192
  } else {