@budibase/server 0.9.188 → 0.9.190-alpha.2

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 (307) hide show
  1. package/Dockerfile +7 -1
  2. package/__mocks__/mssql.ts +1 -1
  3. package/__mocks__/oracledb.ts +31 -0
  4. package/__mocks__/pg.ts +3 -0
  5. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  6. package/builder/assets/index.7d405e74.css +1 -0
  7. package/builder/assets/index.edea4fa5.js +1316 -0
  8. package/builder/assets/oracle.66592424.png +0 -0
  9. package/builder/assets/vendor.470042a4.js +152 -0
  10. package/builder/assets/vendor.5e1fe644.css +1 -0
  11. package/builder/index.html +4 -4
  12. package/coverage/clover.xml +1507 -1081
  13. package/coverage/coverage-final.json +93 -89
  14. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  15. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  16. package/coverage/lcov-report/api/controllers/application.js.html +64 -13
  17. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  18. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  19. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  22. package/coverage/lcov-report/api/controllers/datasource.js.html +232 -28
  23. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  24. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  25. package/coverage/lcov-report/api/controllers/index.html +91 -91
  26. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/layout.js.html +3 -3
  28. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  29. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  30. package/coverage/lcov-report/api/controllers/query.js.html +53 -209
  31. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  32. package/coverage/lcov-report/api/controllers/routing.js.html +3 -3
  33. package/coverage/lcov-report/api/controllers/row/external.js.html +17 -8
  34. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  35. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  37. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  38. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  39. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  40. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  41. package/coverage/lcov-report/api/controllers/table/external.js.html +1001 -0
  42. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  43. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  44. package/coverage/lcov-report/api/controllers/table/internal.js.html +545 -0
  45. package/coverage/lcov-report/api/controllers/table/utils.js.html +175 -52
  46. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  48. package/coverage/lcov-report/api/controllers/view/exporters.js.html +19 -4
  49. package/coverage/lcov-report/api/controllers/view/index.html +22 -22
  50. package/coverage/lcov-report/api/controllers/view/index.js.html +52 -13
  51. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  52. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  53. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  54. package/coverage/lcov-report/api/index.html +1 -1
  55. package/coverage/lcov-report/api/index.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/index.html +4 -4
  69. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  75. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  81. package/coverage/lcov-report/api/routes/table.js.html +35 -2
  82. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  86. package/coverage/lcov-report/automations/actions.js.html +2 -2
  87. package/coverage/lcov-report/automations/automationUtils.js.html +4 -4
  88. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  89. package/coverage/lcov-report/automations/index.html +35 -50
  90. package/coverage/lcov-report/automations/index.js.html +2 -2
  91. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  96. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  98. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/index.html +14 -14
  100. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  102. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  108. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  118. package/coverage/lcov-report/automations/utils.js.html +42 -12
  119. package/coverage/lcov-report/constants/index.html +5 -5
  120. package/coverage/lcov-report/constants/index.js.html +87 -21
  121. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  122. package/coverage/lcov-report/constants/screens.js.html +1 -1
  123. package/coverage/lcov-report/db/client.js.html +2 -2
  124. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  125. package/coverage/lcov-report/db/index.html +2 -2
  126. package/coverage/lcov-report/db/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  128. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  130. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  131. package/coverage/lcov-report/db/newid.js.html +3 -3
  132. package/coverage/lcov-report/db/utils.js.html +57 -57
  133. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  134. package/coverage/lcov-report/events/index.html +6 -6
  135. package/coverage/lcov-report/events/index.js.html +1 -1
  136. package/coverage/lcov-report/events/utils.js.html +5 -5
  137. package/coverage/lcov-report/index.html +106 -91
  138. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  139. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  140. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  141. package/coverage/lcov-report/middleware/authorized.js.html +11 -8
  142. package/coverage/lcov-report/middleware/builder.js.html +16 -7
  143. package/coverage/lcov-report/middleware/currentapp.js.html +6 -6
  144. package/coverage/lcov-report/middleware/index.html +23 -23
  145. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  146. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  147. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  149. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  150. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +90 -33
  151. package/coverage/lcov-report/threads/index.html +141 -0
  152. package/coverage/lcov-report/threads/index.js.html +278 -0
  153. package/coverage/lcov-report/threads/query.js.html +278 -0
  154. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  155. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  156. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  157. package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
  158. package/coverage/lcov-report/utilities/global.js.html +26 -11
  159. package/coverage/lcov-report/utilities/index.html +48 -48
  160. package/coverage/lcov-report/utilities/index.js.html +47 -14
  161. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +30 -9
  162. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  163. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
  166. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  167. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  168. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  169. package/coverage/lcov-report/utilities/security.js.html +3 -3
  170. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  171. package/coverage/lcov-report/utilities/users.js.html +1 -1
  172. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  173. package/coverage/lcov.info +2495 -1737
  174. package/dist/api/controllers/application.js +15 -1
  175. package/dist/api/controllers/auth.js +3 -3
  176. package/dist/api/controllers/datasource.js +67 -16
  177. package/dist/api/controllers/deploy/index.js +2 -0
  178. package/dist/api/controllers/dev.js +4 -1
  179. package/dist/api/controllers/query.js +30 -58
  180. package/dist/api/controllers/row/ExternalRequest.js +78 -34
  181. package/dist/api/controllers/row/external.js +3 -1
  182. package/dist/api/controllers/row/utils.js +6 -12
  183. package/dist/api/controllers/table/external.js +249 -0
  184. package/dist/api/controllers/table/index.js +49 -123
  185. package/dist/api/controllers/table/internal.js +150 -0
  186. package/dist/api/controllers/table/utils.js +62 -28
  187. package/dist/api/controllers/user.js +123 -11
  188. package/dist/api/controllers/view/exporters.js +4 -0
  189. package/dist/api/controllers/view/index.js +14 -2
  190. package/dist/api/routes/query.js +1 -1
  191. package/dist/api/routes/table.js +7 -1
  192. package/dist/api/routes/user.js +2 -1
  193. package/dist/app.js +2 -11
  194. package/dist/automations/bullboard.js +37 -10
  195. package/dist/automations/triggers.js +7 -3
  196. package/dist/automations/utils.js +11 -2
  197. package/dist/constants/index.js +19 -0
  198. package/dist/definitions/datasource.js +5 -0
  199. package/dist/environment.js +13 -0
  200. package/dist/integrations/base/IntegrationBase.js +2 -0
  201. package/dist/integrations/base/datasourcePlus.js +2 -0
  202. package/dist/integrations/base/sql.js +353 -177
  203. package/dist/integrations/base/sqlTable.js +143 -0
  204. package/dist/integrations/base/utils.js +30 -0
  205. package/dist/integrations/index.js +6 -0
  206. package/dist/integrations/microsoftSqlServer.js +117 -9
  207. package/dist/integrations/mysql.js +16 -85
  208. package/dist/integrations/oracle.js +347 -0
  209. package/dist/integrations/postgres.js +35 -28
  210. package/dist/integrations/utils.js +71 -9
  211. package/dist/middleware/authorized.js +2 -1
  212. package/dist/middleware/builder.js +4 -1
  213. package/dist/package.json +12 -7
  214. package/dist/tests/utilities/TestConfiguration.js +2 -1
  215. package/dist/{automations/thread.js → threads/automation.js} +26 -8
  216. package/dist/threads/index.js +64 -0
  217. package/dist/threads/query.js +64 -0
  218. package/dist/tsconfig.tsbuildinfo +1 -1
  219. package/dist/utilities/csvParser.js +46 -5
  220. package/dist/utilities/global.js +6 -2
  221. package/dist/utilities/index.js +11 -0
  222. package/dist/utilities/queue/inMemoryQueue.js +8 -0
  223. package/dist/utilities/scriptRunner.js +4 -1
  224. package/package.json +13 -8
  225. package/scripts/dev/manage.js +1 -0
  226. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  227. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  228. package/scripts/integrations/mssql/data/setup.sql +54 -0
  229. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  230. package/scripts/integrations/mssql/reset.sh +3 -0
  231. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  232. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  233. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  234. package/scripts/integrations/oracle/oracle.md +90 -0
  235. package/scripts/integrations/postgres/docker-compose.yml +3 -3
  236. package/scripts/likeCypress.ts +33 -0
  237. package/src/api/controllers/application.js +18 -1
  238. package/src/api/controllers/auth.js +3 -0
  239. package/src/api/controllers/datasource.js +84 -16
  240. package/src/api/controllers/deploy/index.js +2 -0
  241. package/src/api/controllers/dev.js +4 -1
  242. package/src/api/controllers/query.js +29 -81
  243. package/src/api/controllers/row/ExternalRequest.ts +91 -36
  244. package/src/api/controllers/row/external.js +4 -1
  245. package/src/api/controllers/row/utils.js +8 -11
  246. package/src/api/controllers/table/external.js +307 -0
  247. package/src/api/controllers/table/index.js +47 -137
  248. package/src/api/controllers/table/internal.js +155 -0
  249. package/src/api/controllers/table/utils.js +74 -33
  250. package/src/api/controllers/user.js +132 -13
  251. package/src/api/controllers/view/exporters.js +5 -0
  252. package/src/api/controllers/view/index.js +15 -2
  253. package/src/api/routes/query.js +1 -0
  254. package/src/api/routes/table.js +11 -0
  255. package/src/api/routes/tests/datasource.spec.js +2 -2
  256. package/src/api/routes/tests/misc.spec.js +5 -1
  257. package/src/api/routes/tests/query.spec.js +0 -1
  258. package/src/api/routes/user.js +5 -0
  259. package/src/app.ts +2 -10
  260. package/src/automations/bullboard.js +28 -11
  261. package/src/automations/tests/automation.spec.js +3 -4
  262. package/src/automations/triggers.js +7 -3
  263. package/src/automations/utils.js +12 -2
  264. package/src/constants/index.js +22 -0
  265. package/src/definitions/common.ts +7 -1
  266. package/src/definitions/datasource.ts +10 -3
  267. package/src/environment.js +15 -0
  268. package/src/integrations/airtable.ts +2 -1
  269. package/src/integrations/arangodb.ts +2 -1
  270. package/src/integrations/base/IntegrationBase.ts +6 -0
  271. package/src/integrations/base/datasourcePlus.ts +9 -0
  272. package/src/integrations/base/sql.ts +377 -218
  273. package/src/integrations/base/sqlTable.ts +180 -0
  274. package/src/integrations/base/utils.ts +22 -0
  275. package/src/integrations/couchdb.ts +2 -1
  276. package/src/integrations/dynamodb.ts +2 -1
  277. package/src/integrations/elasticsearch.ts +2 -1
  278. package/src/integrations/index.ts +7 -0
  279. package/src/integrations/microsoftSqlServer.ts +145 -13
  280. package/src/integrations/mongodb.ts +2 -1
  281. package/src/integrations/mysql.ts +23 -95
  282. package/src/integrations/oracle.ts +458 -0
  283. package/src/integrations/postgres.ts +45 -35
  284. package/src/integrations/rest.ts +2 -1
  285. package/src/integrations/s3.ts +2 -1
  286. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  287. package/src/integrations/tests/oracle.spec.js +94 -0
  288. package/src/integrations/tests/postgres.spec.js +4 -0
  289. package/src/integrations/utils.ts +78 -8
  290. package/src/middleware/authorized.js +2 -1
  291. package/src/middleware/builder.js +4 -1
  292. package/src/tests/utilities/TestConfiguration.js +2 -1
  293. package/src/{automations/thread.js → threads/automation.js} +27 -8
  294. package/src/threads/index.js +66 -0
  295. package/src/threads/query.js +66 -0
  296. package/src/utilities/csvParser.js +48 -5
  297. package/src/utilities/global.js +7 -2
  298. package/src/utilities/index.js +11 -0
  299. package/src/utilities/queue/inMemoryQueue.js +7 -0
  300. package/src/utilities/scriptRunner.js +4 -1
  301. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  302. package/src/utilities/tests/csvParser.spec.js +3 -0
  303. package/tsconfig.json +1 -1
  304. package/builder/assets/index.550fdba7.js +0 -201
  305. package/builder/assets/index.7469e1e4.css +0 -29
  306. package/builder/assets/vendor.278a305c.js +0 -9
  307. package/builder/assets/vendor.d75d5eb7.css +0 -1
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">83.95% </span>
26
+ <span class="strong">81.81% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>68/81</span>
28
+ <span class='fraction'>45/55</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">73.17% </span>
33
+ <span class="strong">73.91% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>30/41</span>
35
+ <span class='fraction'>17/23</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">88.16% </span>
47
+ <span class="strong">83.01% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>67/76</span>
49
+ <span class='fraction'>44/53</span>
50
50
  </div>
