@budibase/server 1.0.93 → 1.0.96

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 (210) hide show
  1. package/builder/assets/{index.4494eb63.js → index.b6091ca2.js} +1 -1
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +155 -142
  4. package/coverage/coverage-final.json +6 -6
  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 +2 -2
  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 +15 -15
  50. package/coverage/lcov-report/api/index.js.html +15 -27
  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 +3 -6
  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/utils/index.html +1 -1
  80. package/coverage/lcov-report/api/routes/utils/validators.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 +5 -5
  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 +4 -4
  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 +33 -33
  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 +15 -12
  141. package/coverage/lcov-report/middleware/index.html +11 -11
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  143. package/coverage/lcov-report/middleware/publicApi.js.html +3 -3
  144. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  145. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  146. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  147. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  148. package/coverage/lcov-report/threads/automation.js.html +1 -1
  149. package/coverage/lcov-report/threads/index.html +20 -20
  150. package/coverage/lcov-report/threads/index.js.html +1 -1
  151. package/coverage/lcov-report/threads/query.js.html +111 -15
  152. package/coverage/lcov-report/threads/utils.js.html +1 -1
  153. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  154. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  155. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  156. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  157. package/coverage/lcov-report/utilities/global.js.html +1 -1
  158. package/coverage/lcov-report/utilities/index.html +1 -1
  159. package/coverage/lcov-report/utilities/index.js.html +1 -1
  160. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  161. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  163. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  164. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  167. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  168. package/coverage/lcov-report/utilities/security.js.html +1 -1
  169. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  170. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  174. package/coverage/lcov-report/utilities/users.js.html +1 -1
  175. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  176. package/coverage/lcov.info +258 -240
  177. package/dist/api/controllers/auth.js +1 -1
  178. package/dist/api/controllers/static/index.js +2 -15
  179. package/dist/api/index.js +3 -6
  180. package/dist/api/routes/static.js +1 -2
  181. package/dist/automations/steps/queryRows.js +1 -1
  182. package/dist/db/views/staticViews.js +2 -0
  183. package/dist/environment.js +1 -0
  184. package/dist/integrations/base/sql.js +5 -1
  185. package/dist/middleware/currentapp.js +7 -6
  186. package/dist/middleware/publicApi.js +2 -2
  187. package/dist/package.json +4 -8
  188. package/dist/tests/utilities/TestConfiguration.js +1 -1
  189. package/dist/threads/query.js +32 -5
  190. package/dist/tsconfig.tsbuildinfo +1 -1
  191. package/package.json +5 -9
  192. package/scripts/integrations/customer-categories/docker-compose.yml +2 -2
  193. package/scripts/integrations/oracle/docker-compose.yml +1 -1
  194. package/scripts/integrations/postgres/docker-compose.yml +2 -2
  195. package/scripts/integrations/service-vehicles/docker-compose.yml +2 -2
  196. package/src/api/controllers/auth.js +1 -1
  197. package/src/api/controllers/static/index.js +2 -18
  198. package/src/api/index.js +3 -7
  199. package/src/api/routes/static.js +1 -2
  200. package/src/automations/steps/queryRows.js +1 -1
  201. package/src/db/views/staticViews.js +2 -0
  202. package/src/environment.js +1 -0
  203. package/src/integrations/base/sql.ts +5 -1
  204. package/src/middleware/currentapp.js +7 -6
  205. package/src/middleware/publicApi.js +2 -2
  206. package/src/middleware/tests/authorized.spec.js +1 -3
  207. package/src/middleware/tests/currentapp.spec.js +4 -4
  208. package/src/tests/utilities/TestConfiguration.js +1 -1
  209. package/src/threads/query.js +37 -5
  210. package/.eslintrc +0 -13
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.93",
4
+ "version": "1.0.96",
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,9 +68,9 @@
71
68
  "license": "GPL-3.0",
