@budibase/server 1.0.49-alpha.7 → 1.0.50-alpha.0

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 (193) hide show
  1. package/builder/assets/{index.83c0944f.css → index.c0cc369d.css} +6 -1
  2. package/builder/assets/{index.b7cd931c.js → index.ff2bad21.js} +190 -190
  3. package/builder/assets/{vendor.d526bfe8.js → vendor.5ad9695a.js} +202 -106
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +195 -207
  6. package/coverage/coverage-final.json +4 -4
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +14 -14
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +29 -116
  29. package/coverage/lcov-report/api/controllers/row/index.html +11 -11
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +41 -35
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  83. package/coverage/lcov-report/automations/actions.js.html +1 -1
  84. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  85. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  86. package/coverage/lcov-report/automations/index.html +1 -1
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/index.html +1 -1
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  115. package/coverage/lcov-report/automations/utils.js.html +1 -1
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +1 -1
  118. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  119. package/coverage/lcov-report/constants/screens.js.html +1 -1
  120. package/coverage/lcov-report/db/client.js.html +1 -1
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +1 -1
  123. package/coverage/lcov-report/db/index.js.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  128. package/coverage/lcov-report/db/newid.js.html +1 -1
  129. package/coverage/lcov-report/db/utils.js.html +1 -1
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +1 -1
  133. package/coverage/lcov-report/events/utils.js.html +1 -1
  134. package/coverage/lcov-report/index.html +28 -28
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  139. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  140. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  141. package/coverage/lcov-report/middleware/index.html +1 -1
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  143. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  146. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +14 -14
  149. package/coverage/lcov-report/threads/index.js.html +1 -1
  150. package/coverage/lcov-report/threads/query.js.html +10 -31
  151. package/coverage/lcov-report/threads/utils.js.html +1 -1
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  156. package/coverage/lcov-report/utilities/global.js.html +1 -1
  157. package/coverage/lcov-report/utilities/index.html +1 -1
  158. package/coverage/lcov-report/utilities/index.js.html +1 -1
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  167. package/coverage/lcov-report/utilities/security.js.html +1 -1
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  170. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  173. package/coverage/lcov-report/utilities/users.js.html +1 -1
  174. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  175. package/coverage/lcov.info +314 -328
  176. package/dist/api/controllers/row/ExternalRequest.js +14 -4
  177. package/dist/api/controllers/row/external.js +10 -18
  178. package/dist/api/controllers/static/index.js +4 -7
  179. package/dist/api/controllers/user.js +27 -25
  180. package/dist/integrations/base/sql.js +49 -15
  181. package/dist/package.json +4 -4
  182. package/dist/threads/query.js +2 -8
  183. package/dist/tsconfig.tsbuildinfo +1 -1
  184. package/package.json +5 -5
  185. package/scripts/integrations/mssql/data/Dockerfile +1 -1
  186. package/scripts/integrations/mssql/data/setup.sql +17 -4
  187. package/scripts/integrations/postgres/init.sql +11 -6
  188. package/src/api/controllers/row/ExternalRequest.ts +14 -1
  189. package/src/api/controllers/row/external.js +23 -52
  190. package/src/api/controllers/static/index.js +4 -6
  191. package/src/api/controllers/user.js +29 -27
  192. package/src/integrations/base/sql.ts +61 -22
  193. package/src/threads/query.js +2 -9
@@ -155,7 +155,7 @@ var External;
155
155
  thisRow._id = generateIdForRow(row, table);
156
156
  thisRow.tableId = table._id;
157
157
  thisRow._rev = "rev";
158
- return thisRow;
158
+ return utils_4.processFormulas(table, thisRow);
159
159
  }