51
51
 
52
52
 
@@ -163,246 +163,76 @@
163
163
  <a name='L104'></a><a href='#L104'>104</a>
164
164
  <a name='L105'></a><a href='#L105'>105</a>
165
165
  <a name='L106'></a><a href='#L106'>106</a>
166
- <a name='L107'></a><a href='#L107'>107</a>
167
- <a name='L108'></a><a href='#L108'>108</a>
168
- <a name='L109'></a><a href='#L109'>109</a>
169
- <a name='L110'></a><a href='#L110'>110</a>
170
- <a name='L111'></a><a href='#L111'>111</a>
171
- <a name='L112'></a><a href='#L112'>112</a>
172
- <a name='L113'></a><a href='#L113'>113</a>
173
- <a name='L114'></a><a href='#L114'>114</a>
174
- <a name='L115'></a><a href='#L115'>115</a>
175
- <a name='L116'></a><a href='#L116'>116</a>
176
- <a name='L117'></a><a href='#L117'>117</a>
177
- <a name='L118'></a><a href='#L118'>118</a>
178
- <a name='L119'></a><a href='#L119'>119</a>
179
- <a name='L120'></a><a href='#L120'>120</a>
180
- <a name='L121'></a><a href='#L121'>121</a>
181
- <a name='L122'></a><a href='#L122'>122</a>
182
- <a name='L123'></a><a href='#L123'>123</a>
183
- <a name='L124'></a><a href='#L124'>124</a>
184
- <a name='L125'></a><a href='#L125'>125</a>
185
- <a name='L126'></a><a href='#L126'>126</a>
186
- <a name='L127'></a><a href='#L127'>127</a>
187
- <a name='L128'></a><a href='#L128'>128</a>
188
- <a name='L129'></a><a href='#L129'>129</a>
189
- <a name='L130'></a><a href='#L130'>130</a>
190
- <a name='L131'></a><a href='#L131'>131</a>
191
- <a name='L132'></a><a href='#L132'>132</a>
192
- <a name='L133'></a><a href='#L133'>133</a>
193
- <a name='L134'></a><a href='#L134'>134</a>
194
- <a name='L135'></a><a href='#L135'>135</a>
195
- <a name='L136'></a><a href='#L136'>136</a>
196
- <a name='L137'></a><a href='#L137'>137</a>
197
- <a name='L138'></a><a href='#L138'>138</a>
198
- <a name='L139'></a><a href='#L139'>139</a>
199
- <a name='L140'></a><a href='#L140'>140</a>
200
- <a name='L141'></a><a href='#L141'>141</a>
201
- <a name='L142'></a><a href='#L142'>142</a>
202
- <a name='L143'></a><a href='#L143'>143</a>
203
- <a name='L144'></a><a href='#L144'>144</a>
204
- <a name='L145'></a><a href='#L145'>145</a>
205
- <a name='L146'></a><a href='#L146'>146</a>
206
- <a name='L147'></a><a href='#L147'>147</a>
207
- <a name='L148'></a><a href='#L148'>148</a>
208
- <a name='L149'></a><a href='#L149'>149</a>
209
- <a name='L150'></a><a href='#L150'>150</a>
210
- <a name='L151'></a><a href='#L151'>151</a>
211
- <a name='L152'></a><a href='#L152'>152</a>
212
- <a name='L153'></a><a href='#L153'>153</a>
213
- <a name='L154'></a><a href='#L154'>154</a>
214
- <a name='L155'></a><a href='#L155'>155</a>
215
- <a name='L156'></a><a href='#L156'>156</a>
216
- <a name='L157'></a><a href='#L157'>157</a>
217
- <a name='L158'></a><a href='#L158'>158</a>
218
- <a name='L159'></a><a href='#L159'>159</a>
219
- <a name='L160'></a><a href='#L160'>160</a>
220
- <a name='L161'></a><a href='#L161'>161</a>
221
- <a name='L162'></a><a href='#L162'>162</a>
222
- <a name='L163'></a><a href='#L163'>163</a>
223
- <a name='L164'></a><a href='#L164'>164</a>
224
- <a name='L165'></a><a href='#L165'>165</a>
225
- <a name='L166'></a><a href='#L166'>166</a>
226
- <a name='L167'></a><a href='#L167'>167</a>
227
- <a name='L168'></a><a href='#L168'>168</a>
228
- <a name='L169'></a><a href='#L169'>169</a>
229
- <a name='L170'></a><a href='#L170'>170</a>
230
- <a name='L171'></a><a href='#L171'>171</a>
231
- <a name='L172'></a><a href='#L172'>172</a>
232
- <a name='L173'></a><a href='#L173'>173</a>
233
- <a name='L174'></a><a href='#L174'>174</a>
234
- <a name='L175'></a><a href='#L175'>175</a>
235
- <a name='L176'></a><a href='#L176'>176</a>
236
- <a name='L177'></a><a href='#L177'>177</a>
237
- <a name='L178'></a><a href='#L178'>178</a>
238
- <a name='L179'></a><a href='#L179'>179</a>
239
- <a name='L180'></a><a href='#L180'>180</a>
240
- <a name='L181'></a><a href='#L181'>181</a>
241
- <a name='L182'></a><a href='#L182'>182</a>
242
- <a name='L183'></a><a href='#L183'>183</a>
243
- <a name='L184'></a><a href='#L184'>184</a>
244
- <a name='L185'></a><a href='#L185'>185</a>
245
- <a name='L186'></a><a href='#L186'>186</a>
246
- <a name='L187'></a><a href='#L187'>187</a>
247
- <a name='L188'></a><a href='#L188'>188</a>
248
- <a name='L189'></a><a href='#L189'>189</a>
249
- <a name='L190'></a><a href='#L190'>190</a>
250
- <a name='L191'></a><a href='#L191'>191</a>
251
- <a name='L192'></a><a href='#L192'>192</a>
252
- <a name='L193'></a><a href='#L193'>193</a>
253
- <a name='L194'></a><a href='#L194'>194</a>
254
- <a name='L195'></a><a href='#L195'>195</a>
255
- <a name='L196'></a><a href='#L196'>196</a>
256
- <a name='L197'></a><a href='#L197'>197</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
166
+ <a name='L107'></a><a href='#L107'>107</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
257
167
  <span class="cline-any cline-yes">34x</span>