72
69
  "dependencies": {
73
70
  "@apidevtools/swagger-parser": "^10.0.3",
74
- "@budibase/backend-core": "^1.0.93",
75
- "@budibase/client": "^1.0.93",
76
- "@budibase/string-templates": "^1.0.93",
71
+ "@budibase/backend-core": "^1.0.96",
72
+ "@budibase/client": "^1.0.96",
73
+ "@budibase/string-templates": "^1.0.96",
77
74
  "@bull-board/api": "^3.7.0",
78
75
  "@bull-board/koa": "^3.7.0",
79
76
  "@elastic/elasticsearch": "7.10.0",
@@ -151,7 +148,6 @@
151
148
  "@types/node": "^15.12.4",
152
149
  "@types/oracledb": "^5.2.1",
153
150
  "@types/redis": "^4.0.11",
154
- "@typescript-eslint/parser": "4.28.0",
155
151
  "apidoc": "^0.50.2",
156
152
  "babel-jest": "^27.0.2",
157
153
  "copyfiles": "^2.4.1",
@@ -175,5 +171,5 @@
175
171
  "optionalDependencies": {
176
172
  "oracledb": "^5.3.0"
177
173
  },
178
- "gitHead": "38f53a4148845f1aded8a72311363032c177d2c6"
174
+ "gitHead": "eecd09718a3d1561324234b34faf4b8a4579d6ea"
179
175
  }
@@ -3,7 +3,7 @@ services:
3
3
  db:
4
4
  container_name: postgres
5
5
  image: postgres
6
- restart: always
6
+ restart: unless-stopped
7
7
  environment:
8
8
  POSTGRES_USER: root
9
9
  POSTGRES_PASSWORD: root
@@ -17,7 +17,7 @@ services:
17
17
  pgadmin:
18
18
  container_name: pgadmin-pg
19
19
  image: dpage/pgadmin4
20
- restart: always
20
+ restart: unless-stopped
21
21
  environment:
22
22
  PGADMIN_DEFAULT_EMAIL: root@root.com
23
23
  PGADMIN_DEFAULT_PASSWORD: root
@@ -4,7 +4,7 @@
4
4
  version: "3.8"
5
5
  services:
6
6
  db:
7
- restart: always
7
+ restart: unless-stopped
8
8
  platform: linux/x86_64
9
9
  image: container-registry.oracle.com/database/express:18.4.0-xe
10
10
  environment:
@@ -3,7 +3,7 @@ services:
3
3
  db:
4
4
  container_name: postgres
5
5
  image: postgres
6
- restart: always
6
+ restart: unless-stopped
7
7
  environment:
8
8
  POSTGRES_USER: root
9
9
  POSTGRES_PASSWORD: root
@@ -17,7 +17,7 @@ services:
17
17
  pgadmin:
18
18
  container_name: pgadmin-pg
19
19
  image: dpage/pgadmin4
20
- restart: always
20
+ restart: unless-stopped
21
21
  environment:
22
22
  PGADMIN_DEFAULT_EMAIL: root@root.com
23
23
  PGADMIN_DEFAULT_PASSWORD: root
@@ -3,7 +3,7 @@ services:
3
3
  db:
4
4
  container_name: postgres-vehicle
5
5
  image: postgres
6
- restart: always
6
+ restart: unless-stopped
7
7
  environment:
8
8
  POSTGRES_USER: root
9
9
  POSTGRES_PASSWORD: root
@@ -17,7 +17,7 @@ services:
17
17
  pgadmin:
18
18
  container_name: pgadmin
19
19
  image: dpage/pgadmin4
20
- restart: always
20
+ restart: unless-stopped
21
21
  environment:
22
22
  PGADMIN_DEFAULT_EMAIL: root@root.com
23
23
  PGADMIN_DEFAULT_PASSWORD: root