160
160
  function fixArrayTypes(row, table) {
161
161
  for (let [fieldName, schema] of Object.entries(table.schema)) {
@@ -278,14 +278,24 @@ var External;
278
278
  * This iterates through the returned rows and works out what elements of the rows
279
279
  * actually match up to another row (based on primary keys) - this is pretty specific
280
280
  * to SQL and the way that SQL relationships are returned based on joins.
281
+ * This is complicated, but the idea is that when a SQL query returns all the relations
282
+ * will be separate rows, with all of the data in each row. We have to decipher what comes
283
+ * from where (which tables) and how to convert that into budibase columns.
281
284
  */
282
- updateRelationshipColumns(row, rows, relationships) {
285
+ updateRelationshipColumns(table, row, rows, relationships) {
283
286
  const columns = {};
284
287
  for (let relationship of relationships) {
285
288
  const linkedTable = this.tables[relationship.tableName];
286
289
  if (!linkedTable) {
287
290
  continue;
288
291
  }
292
+ const fromColumn = `${table.name}.${relationship.from}`;
293
+ const toColumn = `${linkedTable.name}.${relationship.to}`;
294
+ // this is important when working with multiple relationships
295
+ // between the same tables, don't want to overlap/multiply the relations
296
+ if (!relationship.through && row[fromColumn] !== row[toColumn]) {
297
+ continue;
298
+ }
289
299
  let linked = basicProcessing(row, linkedTable);
290
300
  if (!linked._id) {
291
301
  continue;
@@ -323,7 +333,7 @@ var External;
323
333
  row._id = rowId;
324
334
  // this is a relationship of some sort
325
335
  if (finalRows[rowId]) {
326
- finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
336
+ finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
327
337
  continue;
328
338
  }
329
339
  const thisRow = fixArrayTypes(basicProcessing(row, table), table);
@@ -332,7 +342,7 @@ var External;
332
342
  }
333
343
  finalRows[thisRow._id] = thisRow;
334
344
  // do this at end once its been added to the final rows
335
- finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
345
+ finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
336
346
  }
337
347
  return utils_4.processFormulas(table, Object.values(finalRows));
338
348
  }
@@ -43,22 +43,20 @@ function handleRequest(operation, tableId, opts = {}) {
43
43
  }
44
44
  exports.handleRequest = handleRequest;
45
45
  exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
46
- const appId = ctx.appId;
47
46
  const inputs = ctx.request.body;
48
47
  const tableId = ctx.params.tableId;
49
48
  const id = breakRowIdField(inputs._id);
50
49
  // don't save the ID to db
51
50
  delete inputs._id;
52
- return handleRequest(appId, DataSourceOperation.UPDATE, tableId, {
51
+ return handleRequest(DataSourceOperation.UPDATE, tableId, {
53
52
  id,
54
53
  row: inputs,
55
54
  });
56
55
  });
57
56
  exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
58
- const appId = ctx.appId;
59
57
  const inputs = ctx.request.body;
60
58
  const tableId = ctx.params.tableId;
61
- return handleRequest(appId, DataSourceOperation.CREATE, tableId, {
59
+ return handleRequest(DataSourceOperation.CREATE, tableId, {
62
60
  row: inputs,
63
61
  });
64
62
  });
@@ -70,35 +68,31 @@ exports.fetchView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
70
68
  return exports.fetch(ctx);
71
69
  });
72
70
  exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
73
- const appId = ctx.appId;
74
71
  const tableId = ctx.params.tableId;
75
- return handleRequest(appId, DataSourceOperation.READ, tableId);
72
+ return handleRequest(DataSourceOperation.READ, tableId);
76
73
  });
77
74
  exports.find = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
78
- const appId = ctx.appId;
79
75
  const id = ctx.params.rowId;
80
76
  const tableId = ctx.params.tableId;
81
- const response = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
77
+ const response = yield handleRequest(DataSourceOperation.READ, tableId, {
82
78
  id,
83
79
  });
84
80
  return response ? response[0] : response;
85
81
  });
86
82
  exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
87
- const appId = ctx.appId;
88
83
  const tableId = ctx.params.tableId;
89
84
  const id = ctx.request.body._id;
90
- const { row } = yield handleRequest(appId, DataSourceOperation.DELETE, tableId, {
85
+ const { row } = yield handleRequest(DataSourceOperation.DELETE, tableId, {
91
86
  id,
92
87
  });
93
88
  return { response: { ok: true }, row };
94
89
  });
95
90
  exports.bulkDestroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
96
- const appId = ctx.appId;
97
91
  const { rows } = ctx.request.body;
98
92
  const tableId = ctx.params.tableId;
99
93
  let promises = [];