258
168
  <span class="cline-any cline-yes">34x</span>
259
- <span class="cline-any cline-neutral">&nbsp;</span>
260
- <span class="cline-any cline-neutral">&nbsp;</span>
261
- <span class="cline-any cline-neutral">&nbsp;</span>
262
- <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-neutral">&nbsp;</span>
265
169
  <span class="cline-any cline-yes">34x</span>
266
170
  <span class="cline-any cline-yes">34x</span>
267
- <span class="cline-any cline-yes">34x</span>
268
- <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-yes">34x</span>
270
- <span class="cline-any cline-yes">1x</span>
271
- <span class="cline-any cline-neutral">&nbsp;</span>
272
- <span class="cline-any cline-yes">1x</span>
273
- <span class="cline-any cline-neutral">&nbsp;</span>
274
- <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-yes">2x</span>
279
- <span class="cline-any cline-neutral">&nbsp;</span>
280
- <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-yes">1x</span>
285
- <span class="cline-any cline-neutral">&nbsp;</span>
286
- <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-yes">1x</span>
291
- <span class="cline-any cline-no">&nbsp;</span>
292
- <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-neutral">&nbsp;</span>
294
171
  <span class="cline-any cline-neutral">&nbsp;</span>
295
172
  <span class="cline-any cline-neutral">&nbsp;</span>
