@budibase/server 1.0.49 → 1.0.50-alpha.3

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 (381) hide show
  1. package/__mocks__/arangojs.ts +1 -1
  2. package/__mocks__/aws-sdk.ts +4 -4
  3. package/__mocks__/mongodb.ts +4 -5
  4. package/__mocks__/mssql.ts +3 -3
  5. package/__mocks__/node-fetch.ts +2 -1
  6. package/__mocks__/pg.ts +3 -5
  7. package/builder/assets/{index.2c37968e.js → index.9fe798bd.js} +252 -249
  8. package/builder/assets/index.c0cc369d.css +6 -0
  9. package/builder/assets/{vendor.f9faf6ab.js → vendor.5ad9695a.js} +202 -106
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +3105 -2814
  12. package/coverage/coverage-final.json +106 -101
  13. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/application.js.html +257 -152
  16. package/coverage/lcov-report/api/controllers/auth.js.html +22 -13
  17. package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
  18. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  20. package/coverage/lcov-report/api/controllers/component.js.html +13 -16
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +81 -51
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/api/controllers/index.html +78 -78
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  27. package/coverage/lcov-report/api/controllers/migrations.js.html +119 -0
  28. package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
  29. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
  31. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  32. package/coverage/lcov-report/api/controllers/role.js.html +16 -16
  33. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
  35. package/coverage/lcov-report/api/controllers/row/index.html +55 -40
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +118 -226
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +52 -34
  39. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +548 -0
  40. package/coverage/lcov-report/api/controllers/row/utils.js.html +47 -62
  41. package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
  42. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  43. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +599 -0
  44. package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
  45. package/coverage/lcov-report/api/controllers/table/index.html +58 -43
  46. package/coverage/lcov-report/api/controllers/table/index.js.html +58 -82
  47. package/coverage/lcov-report/api/controllers/table/internal.js.html +81 -66
  48. package/coverage/lcov-report/api/controllers/table/utils.js.html +218 -110
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +79 -76
  51. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  52. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  53. package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
  54. package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
  55. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  56. package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
  57. package/coverage/lcov-report/api/index.html +1 -1
  58. package/coverage/lcov-report/api/index.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/index.html +18 -18
  71. package/coverage/lcov-report/api/routes/index.js.html +3 -3
  72. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/{hosting.js.html → migrations.js.html} +17 -14
  76. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  87. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  88. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/actions.js.html +24 -24
  90. package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
  91. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  92. package/coverage/lcov-report/automations/index.html +18 -18
  93. package/coverage/lcov-report/automations/index.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -22
  96. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  97. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  98. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  99. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  101. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  102. package/coverage/lcov-report/automations/steps/index.html +13 -13
  103. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  105. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  106. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  107. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  109. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  110. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  111. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  112. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  116. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  119. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  120. package/coverage/lcov-report/automations/triggers.js.html +61 -55
  121. package/coverage/lcov-report/automations/utils.js.html +54 -42
  122. package/coverage/lcov-report/constants/index.html +5 -5
  123. package/coverage/lcov-report/constants/index.js.html +53 -26
  124. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  125. package/coverage/lcov-report/constants/screens.js.html +4 -4
  126. package/coverage/lcov-report/db/client.js.html +18 -18
  127. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  128. package/coverage/lcov-report/db/index.html +15 -15
  129. package/coverage/lcov-report/db/index.js.html +3 -3
  130. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +25 -37
  131. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  132. package/coverage/lcov-report/db/linkedRows/index.js.html +51 -96
  133. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +42 -42
  134. package/coverage/lcov-report/db/newid.js.html +4 -4
  135. package/coverage/lcov-report/db/utils.js.html +87 -87
  136. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  137. package/coverage/lcov-report/events/index.html +1 -1
  138. package/coverage/lcov-report/events/index.js.html +5 -5
  139. package/coverage/lcov-report/events/utils.js.html +3 -3
  140. package/coverage/lcov-report/index.html +135 -120
  141. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  142. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  143. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  144. package/coverage/lcov-report/middleware/authorized.js.html +173 -65
  145. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  146. package/coverage/lcov-report/middleware/currentapp.js.html +95 -83
  147. package/coverage/lcov-report/middleware/index.html +38 -38
  148. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  149. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  150. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  151. package/coverage/lcov-report/middleware/usageQuota.js.html +281 -53
  152. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  153. package/coverage/lcov-report/threads/automation.js.html +30 -24
  154. package/coverage/lcov-report/threads/index.html +26 -26
  155. package/coverage/lcov-report/threads/index.js.html +10 -10
  156. package/coverage/lcov-report/threads/query.js.html +39 -24
  157. package/coverage/lcov-report/threads/utils.js.html +14 -14
  158. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  159. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  160. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  161. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  162. package/coverage/lcov-report/utilities/global.js.html +58 -49
  163. package/coverage/lcov-report/utilities/index.html +37 -37
  164. package/coverage/lcov-report/utilities/index.js.html +43 -73
  165. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  166. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  167. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  168. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  169. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  170. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +97 -103
  171. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  172. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  173. package/coverage/lcov-report/utilities/security.js.html +8 -8
  174. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  176. package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
  177. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +305 -0
  178. package/coverage/lcov-report/{api/controllers/hosting.js.html → utilities/usageQuota/usageQuoteReset.js.html} +36 -48
  179. package/coverage/lcov-report/utilities/users.js.html +9 -9
  180. package/coverage/lcov-report/utilities/workerRequests.js.html +43 -112
  181. package/coverage/lcov.info +5010 -4425
  182. package/dist/api/controllers/application.js +90 -60
  183. package/dist/api/controllers/auth.js +8 -5
  184. package/dist/api/controllers/automation.js +14 -19
  185. package/dist/api/controllers/cloud.js +2 -3
  186. package/dist/api/controllers/component.js +3 -4
  187. package/dist/api/controllers/datasource.js +20 -10
  188. package/dist/api/controllers/deploy/Deployment.js +3 -6
  189. package/dist/api/controllers/deploy/index.js +12 -13
  190. package/dist/api/controllers/dev.js +5 -5
  191. package/dist/api/controllers/layout.js +3 -3
  192. package/dist/api/controllers/metadata.js +4 -4
  193. package/dist/api/controllers/migrations.js +21 -0
  194. package/dist/api/controllers/permission.js +4 -4
  195. package/dist/api/controllers/query/import/index.js +4 -6
  196. package/dist/api/controllers/query/index.js +11 -10
  197. package/dist/api/controllers/role.js +5 -5
  198. package/dist/api/controllers/routing.js +5 -6
  199. package/dist/api/controllers/row/ExternalRequest.js +90 -67
  200. package/dist/api/controllers/row/external.js +14 -22
  201. package/dist/api/controllers/row/internal.js +55 -93
  202. package/dist/api/controllers/row/internalSearch.js +23 -17
  203. package/dist/api/controllers/row/staticFormula.js +147 -0
  204. package/dist/api/controllers/row/utils.js +13 -14
  205. package/dist/api/controllers/screen.js +5 -7
  206. package/dist/api/controllers/static/index.js +62 -16
  207. package/dist/api/controllers/table/bulkFormula.js +159 -0
  208. package/dist/api/controllers/table/external.js +7 -10
  209. package/dist/api/controllers/table/index.js +16 -13
  210. package/dist/api/controllers/table/internal.js +22 -16
  211. package/dist/api/controllers/table/utils.js +62 -35
  212. package/dist/api/controllers/user.js +43 -43
  213. package/dist/api/controllers/view/index.js +8 -10
  214. package/dist/api/controllers/view/utils.js +9 -4
  215. package/dist/api/controllers/webhook.js +10 -8
  216. package/dist/api/routes/index.js +2 -2
  217. package/dist/api/routes/migrations.js +9 -0
  218. package/dist/api/routes/static.js +2 -1
  219. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  220. package/dist/app.js +35 -5
  221. package/dist/automations/automationUtils.js +2 -3
  222. package/dist/automations/steps/createRow.js +3 -5
  223. package/dist/automations/steps/deleteRow.js +1 -4
  224. package/dist/automations/steps/updateRow.js +1 -1
  225. package/dist/automations/triggers.js +27 -25
  226. package/dist/automations/utils.js +10 -5
  227. package/dist/constants/index.js +7 -0
  228. package/dist/db/linkedRows/LinkController.js +3 -7
  229. package/dist/db/linkedRows/index.js +16 -27
  230. package/dist/db/linkedRows/linkUtils.js +6 -6
  231. package/dist/db/views/staticViews.js +9 -10
  232. package/dist/definitions/datasource.js +1 -0
  233. package/dist/environment.js +4 -1
  234. package/dist/integrations/base/sql.js +62 -21
  235. package/dist/integrations/googlesheets.js +340 -0
  236. package/dist/integrations/index.js +3 -0
  237. package/dist/integrations/utils.js +60 -9
  238. package/dist/middleware/authorized.js +57 -30
  239. package/dist/middleware/builder.js +2 -2
  240. package/dist/middleware/currentapp.js +41 -37
  241. package/dist/middleware/usageQuota.js +82 -15
  242. package/dist/migrations/functions/appUrls.js +46 -0
  243. package/dist/migrations/functions/quotas1.js +50 -0
  244. package/dist/migrations/functions/usageQuotas/index.js +20 -0
  245. package/dist/migrations/functions/usageQuotas/syncApps.js +29 -0
  246. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  247. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  248. package/dist/migrations/index.js +62 -0
  249. package/dist/package.json +8 -5
  250. package/dist/tests/utilities/TestConfiguration.js +80 -50
  251. package/dist/threads/automation.js +13 -11
  252. package/dist/threads/query.js +15 -11
  253. package/dist/tsconfig.tsbuildinfo +1 -1
  254. package/dist/utilities/fileSystem/index.js +4 -3
  255. package/dist/utilities/global.js +15 -12
  256. package/dist/utilities/index.js +7 -17
  257. package/dist/utilities/routing/index.js +5 -5
  258. package/dist/utilities/rowProcessor/index.js +23 -17
  259. package/dist/utilities/rowProcessor/utils.js +14 -4
  260. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +45 -31
  261. package/dist/utilities/usageQuota/rows.js +78 -0
  262. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  263. package/dist/utilities/users.js +3 -3
  264. package/dist/utilities/workerRequests.js +4 -24
  265. package/nodemon.json +1 -1
  266. package/package.json +9 -6
  267. package/scripts/integrations/mssql/data/Dockerfile +1 -1
  268. package/scripts/integrations/mssql/data/setup.sql +17 -4
  269. package/scripts/integrations/postgres/init.sql +11 -6
  270. package/scripts/likeCypress.ts +1 -1
  271. package/src/api/controllers/application.js +85 -50
  272. package/src/api/controllers/auth.js +8 -5
  273. package/src/api/controllers/automation.js +13 -23
  274. package/src/api/controllers/cloud.js +2 -3
  275. package/src/api/controllers/component.js +3 -4
  276. package/src/api/controllers/datasource.js +21 -11
  277. package/src/api/controllers/deploy/Deployment.js +3 -7
  278. package/src/api/controllers/deploy/index.js +20 -13
  279. package/src/api/controllers/dev.js +5 -5
  280. package/src/api/controllers/layout.js +3 -3
  281. package/src/api/controllers/metadata.js +4 -9
  282. package/src/api/controllers/migrations.js +13 -0
  283. package/src/api/controllers/permission.js +4 -4
  284. package/src/api/controllers/query/import/index.ts +4 -6
  285. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  286. package/src/api/controllers/query/index.js +11 -10
  287. package/src/api/controllers/role.js +5 -5
  288. package/src/api/controllers/routing.js +5 -6
  289. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  290. package/src/api/controllers/row/external.js +27 -58
  291. package/src/api/controllers/row/internal.js +54 -90
  292. package/src/api/controllers/row/internalSearch.js +23 -17
  293. package/src/api/controllers/row/staticFormula.js +156 -0
  294. package/src/api/controllers/row/utils.js +13 -18
  295. package/src/api/controllers/screen.js +5 -7
  296. package/src/api/controllers/static/index.js +66 -15
  297. package/src/api/controllers/table/bulkFormula.js +173 -0
  298. package/src/api/controllers/table/external.js +7 -10
  299. package/src/api/controllers/table/index.js +20 -28
  300. package/src/api/controllers/table/internal.js +24 -19
  301. package/src/api/controllers/table/utils.js +78 -42
  302. package/src/api/controllers/user.js +46 -45
  303. package/src/api/controllers/view/index.js +8 -10
  304. package/src/api/controllers/view/utils.js +9 -4
  305. package/src/api/controllers/webhook.js +10 -8
  306. package/src/api/routes/index.js +2 -2
  307. package/src/api/routes/migrations.js +14 -0
  308. package/src/api/routes/static.js +5 -0
  309. package/src/api/routes/tests/application.spec.js +2 -2
  310. package/src/api/routes/tests/auth.spec.js +1 -2
  311. package/src/api/routes/tests/automation.spec.js +1 -0
  312. package/src/api/routes/tests/misc.spec.js +0 -1
  313. package/src/api/routes/tests/routing.spec.js +21 -12
  314. package/src/api/routes/tests/row.spec.js +7 -4
  315. package/src/api/routes/tests/static.spec.js +98 -0
  316. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  317. package/src/app.ts +18 -5
  318. package/src/automations/automationUtils.js +2 -3
  319. package/src/automations/steps/createRow.js +2 -5
  320. package/src/automations/steps/deleteRow.js +1 -4
  321. package/src/automations/steps/updateRow.js +1 -1
  322. package/src/automations/triggers.js +33 -31
  323. package/src/automations/utils.js +9 -5
  324. package/src/constants/index.js +9 -0
  325. package/src/db/linkedRows/LinkController.js +3 -7
  326. package/src/db/linkedRows/index.js +16 -31
  327. package/src/db/linkedRows/linkUtils.js +6 -6
  328. package/src/db/tests/linkController.spec.js +0 -1
  329. package/src/db/tests/linkTests.spec.js +5 -6
  330. package/src/db/views/staticViews.js +8 -10
  331. package/src/definitions/common.ts +3 -0
  332. package/src/definitions/datasource.ts +3 -0
  333. package/src/environment.js +4 -1
  334. package/src/integrations/base/sql.ts +75 -29
  335. package/src/integrations/googlesheets.ts +353 -0
  336. package/src/integrations/index.ts +3 -0
  337. package/src/integrations/tests/sql.spec.js +16 -0
  338. package/src/integrations/utils.ts +75 -12
  339. package/src/middleware/authorized.js +66 -30
  340. package/src/middleware/builder.js +2 -2
  341. package/src/middleware/currentapp.js +50 -46
  342. package/src/middleware/tests/authorized.spec.js +13 -6
  343. package/src/middleware/tests/currentapp.spec.js +6 -0
  344. package/src/middleware/tests/usageQuota.spec.js +18 -24
  345. package/src/middleware/usageQuota.js +93 -17
  346. package/src/migrations/functions/appUrls.ts +34 -0
  347. package/src/migrations/functions/quotas1.ts +20 -0
  348. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  349. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  350. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  351. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  352. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  353. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  354. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  355. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  356. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  357. package/src/migrations/index.ts +56 -0
  358. package/src/module.d.ts +3 -0
  359. package/src/tests/utilities/TestConfiguration.js +82 -55
  360. package/src/threads/automation.js +17 -15
  361. package/src/threads/query.js +17 -12
  362. package/src/utilities/fileSystem/index.js +4 -3
  363. package/src/utilities/global.js +15 -12
  364. package/src/utilities/index.js +7 -17
  365. package/src/utilities/routing/index.js +5 -5
  366. package/src/utilities/rowProcessor/index.js +25 -27
  367. package/src/utilities/rowProcessor/utils.js +23 -7
  368. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  369. package/src/utilities/usageQuota/index.js +93 -0
  370. package/src/utilities/usageQuota/rows.js +75 -0
  371. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  372. package/src/utilities/users.js +3 -3
  373. package/src/utilities/workerRequests.js +4 -27
  374. package/tsconfig.json +4 -2
  375. package/builder/assets/index.39e01193.css +0 -1
  376. package/dist/api/controllers/hosting.js +0 -30
  377. package/dist/api/routes/hosting.js +0 -11
  378. package/src/api/controllers/hosting.js +0 -22
  379. package/src/api/routes/hosting.js +0 -13
  380. package/src/api/routes/tests/hosting.spec.js +0 -36
  381. package/src/utilities/usageQuota.js +0 -73