100
94
  for (let row of rows) {
101
- promises.push(handleRequest(appId, DataSourceOperation.DELETE, tableId, {
95
+ promises.push(handleRequest(DataSourceOperation.DELETE, tableId, {
102
96
  id: breakRowIdField(row._id),
103
97
  }));
104
98
  }
@@ -106,7 +100,6 @@ exports.bulkDestroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
106
100
  return { response: { ok: true }, rows: responses.map(resp => resp.row) };
107
101
  });
108
102
  exports.search = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
109
- const appId = ctx.appId;
110
103
  const tableId = ctx.params.tableId;
111
104
  const _a = ctx.request.body, { paginate, query } = _a, params = __rest(_a, ["paginate", "query"]);
112
105
  let { bookmark, limit } = params;
@@ -135,14 +128,14 @@ exports.search = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
135
128
  [params.sort]: direction,
136
129
  };
137
130
  }
138
- const rows = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
131
+ const rows = yield handleRequest(DataSourceOperation.READ, tableId, {
139
132
  filters: query,
140
133
  sort,
141
134
  paginate: paginateObj,
142
135
  });
143
136
  let hasNextPage = false;
144
137
  if (paginate && rows.length === limit) {
145
- const nextRows = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
138
+ const nextRows = yield handleRequest(DataSourceOperation.READ, tableId, {
146
139
  filters: query,
147
140
  sort,
148
141
  paginate: {
@@ -160,7 +153,6 @@ exports.validate = () => __awaiter(void 0, void 0, void 0, function* () {
160
153
  return { valid: true };
161
154
  });
162
155
  exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
163
- const appId = ctx.appId;
164
156
  const id = ctx.params.rowId;
165
157
  const tableId = ctx.params.tableId;
166
158
  const { datasourceId, tableName } = breakExternalTableId(tableId);
@@ -170,7 +162,7 @@ exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function*
170
162
  ctx.throw(400, "Datasource has not been configured for plus API.");
171
163
  }
172
164
  const tables = datasource.entities;
173
- const response = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
165
+ const response = yield handleRequest(DataSourceOperation.READ, tableId, {
174
166
  id,
175
167
  datasource,
176
168
  });
@@ -189,7 +181,7 @@ exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function*
189
181
  const linkedTable = tables[breakExternalTableId(linkedTableId).tableName];
190
182
  // don't support composite keys right now
191
183
  const linkedIds = links.map(link => breakRowIdField(link._id)[0]);
192
- row[fieldName] = yield handleRequest(appId, DataSourceOperation.READ, linkedTableId, {
184
+ row[fieldName] = yield handleRequest(DataSourceOperation.READ, linkedTableId, {
193
185
  tables,
194
186
  filters: {
195
187
  oneOf: {
@@ -21,7 +21,7 @@ const { clientLibraryPath } = require("../../../utilities");
21
21
  const { upload } = require("../../../utilities/fileSystem");
22
22
  const { attachmentsRelativeURL } = require("../../../utilities");
23
23
  const { DocumentTypes } = require("../../../db/utils");
24
- const { getAppDB } = require("@budibase/backend-core/context");
24
+ const { getAppDB, updateAppId } = require("@budibase/backend-core/context");
25
25
  const AWS = require("aws-sdk");
26
26
  const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1";
27
27
  function prepareUpload({ s3Key, bucket, metadata, file }) {
@@ -50,12 +50,9 @@ function getAppIdFromUrl(ctx) {
50
50
  // search prod apps for a url that matches, exclude dev where id is always used
51
51
  const apps = yield getAllApps({ dev: false });
52
52
  const app = apps.filter(a => a.url && a.url.toLowerCase() === possibleAppUrl)[0];
53
- if (app && app.appId) {
54
- return app.appId;
55
- }
56
- else {
57
- return ctx.params.appId;
58
- }
53
+ const appId = app && app.appId ? app.appId : ctx.params.appId;
54
+ updateAppId(appId);
55
+ return appId;
59
56
  });
60
57
  }
61
58
  exports.serveBuilder = function (ctx) {
@@ -16,7 +16,7 @@ const { isEqual } = require("lodash");
16
16
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
17
17
  const { getDevelopmentAppID, getProdAppIDs, dbExists, } = require("@budibase/backend-core/db");
18
18
  const { UserStatus } = require("@budibase/backend-core/constants");
19
- const { getAppDB } = require("@budibase/backend-core/context");
19
+ const { getAppDB, doInAppContext } = require("@budibase/backend-core/context");
20
20
  function rawMetadata() {
21
21
  return __awaiter(this, void 0, void 0, function* () {
22
22
  const db = getAppDB();
@@ -97,31 +97,33 @@ exports.syncUser = function (ctx) {
97
97
  if (!(yield dbExists(appId))) {
98
98
  continue;
99
99
  }
100
- const db = getAppDB();
101
- const metadataId = generateUserMetadataID(userId);
102
- let metadata;
103
- try {
104
- metadata = yield db.get(metadataId);
105
- }
106
- catch (err) {
107
- if (deleting) {
108
- continue;
100
+ yield doInAppContext(appId, () => __awaiter(this, void 0, void 0, function* () {
101
+ const db = getAppDB();
102
+ const metadataId = generateUserMetadataID(userId);
103
+ let metadata;
104
+ try {
105
+ metadata = yield db.get(metadataId);
109
106
  }
110
- metadata = {
111
- tableId: InternalTables.USER_METADATA,
112
- };
113
- }
114
- // assign the roleId for the metadata doc
115
- if (roleId) {
116
- metadata.roleId = roleId;
117
- }
118
- let combined = !deleting
119
- ? combineMetadataAndUser(user, metadata)
120
- : Object.assign(Object.assign({}, metadata), { status: UserStatus.INACTIVE, metadata: BUILTIN_ROLE_IDS.PUBLIC });
121
- // if its null then there was no updates required
122
- if (combined) {
123
- yield db.put(combined);
124
- }
107
+ catch (err) {
108
+ if (deleting) {
109
+ return;
110
+ }
111
+ metadata = {
112
+ tableId: InternalTables.USER_METADATA,
113
+ };
114
+ }
115
+ // assign the roleId for the metadata doc
116
+ if (roleId) {
117
+ metadata.roleId = roleId;
118
+ }
119
+ let combined = !deleting
120
+ ? combineMetadataAndUser(user, metadata)
121
+ : Object.assign(Object.assign({}, metadata), { status: UserStatus.INACTIVE, metadata: BUILTIN_ROLE_IDS.PUBLIC });
122
+ // if its null then there was no updates required
123
+ if (combined) {
124
+ yield db.put(combined);
125
+ }
126
+ }));
125
127
  }
126
128
  }
127
129
  ctx.body = {
@@ -159,15 +159,14 @@ class InternalBuilder {
159
159
  addSorting(query, json) {
160
160
  var _a;
161
161
  let { sort, paginate } = json;
162
- if (!sort) {
163
- return query;
164
- }
165
162
  const table = (_a = json.meta) === null || _a === void 0 ? void 0 : _a.table;
166
- for (let [key, value] of Object.entries(sort)) {
167
- const direction = value === datasource_1.SortDirection.ASCENDING ? "asc" : "desc";
168
- query = query.orderBy(`${table === null || table === void 0 ? void 0 : table.name}.${key}`, direction);
163
+ if (sort) {
164
+ for (let [key, value] of Object.entries(sort)) {
165
+ const direction = value === datasource_1.SortDirection.ASCENDING ? "asc" : "desc";
166
+ query = query.orderBy(`${table === null || table === void 0 ? void 0 : table.name}.${key}`, direction);
167
+ }
169
168
  }
170
- if (this.client === utils_1.SqlClients.MS_SQL && !sort && (paginate === null || paginate === void 0 ? void 0 : paginate.limit)) {
169
+ else if (this.client === utils_1.SqlClients.MS_SQL && (paginate === null || paginate === void 0 ? void 0 : paginate.limit)) {
171
170
  // @ts-ignore
172
171
  query = query.orderBy(`${table === null || table === void 0 ? void 0 : table.name}.${table === null || table === void 0 ? void 0 : table.primary[0]}`);
173
172
  }
@@ -177,20 +176,55 @@ class InternalBuilder {
177
176
  if (!relationships) {
178
177
  return query;
179
178
  }
179
+ const tableSets = {};
180
+ // aggregate into table sets (all the same to tables)
180
181
  for (let relationship of relationships) {
181
- const from = relationship.from, to = relationship.to, toTable = relationship.tableName;
182
- if (!relationship.through) {
182
+ const keyObj = {
183
+ toTable: relationship.tableName,
184
+ throughTable: undefined,
185
+ };
186
+ if (relationship.through) {
187
+ keyObj.throughTable = relationship.through;
188
+ }
189
+ const key = JSON.stringify(keyObj);
190
+ if (tableSets[key]) {
191
+ tableSets[key].push(relationship);
192
+ }
193
+ else {
194
+ tableSets[key] = [relationship];
195
+ }
196
+ }
197
+ for (let [key, relationships] of Object.entries(tableSets)) {
198
+ const { toTable, throughTable } = JSON.parse(key);
199
+ if (!throughTable) {
183
200
  // @ts-ignore
184
- query = query.leftJoin(toTable, `${fromTable}.${from}`, `${toTable}.${to}`);
201
+ query = query.join(toTable, function () {
202
+ for (let relationship of relationships) {
203
+ const from = relationship.from, to = relationship.to;
204
+ // @ts-ignore
205
+ this.orOn(`${fromTable}.${from}`, "=", `${toTable}.${to}`);
206
+ }
207
+ }, "left");
185
208
  }
186
209
  else {
187
- const throughTable = relationship.through;
188
- const fromPrimary = relationship.fromPrimary;
189
- const toPrimary = relationship.toPrimary;
190
210
  query = query
191
211
  // @ts-ignore
192
- .leftJoin(throughTable, `${fromTable}.${fromPrimary}`, `${throughTable}.${from}`)
193
- .leftJoin(toTable, `${toTable}.${toPrimary}`, `${throughTable}.${to}`);
212
+ .join(throughTable, function () {
213
+ for (let relationship of relationships) {
214
+ const fromPrimary = relationship.fromPrimary;
215
+ const from = relationship.from;
216
+ // @ts-ignore
217
+ this.orOn(`${fromTable}.${fromPrimary}`, "=", `${throughTable}.${from}`);
218
+ }
219
+ }, "left")
220
+ .join(toTable, function () {
221
+ for (let relationship of relationships) {
222
+ const toPrimary = relationship.toPrimary;
223
+ const to = relationship.to;
224
+ // @ts-ignore
225
+ this.orOn(`${toTable}.${toPrimary}`, `${throughTable}.${to}`);
226
+ }
227
+ }, "left");
194
228
  }
195
229
  }
196
230
  return query.limit(BASE_LIMIT);
package/dist/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.6",
4
+ "version": "1.0.49",
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.6",
74
- "@budibase/client": "^1.0.49-alpha.6",
75
- "@budibase/string-templates": "^1.0.49-alpha.6",
73
+ "@budibase/backend-core": "^1.0.49",
74
+ "@budibase/client": "^1.0.49",
75
+ "@budibase/string-templates": "^1.0.49",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",
@@ -14,8 +14,6 @@ const ScriptRunner = require("../utilities/scriptRunner");
14
14
  const { integrations } = require("../integrations");
15
15
  const { processStringSync } = require("@budibase/string-templates");
16
16
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
17
- const IS_TRIPLE_BRACE = new RegExp(/^{{3}.*}{3}$/);
18
- const IS_HANDLEBARS = new RegExp(/^{{2}.*}{2}$/);
19
17
  class QueryRunner {
20
18
  constructor(input, flags = { noRecursiveQuery: false }) {
21
19
  this.datasource = input.datasource;
@@ -180,12 +178,8 @@ class QueryRunner {
180
178
  }
181
179
  else if (typeof fields[key] === "string") {
182
180
  // enrich string value as normal
183
- let value = fields[key];
184
- // add triple brace to avoid escaping e.g. '=' in cookie header
185
- if (IS_HANDLEBARS.test(value) && !IS_TRIPLE_BRACE.test(value)) {
186
- value = `{${value}}`;
187
- }
188
- enrichedQuery[key] = processStringSync(value, parameters, {
181
+ enrichedQuery[key] = processStringSync(fields[key], parameters, {
182
+ noEscaping: true,
189
183
  noHelpers: true,
190
184
  });
191
185
  }