296
173
  <span class="cline-any cline-neutral">&nbsp;</span>
297
174
  <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-yes">1x</span>
299
- <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-neutral">&nbsp;</span>
301
175
  <span class="cline-any cline-yes">34x</span>
302
- <span class="cline-any cline-yes">19x</span>
303
- <span class="cline-any cline-yes">19x</span>
304
- <span class="cline-any cline-neutral">&nbsp;</span>
305
- <span class="cline-any cline-neutral">&nbsp;</span>
306
176
  <span class="cline-any cline-yes">34x</span>
307
- <span class="cline-any cline-yes">99x</span>
308
- <span class="cline-any cline-yes">99x</span>
309
- <span class="cline-any cline-yes">99x</span>
310
- <span class="cline-any cline-yes">99x</span>
311
- <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-neutral">&nbsp;</span>
313
- <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-neutral">&nbsp;</span>
315
- <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-neutral">&nbsp;</span>
317
- <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-neutral">&nbsp;</span>
319
- <span class="cline-any cline-yes">99x</span>
320
- <span class="cline-any cline-yes">4x</span>
321
- <span class="cline-any cline-neutral">&nbsp;</span>
322
- <span class="cline-any cline-neutral">&nbsp;</span>
323
177
  <span class="cline-any cline-neutral">&nbsp;</span>