@@ -1,10 +1,15 @@
1
1
  const setup = require("./utilities")
2
2
  const { basicScreen } = setup.structures
3
- const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
3
+ const { checkBuilderEndpoint, runInProd } = require("./utilities/TestFunctions")
4
4
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
+ const { doInAppContext } = require("@budibase/backend-core/context")
5
6
 
6
7
  const route = "/test"
7
8
 
9
+ // there are checks which are disabled in test env,
10
+ // these checks need to be enabled for this test
11
+
12
+
8
13
  describe("/routing", () => {
9
14
  let request = setup.getRequest()
10
15
  let config = setup.getConfig()
@@ -26,20 +31,24 @@ describe("/routing", () => {
26
31
 
27
32
  describe("fetch", () => {
28
33
  it("prevents a public user from accessing development app", async () => {
29
- await request
30
- .get(`/api/routing/client`)
31
- .set(config.publicHeaders({ prodApp: false }))
32
- .expect(302)
34
+ await runInProd(() => {
35
+ return request
36
+ .get(`/api/routing/client`)
37
+ .set(config.publicHeaders({ prodApp: false }))
38
+ .expect(302)
39
+ })
33
40
  })
34
41
 
35
42
  it("prevents a non builder from accessing development app", async () => {
36
- await request
37
- .get(`/api/routing/client`)
38
- .set(await config.roleHeaders({
39
- roleId: BUILTIN_ROLE_IDS.BASIC,
40
- prodApp: false
41
- }))
42
- .expect(302)
43
+ await runInProd(async () => {
44
+ return request
45
+ .get(`/api/routing/client`)
46
+ .set(await config.roleHeaders({
47
+ roleId: BUILTIN_ROLE_IDS.BASIC,
48
+ prodApp: false
49
+ }))
50
+ .expect(302)
51
+ })
43
52
  })
44
53
  it("returns the correct routing for basic user", async () => {
45
54
  const res = await request
@@ -1,6 +1,7 @@
1
1
  const { outputProcessing } = require("../../../utilities/rowProcessor")
2
2
  const setup = require("./utilities")
3
3
  const { basicRow } = setup.structures
4
+ const { doInAppContext } = require("@budibase/backend-core/context")
4
5
 
5
6
  // mock the fetch for the search system
6
7
  jest.mock("node-fetch")
@@ -387,10 +388,12 @@ describe("/rows", () => {
387
388
  })
388
389
  // the environment needs configured for this
389
390
  await setup.switchToSelfHosted(async () => {
390
- const enriched = await outputProcessing({ appId: config.getAppId() }, table, [row])
391
- expect(enriched[0].attachment[0].url).toBe(
392
- `/prod-budi-app-assets/${config.getAppId()}/attachments/test/thing.csv`
393
- )
391
+ doInAppContext(config.getAppId(), async () => {
392
+ const enriched = await outputProcessing(table, [row])
393
+ expect(enriched[0].attachment[0].url).toBe(
394
+ `/prod-budi-app-assets/${config.getAppId()}/attachments/test/thing.csv`
395
+ )
396
+ })
394
397
  })
395
398
  })
396
399
  })
@@ -0,0 +1,98 @@
1
+ jest.mock("node-fetch")
2
+ jest.mock("aws-sdk", () => ({
3
+ config: {
4
+ update: jest.fn(),
5
+ },
6
+ DynamoDB: {
7
+ DocumentClient: jest.fn(),
8
+ },
9
+ S3: jest.fn(() => ({
10
+ getSignedUrl: jest.fn(() => {
11
+ return "my-url"
12
+ }),
13
+ })),
14
+ }))
15
+
16
+ const setup = require("./utilities")
17
+
18
+ describe("/attachments", () => {
19
+ let request = setup.getRequest()
20
+ let config = setup.getConfig()
21
+ let app
22
+
23
+ afterAll(setup.afterAll)
24
+
25
+ beforeEach(async () => {
26
+ app = await config.init()
27
+ })
28
+
29
+ describe("generateSignedUrls", () => {
30
+ let datasource
31
+
32
+ beforeEach(async () => {
33
+ datasource = await config.createDatasource({
34
+ datasource: {
35
+ type: "datasource",
36
+ name: "Test",
37
+ source: "S3",
38
+ config: {},
39
+ },
40
+ })
41
+ })
42
+
43
+ it("should be able to generate a signed upload URL", async () => {
44
+ const bucket = "foo"
45
+ const key = "bar"
46
+ const res = await request
47
+ .post(`/api/attachments/${datasource._id}/url`)
48
+ .send({ bucket, key })
49
+ .set(config.defaultHeaders())
50
+ .expect("Content-Type", /json/)
51
+ .expect(200)
52
+ expect(res.body.signedUrl).toEqual("my-url")
53
+ expect(res.body.publicUrl).toEqual(
54
+ `https://${bucket}.s3.eu-west-1.amazonaws.com/${key}`
55
+ )
56
+ })
57
+
58
+ it("should handle an invalid datasource ID", async () => {
59
+ const res = await request
60
+ .post(`/api/attachments/foo/url`)
61
+ .send({
62
+ bucket: "foo",
63
+ key: "bar",
64
+ })
65
+ .set(config.defaultHeaders())
66
+ .expect("Content-Type", /json/)
67
+ .expect(400)
68
+ expect(res.body.message).toEqual(
69
+ "The specified datasource could not be found"
70
+ )
71
+ })
72
+
73
+ it("should require a bucket parameter", async () => {
74
+ const res = await request
75
+ .post(`/api/attachments/${datasource._id}/url`)
76
+ .send({
77
+ bucket: undefined,
78
+ key: "bar",
79
+ })
80
+ .set(config.defaultHeaders())
81
+ .expect("Content-Type", /json/)
82
+ .expect(400)
83
+ expect(res.body.message).toEqual("bucket and key values are required")
84
+ })
85
+
86
+ it("should require a key parameter", async () => {
87
+ const res = await request
88
+ .post(`/api/attachments/${datasource._id}/url`)
89
+ .send({
90
+ bucket: "foo",
91
+ })
92
+ .set(config.defaultHeaders())
93
+ .expect("Content-Type", /json/)
94
+ .expect(400)
95
+ expect(res.body.message).toEqual("bucket and key values are required")
96
+ })
97
+ })
98
+ })
@@ -1,9 +1,10 @@
1
1
  const rowController = require("../../../controllers/row")
2
2
  const appController = require("../../../controllers/application")
3
- const CouchDB = require("../../../../db")
4
3
  const { AppStatus } = require("../../../../db/utils")
5
4
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
6
5
  const { TENANT_ID } = require("../../../../tests/utilities/structures")
6
+ const { getAppDB, doInAppContext } = require("@budibase/backend-core/context")
7
+ const env = require("../../../../environment")
7
8
 
8
9
  function Request(appId, params) {
9
10
  this.appId = appId
@@ -11,9 +12,15 @@ function Request(appId, params) {
11
12
  this.request = {}
12
13
  }
13
14
 
15
+ function runRequest(appId, controlFunc, request) {
16
+ return doInAppContext(appId, async () => {
17
+ return controlFunc(request)
18
+ })
19
+ }
20
+
14
21
  exports.getAllTableRows = async config => {
15
22
  const req = new Request(config.appId, { tableId: config.table._id })
16
- await rowController.fetch(req)
23
+ await runRequest(config.appId, rowController.fetch, req)
17
24
  return req.body
18
25
  }
19
26
 
@@ -26,14 +33,17 @@ exports.clearAllApps = async (tenantId = TENANT_ID) => {
26
33
  }
27
34
  for (let app of apps) {
28
35
  const { appId } = app
29
- await appController.delete(new Request(null, { appId }))
36
+ const req = new Request(null, { appId })
37
+ await runRequest(appId, appController.delete, req)
30
38
  }
31
39
  }
32
40
 
33
41
  exports.clearAllAutomations = async config => {
34
42
  const automations = await config.getAllAutomations()
35
43
  for (let auto of automations) {
36
- await config.deleteAutomation(auto)
44
+ await doInAppContext(config.appId, async () => {
45
+ await config.deleteAutomation(auto)
46
+ })
37
47
  }
38
48
  }
39
49
 
@@ -96,20 +106,32 @@ exports.checkPermissionsEndpoint = async ({
96
106
  .expect(403)
97
107
  }
98
108
 
99
- exports.getDB = config => {
100
- return new CouchDB(config.getAppId())
109
+ exports.getDB = () => {
110
+ return getAppDB()
101
111
  }
102
112
 
103
113
  exports.testAutomation = async (config, automation) => {
104
- return await config.request
105
- .post(`/api/automations/${automation._id}/test`)
106
- .send({
107
- row: {
108
- name: "Test",
109
- description: "TEST",
110
- },
111
- })
112
- .set(config.defaultHeaders())
113
- .expect("Content-Type", /json/)
114
- .expect(200)
114
+ return runRequest(automation.appId, async () => {
115
+ return await config.request
116
+ .post(`/api/automations/${automation._id}/test`)
117
+ .send({
118
+ row: {
119
+ name: "Test",
120
+ description: "TEST",
121
+ },
122
+ })
123
+ .set(config.defaultHeaders())
124
+ .expect("Content-Type", /json/)
125
+ .expect(200)
126
+ })
127
+ }
128
+
129
+ exports.runInProd = async func => {
130
+ const nodeEnv = env.NODE_ENV
131
+ const workerId = env.JEST_WORKER_ID
132
+ env._set("NODE_ENV", "PRODUCTION")
133
+ env._set("JEST_WORKER_ID", null)
134
+ await func()
135
+ env._set("NODE_ENV", nodeEnv)
136
+ env._set("JEST_WORKER_ID", workerId)
115
137
  }
package/src/app.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // need to load environment first
2
2
  import { ExtendableContext } from "koa"
3
3
 
4
- const env = require("./environment")
4
+ import * as env from "./environment"
5
5
  const CouchDB = require("./db")
6
6
  require("@budibase/backend-core").init(CouchDB)
7
7
  const Koa = require("koa")
@@ -16,6 +16,7 @@ const Sentry = require("@sentry/node")
16
16
  const fileSystem = require("./utilities/fileSystem")
17
17
  const bullboard = require("./automations/bullboard")
18
18
  const redis = require("./utilities/redis")
19
+ import * as migrations from "./migrations"
19
20
 
20
21
  const app = new Koa()
21
22
 
@@ -84,13 +85,25 @@ module.exports = server.listen(env.PORT || 0, async () => {
84
85
  await automations.init()
85
86
  })
86
87
 
87
- process.on("uncaughtException", err => {
88
- console.error(err)
88
+ const shutdown = () => {
89
89
  server.close()
90
90
  server.destroy()
91
+ }
92
+
93
+ process.on("uncaughtException", err => {
94
+ console.error(err)
95
+ shutdown()
91
96
  })
92
97
 
93
98
  process.on("SIGTERM", () => {
94
- server.close()
95
- server.destroy()
99
+ shutdown()
96
100
  })
101
+
102
+ // run migrations on startup if not done via http
103
+ // not recommended in a clustered environment
104
+ if (!env.HTTP_MIGRATIONS) {
105
+ migrations.migrate().catch(err => {
106
+ console.error("Error performing migrations. Exiting.\n", err)
107
+ shutdown()
108
+ })
109
+ }
@@ -53,13 +53,12 @@ exports.cleanInputValues = (inputs, schema) => {
53
53
  * the automation but is instead part of the Table/Table. This function will get the table schema and use it to instead
54
54
  * perform the cleanInputValues function on the input row.
55
55
  *
56
- * @param {string} appId The instance which the Table/Table is contained under.
57
56
  * @param {string} tableId The ID of the Table/Table which the schema is to be retrieved for.
58
57
  * @param {object} row The input row structure which requires clean-up after having been through template statements.
59
58
  * @returns {Promise<Object>} The cleaned up rows object, will should now have all the required primitive types.
60
59
  */
61
- exports.cleanUpRow = async (appId, tableId, row) => {
62
- let table = await getTable(appId, tableId)
60
+ exports.cleanUpRow = async (tableId, row) => {
61
+ let table = await getTable(tableId)
63
62
  return exports.cleanInputValues(row, { properties: table.schema })
64
63
  }
65
64
 
@@ -1,6 +1,5 @@
1
1
  const rowController = require("../../api/controllers/row")
2
2
  const automationUtils = require("../automationUtils")
3
- const env = require("../../environment")
4
3
  const usage = require("../../utilities/usageQuota")
5
4
  const { buildCtx } = require("./utils")
6
5
 
@@ -79,14 +78,12 @@ exports.run = async function ({ inputs, appId, emitter }) {
79
78
 
80
79
  try {
81
80
  inputs.row = await automationUtils.cleanUpRow(
82
- appId,
83
81
  inputs.row.tableId,
84
82
  inputs.row
85
83
  )
86
- if (env.USE_QUOTAS) {
87
- await usage.update(usage.Properties.ROW, 1)
88
- }
84
+ await usage.update(usage.Properties.ROW, 1, { dryRun: true })
89
85
  await rowController.save(ctx)
86
+ await usage.update(usage.Properties.ROW, 1)
90
87
  return {
91
88
  row: inputs.row,
92
89
  response: ctx.body,
@@ -1,5 +1,4 @@
1
1
  const rowController = require("../../api/controllers/row")
2
- const env = require("../../environment")
3
2
  const usage = require("../../utilities/usageQuota")
4
3
  const { buildCtx } = require("./utils")
5
4
  const automationUtils = require("../automationUtils")
@@ -74,9 +73,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
74
73
  })
75
74
 
76
75
  try {
77
- if (env.isProd()) {
78
- await usage.update(usage.Properties.ROW, -1)
79
- }
76
+ await usage.update(usage.Properties.ROW, -1)
80
77
  await rowController.destroy(ctx)
81
78
  return {
82
79
  response: ctx.body,
@@ -87,7 +87,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
87
87
 
88
88
  try {
89
89
  if (tableId) {
90
- inputs.row = await automationUtils.cleanUpRow(appId, tableId, inputs.row)
90
+ inputs.row = await automationUtils.cleanUpRow(tableId, inputs.row)
91
91
  }
92
92
  await rowController.patch(ctx)
93
93
  return {
@@ -1,4 +1,3 @@
1
- const CouchDB = require("../db")
2
1
  const emitter = require("../events/index")
3
2
  const { getAutomationParams } = require("../db/utils")
4
3
  const { coerce } = require("../utilities/rowProcessor")
@@ -9,6 +8,7 @@ const { queue } = require("./bullboard")
9
8
  const { checkTestFlag } = require("../utilities/redis")
10
9
  const utils = require("./utils")
11
10
  const env = require("../environment")
11
+ const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
12
12
 
13
13
  const TRIGGER_DEFINITIONS = definitions
14
14
  const JOB_OPTS = {
@@ -21,39 +21,41 @@ async function queueRelevantRowAutomations(event, eventType) {
21
21
  throw `No appId specified for ${eventType} - check event emitters.`
22
22
  }
23
23
 
24
- const db = new CouchDB(event.appId)
25
- let automations = await db.allDocs(
26
- getAutomationParams(null, { include_docs: true })
27
- )
24
+ doInAppContext(event.appId, async () => {
25
+ const db = getAppDB()
26
+ let automations = await db.allDocs(
27
+ getAutomationParams(null, { include_docs: true })
28
+ )
28
29
 
29
- // filter down to the correct event type
30
- automations = automations.rows
31
- .map(automation => automation.doc)
32
- .filter(automation => {
33
- const trigger = automation.definition.trigger
34
- return trigger && trigger.event === eventType
35
- })
30
+ // filter down to the correct event type
31
+ automations = automations.rows
32
+ .map(automation => automation.doc)
33
+ .filter(automation => {
34
+ const trigger = automation.definition.trigger
35
+ return trigger && trigger.event === eventType
36
+ })
36
37
 
37
- for (let automation of automations) {
38
- let automationDef = automation.definition
39
- let automationTrigger = automationDef ? automationDef.trigger : {}
40
- // don't queue events which are for dev apps, only way to test automations is
41
- // running tests on them, in production the test flag will never
42
- // be checked due to lazy evaluation (first always false)
43
- if (
44
- !env.ALLOW_DEV_AUTOMATIONS &&
45
- isDevAppID(event.appId) &&
46
- !(await checkTestFlag(automation._id))
47
- ) {
48
- continue
38
+ for (let automation of automations) {
39
+ let automationDef = automation.definition
40
+ let automationTrigger = automationDef ? automationDef.trigger : {}
41
+ // don't queue events which are for dev apps, only way to test automations is
42
+ // running tests on them, in production the test flag will never
43
+ // be checked due to lazy evaluation (first always false)
44
+ if (
45
+ !env.ALLOW_DEV_AUTOMATIONS &&
46
+ isDevAppID(event.appId) &&
47
+ !(await checkTestFlag(automation._id))
48
+ ) {
49
+ continue
50
+ }
51
+ if (
52
+ automationTrigger.inputs &&
53
+ automationTrigger.inputs.tableId === event.row.tableId
54
+ ) {
55
+ await queue.add({ automation, event }, JOB_OPTS)
56
+ }
49
57
  }
50
- if (
51
- automationTrigger.inputs &&
52
- automationTrigger.inputs.tableId === event.row.tableId
53
- ) {
54
- await queue.add({ automation, event }, JOB_OPTS)
55
- }
56
- }
58
+ })
57
59
  }
58
60
 
59
61
  emitter.on("row:save", async function (event) {
@@ -6,8 +6,9 @@ const { queue } = require("./bullboard")
6
6
  const newid = require("../db/newid")
7
7
  const { updateEntityMetadata } = require("../utilities")
8
8
  const { MetadataTypes } = require("../constants")
9
- const { getDeployedAppID } = require("@budibase/backend-core/db")
9
+ const { getProdAppID } = require("@budibase/backend-core/db")
10
10
  const { cloneDeep } = require("lodash/fp")
11
+ const { getAppDB, getAppId } = require("@budibase/backend-core/context")
11
12
 
12
13
  const WH_STEP_ID = definitions.WEBHOOK.stepId
13
14
  const CRON_STEP_ID = definitions.CRON.stepId
@@ -27,7 +28,6 @@ exports.processEvent = async job => {
27
28
 
28
29
  exports.updateTestHistory = async (appId, automation, history) => {
29
30
  return updateEntityMetadata(
30
- appId,
31
31
  MetadataTypes.AUTOMATION_TEST_HISTORY,
32
32
  automation._id,
33
33
  metadata => {
@@ -93,6 +93,9 @@ exports.enableCronTrigger = async (appId, automation) => {
93
93
  )
94
94
  // Assign cron job ID from bull so we can remove it later if the cron trigger is removed
95
95
  trigger.cronJobId = job.id
96
+ // can't use getAppDB here as this is likely to be called from dev app,
97
+ // but this call could be for dev app or prod app, need to just use what
98
+ // was passed in
96
99
  const db = new CouchDB(appId)
97
100
  const response = await db.put(automation)
98
101
  automation._id = response.id
@@ -109,7 +112,8 @@ exports.enableCronTrigger = async (appId, automation) => {
109
112
  * @returns {Promise<object|undefined>} After this is complete the new automation object may have been updated and should be
110
113
  * written to DB (this does not write to DB as it would be wasteful to repeat).
111
114
  */
112
- exports.checkForWebhooks = async ({ appId, oldAuto, newAuto }) => {
115
+ exports.checkForWebhooks = async ({ oldAuto, newAuto }) => {
116
+ const appId = getAppId()
113
117
  const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
114
118
  const newTrigger = newAuto ? newAuto.definition.trigger : null
115
119
  const triggerChanged =
@@ -128,7 +132,7 @@ exports.checkForWebhooks = async ({ appId, oldAuto, newAuto }) => {
128
132
  oldTrigger.webhookId
129
133
  ) {
130
134
  try {
131
- let db = new CouchDB(appId)
135
+ let db = getAppDB()
132
136
  // need to get the webhook to get the rev
133
137
  const webhook = await db.get(oldTrigger.webhookId)
134
138
  const ctx = {
@@ -166,7 +170,7 @@ exports.checkForWebhooks = async ({ appId, oldAuto, newAuto }) => {
166
170
  // the app ID has to be development for this endpoint
167
171
  // it can only be used when building the app
168
172
  // but the trigger endpoint will always be used in production
169
- const prodAppId = getDeployedAppID(appId)
173
+ const prodAppId = getProdAppID(appId)
170
174
  newTrigger.inputs = {
171
175
  schemaUrl: `api/webhooks/schema/${appId}/${id}`,
172
176
  triggerUrl: `api/webhooks/trigger/${prodAppId}/${id}`,
@@ -61,6 +61,11 @@ exports.RelationshipTypes = {
61
61
  MANY_TO_MANY: "many-to-many",
62
62
  }
63
63
 
64
+ exports.FormulaTypes = {
65
+ STATIC: "static",
66
+ DYNAMIC: "dynamic",
67
+ }
68
+
64
69
  exports.AuthTypes = {
65
70
  APP: "app",
66
71
  BUILDER: "builder",
@@ -78,6 +83,10 @@ exports.DataSourceOperation = {
78
83
  DELETE_TABLE: "DELETE_TABLE",
79
84
  }
80
85
 
86
+ exports.DatasourceAuthTypes = {
87
+ GOOGLE: "google",
88
+ }
89
+
81
90
  exports.SortDirection = {
82
91
  ASCENDING: "ASCENDING",
83
92
  DESCENDING: "DESCENDING",
@@ -1,4 +1,3 @@
1
- const CouchDB = require("../index")
2
1
  const { IncludeDocs, getLinkDocuments } = require("./linkUtils")
3
2
  const {
4
3
  generateLinkID,
@@ -7,6 +6,7 @@ const {
7
6
  } = require("../utils")
8
7
  const Sentry = require("@sentry/node")
9
8
  const { FieldTypes, RelationshipTypes } = require("../../constants")
9
+ const { getAppDB } = require("@budibase/backend-core/context")
10
10
 
11
11
  /**
12
12
  * Creates a new link document structure which can be put to the database. It is important to
@@ -52,9 +52,8 @@ function LinkDocument(
52
52
  }
53
53
 
54
54
  class LinkController {
55
- constructor({ appId, tableId, row, table, oldTable }) {
56
- this._appId = appId
57
- this._db = new CouchDB(appId)
55
+ constructor({ tableId, row, table, oldTable }) {
56
+ this._db = getAppDB()
58
57
  this._tableId = tableId
59
58
  this._row = row
60
59
  this._table = table
@@ -99,7 +98,6 @@ class LinkController {
99
98
  */
100
99
  getRowLinkDocs(rowId) {
101
100
  return getLinkDocuments({
102
- appId: this._appId,
103
101
  tableId: this._tableId,
104
102
  rowId,
105
103
  includeDocs: IncludeDocs.INCLUDE,
@@ -111,7 +109,6 @@ class LinkController {
111
109
  */
112
110
  getTableLinkDocs() {
113
111
  return getLinkDocuments({
114
- appId: this._appId,
115
112
  tableId: this._tableId,
116
113
  includeDocs: IncludeDocs.INCLUDE,
117
114
  })
@@ -230,7 +227,6 @@ class LinkController {
230
227
  if (linkedSchema.relationshipType === RelationshipTypes.ONE_TO_MANY) {
231
228
  let links = (
232
229
  await getLinkDocuments({
233
- appId: this._appId,
234
230
  tableId: field.tableId,
235
231
  rowId: linkId,
236
232
  includeDocs: IncludeDocs.EXCLUDE,