@budibase/server 1.0.46-alpha.4 → 1.0.46-alpha.8

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 (226) hide show
  1. package/builder/assets/{index.c21ee1fb.js → index.51efc215.js} +243 -243
  2. package/builder/assets/{index.243ca52c.css → index.dd9e386f.css} +1 -1
  3. package/builder/assets/{vendor.10e2ad1b.js → vendor.3bd2f661.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +1794 -1793
  6. package/coverage/coverage-final.json +136 -138
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  9. package/coverage/lcov-report/api/controllers/application.js.html +209 -125
  10. package/coverage/lcov-report/api/controllers/auth.js.html +23 -11
  11. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  12. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +12 -12
  14. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +58 -22
  16. package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
  17. package/coverage/lcov-report/api/controllers/index.html +38 -53
  18. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  19. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  21. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  22. package/coverage/lcov-report/api/controllers/query/index.html +15 -15
  23. package/coverage/lcov-report/api/controllers/query/index.js.html +61 -28
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +9 -9
  25. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  28. package/coverage/lcov-report/api/controllers/row/index.html +5 -5
  29. package/coverage/lcov-report/api/controllers/row/index.js.html +13 -13
  30. package/coverage/lcov-report/api/controllers/row/internal.js.html +26 -26
  31. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +8 -8
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +17 -26
  33. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  34. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  35. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  36. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +14 -14
  38. package/coverage/lcov-report/api/controllers/table/internal.js.html +10 -10
  39. package/coverage/lcov-report/api/controllers/table/utils.js.html +26 -26
  40. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  41. package/coverage/lcov-report/api/controllers/user.js.html +30 -24
  42. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  43. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  45. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  46. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  47. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  48. package/coverage/lcov-report/api/index.html +1 -1
  49. package/coverage/lcov-report/api/index.js.html +26 -26
  50. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  51. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  52. package/coverage/lcov-report/api/routes/application.js.html +9 -9
  53. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  54. package/coverage/lcov-report/api/routes/automation.js.html +14 -14
  55. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  56. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  57. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  58. package/coverage/lcov-report/api/routes/datasource.js.html +13 -13
  59. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  60. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  61. package/coverage/lcov-report/api/routes/index.html +7 -22
  62. package/coverage/lcov-report/api/routes/index.js.html +31 -37
  63. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  64. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  65. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  66. package/coverage/lcov-report/api/routes/permission.js.html +12 -12
  67. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  68. package/coverage/lcov-report/api/routes/role.js.html +12 -12
  69. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  70. package/coverage/lcov-report/api/routes/row.js.html +10 -10
  71. package/coverage/lcov-report/api/routes/screen.js.html +11 -11
  72. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/static.js.html +13 -13
  74. package/coverage/lcov-report/api/routes/table.js.html +12 -12
  75. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  76. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  77. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  78. package/coverage/lcov-report/api/routes/webhook.js.html +11 -11
  79. package/coverage/lcov-report/automations/actions.js.html +24 -24
  80. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  81. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  82. package/coverage/lcov-report/automations/index.html +1 -1
  83. package/coverage/lcov-report/automations/index.js.html +7 -7
  84. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  85. package/coverage/lcov-report/automations/steps/createRow.js.html +7 -7
  86. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  87. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  88. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  89. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  90. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  91. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  92. package/coverage/lcov-report/automations/steps/index.html +1 -1
  93. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  94. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  95. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  96. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  97. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  98. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  99. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  101. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  102. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  103. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  104. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  106. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  107. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  108. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  111. package/coverage/lcov-report/automations/utils.js.html +32 -32
  112. package/coverage/lcov-report/constants/index.html +5 -5
  113. package/coverage/lcov-report/constants/index.js.html +36 -24
  114. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  115. package/coverage/lcov-report/constants/screens.js.html +4 -4
  116. package/coverage/lcov-report/db/client.js.html +18 -18
  117. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  118. package/coverage/lcov-report/db/index.html +1 -1
  119. package/coverage/lcov-report/db/index.js.html +3 -3
  120. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +7 -7
  121. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  122. package/coverage/lcov-report/db/linkedRows/index.js.html +18 -18
  123. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +13 -13
  124. package/coverage/lcov-report/db/newid.js.html +4 -4
  125. package/coverage/lcov-report/db/utils.js.html +73 -73
  126. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  127. package/coverage/lcov-report/events/index.html +1 -1
  128. package/coverage/lcov-report/events/index.js.html +6 -6
  129. package/coverage/lcov-report/events/utils.js.html +3 -3
  130. package/coverage/lcov-report/index.html +62 -62
  131. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  132. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  133. package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
  134. package/coverage/lcov-report/middleware/authorized.js.html +171 -69
  135. package/coverage/lcov-report/middleware/builder.js.html +16 -16
  136. package/coverage/lcov-report/middleware/currentapp.js.html +46 -73
  137. package/coverage/lcov-report/middleware/index.html +24 -24
  138. package/coverage/lcov-report/middleware/joi-validator.js.html +6 -6
  139. package/coverage/lcov-report/middleware/resourceId.js.html +22 -22
  140. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  141. package/coverage/lcov-report/middleware/usageQuota.js.html +17 -17
  142. package/coverage/lcov-report/middleware/utils.js.html +4 -4
  143. package/coverage/lcov-report/migrations/usageQuotas/index.html +1 -1
  144. package/coverage/lcov-report/migrations/usageQuotas/index.js.html +6 -6
  145. package/coverage/lcov-report/migrations/usageQuotas/syncApps.js.html +6 -6
  146. package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +7 -7
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +15 -15
  149. package/coverage/lcov-report/threads/index.js.html +10 -10
  150. package/coverage/lcov-report/threads/query.js.html +23 -8
  151. package/coverage/lcov-report/threads/utils.js.html +14 -14
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  154. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  155. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  156. package/coverage/lcov-report/utilities/global.js.html +26 -26
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +25 -25
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -9
  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 +6 -6
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +17 -17
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  167. package/coverage/lcov-report/utilities/security.js.html +8 -8
  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 +8 -8
  171. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
  172. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  173. package/coverage/lcov-report/utilities/users.js.html +5 -5
  174. package/coverage/lcov-report/utilities/workerRequests.js.html +39 -108
  175. package/coverage/lcov.info +2292 -2272
  176. package/dist/api/controllers/application.js +49 -20
  177. package/dist/api/controllers/auth.js +4 -0
  178. package/dist/api/controllers/datasource.js +11 -0
  179. package/dist/api/controllers/query/index.js +11 -3
  180. package/dist/api/controllers/row/utils.js +1 -2
  181. package/dist/api/controllers/static/index.js +9 -10
  182. package/dist/api/controllers/user.js +2 -0
  183. package/dist/api/routes/index.js +0 -2
  184. package/dist/constants/index.js +3 -0
  185. package/dist/definitions/datasource.js +1 -0
  186. package/dist/integrations/googlesheets.js +340 -0
  187. package/dist/integrations/index.js +3 -0
  188. package/dist/integrations/utils.js +6 -3
  189. package/dist/middleware/authorized.js +55 -30
  190. package/dist/middleware/currentapp.js +0 -9
  191. package/dist/package.json +8 -5
  192. package/dist/tests/utilities/TestConfiguration.js +10 -6
  193. package/dist/threads/query.js +4 -0
  194. package/dist/tsconfig.tsbuildinfo +1 -1
  195. package/dist/utilities/workerRequests.js +0 -20
  196. package/nodemon.json +1 -1
  197. package/package.json +9 -6
  198. package/src/api/controllers/application.js +52 -24
  199. package/src/api/controllers/auth.js +4 -0
  200. package/src/api/controllers/datasource.js +12 -0
  201. package/src/api/controllers/query/index.js +14 -3
  202. package/src/api/controllers/row/utils.js +1 -4
  203. package/src/api/controllers/static/index.js +13 -10
  204. package/src/api/controllers/user.js +2 -0
  205. package/src/api/routes/index.js +0 -2
  206. package/src/api/routes/tests/application.spec.js +2 -2
  207. package/src/api/routes/tests/auth.spec.js +1 -2
  208. package/src/constants/index.js +4 -0
  209. package/src/definitions/datasource.ts +3 -0
  210. package/src/integrations/googlesheets.ts +353 -0
  211. package/src/integrations/index.ts +3 -0
  212. package/src/integrations/utils.ts +18 -5
  213. package/src/middleware/authorized.js +64 -30
  214. package/src/middleware/currentapp.js +0 -9
  215. package/src/middleware/tests/authorized.spec.js +6 -4
  216. package/src/migrations/tests/usageQuotas/syncRows.spec.js +1 -1
  217. package/src/tests/utilities/TestConfiguration.js +10 -6
  218. package/src/threads/query.js +5 -0
  219. package/src/utilities/workerRequests.js +0 -23
  220. package/coverage/lcov-report/api/controllers/hosting.js.html +0 -146
  221. package/coverage/lcov-report/api/routes/hosting.js.html +0 -119
  222. package/dist/api/controllers/hosting.js +0 -30
  223. package/dist/api/routes/hosting.js +0 -11
  224. package/src/api/controllers/hosting.js +0 -22
  225. package/src/api/routes/hosting.js +0 -13
  226. package/src/api/routes/tests/hosting.spec.js +0 -36
@@ -61,26 +61,6 @@ exports.sendSmtpEmail = (to, from, subject, contents, automation) => __awaiter(v
61
61
  }
62
62
  return response.json();
63
63
  });