324
178
  <span class="cline-any cline-neutral">&nbsp;</span>
179
+ <span class="cline-any cline-yes">101x</span>
325
180
  <span class="cline-any cline-yes">99x</span>
326
181
  <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-neutral">&nbsp;</span>
330
- <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-yes">99x</span>
332
- <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-yes">99x</span>
336
- <span class="cline-any cline-yes">4x</span>
337
- <span class="cline-any cline-yes">13x</span>
338
- <span class="cline-any cline-yes">13x</span>
339
- <span class="cline-any cline-yes">13x</span>
182
+ <span class="cline-any cline-yes">101x</span>
340
183
  <span class="cline-any cline-no">&nbsp;</span>
341
- <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">13x</span>
184
+ <span class="cline-any cline-yes">101x</span>
343
185
  <span class="cline-any cline-no">&nbsp;</span>
344
186
  <span class="cline-any cline-neutral">&nbsp;</span>
187
+ <span class="cline-any cline-yes">101x</span>
345
188
  <span class="cline-any cline-neutral">&nbsp;</span>
346
189
  <span class="cline-any cline-neutral">&nbsp;</span>
347
190
  <span class="cline-any cline-neutral">&nbsp;</span>
191
+ <span class="cline-any cline-yes">34x</span>
192
+ <span class="cline-any cline-yes">1x</span>
348
193
  <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-yes">99x</span>
194
+ <span class="cline-any cline-yes">1x</span>
350
195
  <span class="cline-any cline-neutral">&nbsp;</span>
351
196
  <span class="cline-any cline-neutral">&nbsp;</span>
352
197
  <span class="cline-any cline-neutral">&nbsp;</span>
353
198
  <span class="cline-any cline-neutral">&nbsp;</span>
354
199
  <span class="cline-any cline-neutral">&nbsp;</span>
200
+ <span class="cline-any cline-yes">2x</span>
355
201
  <span class="cline-any cline-neutral">&nbsp;</span>
356
202
  <span class="cline-any cline-neutral">&nbsp;</span>
357
203
  <span class="cline-any cline-neutral">&nbsp;</span>
358
204
  <span class="cline-any cline-neutral">&nbsp;</span>
359
205
  <span class="cline-any cline-neutral">&nbsp;</span>
206
+ <span class="cline-any cline-yes">1x</span>
360
207
  <span class="cline-any cline-neutral">&nbsp;</span>
361
208
  <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">99x</span>
363
209
  <span class="cline-any cline-neutral">&nbsp;</span>
364
210
  <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-yes">99x</span>
366
- <span class="cline-any cline-no">&nbsp;</span>
367
- <span class="cline-any cline-no">&nbsp;</span>
368
211
  <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-no">&nbsp;</span>
212
+ <span class="cline-any cline-yes">1x</span>
370
213
  <span class="cline-any cline-no">&nbsp;</span>
