@budibase/server 1.0.95 → 1.0.98-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 (241) hide show
  1. package/builder/assets/{index.7c8961b4.css → index.0b7cf958.css} +1 -1
  2. package/builder/assets/index.55c226d0.js +1292 -0
  3. package/builder/assets/{vendor.a7c6ad0a.js → vendor.8e34a169.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +274 -273
  6. package/coverage/coverage-final.json +18 -18
  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 +2 -2
  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 +1 -1
  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 +2 -2
  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 +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +20 -20
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +47 -35
  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 +6 -6
  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 +4 -4
  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 +1 -1
  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 +15 -15
  52. package/coverage/lcov-report/api/index.js.html +15 -27
  53. package/coverage/lcov-report/api/routes/analytics.js.html +3 -3
  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 +3 -6
  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/utils/index.html +1 -1
  82. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  85. package/coverage/lcov-report/automations/actions.js.html +1 -1
  86. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  87. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  88. package/coverage/lcov-report/automations/index.html +1 -1
  89. package/coverage/lcov-report/automations/index.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/index.html +1 -1
  99. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  116. package/coverage/lcov-report/automations/triggers.js.html +3 -3
  117. package/coverage/lcov-report/automations/utils.js.html +1 -1
  118. package/coverage/lcov-report/constants/index.html +1 -1
  119. package/coverage/lcov-report/constants/index.js.html +1 -1
  120. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  121. package/coverage/lcov-report/constants/screens.js.html +1 -1
  122. package/coverage/lcov-report/db/client.js.html +1 -1
  123. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  124. package/coverage/lcov-report/db/index.html +1 -1
  125. package/coverage/lcov-report/db/index.js.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  128. package/coverage/lcov-report/db/linkedRows/index.js.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -7
  130. package/coverage/lcov-report/db/newid.js.html +2 -2
  131. package/coverage/lcov-report/db/utils.js.html +4 -4
  132. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  133. package/coverage/lcov-report/events/index.html +1 -1
  134. package/coverage/lcov-report/events/index.js.html +1 -1
  135. package/coverage/lcov-report/events/utils.js.html +1 -1
  136. package/coverage/lcov-report/index.html +25 -25
  137. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  138. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  139. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  140. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  141. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  142. package/coverage/lcov-report/middleware/currentapp.js.html +15 -12
  143. package/coverage/lcov-report/middleware/index.html +11 -11
  144. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  145. package/coverage/lcov-report/middleware/publicApi.js.html +3 -3
  146. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  147. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  149. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  150. package/coverage/lcov-report/threads/automation.js.html +1 -1
  151. package/coverage/lcov-report/threads/index.html +1 -1
  152. package/coverage/lcov-report/threads/index.js.html +1 -1
  153. package/coverage/lcov-report/threads/query.js.html +1 -1
  154. package/coverage/lcov-report/threads/utils.js.html +1 -1
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  157. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  158. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  159. package/coverage/lcov-report/utilities/global.js.html +1 -1
  160. package/coverage/lcov-report/utilities/index.html +1 -1
  161. package/coverage/lcov-report/utilities/index.js.html +1 -1
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  163. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +24 -24
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +8 -8
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  170. package/coverage/lcov-report/utilities/security.js.html +1 -1
  171. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  174. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  176. package/coverage/lcov-report/utilities/users.js.html +1 -1
  177. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  178. package/coverage/lcov.info +415 -416
  179. package/dist/api/controllers/auth.js +1 -1
  180. package/dist/api/controllers/public/rows.js +2 -2
  181. package/dist/api/controllers/query/import/index.js +2 -1
  182. package/dist/api/controllers/query/import/sources/base/index.js +12 -1
  183. package/dist/api/controllers/query/import/sources/curl.js +2 -2
  184. package/dist/api/controllers/query/import/sources/openapi3.js +174 -0
  185. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  186. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  187. package/dist/api/controllers/row/internal.js +2 -1
  188. package/dist/api/controllers/static/index.js +2 -15
  189. package/dist/api/controllers/table/external.js +3 -3
  190. package/dist/api/index.js +3 -6
  191. package/dist/api/routes/analytics.js +2 -2
  192. package/dist/api/routes/static.js +1 -2
  193. package/dist/db/views/staticViews.js +2 -0
  194. package/dist/definitions/datasource.js +1 -0
  195. package/dist/integrations/base/sql.js +16 -9
  196. package/dist/integrations/dynamodb.js +3 -1
  197. package/dist/integrations/firebase.js +192 -0
  198. package/dist/integrations/index.js +3 -0
  199. package/dist/integrations/rest.js +2 -1
  200. package/dist/middleware/currentapp.js +7 -6
  201. package/dist/middleware/publicApi.js +2 -2
  202. package/dist/package.json +7 -8
  203. package/dist/tests/utilities/TestConfiguration.js +1 -1
  204. package/dist/tsconfig.tsbuildinfo +1 -1
  205. package/package.json +8 -9
  206. package/scripts/dev/manage.js +2 -1
  207. package/src/api/controllers/auth.js +1 -1
  208. package/src/api/controllers/public/rows.ts +2 -4
  209. package/src/api/controllers/query/import/index.ts +2 -1
  210. package/src/api/controllers/query/import/sources/base/index.ts +12 -2
  211. package/src/api/controllers/query/import/sources/curl.ts +2 -2
  212. package/src/api/controllers/query/import/sources/openapi3.ts +205 -0
  213. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  214. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  215. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  216. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  217. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  218. package/src/api/controllers/query/import/tests/index.spec.js +43 -0
  219. package/src/api/controllers/row/internal.js +5 -1
  220. package/src/api/controllers/static/index.js +2 -18
  221. package/src/api/controllers/table/external.js +3 -3
  222. package/src/api/index.js +3 -7
  223. package/src/api/routes/analytics.js +2 -2
  224. package/src/api/routes/static.js +1 -2
  225. package/src/api/routes/tests/misc.spec.js +2 -2
  226. package/src/db/views/staticViews.js +2 -0
  227. package/src/definitions/datasource.ts +1 -0
  228. package/src/definitions/openapi.ts +472 -472
  229. package/src/integrations/base/sql.ts +14 -9
  230. package/src/integrations/dynamodb.ts +3 -1
  231. package/src/integrations/firebase.ts +205 -0
  232. package/src/integrations/index.ts +3 -0
  233. package/src/integrations/rest.ts +2 -1
  234. package/src/integrations/tests/sql.spec.js +51 -0
  235. package/src/middleware/currentapp.js +7 -6
  236. package/src/middleware/publicApi.js +2 -2
  237. package/src/middleware/tests/authorized.spec.js +1 -3
  238. package/src/middleware/tests/currentapp.spec.js +4 -4
  239. package/src/tests/utilities/TestConfiguration.js +1 -1
  240. package/.eslintrc +0 -13
  241. package/builder/assets/index.3544c466.js +0 -1291
@@ -91,7 +91,8 @@ exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
91
91
  const isUserTable = tableId === InternalTables.USER_METADATA;
92
92
  let oldRow;
93
93
  try {
94
- oldRow = yield db.get(inputs._id);
94
+ let dbTable = yield db.get(tableId);
95
+ oldRow = yield outputProcessing(dbTable, yield findRow(ctx, tableId, inputs._id));
95
96
  }
96
97
  catch (err) {
97
98
  if (isUserTable) {
@@ -14,14 +14,13 @@ const { resolve, join } = require("../../../utilities/centralPath");
14
14
  const uuid = require("uuid");
15
15
  const { ObjectStoreBuckets } = require("../../../constants");
16
16
  const { processString } = require("@budibase/string-templates");
17
- const { getAllApps } = require("@budibase/backend-core/db");
18
17
  const { loadHandlebarsFile, NODE_MODULES_PATH, TOP_LEVEL_PATH, } = require("../../../utilities/fileSystem");
19
18
  const env = require("../../../environment");
20
19
  const { clientLibraryPath } = require("../../../utilities");
21
20
  const { upload } = require("../../../utilities/fileSystem");
22
21
  const { attachmentsRelativeURL } = require("../../../utilities");
23
22
  const { DocumentTypes } = require("../../../db/utils");
24
- const { getAppDB, updateAppId } = require("@budibase/backend-core/context");
23
+ const { getAppDB, getAppId } = require("@budibase/backend-core/context");
25
24
  const AWS = require("aws-sdk");
26
25
  const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1";
27
26
  function prepareUpload({ s3Key, bucket, metadata, file }) {
@@ -43,18 +42,6 @@ function prepareUpload({ s3Key, bucket, metadata, file }) {
43
42
  };
44
43
  });
45
44
  }
46
- function getAppIdFromUrl(ctx) {
47
- return __awaiter(this, void 0, void 0, function* () {
48
- // the "appId" component of the URL can be the id or the custom url
49
- let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`;
50
- // search prod apps for a url that matches, exclude dev where id is always used
51
- const apps = yield getAllApps({ dev: false });
52
- const app = apps.filter(a => a.url && a.url.toLowerCase() === possibleAppUrl)[0];
53
- const appId = app && app.appId ? app.appId : ctx.params.appId;
54
- updateAppId(appId);
55
- return appId;
56
- });
57
- }
58
45
  exports.serveBuilder = function (ctx) {
59
46
  return __awaiter(this, void 0, void 0, function* () {
60
47
  let builderPath = resolve(TOP_LEVEL_PATH, "builder");
@@ -81,10 +68,10 @@ exports.uploadFile = function (ctx) {
81
68
  };
82
69
  exports.serveApp = function (ctx) {
83
70
  return __awaiter(this, void 0, void 0, function* () {
84
- let appId = yield getAppIdFromUrl(ctx);
85
71
  const App = require("./templates/BudibaseApp.svelte").default;
86
72
  const db = getAppDB({ skip_setup: true });
87
73
  const appInfo = yield db.get(DocumentTypes.APP_METADATA);
74
+ let appId = getAppId();
88
75
  const { head, html, css } = App.render({
89
76
  title: appInfo.name,
90
77
  production: env.isProd(),
@@ -97,8 +97,8 @@ function generateManyLinkSchema(datasource, column, table, relatedTable) {
97
97
  },
98
98
  };
99
99
  column.through = junctionTable._id;
100
- column.throughFrom = primary;
101
- column.throughTo = relatedPrimary;
100
+ column.throughFrom = relatedPrimary;
101
+ column.throughTo = primary;
102
102
  column.fieldName = relatedPrimary;
103
103
  return junctionTable;
104
104
  }
@@ -123,7 +123,7 @@ function generateRelatedSchema(linkColumn, table, relatedTable, columnName) {
123
123
  // is many to many
124
124
  else {
125
125
  // don't need to copy through, already got it
126
- relatedSchema.fieldName = linkColumn.throughFrom;
126
+ relatedSchema.fieldName = linkColumn.throughTo;
127
127
  relatedSchema.throughTo = linkColumn.throughFrom;
128
128
  relatedSchema.throughFrom = linkColumn.throughTo;
129
129
  }
package/dist/api/index.js CHANGED
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  const Router = require("@koa/router");
12
- const { buildAuthMiddleware, auditLog, buildTenancyMiddleware, buildAppTenancyMiddleware, } = require("@budibase/backend-core/auth");
12
+ const { buildAuthMiddleware, auditLog, buildTenancyMiddleware, } = require("@budibase/backend-core/auth");
13
13
  const currentApp = require("../middleware/currentapp");
14
14
  const compress = require("koa-compress");
15
15
  const zlib = require("zlib");
@@ -17,6 +17,8 @@ const { mainRoutes, staticRoutes, publicRoutes } = require("./routes");
17
17
  const pkg = require("../../package.json");
18
18
  const env = require("../environment");
19
19
  const router = new Router();
20
+ router.get("/health", ctx => (ctx.status = 200));
21
+ router.get("/version", ctx => (ctx.body = pkg.version));
20
22
  router
21
23
  .use(compress({
22
24
  threshold: 2048,
@@ -35,8 +37,6 @@ router
35
37
  };
36
38
  yield next();
37
39
  }))
38
- .use("/health", ctx => (ctx.status = 200))
39
- .use("/version", ctx => (ctx.body = pkg.version))
40
40
  // re-direct before any middlewares occur
41
41
  .redirect("/", "/builder")
42
42
  .use(buildAuthMiddleware(null, {
@@ -49,8 +49,6 @@ router
49
49
  noTenancyRequired: true,
50
50
  }))
51
51
  .use(currentApp)
52
- // this middleware will try to use the app ID to determine the tenancy
53
- .use(buildAppTenancyMiddleware())
54
52
  .use(auditLog);
55
53
  // error handling middleware
56
54
  router.use((ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
@@ -70,7 +68,6 @@ router.use((ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
70
68
  }
71
69
  }
72
70
  }));
73
- router.get("/health", ctx => (ctx.status = 200));
74
71
  // authenticated routes
75
72
  for (let route of mainRoutes) {
76
73
  router.use(route.routes());
@@ -3,6 +3,6 @@ const Router = require("@koa/router");
3
3
  const controller = require("../controllers/analytics");
4
4
  const router = Router();
5
5
  router
6
- .get("/api/analytics", controller.isEnabled)
7
- .post("/api/analytics/ping", controller.endUserPing);
6
+ .get("/api/bbtel", controller.isEnabled)
7
+ .post("/api/bbtel/ping", controller.endUserPing);
8
8
  module.exports = router;
@@ -42,7 +42,6 @@ router
42
42
  .get("/builder/:file*", controller.serveBuilder)
43
43
  .post("/api/attachments/process", authorized(BUILDER), controller.uploadFile)
44
44
  .post("/api/attachments/:tableId/upload", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.WRITE), controller.uploadFile)
45
- // TODO: this likely needs to be secured in some way
46
- .get("/:appId/:path*", controller.serveApp)
45
+ .get("/app/:appUrl/:path*", controller.serveApp)
47
46
  .post("/api/attachments/:datasourceId/url", authorized(PermissionTypes.TABLE, PermissionLevels.READ), controller.getSignedUploadURL);
48
47
  module.exports = router;
@@ -36,6 +36,7 @@ exports.createLinkView = () => __awaiter(void 0, void 0, void 0, function* () {
36
36
  if (doc.type === "link") {
37
37
  let doc1 = doc.doc1;
38
38
  let doc2 = doc.doc2;
39
+ // eslint-disable-next-line no-undef
39
40
  emit([doc1.tableId, doc1.rowId], {
40
41
  id: doc2.rowId,
41
42
  thisId: doc1.rowId,
@@ -43,6 +44,7 @@ exports.createLinkView = () => __awaiter(void 0, void 0, void 0, function* () {
43
44
  });
44
45
  // if linking to same table can't emit twice
45
46
  if (doc1.tableId !== doc2.tableId) {
47
+ // eslint-disable-next-line no-undef
46
48
  emit([doc2.tableId, doc2.rowId], {
47
49
  id: doc1.rowId,
48
50
  thisId: doc2.rowId,
@@ -50,6 +50,7 @@ var SourceNames;
50
50
  SourceNames["REST"] = "REST";
51
51
  SourceNames["ORACLE"] = "ORACLE";
52
52
  SourceNames["GOOGLE_SHEETS"] = "GOOGLE_SHEETS";
53
+ SourceNames["FIREBASE"] = "FIREBASE";
53
54
  })(SourceNames = exports.SourceNames || (exports.SourceNames = {}));
54
55
  var IncludeRelationships;
55
56
  (function (IncludeRelationships) {
@@ -34,11 +34,8 @@ function parse(input) {
34
34
  if (typeof input !== "string") {
35
35
  return input;
36
36
  }
37
- if (input === MAX_ISO_DATE) {
38
- return new Date(8640000000000000);
39
- }
40
- if (input === MIN_ISO_DATE) {
41
- return new Date(-8640000000000000);
37
+ if (input === MAX_ISO_DATE || input === MIN_ISO_DATE) {
38
+ return null;
42
39
  }
43
40
  if (utils_1.isIsoDateString(input)) {
44
41
  return new Date(input);
@@ -127,11 +124,21 @@ class InternalBuilder {
127
124
  }
128
125
  if (filters.range) {
129
126
  iterate(filters.range, (key, value) => {
130
- if (!value.high || !value.low) {
131
- return;
127
+ if (value.low && value.high) {
128
+ // Use a between operator if we have 2 valid range values
129
+ const fnc = allOr ? "orWhereBetween" : "whereBetween";
130
+ query = query[fnc](key, [value.low, value.high]);
131
+ }
132
+ else if (value.low) {
133
+ // Use just a single greater than operator if we only have a low
134
+ const fnc = allOr ? "orWhere" : "where";
135
+ query = query[fnc](key, ">", value.low);
136
+ }
137
+ else if (value.high) {
138
+ // Use just a single less than operator if we only have a high
139
+ const fnc = allOr ? "orWhere" : "where";
140
+ query = query[fnc](key, "<", value.high);
132
141
  }
133
- const fnc = allOr ? "orWhereBetween" : "whereBetween";
134
- query = query[fnc](key, [value.low, value.high]);
135
142
  });
136
143
  }
137
144
  if (filters.equal) {
@@ -124,7 +124,9 @@ var DynamoModule;
124
124
  class DynamoDBIntegration {
125
125
  constructor(config) {
126
126
  this.config = config;
127
- this.connect();
127
+ if (!this.config.endpoint) {
128
+ this.connect();
129
+ }
128
130
  let options = {
129
131
  correctClockSkew: true,
130
132
  endpoint: config.endpoint ? config.endpoint : undefined,
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const datasource_1 = require("../definitions/datasource");
13
+ const firestore_1 = require("@google-cloud/firestore");
14
+ var Firebase;
15
+ (function (Firebase) {
16
+ const SCHEMA = {
17
+ docs: "https://firebase.google.com/docs/firestore/quickstart",
18
+ friendlyName: "Firestore",
19
+ description: "Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
20
+ datasource: {
21
+ email: {
22
+ type: datasource_1.DatasourceFieldTypes.STRING,
23
+ required: true,
24
+ },
25
+ privateKey: {
26
+ type: datasource_1.DatasourceFieldTypes.STRING,
27
+ required: true,
28
+ },
29
+ projectId: {
30
+ type: datasource_1.DatasourceFieldTypes.STRING,
31
+ required: true,
32
+ },
33
+ serviceAccount: {
34
+ type: datasource_1.DatasourceFieldTypes.JSON,
35
+ required: false,
36
+ },
37
+ },
38
+ query: {
39
+ create: {
40
+ type: datasource_1.QueryTypes.JSON,
41
+ },
42
+ read: {
43
+ type: datasource_1.QueryTypes.JSON,
44
+ },
45
+ update: {
46
+ type: datasource_1.QueryTypes.JSON,
47
+ },
48
+ delete: {
49
+ type: datasource_1.QueryTypes.JSON,
50
+ },
51
+ },
52
+ extra: {
53
+ collection: {
54
+ displayName: "Collection",
55
+ type: datasource_1.DatasourceFieldTypes.STRING,
56
+ required: true,
57
+ },
58
+ filterField: {
59
+ displayName: "Filter field",
60
+ type: datasource_1.DatasourceFieldTypes.STRING,
61
+ required: false,
62
+ },
63
+ filter: {
64
+ displayName: "Filter comparison",
65
+ type: datasource_1.DatasourceFieldTypes.LIST,
66
+ required: false,
67
+ data: {
68
+ read: [
69
+ "==",
70
+ "<",
71
+ "<=",
72
+ "==",
73
+ "!=",
74
+ ">=",
75
+ ">",
76
+ "array-contains",
77
+ "in",
78
+ "not-in",
79
+ "array-contains-any",
80
+ ],
81
+ },
82
+ },
83
+ filterValue: {
84
+ displayName: "Filter value",
85
+ type: datasource_1.DatasourceFieldTypes.STRING,
86
+ required: false,
87
+ },
88
+ },
89
+ };
90
+ class FirebaseIntegration {
91
+ constructor(config) {
92
+ this.config = config;
93
+ if (config.serviceAccount) {
94
+ const serviceAccount = JSON.parse(config.serviceAccount);
95
+ this.db = new firestore_1.Firestore({
96
+ projectId: serviceAccount.project_id,
97
+ credentials: {
98
+ client_email: serviceAccount.client_email,
99
+ private_key: serviceAccount.private_key,
100
+ },
101
+ });
102
+ }
103
+ else {
104
+ this.db = new firestore_1.Firestore({
105
+ projectId: config.projectId,
106
+ credentials: {
107
+ client_email: config.email,
108
+ private_key: config.privateKey,
109
+ },
110
+ });
111
+ }
112
+ }
113
+ create(query) {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ try {
116
+ const documentReference = this.db
117
+ .collection(query.extra.collection)
118
+ .doc();
119
+ yield documentReference.set(Object.assign(Object.assign({}, query.json), { id: documentReference.id }));
120
+ const snapshot = yield documentReference.get();
121
+ return snapshot.data();
122
+ }
123
+ catch (err) {
124
+ console.error("Error writing to Firestore", err);
125
+ throw err;
126
+ }
127
+ });
128
+ }
129
+ read(query) {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ try {
132
+ let snapshot;
133
+ const collectionRef = this.db.collection(query.extra.collection);
134
+ if (query.extra.filterField &&
135
+ query.extra.filter &&
136
+ query.extra.filterValue) {
137
+ snapshot = yield collectionRef
138
+ .where(query.extra.filterField, query.extra.filter, query.extra.filterValue)
139
+ .get();
140
+ }
141
+ else {
142
+ snapshot = yield collectionRef.get();
143
+ }
144
+ const result = [];
145
+ snapshot.forEach(doc => result.push(doc.data()));
146
+ return result;
147
+ }
148
+ catch (err) {
149
+ console.error("Error querying Firestore", err);
150
+ throw err;
151
+ }
152
+ });
153
+ }
154
+ update(query) {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ try {
157
+ yield this.db
158
+ .collection(query.extra.collection)
159
+ .doc(query.json.id)
160
+ .update(query.json);
161
+ return (yield this.db
162
+ .collection(query.extra.collection)
163
+ .doc(query.json.id)
164
+ .get()).data();
165
+ }
166
+ catch (err) {
167
+ console.error("Error writing to firebase", err);
168
+ throw err;
169
+ }
170
+ });
171
+ }
172
+ delete(query) {
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ try {
175
+ yield this.db
176
+ .collection(query.extra.collection)
177
+ .doc(query.json.id)
178
+ .delete();
179
+ return true;
180
+ }
181
+ catch (err) {
182
+ console.error("Error writing to mongodb", err);
183
+ throw err;
184
+ }
185
+ });
186
+ }
187
+ }
188
+ module.exports = {
189
+ schema: SCHEMA,
190
+ integration: FirebaseIntegration,
191
+ };
192
+ })(Firebase || (Firebase = {}));
@@ -11,6 +11,7 @@ const mysql = require("./mysql");
11
11
  const arangodb = require("./arangodb");
12
12
  const rest = require("./rest");
13
13
  const googlesheets = require("./googlesheets");
14
+ const firebase = require("./firebase");
14
15
  const { SourceNames } = require("../definitions/datasource");
15
16
  const environment = require("../environment");
16
17
  const DEFINITIONS = {
@@ -25,6 +26,7 @@ const DEFINITIONS = {
25
26
  [SourceNames.MYSQL]: mysql.schema,
26
27
  [SourceNames.ARANGODB]: arangodb.schema,
27
28
  [SourceNames.REST]: rest.schema,
29
+ [SourceNames.FIREBASE]: firebase.schema,
28
30
  };
29
31
  const INTEGRATIONS = {
30
32
  [SourceNames.POSTGRES]: postgres.integration,
@@ -38,6 +40,7 @@ const INTEGRATIONS = {
38
40
  [SourceNames.MYSQL]: mysql.integration,
39
41
  [SourceNames.ARANGODB]: arangodb.integration,
40
42
  [SourceNames.REST]: rest.integration,
43
+ [SourceNames.FIREBASE]: firebase.integration,
41
44
  };
42
45
  // optionally add oracle integration if the oracle binary can be installed
43
46
  if (!(process.arch === "arm64" && process.platform === "darwin")) {
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const datasource_1 = require("../definitions/datasource");
13
+ const lodash_1 = require("lodash");
13
14
  const BodyTypes = {
14
15
  NONE: "none",
15
16
  FORM_DATA: "form",
@@ -148,7 +149,7 @@ var RestModule;
148
149
  // Check if a pagination cursor exists in the response
149
150
  let nextCursor = null;
150
151
  if (pagination === null || pagination === void 0 ? void 0 : pagination.responseParam) {
151
- nextCursor = data === null || data === void 0 ? void 0 : data[pagination.responseParam];
152
+ nextCursor = lodash_1.get(data, pagination.responseParam);
152
153
  }
153
154
  return {
154
155
  data,
@@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const { getAppId, setCookie, getCookie, clearCookie, } = require("@budibase/backend-core/utils");
11
+ const { getAppIdFromCtx, setCookie, getCookie, clearCookie, } = require("@budibase/backend-core/utils");
12
12
  const { Cookies } = require("@budibase/backend-core/constants");
13
13
  const { getRole } = require("@budibase/backend-core/roles");
14
14
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
@@ -21,7 +21,7 @@ const { isWebhookEndpoint } = require("./utils");
21
21
  const { doInAppContext } = require("@budibase/backend-core/context");
22
22
  module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
23
23
  // try to get the appID from the request
24
- let requestAppId = getAppId(ctx);
24
+ let requestAppId = yield getAppIdFromCtx(ctx);
25
25
  // get app cookie if it exists
26
26
  let appCookie = null;
27
27
  try {
@@ -70,19 +70,20 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
70
70
  return next();
71
71
  }
72
72
  return doInAppContext(appId, () => __awaiter(void 0, void 0, void 0, function* () {
73
- let noCookieSet = false;
73
+ let skipCookie = false;
74
74
  // if the user not in the right tenant then make sure they have no permissions
75
75
  // need to judge this only based on the request app ID,
76
76
  if (env.MULTI_TENANCY &&
77
77
  ctx.user &&
78
78
  requestAppId &&
79
- !isUserInAppTenant(requestAppId)) {
79
+ !isUserInAppTenant(requestAppId, ctx.user)) {
80
80
  // don't error, simply remove the users rights (they are a public user)
81
81
  delete ctx.user.builder;
82
82
  delete ctx.user.admin;
83
83
  delete ctx.user.roles;
84
+ ctx.isAuthenticated = false;
84
85
  roleId = BUILTIN_ROLE_IDS.PUBLIC;
85
- noCookieSet = true;
86
+ skipCookie = true;
86
87
  }
87
88
  ctx.appId = appId;
88
89
  if (roleId) {
@@ -96,7 +97,7 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
96
97
  if ((requestAppId !== appId ||
97
98
  appCookie == null ||
98
99
  appCookie.appId !== requestAppId) &&
99
- !noCookieSet) {
100
+ !skipCookie) {
100
101
  setCookie(ctx, { appId }, Cookies.CurrentApp);
101
102
  }
102
103
  return next();
@@ -9,10 +9,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  const { Headers } = require("@budibase/backend-core/constants");
12
- const { getAppId } = require("@budibase/backend-core/utils");
12
+ const { getAppIdFromCtx } = require("@budibase/backend-core/utils");
13
13
  module.exports = function ({ requiresAppId } = {}) {
14
14
  return (ctx, next) => __awaiter(this, void 0, void 0, function* () {
15
- const appId = getAppId(ctx);
15
+ const appId = yield getAppIdFromCtx(ctx);
16
16
  if (requiresAppId && !appId) {
17
17
  ctx.throw(400, `Invalid app ID provided, please check the ${Headers.APP_ID} header.`);
18
18
  }
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.94",
4
+ "version": "1.0.97",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -21,10 +21,7 @@
21
21
  "dev:stack:down": "node scripts/dev/manage.js down",
22
22
  "dev:stack:nuke": "node scripts/dev/manage.js nuke",
23
23
  "dev:builder": "yarn run dev:stack:up && nodemon",
24
- "format": "prettier --config ../../.prettierrc.json 'src/**/*.ts' --write",
25
24
  "specs": "node specs/generate.js && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
26
- "lint": "eslint --fix src/",
27
- "lint:fix": "yarn run format && yarn run lint",
28
25
  "initialise": "node scripts/initialise.js",
29
26
  "env:multi:enable": "node scripts/multiTenancy.js enable",
30
27
  "env:multi:disable": "node scripts/multiTenancy.js disable",
@@ -71,12 +68,13 @@
71
68
  "license": "GPL-3.0",
72
69
  "dependencies": {
73
70
  "@apidevtools/swagger-parser": "^10.0.3",
74
- "@budibase/backend-core": "^1.0.94",
75
- "@budibase/client": "^1.0.94",
76
- "@budibase/string-templates": "^1.0.94",
71
+ "@budibase/backend-core": "^1.0.97",
72
+ "@budibase/client": "^1.0.97",
73
+ "@budibase/string-templates": "^1.0.97",
77
74
  "@bull-board/api": "^3.7.0",
78
75
  "@bull-board/koa": "^3.7.0",
79
76
  "@elastic/elasticsearch": "7.10.0",
77
+ "@google-cloud/firestore": "^5.0.2",
80
78
  "@koa/router": "8.0.0",
81
79
  "@sendgrid/mail": "7.1.1",
82
80
  "@sentry/node": "^6.0.0",
@@ -148,15 +146,16 @@
148
146
  "@types/jest": "^26.0.23",
149
147
  "@types/koa": "^2.13.3",
150
148
  "@types/koa-router": "^7.4.2",
149
+ "@types/lodash": "4.14.180",
151
150
  "@types/node": "^15.12.4",
152
151
  "@types/oracledb": "^5.2.1",
153
152
  "@types/redis": "^4.0.11",
154
- "@typescript-eslint/parser": "4.28.0",
155
153
  "apidoc": "^0.50.2",
156
154
  "babel-jest": "^27.0.2",
157
155
  "copyfiles": "^2.4.1",
158
156
  "docker-compose": "^0.23.6",
159
157
  "eslint": "^6.8.0",
158
+ "is-wsl": "^2.2.0",
160
159
  "jest": "^27.0.5",
161
160
  "jest-openapi": "^0.14.2",
162
161
  "nodemon": "^2.0.4",
@@ -75,7 +75,7 @@ class TestConfiguration {
75
75
  });
76
76
  }
77
77
  // check if already in a context
78
- if (context.getAppId() == null) {
78
+ if (context.getAppId() == null && this.appId !== null) {
79
79
  return context.doInAppContext(this.appId, () => __awaiter(this, void 0, void 0, function* () {
80
80
  return run();
81
81
  }));