@@ -7,7 +7,7 @@ const { getAppDB, getAppId } = require("@budibase/backend-core/context")
7
7
  exports.fetchSelf = async ctx => {
8
8
  let userId = ctx.user.userId || ctx.user._id
9
9
  /* istanbul ignore next */
10
- if (!userId) {
10
+ if (!userId || !ctx.isAuthenticated) {
11
11
  ctx.body = {}
12
12
  return
13
13
  }
@@ -5,7 +5,6 @@ const { resolve, join } = require("../../../utilities/centralPath")
5
5
  const uuid = require("uuid")
6
6
  const { ObjectStoreBuckets } = require("../../../constants")
7
7
  const { processString } = require("@budibase/string-templates")
8
- const { getAllApps } = require("@budibase/backend-core/db")
9
8
  const {
10
9
  loadHandlebarsFile,
11
10
  NODE_MODULES_PATH,
@@ -16,7 +15,7 @@ const { clientLibraryPath } = require("../../../utilities")
16
15
  const { upload } = require("../../../utilities/fileSystem")
17
16
  const { attachmentsRelativeURL } = require("../../../utilities")
18
17
  const { DocumentTypes } = require("../../../db/utils")
19
- const { getAppDB, updateAppId } = require("@budibase/backend-core/context")
18
+ const { getAppDB, getAppId } = require("@budibase/backend-core/context")
20
19
  const AWS = require("aws-sdk")
21
20
  const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1"
22
21
 
@@ -39,21 +38,6 @@ async function prepareUpload({ s3Key, bucket, metadata, file }) {
39
38
  }
40
39
  }
41
40
 
42
- async function getAppIdFromUrl(ctx) {
43
- // the "appId" component of the URL can be the id or the custom url
44
- let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`
45
-
46
- // search prod apps for a url that matches, exclude dev where id is always used
47
- const apps = await getAllApps({ dev: false })
48
- const app = apps.filter(
49
- a => a.url && a.url.toLowerCase() === possibleAppUrl
50
- )[0]
51
-
52
- const appId = app && app.appId ? app.appId : ctx.params.appId
53
- updateAppId(appId)
54
- return appId
55
- }
56
-
57
41
  exports.serveBuilder = async function (ctx) {
58
42
  let builderPath = resolve(TOP_LEVEL_PATH, "builder")
59
43
  await send(ctx, ctx.file, { root: builderPath })
@@ -81,10 +65,10 @@ exports.uploadFile = async function (ctx) {
81
65
  }
82
66
 
83
67
  exports.serveApp = async function (ctx) {
84
- let appId = await getAppIdFromUrl(ctx)
85
68
  const App = require("./templates/BudibaseApp.svelte").default
86
69
  const db = getAppDB({ skip_setup: true })
87
70
  const appInfo = await db.get(DocumentTypes.APP_METADATA)
71
+ let appId = getAppId()
88
72
 
89
73
  const { head, html, css } = App.render({
90
74
  title: appInfo.name,
package/src/api/index.js CHANGED
@@ -3,7 +3,6 @@ const {
3
3
  buildAuthMiddleware,
4
4
  auditLog,
5
5
  buildTenancyMiddleware,
6
- buildAppTenancyMiddleware,
7
6
  } = require("@budibase/backend-core/auth")
8
7
  const currentApp = require("../middleware/currentapp")
9
8
  const compress = require("koa-compress")
@@ -14,6 +13,9 @@ const env = require("../environment")
14
13
 
15
14
  const router = new Router()
16
15
 
16
+ router.get("/health", ctx => (ctx.status = 200))
17
+ router.get("/version", ctx => (ctx.body = pkg.version))
18
+
17
19
  router
18
20
  .use(
19
21
  compress({
@@ -34,8 +36,6 @@ router
34
36
  }
35
37
  await next()
36
38
  })
37
- .use("/health", ctx => (ctx.status = 200))
38
- .use("/version", ctx => (ctx.body = pkg.version))
39
39
  // re-direct before any middlewares occur
40
40
  .redirect("/", "/builder")
41
41
  .use(
@@ -52,8 +52,6 @@ router
52
52
  })
53
53
  )
54
54
  .use(currentApp)
55
- // this middleware will try to use the app ID to determine the tenancy
56
- .use(buildAppTenancyMiddleware())
57
55
  .use(auditLog)
58
56
 
59
57
  // error handling middleware
@@ -74,8 +72,6 @@ router.use(async (ctx, next) => {
74
72
  }
75
73
  })
76
74
 
77
- router.get("/health", ctx => (ctx.status = 200))
78
-
79
75
  // authenticated routes
80
76
  for (let route of mainRoutes) {
81
77
  router.use(route.routes())
@@ -44,8 +44,7 @@ router
44
44
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
45
45
  controller.uploadFile
46
46
  )
47
- // TODO: this likely needs to be secured in some way
48
- .get("/:appId/:path*", controller.serveApp)
47
+ .get("/app/:appUrl/:path*", controller.serveApp)
49
48
  .post(
50
49
  "/api/attachments/:datasourceId/url",
51
50
  authorized(PermissionTypes.TABLE, PermissionLevels.READ),
@@ -85,7 +85,7 @@ exports.run = async function ({ inputs, appId }) {
85
85
  const { tableId, filters, sortColumn, sortOrder, limit } = inputs
86
86
  const table = await getTable(appId, tableId)
87
87
  let sortType = FieldTypes.STRING
88
- if (table && table.schema && sortColumn) {
88
+ if (table && table.schema && table.schema[sortColumn] && sortColumn) {
89
89
  const fieldType = table.schema[sortColumn].type
90
90
  sortType =
91
91
  fieldType === FieldTypes.NUMBER ? FieldTypes.NUMBER : FieldTypes.STRING
@@ -33,6 +33,7 @@ exports.createLinkView = async () => {
33
33
  if (doc.type === "link") {
34
34
  let doc1 = doc.doc1
35
35
  let doc2 = doc.doc2
36
+ // eslint-disable-next-line no-undef
36
37
  emit([doc1.tableId, doc1.rowId], {
37
38
  id: doc2.rowId,
38
39
  thisId: doc1.rowId,
@@ -40,6 +41,7 @@ exports.createLinkView = async () => {
40
41
  })
41
42
  // if linking to same table can't emit twice
42
43
  if (doc1.tableId !== doc2.tableId) {
44
+ // eslint-disable-next-line no-undef
43
45
  emit([doc2.tableId, doc2.rowId], {
44
46
  id: doc1.rowId,
45
47
  thisId: doc2.rowId,
@@ -70,6 +70,7 @@ module.exports = {
70
70
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
71
71
  DISABLE_THREADING: process.env.DISABLE_THREADING,
72
72
  QUERY_THREAD_TIMEOUT: process.env.QUERY_THREAD_TIMEOUT,
73
+ SQL_MAX_ROWS: process.env.SQL_MAX_ROWS,
73
74
  _set(key, value) {
74
75
  process.env[key] = value
75
76
  module.exports[key] = value
@@ -9,8 +9,12 @@ import {
9
9
  } from "../../definitions/datasource"
10
10
  import { isIsoDateString, SqlClients } from "../utils"
11
11
  import SqlTableQueryBuilder from "./sqlTable"
12
+ import environment from "../../environment"
12
13
 
13
- const BASE_LIMIT = 5000
14
+ const envLimit = environment.SQL_MAX_ROWS
15
+ ? parseInt(environment.SQL_MAX_ROWS)
16
+ : null
17
+ const BASE_LIMIT = envLimit || 5000
14
18
 
15
19
  type KnexQuery = Knex.QueryBuilder | Knex
16
20
  // these are invalid dates sent by the client, need to convert them to a real max date
@@ -1,5 +1,5 @@
1
1
  const {
2
- getAppId,
2
+ getAppIdFromCtx,
3
3
  setCookie,
4
4
  getCookie,
5
5
  clearCookie,
@@ -17,7 +17,7 @@ const { doInAppContext } = require("@budibase/backend-core/context")
17
17
 
18
18
  module.exports = async (ctx, next) => {
19
19
  // try to get the appID from the request
20
- let requestAppId = getAppId(ctx)
20
+ let requestAppId = await getAppIdFromCtx(ctx)
21
21
  // get app cookie if it exists
22
22
  let appCookie = null
23
23
  try {
@@ -71,21 +71,22 @@ module.exports = async (ctx, next) => {
71
71
  }
72
72
 
73
73
  return doInAppContext(appId, async () => {
74
- let noCookieSet = false
74
+ let skipCookie = false
75
75
  // if the user not in the right tenant then make sure they have no permissions
76
76
  // need to judge this only based on the request app ID,
77
77
  if (
78
78
  env.MULTI_TENANCY &&
79
79
  ctx.user &&
80
80
  requestAppId &&
81
- !isUserInAppTenant(requestAppId)
81
+ !isUserInAppTenant(requestAppId, ctx.user)
82
82
  ) {
83
83
  // don't error, simply remove the users rights (they are a public user)
84
84
  delete ctx.user.builder
85
85
  delete ctx.user.admin
86
86
  delete ctx.user.roles
87
+ ctx.isAuthenticated = false
87
88
  roleId = BUILTIN_ROLE_IDS.PUBLIC
88
- noCookieSet = true
89
+ skipCookie = true
89
90
  }
90
91
 
91
92
  ctx.appId = appId
@@ -105,7 +106,7 @@ module.exports = async (ctx, next) => {
105
106
  (requestAppId !== appId ||
106
107
  appCookie == null ||
107
108
  appCookie.appId !== requestAppId) &&
108
- !noCookieSet
109
+ !skipCookie
109
110
  ) {
110
111
  setCookie(ctx, { appId }, Cookies.CurrentApp)
111
112
  }
@@ -1,9 +1,9 @@
1
1
  const { Headers } = require("@budibase/backend-core/constants")
2
- const { getAppId } = require("@budibase/backend-core/utils")
2
+ const { getAppIdFromCtx } = require("@budibase/backend-core/utils")
3
3
 
4
4
  module.exports = function ({ requiresAppId } = {}) {
5
5
  return async (ctx, next) => {
6
- const appId = getAppId(ctx)
6
+ const appId = await getAppIdFromCtx(ctx)
7
7
  if (requiresAppId && !appId) {
8
8
  ctx.throw(
9
9
  400,
@@ -35,9 +35,7 @@ class TestConfiguration {
35
35
  }
36
36
 
37
37
  executeMiddleware() {
38
- return doInAppContext(APP_ID, () => {
39
- return this.middleware(this.ctx, this.next)
40
- })
38
+ return this.middleware(this.ctx, this.next)
41
39
  }
42
40
 
43
41
  setUser(user) {
@@ -38,7 +38,7 @@ function mockAuthWithNoCookie() {
38
38
  },
39
39
  }))
40
40
  jest.mock("@budibase/backend-core/utils", () => ({
41
- getAppId: jest.fn(),
41
+ getAppIdFromCtx: jest.fn(),
42
42
  setCookie: jest.fn(),
43
43
  getCookie: jest.fn(),
44
44
  }))
@@ -51,7 +51,7 @@ function mockAuthWithCookie() {
51
51
  jest.resetModules()
52
52
  mockWorker()
53
53
  jest.mock("@budibase/backend-core/utils", () => ({
54
- getAppId: () => {
54
+ getAppIdFromCtx: () => {
55
55
  return "app_test"
56
56
  },
57
57
  setCookie: jest.fn(),
@@ -143,7 +143,7 @@ describe("Current app middleware", () => {
143
143
  it("should perform correct when no cookie exists", async () => {
144
144
  mockReset()
145
145
  jest.mock("@budibase/backend-core/utils", () => ({
146
- getAppId: () => {
146
+ getAppIdFromCtx: () => {
147
147
  return "app_test"
148
148
  },
149
149
  setCookie: jest.fn(),
@@ -158,7 +158,7 @@ describe("Current app middleware", () => {
158
158
  it("lastly check what occurs when cookie doesn't need updated", async () => {
159
159
  mockReset()
160
160
  jest.mock("@budibase/backend-core/utils", () => ({
161
- getAppId: () => {
161
+ getAppIdFromCtx: () => {
162
162
  return "app_test"
163
163
  },
164
164
  setCookie: jest.fn(),
@@ -80,7 +80,7 @@ class TestConfiguration {
80
80
  return request.body
81
81
  }
82
82
  // check if already in a context
83
- if (context.getAppId() == null) {
83
+ if (context.getAppId() == null && this.appId !== null) {
84
84
  return context.doInAppContext(this.appId, async () => {
85
85
  return run()
86
86
  })
@@ -33,10 +33,12 @@ class QueryRunner {
33
33
  return fields
34
34
  }
35
35
  const bindings = findHBSBlocks(sql)
36
- let variables = []
36
+ let variables = [],
37
+ arrays = []
37
38
  for (let binding of bindings) {
38
- let variable = integration.getBindingIdentifier()
39
- variables.push(binding)
39
+ // look for array/list operations in the SQL statement, which will need handled later
40
+ const listRegex = new RegExp(`(in|IN|In|iN)( )+${binding}`)
41
+ const listRegexMatch = sql.match(listRegex)
40
42
  // check if the variable was used as part of a string concat e.g. 'Hello {{binding}}'
41
43
  const charConstRegex = new RegExp(`'[^']*${binding}[^']*'`)
42
44
  const charConstMatch = sql.match(charConstRegex)
@@ -46,15 +48,45 @@ class QueryRunner {
46
48
  part2 = `'${part2.substring(0, part2.length - 1)}'`
47
49
  sql = sql.replace(
48
50
  charConstMatch[0],
49
- integration.getStringConcat([part1, variable, part2])
51
+ integration.getStringConcat([
52
+ part1,
53
+ integration.getBindingIdentifier(),
54
+ part2,
55
+ ])
56
+ )
57
+ }
58
+ // generate SQL parameterised array
59
+ else if (listRegexMatch) {
60
+ arrays.push(binding)
61
+ // determine the length of the array
62
+ const value = this.enrichQueryFields([binding], parameters)[0].split(
63
+ ","
64
+ )
65
+ // build a string like ($1, $2, $3)
66
+ sql = sql.replace(
67
+ binding,
68
+ `(${Array.apply(null, Array(value.length))
69
+ .map(() => integration.getBindingIdentifier())
70
+ .join(",")})`
50
71
  )
51
72
  } else {
52
- sql = sql.replace(binding, variable)
73
+ sql = sql.replace(binding, integration.getBindingIdentifier())
53
74
  }
75
+ variables.push(binding)
54
76
  }
55
77
  // replicate the knex structure
56
78
  fields.sql = sql
57
79
  fields.bindings = this.enrichQueryFields(variables, parameters)
80
+ // check for arrays in the data
81
+ let updated = []
82
+ for (let i = 0; i < variables.length; i++) {
83
+ if (arrays.includes(variables[i])) {
84
+ updated = updated.concat(fields.bindings[i].split(","))
85
+ } else {
86
+ updated.push(fields.bindings[i])
87
+ }
88
+ }
89
+ fields.bindings = updated
58
90
  return fields
59
91
  }
60
92
 
package/.eslintrc DELETED
@@ -1,13 +0,0 @@
1
- {
2
- "globals": {
3
- "emit": true,
4
- "key": true
5
- },
6
- "parser": "@typescript-eslint/parser",
7
- "env": {
8
- "node": true
9
- },
10
- "extends": ["eslint:recommended"],
11
- "rules": {
12
- }
13
- }