371
214
  <span class="cline-any cline-neutral">&nbsp;</span>
372
215
  <span class="cline-any cline-neutral">&nbsp;</span>
373
216
  <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">99x</span>
375
- <span class="cline-any cline-yes">99x</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-neutral">&nbsp;</span>
379
217
  <span class="cline-any cline-neutral">&nbsp;</span>
380
218
  <span class="cline-any cline-neutral">&nbsp;</span>
381
219
  <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">99x</span>
384
- <span class="cline-any cline-yes">4x</span>
385
- <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-no">&nbsp;</span>
220
+ <span class="cline-any cline-yes">1x</span>
388
221
  <span class="cline-any cline-neutral">&nbsp;</span>
389
222
  <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-yes">34x</span>
224
+ <span class="cline-any cline-yes">19x</span>
225
+ <span class="cline-any cline-yes">19x</span>
390
226
  <span class="cline-any cline-neutral">&nbsp;</span>
391
227
  <span class="cline-any cline-neutral">&nbsp;</span>
228
+ <span class="cline-any cline-yes">34x</span>
392
229
  <span class="cline-any cline-yes">99x</span>
393
230
  <span class="cline-any cline-yes">99x</span>
394
- <span class="cline-any cline-yes">1x</span>
395
- <span class="cline-any cline-neutral">&nbsp;</span>
396
231
  <span class="cline-any cline-yes">99x</span>
397
232
  <span class="cline-any cline-yes">99x</span>
398
- <span class="cline-any cline-neutral">&nbsp;</span>
399
233
  <span class="cline-any cline-yes">99x</span>
400
- <span class="cline-any cline-neutral">&nbsp;</span>
401
234
  <span class="cline-any cline-yes">99x</span>
402
235
  <span class="cline-any cline-neutral">&nbsp;</span>
403
- <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-yes">99x</span>
405
- <span class="cline-any cline-yes">99x</span>
406
236
  <span class="cline-any cline-yes">99x</span>
407
237
  <span class="cline-any cline-neutral">&nbsp;</span>
408
238
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -410,58 +240,60 @@
410
240
  <span class="cline-any cline-yes">2x</span>
411
241
  <span class="cline-any cline-yes">2x</span>
412
242
  <span class="cline-any cline-yes">2x</span>
413
- <span class="cline-any cline-neutral">&nbsp;</span>
414
- <span class="cline-any cline-neutral">&nbsp;</span>
415
243
  <span class="cline-any cline-yes">2x</span>
416
244
  <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-neutral">&nbsp;</span>
420
245
  <span class="cline-any cline-yes">2x</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
246
  <span class="cline-any cline-yes">2x</span>
424
247
  <span class="cline-any cline-neutral">&nbsp;</span>
425
248
  <span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-yes">34x</span>
250
+ <span class="cline-any cline-no">&nbsp;</span>
251
+ <span class="cline-any cline-no">&nbsp;</span>
426
252
  <span class="cline-any cline-neutral">&nbsp;</span>
427
253
  <span class="cline-any cline-neutral">&nbsp;</span>
428
254
  <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-yes">2x</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-neutral">&nbsp;</span>
433
- <span class="cline-any cline-yes">2x</span>
434
- <span class="cline-any cline-yes">2x</span>
435
- <span class="cline-any cline-yes">2x</span>
436
- <span class="cline-any cline-neutral">&nbsp;</span>
437
- <span class="cline-any cline-yes">2x</span>
255
+ <span class="cline-any cline-no">&nbsp;</span>
438
256
  <span class="cline-any cline-no">&nbsp;</span>
439
257
  <span class="cline-any cline-neutral">&nbsp;</span>
440
258
  <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-yes">2x</span>
259
+ <span class="cline-any cline-yes">34x</span>
442
260
  <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-yes">2x</span>
444
- <span class="cline-any cline-yes">2x</span>
261
+ <span class="cline-any cline-yes">1x</span>
445
262
  <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-yes">1x</span>
264
+ <span class="cline-any cline-no">&nbsp;</span>
446
265
  <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-yes">34x</span>
448
266
  <span class="cline-any cline-yes">1x</span>
449
267
  <span class="cline-any cline-yes">1x</span>
268
+ <span class="cline-any cline-no">&nbsp;</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
270
  <span class="cline-any cline-yes">1x</span>
451
271
  <span class="cline-any cline-neutral">&nbsp;</span>
452
272
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../../db")
453
- const linkRows = require("../../../db/linkedRows")
273
+ const internal = require("./internal")
274
+ const external = require("./external")
454
275
  const csvParser = require("../../../utilities/csvParser")
276
+ const { isExternalTable } = require("../../../integrations/utils")
455
277
  const {
456
- getRowParams,
457
278
  getTableParams,
458
- generateTableID,
459
279
  getDatasourceParams,
460
280
  BudibaseInternalDB,
461
281
  } = require("../../../db/utils")