64
- exports.getDeployedApps = () => __awaiter(void 0, void 0, void 0, function* () {
65
- try {
66
- const response = yield fetch(checkSlashesInUrl(env.WORKER_URL + `/api/apps`), request(null, {
67
- method: "GET",
68
- }));
69
- const json = yield response.json();
70
- const apps = {};
71
- for (let [key, value] of Object.entries(json)) {
72
- if (value.url) {
73
- value.url = value.url.toLowerCase();
74
- apps[key.toLowerCase()] = value;
75
- }
76
- }
77
- return apps;
78
- }
79
- catch (err) {
80
- // error, cannot determine deployed apps, don't stop app creation - sort this later
81
- return {};
82
- }
83
- });
84
64
  exports.getGlobalSelf = (ctx, appId = null) => __awaiter(void 0, void 0, void 0, function* () {
85
65
  const endpoint = `/api/global/users/self`;
86
66
  const response = yield fetch(checkSlashesInUrl(env.WORKER_URL + endpoint),
package/nodemon.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "watch": ["src", "../auth"],
2
+ "watch": ["src", "../backend-core"],
3
3
  "ext": "js,ts,json",
4
4
  "ignore": ["src/**/*.spec.ts", "src/**/*.spec.js"],
5
5
  "exec": "ts-node src/index.ts"
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.46-alpha.4",
4
+ "version": "1.0.46-alpha.8",
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.46-alpha.4",
74
- "@budibase/client": "^1.0.46-alpha.4",
75
- "@budibase/string-templates": "^1.0.46-alpha.4",
73
+ "@budibase/backend-core": "^1.0.46-alpha.8",
74
+ "@budibase/client": "^1.0.46-alpha.8",
75
+ "@budibase/string-templates": "^1.0.46-alpha.8",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",
@@ -92,6 +92,8 @@
92
92
  "fix-path": "3.0.0",
93
93
  "form-data": "^4.0.0",
94
94
  "fs-extra": "8.1.0",
95
+ "google-auth-library": "^7.11.0",
96
+ "google-spreadsheet": "^3.2.0",
95
97
  "jimp": "0.16.1",
96
98
  "joi": "17.2.1",
97
99
  "js-yaml": "^4.1.0",
@@ -110,7 +112,7 @@
110
112
  "mongodb": "3.6.3",
111
113
  "mssql": "6.2.3",
112
114
  "mysql2": "^2.3.1",
113
- "node-fetch": "2.6.0",
115
+ "node-fetch": "2.6.7",
114
116
  "open": "^8.4.0",
115
117
  "pg": "8.5.1",
116
118
  "pino-pretty": "4.0.0",
@@ -139,6 +141,7 @@
139
141
  "@jest/test-sequencer": "^24.8.0",
140
142
  "@types/apidoc": "^0.50.0",
141
143
  "@types/bull": "^3.15.1",
144
+ "@types/google-spreadsheet": "^3.1.5",
142
145
  "@types/jest": "^26.0.23",
143
146
  "@types/koa": "^2.13.3",
144
147
  "@types/koa-router": "^7.4.2",
@@ -165,5 +168,5 @@
165
168
  "optionalDependencies": {
166
169
  "oracledb": "^5.3.0"
167
170
  },
168
- "gitHead": "965525d1b1437e7c94eaff0b21f2143e3f2f0ad7"
171
+ "gitHead": "d69c417cf4407896917419c6f2dbb3de4ea340d2"
169
172
  }
@@ -33,10 +33,7 @@ const {
33
33
  Replication,
34
34
  } = require("@budibase/backend-core/db")
35
35
  const { USERS_TABLE_SCHEMA } = require("../../constants")
36
- const {
37
- getDeployedApps,
38
- removeAppFromUserRoles,
39
- } = require("../../utilities/workerRequests")
36
+ const { removeAppFromUserRoles } = require("../../utilities/workerRequests")
40
37
  const { clientLibraryPath, stringToReadStream } = require("../../utilities")
41
38
  const { getAllLocks } = require("../../utilities/redis")
42
39
  const {
@@ -78,29 +75,42 @@ function getUserRoleId(ctx) {
78
75
  : ctx.user.role._id
79
76
  }
80
77
 
81
- async function getAppUrlIfNotInUse(ctx) {
78
+ async function getAppUrl(ctx) {
79
+ // construct the url
82
80
  let url
83
81
  if (ctx.request.body.url) {
82
+ // if the url is provided, use that
84
83
  url = encodeURI(ctx.request.body.url)
85
84
  } else if (ctx.request.body.name) {
85
+ // otherwise use the name
86
86
  url = encodeURI(`${ctx.request.body.name}`)
87
87
  }
88
88
  if (url) {
89
89
  url = `/${url.replace(URL_REGEX_SLASH, "")}`.toLowerCase()
90
90
  }
91
- if (!env.SELF_HOSTED) {
92
- return url
91
+ return url
92
+ }
93
+
94
+ const checkAppUrl = (ctx, apps, url, currentAppId) => {
95
+ if (currentAppId) {
96
+ apps = apps.filter(app => app.appId !== currentAppId)
93
97
  }
94
- const deployedApps = await getDeployedApps()
95
- if (
96
- url &&
97
- deployedApps[url] != null &&
98
- ctx.params != null &&
99
- deployedApps[url].appId !== ctx.params.appId
100
- ) {
101
- ctx.throw(400, "App name/URL is already in use.")
98
+ if (apps.some(app => app.url === url)) {
99
+ ctx.throw(400, "App URL is already in use.")
100
+ }
101
+ }
102
+
103
+ const checkAppName = (ctx, apps, name, currentAppId) => {
104
+ // TODO: Replace with Joi
105
+ if (!name) {
106
+ ctx.throw(400, "Name is required")
107
+ }
108
+ if (currentAppId) {
109
+ apps = apps.filter(app => app.appId !== currentAppId)
110
+ }
111
+ if (apps.some(app => app.name === name)) {
112
+ ctx.throw(400, "App name is already in use.")
102
113
  }
103
- return url
104
114
  }
105
115
 
106
116
  async function createInstance(template) {
@@ -206,6 +216,12 @@ exports.fetchAppPackage = async ctx => {
206
216
  }
207
217
 
208
218
  exports.create = async ctx => {
219
+ const apps = await getAllApps(CouchDB, { dev: true })
220
+ const name = ctx.request.body.name
221
+ checkAppName(ctx, apps, name)
222
+ const url = await getAppUrl(ctx)
223
+ checkAppUrl(ctx, apps, url)
224
+
209
225
  const { useTemplate, templateKey, templateString } = ctx.request.body
210
226
  const instanceConfig = {
211
227
  useTemplate,
@@ -218,7 +234,6 @@ exports.create = async ctx => {
218
234
  const instance = await createInstance(instanceConfig)
219
235
  const appId = instance._id
220
236
 
221
- const url = await getAppUrlIfNotInUse(ctx)
222
237
  const db = new CouchDB(appId)
223
238
  let _rev
224
239
  try {
@@ -235,7 +250,7 @@ exports.create = async ctx => {
235
250
  type: "app",
236
251
  version: packageJson.version,
237
252
  componentLibraries: ["@budibase/standard-components"],
238
- name: ctx.request.body.name,
253
+ name: name,
239
254
  url: url,
240
255
  template: ctx.request.body.template,
241
256
  instance: instance,
@@ -262,8 +277,22 @@ exports.create = async ctx => {
262
277
  ctx.body = newApplication
263
278
  }
264
279
 
280
+ // This endpoint currently operates as a PATCH rather than a PUT
281
+ // Thus name and url fields are handled only if present
265
282
  exports.update = async ctx => {
266
- const data = await updateAppPackage(ctx, ctx.request.body, ctx.params.appId)
283
+ const apps = await getAllApps(CouchDB, { dev: true })
284
+ // validation
285
+ const name = ctx.request.body.name
286
+ if (name) {
287
+ checkAppName(ctx, apps, name, ctx.params.appId)
288
+ }
289
+ const url = await getAppUrl(ctx)
290
+ if (url) {
291
+ checkAppUrl(ctx, apps, url, ctx.params.appId)
292
+ ctx.request.body.url = url
293
+ }
294
+
295
+ const data = await updateAppPackage(ctx.request.body, ctx.params.appId)
267
296
  ctx.status = 200
268
297
  ctx.body = data
269
298
  }
@@ -285,7 +314,7 @@ exports.updateClient = async ctx => {
285
314
  version: packageJson.version,
286
315
  revertableVersion: currentVersion,
287
316
  }
288
- const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId)
317
+ const data = await updateAppPackage(appPackageUpdates, ctx.params.appId)
289
318
  ctx.status = 200
290
319
  ctx.body = data
291
320
  }
@@ -308,7 +337,7 @@ exports.revertClient = async ctx => {
308
337
  version: application.revertableVersion,
309
338
  revertableVersion: null,
310
339
  }
311
- const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId)
340
+ const data = await updateAppPackage(appPackageUpdates, ctx.params.appId)
312
341
  ctx.status = 200
313
342
  ctx.body = data
314
343
  }
@@ -381,12 +410,11 @@ exports.sync = async (ctx, next) => {
381
410
  }
382
411
  }
383
412
 
384
- const updateAppPackage = async (ctx, appPackage, appId) => {
385
- const url = await getAppUrlIfNotInUse(ctx)
413
+ const updateAppPackage = async (appPackage, appId) => {
386
414
  const db = new CouchDB(appId)
387
415
  const application = await db.get(DocumentTypes.APP_METADATA)
388
416
 
389
- const newAppPackage = { ...application, ...appPackage, url }
417
+ const newAppPackage = { ...application, ...appPackage }
390
418
  if (appPackage._rev !== application._rev) {
391
419
  newAppPackage._rev = application._rev
392
420
  }
@@ -16,6 +16,8 @@ exports.fetchSelf = async ctx => {
16
16
  const user = await getFullUser(ctx, userId)
17
17
  // this shouldn't be returned by the app self
18
18
  delete user.roles
19
+ // forward the csrf token from the session
20
+ user.csrfToken = ctx.user.csrfToken
19
21
 
20
22
  if (appId) {
21
23
  const db = new CouchDB(appId)
@@ -24,6 +26,8 @@ exports.fetchSelf = async ctx => {
24
26
  try {
25
27
  const userTable = await db.get(InternalTables.USER_METADATA)
26
28
  const metadata = await db.get(userId)
29
+ // make sure there is never a stale csrf token
30
+ delete metadata.csrfToken
27
31
  // specifically needs to make sure is enriched
28
32
  ctx.body = await outputProcessing(ctx, userTable, {
29
33
  ...user,
@@ -38,6 +38,13 @@ exports.fetch = async function (ctx) {
38
38
  )
39
39
  ).rows.map(row => row.doc)
40
40
 
41
+ for (let datasource of datasources) {
42
+ if (datasource.config && datasource.config.auth) {
43
+ // strip secrets from response so they don't show in the network request
44
+ delete datasource.config.auth
45
+ }
46
+ }
47
+
41
48
  ctx.body = [bbInternalDb, ...datasources]
42
49
  }
43
50
 
@@ -94,8 +101,13 @@ exports.update = async function (ctx) {
94
101
  const db = new CouchDB(ctx.appId)
95
102
  const datasourceId = ctx.params.datasourceId
96
103
  let datasource = await db.get(datasourceId)
104
+ const auth = datasource.config.auth
97
105
  await invalidateVariables(datasource, ctx.request.body)
98
106
  datasource = { ...datasource, ...ctx.request.body }
107
+ if (auth && !ctx.request.body.auth) {
108
+ // don't strip auth config from DB
109
+ datasource.config.auth = auth
110
+ }
99
111
 
100
112
  const response = await db.put(datasource)
101
113
  datasource._rev = response.rev
@@ -141,6 +141,16 @@ async function execute(ctx, opts = { rowsOnly: false }) {
141
141
  const query = await db.get(ctx.params.queryId)
142
142
  const datasource = await db.get(query.datasourceId)
143
143
 
144
+ const enrichedParameters = ctx.request.body.parameters || {}
145
+ // make sure parameters are fully enriched with defaults
146
+ if (query && query.parameters) {
147
+ for (let parameter of query.parameters) {
148
+ if (!enrichedParameters[parameter.name]) {
149
+ enrichedParameters[parameter.name] = parameter.default
150
+ }
151
+ }
152
+ }
153
+
144
154
  // call the relevant CRUD method on the integration class
145
155
  try {
146
156
  const { rows, pagination, extra } = await Runner.run({
@@ -149,7 +159,7 @@ async function execute(ctx, opts = { rowsOnly: false }) {
149
159
  queryVerb: query.queryVerb,
150
160
  fields: query.fields,
151
161
  pagination: ctx.request.body.pagination,
152
- parameters: ctx.request.body.parameters,
162
+ parameters: enrichedParameters,
153
163
  transformer: query.transformer,
154
164
  queryId: ctx.params.queryId,
155
165
  })
@@ -178,8 +188,9 @@ const removeDynamicVariables = async (db, queryId) => {
178
188
 
179
189
  if (dynamicVariables) {
180
190
  // delete dynamic variables from the datasource
181
- const newVariables = dynamicVariables.filter(dv => dv.queryId !== queryId)
182
- datasource.config.dynamicVariables = newVariables
191
+ datasource.config.dynamicVariables = dynamicVariables.filter(
192
+ dv => dv.queryId !== queryId
193
+ )
183
194
  await db.put(datasource)
184
195
 
185
196
  // invalidate the deleted variables
@@ -52,10 +52,7 @@ exports.validate = async ({ appId, tableId, row, table }) => {
52
52
  const constraints = cloneDeep(table.schema[fieldName].constraints)
53
53
  const type = table.schema[fieldName].type
54
54
  // special case for options, need to always allow unselected (null)
55
- if (
56
- (type === FieldTypes.OPTIONS || type === FieldTypes.ARRAY) &&
57
- constraints.inclusion
58
- ) {
55
+ if (type === FieldTypes.OPTIONS && constraints.inclusion) {
59
56
  constraints.inclusion.push(null)
60
57
  }
61
58
  let res
@@ -5,7 +5,7 @@ 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 { getDeployedApps } = require("../../../utilities/workerRequests")
8
+ const { getAllApps } = require("@budibase/backend-core/db")
9
9
  const CouchDB = require("../../../db")
10
10
  const {
11
11
  loadHandlebarsFile,
@@ -39,12 +39,18 @@ async function prepareUpload({ s3Key, bucket, metadata, file }) {
39
39
  }
40
40
  }
41
41
 
42
- async function checkForSelfHostedURL(ctx) {
43
- // the "appId" component of the URL may actually be a specific self hosted URL
42
+ async function getAppIdFromUrl(ctx) {
43
+ // the "appId" component of the URL can be the id or the custom url
44
44
  let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`
45
- const apps = await getDeployedApps()
46
- if (apps[possibleAppUrl] && apps[possibleAppUrl].appId) {
47
- return apps[possibleAppUrl].appId
45
+
46
+ // search prod apps for a url that matches, exclude dev where id is always used
47
+ const apps = await getAllApps(CouchDB, { dev: false })
48
+ const app = apps.filter(
49
+ a => a.url && a.url.toLowerCase() === possibleAppUrl
50
+ )[0]
51
+
52
+ if (app && app.appId) {
53
+ return app.appId
48
54
  } else {
49
55
  return ctx.params.appId
50
56
  }
@@ -77,10 +83,7 @@ exports.uploadFile = async function (ctx) {
77
83
  }
78
84
 
79
85
  exports.serveApp = async function (ctx) {
80
- let appId = ctx.params.appId
81
- if (env.SELF_HOSTED) {
82
- appId = await checkForSelfHostedURL(ctx)
83
- }
86
+ let appId = await getAppIdFromUrl(ctx)
84
87
  const App = require("./templates/BudibaseApp.svelte").default
85
88
  const db = new CouchDB(appId, { skip_setup: true })
86
89
  const appInfo = await db.get(DocumentTypes.APP_METADATA)
@@ -167,6 +167,8 @@ exports.updateSelfMetadata = async function (ctx) {
167
167
  ctx.request.body._id = ctx.user._id
168
168
  // make sure no stale rev
169
169
  delete ctx.request.body._rev
170
+ // make sure no csrf token
171
+ delete ctx.request.body.csrfToken
170
172
  await exports.updateMetadata(ctx)
171
173
  }
172
174
 
@@ -20,7 +20,6 @@ const integrationRoutes = require("./integration")
20
20
  const permissionRoutes = require("./permission")
21
21
  const datasourceRoutes = require("./datasource")
22
22
  const queryRoutes = require("./query")
23
- const hostingRoutes = require("./hosting")
24
23
  const backupRoutes = require("./backup")
25
24
  const metadataRoutes = require("./metadata")
26
25
  const devRoutes = require("./dev")
@@ -46,7 +45,6 @@ exports.mainRoutes = [
46
45
  permissionRoutes,
47
46
  datasourceRoutes,
48
47
  queryRoutes,
49
- hostingRoutes,
50
48
  backupRoutes,
51
49
  metadataRoutes,
52
50
  devRoutes,
@@ -53,8 +53,8 @@ describe("/applications", () => {
53
53
 
54
54
  describe("fetch", () => {
55
55
  it("lists all applications", async () => {
56
- await config.createApp(request, "app1")
57
- await config.createApp(request, "app2")
56
+ await config.createApp("app1")
57
+ await config.createApp("app2")
58
58
 
59
59
  const res = await request
60
60
  .get(`/api/applications?status=${AppStatus.DEV}`)
@@ -13,10 +13,9 @@ describe("/authenticate", () => {
13
13
 
14
14
  describe("fetch self", () => {
15
15
  it("should be able to fetch self", async () => {
16
- const headers = await config.login()
17
16
  const res = await request
18
17
  .get(`/api/self`)
19
- .set(headers)
18
+ .set(config.defaultHeaders())
20
19
  .expect("Content-Type", /json/)
21
20
  .expect(200)
22
21
  expect(res.body._id).toEqual(generateUserMetadataID("us_uuid1"))
@@ -75,6 +75,10 @@ exports.DataSourceOperation = {
75
75
  DELETE_TABLE: "DELETE_TABLE",
76
76
  }
77
77
 
78
+ exports.DatasourceAuthTypes = {
79
+ GOOGLE: "google",
80
+ }
81
+
78
82
  exports.SortDirection = {
79
83
  ASCENDING: "ASCENDING",
80
84
  DESCENDING: "DESCENDING",
@@ -47,6 +47,7 @@ export enum SourceNames {
47
47
  ARANGODB = "ARANGODB",
48
48
  REST = "REST",
49
49
  ORACLE = "ORACLE",
50
+ GOOGLE_SHEETS = "GOOGLE_SHEETS",
50
51
  }
51
52
 
52
53
  export enum IncludeRelationships {
@@ -86,6 +87,8 @@ export interface ExtraQueryConfig {
86
87
  export interface Integration {
87
88
  docs: string
88
89
  plus?: boolean
90
+ auth?: { type: string }
91
+ relationships?: boolean
89
92
  description: string
90
93
  friendlyName: string
91
94
  datasource: {}