462
- const { FieldTypes } = require("../../../constants")
463
- const { TableSaveFunctions, getTable } = require("./utils")
282
+ const { getTable } = require("./utils")
283
+ &nbsp;
284
+ function pickApi({ tableId, table }) {
285
+ if (table &amp;&amp; !tableId) {
286
+ tableId = table._id
287
+ }
288
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (table &amp;&amp; table.type === "external") {
289
+ <span class="cstat-no" title="statement not covered" > return external</span>
290
+ } else <span class="missing-if-branch" title="if path not taken" >I</span>if (tableId &amp;&amp; isExternalTable(tableId)) {
291
+ <span class="cstat-no" title="statement not covered" > return external</span>
292
+ }
293
+ return internal
294
+ }
464
295
  &nbsp;
296
+ // covers both internal and external
465
297
  exports.fetch = async function (ctx) {
466
298
  const db = new CouchDB(ctx.appId)
467
299
  &nbsp;
@@ -501,148 +333,46 @@ exports.find = async function (ctx) {
501
333
  &nbsp;
502
334
  exports.save = async function (ctx) {
503
335
  const appId = ctx.appId
504
- const db = new CouchDB(appId)
505
- const { dataImport, ...rest } = ctx.request.body
506
- let tableToSave = {
507
- type: "table",
508
- _id: generateTableID(),
509
- views: {},
510
- ...rest,
511
- }
512
- &nbsp;
513
- // if the table obj had an _id then it will have been retrieved
514
- let oldTable
515
- if (ctx.request.body &amp;&amp; ctx.request.body._id) {
516
- oldTable = await db.get(ctx.request.body._id)
517
- }
518
- &nbsp;
519
- // saving a table is a complex operation, involving many different steps, this
520
- // has been broken out into a utility to make it more obvious/easier to manipulate
521
- const tableSaveFunctions = new TableSaveFunctions({
522
- db,
523
- ctx,
524
- oldTable,
525
- dataImport,
526
- })
527
- tableToSave = await tableSaveFunctions.before(tableToSave)
528
- &nbsp;
529
- // make sure that types don't change of a column, have to remove
530
- // the column if you want to change the type
531
- if (oldTable &amp;&amp; oldTable.schema) {
532
- for (let propKey of Object.keys(tableToSave.schema)) {
533
- let column = tableToSave.schema[propKey]
534
- let oldColumn = oldTable.schema[propKey]
535
- <span class="missing-if-branch" title="if path not taken" >I</span>if (oldColumn &amp;&amp; oldColumn.type === "internal") {
536
- <span class="cstat-no" title="statement not covered" > oldColumn.type = "auto"</span>
537
- }
538
- <span class="missing-if-branch" title="if path not taken" >I</span>if (oldColumn &amp;&amp; oldColumn.type !== column.type) {
539
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Cannot change the type of a column")</span>
540
- }
541
- }
542
- }
543
- &nbsp;
544
- // Don't rename if the name is the same
545
- let { _rename } = tableToSave
546
- /* istanbul ignore next */
547
- if (_rename &amp;&amp; _rename.old === _rename.updated) {
548
- _rename = null
549
- delete tableToSave._rename
550
- }
551
- &nbsp;
552
- // rename row fields when table column is renamed
553
- /* istanbul ignore next */
554
- if (_rename &amp;&amp; tableToSave.schema[_rename.updated].type === FieldTypes.LINK) {
555
- ctx.throw(400, "Cannot rename a linked column.")
556
- }
557
- &nbsp;
558
- tableToSave = await tableSaveFunctions.mid(tableToSave)
559
- &nbsp;
560
- // update schema of non-statistics views when new columns are added
561
- for (let view in tableToSave.views) {
562
- const tableView = <span class="cstat-no" title="statement not covered" >tableToSave.views[view]</span>
563
- <span class="cstat-no" title="statement not covered" > if (!tableView) <span class="cstat-no" title="statement not covered" >continue</span></span>
564
- &nbsp;
565
- <span class="cstat-no" title="statement not covered" > if (tableView.schema.group || tableView.schema.field) <span class="cstat-no" title="statement not covered" >continue</span></span>
566
- <span class="cstat-no" title="statement not covered" > tableView.schema = tableToSave.schema</span>
567
- }
568
- &nbsp;
569
- // update linked rows
570
- try {
571
- const linkResp = await linkRows.updateLinks({
572
- appId,
573
- eventType: oldTable
574
- ? linkRows.EventType.TABLE_UPDATED
575
- : linkRows.EventType.TABLE_SAVE,
576
- table: tableToSave,
577
- oldTable: oldTable,
578
- })
579
- if (linkResp != null &amp;&amp; linkResp._rev) {
580
- tableToSave._rev = linkResp._rev
581
- }
582
- } catch (err) {
583
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, err)</span>
584
- }
585
- &nbsp;
586
- // don't perform any updates until relationships have been
587
- // checked by the updateLinks function
588
- const updatedRows = tableSaveFunctions.getUpdatedRows()
589
- if (updatedRows &amp;&amp; updatedRows.length !== 0) {
590
- await db.bulkDocs(updatedRows)
591
- }
592
- const result = await db.put(tableToSave)
593
- tableToSave._rev = result.rev
594
- &nbsp;
595
- tableToSave = await tableSaveFunctions.after(tableToSave)
596
- &nbsp;
597
- ctx.eventEmitter &amp;&amp;
598
- ctx.eventEmitter.emitTable(`table:save`, appId, tableToSave)
599
- &nbsp;
336
+ const table = ctx.request.body
337
+ const savedTable = await pickApi({ table }).save(ctx)
600
338
  ctx.status = 200
601
- ctx.message = `Table ${ctx.request.body.name} saved successfully.`
602
- ctx.body = tableToSave
339
+ ctx.message = `Table ${table.name} saved successfully.`
340
+ ctx.eventEmitter &amp;&amp;
341
+ ctx.eventEmitter.emitTable(`table:save`, appId, savedTable)
342
+ ctx.body = savedTable
603
343
  }
604
344
  &nbsp;
605
345
  exports.destroy = async function (ctx) {
606
346
  const appId = ctx.appId
607
- const db = new CouchDB(appId)
608
- const tableToDelete = await db.get(ctx.params.tableId)
609
- &nbsp;
610
- // Delete all rows for that table
611
- const rows = await db.allDocs(
612
- getRowParams(ctx.params.tableId, null, {
613
- include_docs: true,
614
- })
615
- )
616
- await db.bulkDocs(rows.rows.map(<span class="fstat-no" title="function not covered" >ro</span>w =&gt; (<span class="cstat-no" title="statement not covered" >{ ...row.doc, _deleted: true })</span>))
617
- &nbsp;
618
- // update linked rows
619
- await linkRows.updateLinks({
620
- appId,
621
- eventType: linkRows.EventType.TABLE_DELETE,
622
- table: tableToDelete,
623
- })
624
- &nbsp;
625
- // don't remove the table itself until very end
626
- await db.remove(tableToDelete)
627
- &nbsp;
628
- // remove table search index
629
- const currentIndexes = await db.getIndexes()
630
- const existingIndex = currentIndexes.indexes.find(
631
- existing =&gt; existing.name === `search:${ctx.params.tableId}`
632
- )
633
- <span class="missing-if-branch" title="if path not taken" >I</span>if (existingIndex) {
634
- <span class="cstat-no" title="statement not covered" > await db.deleteIndex(existingIndex)</span>
635
- }
636
- &nbsp;
347
+ const tableId = ctx.params.tableId
348
+ const deletedTable = await pickApi({ tableId }).destroy(ctx)
637
349
  ctx.eventEmitter &amp;&amp;
638
- ctx.eventEmitter.emitTable(`table:delete`, appId, tableToDelete)
350
+ ctx.eventEmitter.emitTable(`table:delete`, appId, deletedTable)
639
351
  ctx.status = 200
640
- ctx.body = { message: `Table ${ctx.params.tableId} deleted.` }
352
+ ctx.body = { message: `Table ${tableId} deleted.` }
353
+ }
354
+ &nbsp;
355
+ exports.bulkImport = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
356
+ const tableId = <span class="cstat-no" title="statement not covered" >ctx.params.tableId</span>
357
+ <span class="cstat-no" title="statement not covered" > await pickApi({ tableId }).bulkImport(ctx)</span>
358
+ // right now we don't trigger anything for bulk import because it
359
+ // can only be done in the builder, but in the future we may need to
360
+ // think about events for bulk items
361
+ <span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
362
+ <span class="cstat-no" title="statement not covered" > ctx.body = { message: `Bulk rows created.` }</span>
641
363
  }
642
364
  &nbsp;
643
365
  exports.validateCSVSchema = async function (ctx) {
644
- const { csvString, schema = {} } = ctx.request.body
645
- const result = await csvParser.parse(csvString, schema)
366
+ // tableId being specified means its an import to an existing table
367
+ const { csvString, schema = {}, tableId } = ctx.request.body
368
+ let existingTable
369
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (tableId) {
370
+ <span class="cstat-no" title="statement not covered" > existingTable = await getTable(ctx.appId, tableId)</span>
371
+ }
372
+ let result = await csvParser.parse(csvString, schema)
373
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (existingTable) {
374
+ <span class="cstat-no" title="statement not covered" > result = csvParser.updateSchema({ schema: result, existingTable })</span>
375
+ }
646
376
  ctx.body = { schema: result }
647
377
  }
648
378
  &nbsp;</pre></td></tr></table></pre>
@@ -652,7 +382,7 @@ exports.validateCSVSchema = async function (ctx) {
652
382
  <div class='footer quiet pad2 space-top1 center small'>
653
383
  Code coverage generated by
654
384
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
655
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
385
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
656
386
  </div>
657
387
  </div>
658
388
  <script src="../../../prettify.js"></script>