@budibase/server 0.9.184 → 0.9.185-alpha.11

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 (290) hide show
  1. package/Dockerfile +1 -1
  2. package/__mocks__/mssql.ts +1 -1
  3. package/__mocks__/pg.ts +3 -0
  4. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  5. package/builder/assets/index.053c6f7a.js +1321 -0
  6. package/builder/assets/index.4a7c5636.css +1 -0
  7. package/builder/assets/vendor.470042a4.js +152 -0
  8. package/builder/assets/vendor.5e1fe644.css +1 -0
  9. package/builder/index.html +4 -4
  10. package/coverage/clover.xml +1357 -959
  11. package/coverage/coverage-final.json +91 -87
  12. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  13. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  14. package/coverage/lcov-report/api/controllers/application.js.html +65 -14
  15. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  16. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  17. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  20. package/coverage/lcov-report/api/controllers/datasource.js.html +147 -27
  21. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  22. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  23. package/coverage/lcov-report/api/controllers/index.html +90 -90
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +3 -3
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  27. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  28. package/coverage/lcov-report/api/controllers/query.js.html +53 -209
  29. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  30. package/coverage/lcov-report/api/controllers/routing.js.html +3 -3
  31. package/coverage/lcov-report/api/controllers/row/external.js.html +12 -6
  32. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  33. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  34. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  35. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  37. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  38. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  39. package/coverage/lcov-report/api/controllers/table/external.js.html +980 -0
  40. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  41. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  42. package/coverage/lcov-report/api/controllers/table/internal.js.html +545 -0
  43. package/coverage/lcov-report/api/controllers/table/utils.js.html +172 -49
  44. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  45. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  46. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.html +9 -9
  48. package/coverage/lcov-report/api/controllers/view/index.js.html +5 -5
  49. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  50. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  51. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  52. package/coverage/lcov-report/api/index.html +1 -1
  53. package/coverage/lcov-report/api/index.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  65. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/index.html +4 -4
  67. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  73. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/table.js.html +35 -2
  80. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  82. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  84. package/coverage/lcov-report/automations/actions.js.html +2 -2
  85. package/coverage/lcov-report/automations/automationUtils.js.html +3 -3
  86. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  87. package/coverage/lcov-report/automations/index.html +33 -48
  88. package/coverage/lcov-report/automations/index.js.html +2 -2
  89. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  94. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  96. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/index.html +14 -14
  98. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  100. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  101. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  106. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  108. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  111. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  116. package/coverage/lcov-report/automations/utils.js.html +42 -12
  117. package/coverage/lcov-report/constants/index.html +5 -5
  118. package/coverage/lcov-report/constants/index.js.html +49 -4
  119. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  120. package/coverage/lcov-report/constants/screens.js.html +1 -1
  121. package/coverage/lcov-report/db/client.js.html +2 -2
  122. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  123. package/coverage/lcov-report/db/index.html +2 -2
  124. package/coverage/lcov-report/db/index.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  126. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  127. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  128. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  129. package/coverage/lcov-report/db/newid.js.html +1 -1
  130. package/coverage/lcov-report/db/utils.js.html +1 -1
  131. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  132. package/coverage/lcov-report/events/index.html +6 -6
  133. package/coverage/lcov-report/events/index.js.html +1 -1
  134. package/coverage/lcov-report/events/utils.js.html +5 -5
  135. package/coverage/lcov-report/index.html +98 -83
  136. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  137. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  138. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  139. package/coverage/lcov-report/middleware/authorized.js.html +11 -8
  140. package/coverage/lcov-report/middleware/builder.js.html +16 -7
  141. package/coverage/lcov-report/middleware/currentapp.js.html +6 -6
  142. package/coverage/lcov-report/middleware/index.html +23 -23
  143. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  144. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  145. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  146. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  147. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  148. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +83 -32
  149. package/coverage/lcov-report/threads/index.html +141 -0
  150. package/coverage/lcov-report/threads/index.js.html +260 -0
  151. package/coverage/lcov-report/threads/query.js.html +269 -0
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
  156. package/coverage/lcov-report/utilities/global.js.html +26 -11
  157. package/coverage/lcov-report/utilities/index.html +49 -49
  158. package/coverage/lcov-report/utilities/index.js.html +65 -17
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +30 -9
  160. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  167. package/coverage/lcov-report/utilities/security.js.html +3 -3
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/users.js.html +1 -1
  170. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  171. package/coverage/lcov.info +2301 -1599
  172. package/dist/api/controllers/application.js +16 -2
  173. package/dist/api/controllers/auth.js +3 -3
  174. package/dist/api/controllers/datasource.js +47 -16
  175. package/dist/api/controllers/deploy/index.js +2 -0
  176. package/dist/api/controllers/dev.js +4 -1
  177. package/dist/api/controllers/query.js +30 -58
  178. package/dist/api/controllers/row/ExternalRequest.js +37 -14
  179. package/dist/api/controllers/row/external.js +1 -0
  180. package/dist/api/controllers/row/utils.js +6 -12
  181. package/dist/api/controllers/static/index.js +1 -1
  182. package/dist/api/controllers/table/external.js +242 -0
  183. package/dist/api/controllers/table/index.js +49 -123
  184. package/dist/api/controllers/table/internal.js +150 -0
  185. package/dist/api/controllers/table/utils.js +62 -28
  186. package/dist/api/controllers/user.js +123 -11
  187. package/dist/api/routes/query.js +1 -1
  188. package/dist/api/routes/table.js +7 -1
  189. package/dist/api/routes/user.js +2 -1
  190. package/dist/app.js +2 -11
  191. package/dist/automations/bullboard.js +37 -10
  192. package/dist/automations/triggers.js +7 -3
  193. package/dist/automations/utils.js +11 -2
  194. package/dist/constants/index.js +13 -0
  195. package/dist/definitions/datasource.js +4 -0
  196. package/dist/integrations/base/IntegrationBase.js +2 -0
  197. package/dist/integrations/base/datasourcePlus.js +2 -0
  198. package/dist/integrations/base/sql.js +334 -180
  199. package/dist/integrations/base/sqlTable.js +143 -0
  200. package/dist/integrations/base/utils.js +30 -0
  201. package/dist/integrations/microsoftSqlServer.js +117 -9
  202. package/dist/integrations/mysql.js +14 -84
  203. package/dist/integrations/postgres.js +35 -28
  204. package/dist/integrations/utils.js +56 -9
  205. package/dist/middleware/authorized.js +2 -1
  206. package/dist/middleware/builder.js +4 -1
  207. package/dist/package.json +7 -6
  208. package/dist/tests/utilities/TestConfiguration.js +2 -1
  209. package/dist/{automations/thread.js → threads/automation.js} +23 -7
  210. package/dist/threads/index.js +58 -0
  211. package/dist/threads/query.js +61 -0
  212. package/dist/tsconfig.tsbuildinfo +1 -1
  213. package/dist/utilities/csvParser.js +46 -5
  214. package/dist/utilities/global.js +6 -2
  215. package/dist/utilities/index.js +18 -2
  216. package/dist/utilities/queue/inMemoryQueue.js +8 -0
  217. package/dist/utilities/scriptRunner.js +4 -1
  218. package/package.json +8 -7
  219. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  220. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  221. package/scripts/integrations/mssql/data/setup.sql +54 -0
  222. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  223. package/scripts/integrations/mssql/reset.sh +3 -0
  224. package/scripts/likeCypress.ts +33 -0
  225. package/src/api/controllers/application.js +19 -2
  226. package/src/api/controllers/auth.js +3 -0
  227. package/src/api/controllers/datasource.js +56 -16
  228. package/src/api/controllers/deploy/index.js +2 -0
  229. package/src/api/controllers/dev.js +4 -1
  230. package/src/api/controllers/query.js +29 -81
  231. package/src/api/controllers/row/ExternalRequest.ts +47 -16
  232. package/src/api/controllers/row/external.js +2 -0
  233. package/src/api/controllers/row/utils.js +8 -11
  234. package/src/api/controllers/static/index.js +1 -1
  235. package/src/api/controllers/table/external.js +300 -0
  236. package/src/api/controllers/table/index.js +47 -137
  237. package/src/api/controllers/table/internal.js +155 -0
  238. package/src/api/controllers/table/utils.js +74 -33
  239. package/src/api/controllers/user.js +132 -13
  240. package/src/api/routes/query.js +1 -0
  241. package/src/api/routes/table.js +11 -0
  242. package/src/api/routes/tests/datasource.spec.js +2 -2
  243. package/src/api/routes/tests/misc.spec.js +5 -1
  244. package/src/api/routes/tests/query.spec.js +0 -1
  245. package/src/api/routes/user.js +5 -0
  246. package/src/app.ts +2 -10
  247. package/src/automations/bullboard.js +28 -11
  248. package/src/automations/tests/automation.spec.js +3 -4
  249. package/src/automations/triggers.js +7 -3
  250. package/src/automations/utils.js +12 -2
  251. package/src/constants/index.js +15 -0
  252. package/src/definitions/common.ts +7 -1
  253. package/src/definitions/datasource.ts +9 -3
  254. package/src/integrations/airtable.ts +2 -1
  255. package/src/integrations/arangodb.ts +2 -1
  256. package/src/integrations/base/IntegrationBase.ts +6 -0
  257. package/src/integrations/base/datasourcePlus.ts +9 -0
  258. package/src/integrations/base/sql.ts +359 -222
  259. package/src/integrations/base/sqlTable.ts +180 -0
  260. package/src/integrations/base/utils.ts +22 -0
  261. package/src/integrations/couchdb.ts +2 -1
  262. package/src/integrations/dynamodb.ts +2 -1
  263. package/src/integrations/elasticsearch.ts +2 -1
  264. package/src/integrations/microsoftSqlServer.ts +145 -13
  265. package/src/integrations/mongodb.ts +2 -1
  266. package/src/integrations/mysql.ts +20 -94
  267. package/src/integrations/postgres.ts +45 -35
  268. package/src/integrations/rest.ts +2 -1
  269. package/src/integrations/s3.ts +2 -1
  270. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  271. package/src/integrations/tests/postgres.spec.js +4 -0
  272. package/src/integrations/utils.ts +60 -8
  273. package/src/middleware/authorized.js +2 -1
  274. package/src/middleware/builder.js +4 -1
  275. package/src/tests/utilities/TestConfiguration.js +2 -1
  276. package/src/{automations/thread.js → threads/automation.js} +24 -7
  277. package/src/threads/index.js +60 -0
  278. package/src/threads/query.js +63 -0
  279. package/src/utilities/csvParser.js +48 -5
  280. package/src/utilities/global.js +7 -2
  281. package/src/utilities/index.js +18 -2
  282. package/src/utilities/queue/inMemoryQueue.js +7 -0
  283. package/src/utilities/scriptRunner.js +4 -1
  284. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  285. package/src/utilities/tests/csvParser.spec.js +3 -0
  286. package/tsconfig.json +1 -1
  287. package/builder/assets/index.34964222.js +0 -201
  288. package/builder/assets/index.7469e1e4.css +0 -29
  289. package/builder/assets/vendor.278a305c.js +0 -9
  290. package/builder/assets/vendor.d75d5eb7.css +0 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">84.21% </span>
26
+ <span class="strong">37.37% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>32/38</span>
28
+ <span class='fraction'>37/99</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/0</span>
35
+ <span class='fraction'>0/31</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">62.5% </span>
40
+ <span class="strong">35.71% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>5/8</span>
42
+ <span class='fraction'>5/14</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">86.49% </span>
47
+ <span class="strong">37.75% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>32/37</span>
49
+ <span class='fraction'>37/98</span>
50
50
  </div>
51
51
 
52
52
 
@@ -55,7 +55,7 @@
55
55
  Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
56
  </p>
57
57
  </div>
58
- <div class='status-line high'></div>
58
+ <div class='status-line low'></div>
59
59
  <pre><table class="coverage">
60
60
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
61
  <a name='L2'></a><a href='#L2'>2</a>
@@ -135,7 +135,126 @@
135
135
  <a name='L76'></a><a href='#L76'>76</a>
136
136
  <a name='L77'></a><a href='#L77'>77</a>
137
137
  <a name='L78'></a><a href='#L78'>78</a>
138
- <a name='L79'></a><a href='#L79'>79</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
138
+ <a name='L79'></a><a href='#L79'>79</a>
139
+ <a name='L80'></a><a href='#L80'>80</a>
140
+ <a name='L81'></a><a href='#L81'>81</a>
141
+ <a name='L82'></a><a href='#L82'>82</a>
142
+ <a name='L83'></a><a href='#L83'>83</a>
143
+ <a name='L84'></a><a href='#L84'>84</a>
144
+ <a name='L85'></a><a href='#L85'>85</a>
145
+ <a name='L86'></a><a href='#L86'>86</a>
146
+ <a name='L87'></a><a href='#L87'>87</a>
147
+ <a name='L88'></a><a href='#L88'>88</a>
148
+ <a name='L89'></a><a href='#L89'>89</a>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a>
153
+ <a name='L94'></a><a href='#L94'>94</a>
154
+ <a name='L95'></a><a href='#L95'>95</a>
155
+ <a name='L96'></a><a href='#L96'>96</a>
156
+ <a name='L97'></a><a href='#L97'>97</a>
157
+ <a name='L98'></a><a href='#L98'>98</a>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
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>
257
+ <a name='L198'></a><a href='#L198'>198</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
139
258
  <span class="cline-any cline-neutral">&nbsp;</span>
140
259
  <span class="cline-any cline-neutral">&nbsp;</span>
141
260
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -143,25 +262,142 @@
143
262
  <span class="cline-any cline-yes">34x</span>
144
263
  <span class="cline-any cline-yes">34x</span>
145
264
  <span class="cline-any cline-yes">34x</span>
265
+ <span class="cline-any cline-yes">34x</span>
266
+ <span class="cline-any cline-yes">34x</span>
267
+ <span class="cline-any cline-yes">34x</span>
268
+ <span class="cline-any cline-yes">34x</span>
269
+ <span class="cline-any cline-yes">34x</span>
146
270
  <span class="cline-any cline-neutral">&nbsp;</span>
147
271
  <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-yes">2x</span>
148
273
  <span class="cline-any cline-neutral">&nbsp;</span>
149
- <span class="cline-any cline-yes">1x</span>
150
- <span class="cline-any cline-yes">1x</span>
151
- <span class="cline-any cline-yes">1x</span>
152
- <span class="cline-any cline-yes">1x</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-no">&nbsp;</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-no">&nbsp;</span>
284
+ <span class="cline-any cline-no">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-no">&nbsp;</span>
287
+ <span class="cline-any cline-no">&nbsp;</span>
288
+ <span class="cline-any cline-no">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-no">&nbsp;</span>
294
+ <span class="cline-any cline-no">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-no">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-no">&nbsp;</span>
301
+ <span class="cline-any cline-no">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-no">&nbsp;</span>
153
307
  <span class="cline-any cline-neutral">&nbsp;</span>
154
308
  <span class="cline-any cline-neutral">&nbsp;</span>
155
309
  <span class="cline-any cline-yes">34x</span>
156
- <span class="cline-any cline-yes">2x</span>
157
- <span class="cline-any cline-yes">2x</span>
158
- <span class="cline-any cline-yes">2x</span>
159
310
  <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-no">&nbsp;</span>
312
+ <span class="cline-any cline-no">&nbsp;</span>
160
313
  <span class="cline-any cline-neutral">&nbsp;</span>
161
314
  <span class="cline-any cline-neutral">&nbsp;</span>
162
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
163
321
  <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-yes">34x</span>
327
+ <span class="cline-any cline-no">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-no">&nbsp;</span>
331
+ <span class="cline-any cline-no">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-no">&nbsp;</span>
334
+ <span class="cline-any cline-no">&nbsp;</span>
335
+ <span class="cline-any cline-no">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-no">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-no">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-no">&nbsp;</span>
343
+ <span class="cline-any cline-no">&nbsp;</span>
344
+ <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-no">&nbsp;</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
164
352
  <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-no">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-no">&nbsp;</span>
359
+ <span class="cline-any cline-no">&nbsp;</span>
360
+ <span class="cline-any cline-no">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-no">&nbsp;</span>
363
+ <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
+ <span class="cline-any cline-no">&nbsp;</span>
372
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-no">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-no">&nbsp;</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-neutral">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</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>
388
+ <span class="cline-any cline-no">&nbsp;</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-no">&nbsp;</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-yes">34x</span>
398
+ <span class="cline-any cline-yes">2x</span>
399
+ <span class="cline-any cline-yes">2x</span>
400
+ <span class="cline-any cline-yes">2x</span>
165
401
  <span class="cline-any cline-yes">2x</span>
166
402
  <span class="cline-any cline-yes">2x</span>
167
403
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -190,6 +426,8 @@
190
426
  <span class="cline-any cline-yes">1x</span>
191
427
  <span class="cline-any cline-yes">1x</span>
192
428
  <span class="cline-any cline-yes">1x</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-yes">1x</span>
193
431
  <span class="cline-any cline-yes">1x</span>
194
432
  <span class="cline-any cline-neutral">&nbsp;</span>
195
433
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -219,27 +457,144 @@ const {
219
457
  getUserMetadataParams,
220
458
  } = require("../../db/utils")
221
459
  const { InternalTables } = require("../../db/utils")
222
- const { getGlobalUsers } = require("../../utilities/global")
460
+ const { getGlobalUsers, getRawGlobalUser } = require("../../utilities/global")
223
461
  const { getFullUser } = require("../../utilities/users")
462
+ const { isEqual } = require("lodash")
463
+ const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
464
+ const { getDevelopmentAppID, getDeployedAppIDs } = require("@budibase/auth/db")
465
+ const { doesDatabaseExist } = require("../../utilities")
466
+ const { UserStatus } = require("@budibase/auth/constants")
224
467
  &nbsp;
225
- function removeGlobalProps(user) {
226
- // make sure to always remove some of the global user props
227
- delete user.password
228
- delete user.roles
229
- delete user.builder
230
- return user
231
- }
232
- &nbsp;
233
- exports.fetchMetadata = async function (ctx) {
234
- const database = new CouchDB(ctx.appId)
235
- const global = await getGlobalUsers(ctx.appId)
236
- const metadata = (
237
- await database.allDocs(
468
+ async function rawMetadata(db) {
469
+ return (
470
+ await db.allDocs(
238
471
  getUserMetadataParams(null, {
239
472
  include_docs: true,
240
473
  })
241
474
  )
242
475
  ).rows.map(<span class="fstat-no" title="function not covered" >ro</span>w =&gt; <span class="cstat-no" title="statement not covered" >row.doc)</span>
476
+ }
477
+ &nbsp;
478
+ function <span class="fstat-no" title="function not covered" >combineMetadataAndUser(</span>user, metadata) {
479
+ // skip users with no access
480
+ <span class="cstat-no" title="statement not covered" > if (user.roleId === BUILTIN_ROLE_IDS.PUBLIC) {</span>
481
+ <span class="cstat-no" title="statement not covered" > return null</span>
482
+ }
483
+ <span class="cstat-no" title="statement not covered" > delete user._rev</span>
484
+ const metadataId = <span class="cstat-no" title="statement not covered" >generateUserMetadataID(user._id)</span>
485
+ const newDoc = <span class="cstat-no" title="statement not covered" >{</span>
486
+ ...user,
487
+ _id: metadataId,
488
+ tableId: InternalTables.USER_METADATA,
489
+ }
490
+ const found = <span class="cstat-no" title="statement not covered" >Array.isArray(metadata)</span>
491
+ ? metadata.find(<span class="fstat-no" title="function not covered" >do</span>c =&gt; <span class="cstat-no" title="statement not covered" >doc._id === metadataId)</span>
492
+ : metadata
493
+ // copy rev over for the purposes of equality check
494
+ <span class="cstat-no" title="statement not covered" > if (found) {</span>
495
+ <span class="cstat-no" title="statement not covered" > newDoc._rev = found._rev</span>
496
+ }
497
+ <span class="cstat-no" title="statement not covered" > if (found == null || !isEqual(newDoc, found)) {</span>
498
+ <span class="cstat-no" title="statement not covered" > return {</span>
499
+ ...found,
500
+ ...newDoc,
501
+ }
502
+ }
503
+ <span class="cstat-no" title="statement not covered" > return null</span>
504
+ }
505
+ &nbsp;
506
+ exports.syncGlobalUsers = <span class="fstat-no" title="function not covered" >as</span>ync appId =&gt; {
507
+ // sync user metadata
508
+ const db = <span class="cstat-no" title="statement not covered" >new CouchDB(appId)</span>
509
+ const [users, metadata] = <span class="cstat-no" title="statement not covered" >await Promise.all([</span>
510
+ getGlobalUsers(appId),
511
+ rawMetadata(db),
512
+ ])
513
+ const toWrite = <span class="cstat-no" title="statement not covered" >[]</span>
514
+ <span class="cstat-no" title="statement not covered" > for (let user of users) {</span>
515
+ const combined = <span class="cstat-no" title="statement not covered" >await combineMetadataAndUser(user, metadata)</span>
516
+ <span class="cstat-no" title="statement not covered" > if (combined) {</span>
517
+ <span class="cstat-no" title="statement not covered" > toWrite.push(combined)</span>
518
+ }
519
+ }
520
+ <span class="cstat-no" title="statement not covered" > await db.bulkDocs(toWrite)</span>
521
+ }
522
+ &nbsp;
523
+ exports.syncUser = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
524
+ let deleting = <span class="cstat-no" title="statement not covered" >false,</span>
525
+ user
526
+ const userId = <span class="cstat-no" title="statement not covered" >ctx.params.id</span>
527
+ <span class="cstat-no" title="statement not covered" > try {</span>
528
+ <span class="cstat-no" title="statement not covered" > user = await getRawGlobalUser(userId)</span>
529
+ } catch (err) {
530
+ <span class="cstat-no" title="statement not covered" > if (err &amp;&amp; err.status === 404) {</span>
531
+ <span class="cstat-no" title="statement not covered" > user = {}</span>
532
+ <span class="cstat-no" title="statement not covered" > deleting = true</span>
533
+ } else {
534
+ <span class="cstat-no" title="statement not covered" > throw err</span>
535
+ }
536
+ }
537
+ const roles = <span class="cstat-no" title="statement not covered" >user.roles</span>
538
+ // remove props which aren't useful to metadata
539
+ <span class="cstat-no" title="statement not covered" > delete user.password</span>
540
+ <span class="cstat-no" title="statement not covered" > delete user.forceResetPassword</span>
541
+ <span class="cstat-no" title="statement not covered" > delete user.roles</span>
542
+ // run through all production appIDs in the users roles
543
+ let prodAppIds
544
+ // if they are a builder then get all production app IDs
545
+ <span class="cstat-no" title="statement not covered" > if ((user.builder &amp;&amp; user.builder.global) || deleting) {</span>
546
+ <span class="cstat-no" title="statement not covered" > prodAppIds = await getDeployedAppIDs(CouchDB)</span>
547
+ } else {
548
+ <span class="cstat-no" title="statement not covered" > prodAppIds = Object.entries(roles)</span>
549
+ .filter(<span class="fstat-no" title="function not covered" >en</span>try =&gt; <span class="cstat-no" title="statement not covered" >entry[1] !== BUILTIN_ROLE_IDS.PUBLIC)</span>
550
+ .map(<span class="fstat-no" title="function not covered" >([</span>appId]) =&gt; <span class="cstat-no" title="statement not covered" >appId)</span>
551
+ }
552
+ <span class="cstat-no" title="statement not covered" > for (let prodAppId of prodAppIds) {</span>
553
+ const roleId = <span class="cstat-no" title="statement not covered" >roles[prodAppId]</span>
554
+ const devAppId = <span class="cstat-no" title="statement not covered" >getDevelopmentAppID(prodAppId)</span>
555
+ <span class="cstat-no" title="statement not covered" > for (let appId of [prodAppId, devAppId]) {</span>
556
+ <span class="cstat-no" title="statement not covered" > if (!(await doesDatabaseExist(appId))) {</span>
557
+ <span class="cstat-no" title="statement not covered" > continue</span>
558
+ }
559
+ const db = <span class="cstat-no" title="statement not covered" >new CouchDB(appId)</span>
560
+ const metadataId = <span class="cstat-no" title="statement not covered" >generateUserMetadataID(userId)</span>
561
+ let metadata
562
+ <span class="cstat-no" title="statement not covered" > try {</span>
563
+ <span class="cstat-no" title="statement not covered" > metadata = await db.get(metadataId)</span>
564
+ } catch (err) {
565
+ <span class="cstat-no" title="statement not covered" > if (deleting) {</span>
566
+ <span class="cstat-no" title="statement not covered" > continue</span>
567
+ }
568
+ <span class="cstat-no" title="statement not covered" > metadata = {</span>
569
+ tableId: InternalTables.USER_METADATA,
570
+ }
571
+ }
572
+ // assign the roleId for the metadata doc
573
+ <span class="cstat-no" title="statement not covered" > if (roleId) {</span>
574
+ <span class="cstat-no" title="statement not covered" > metadata.roleId = roleId</span>
575
+ }
576
+ let combined = <span class="cstat-no" title="statement not covered" >!deleting</span>
577
+ ? combineMetadataAndUser(user, metadata)
578
+ : {
579
+ ...metadata,
580
+ status: UserStatus.INACTIVE,
581
+ metadata: BUILTIN_ROLE_IDS.PUBLIC,
582
+ }
583
+ // if its null then there was no updates required
584
+ <span class="cstat-no" title="statement not covered" > if (combined) {</span>
585
+ <span class="cstat-no" title="statement not covered" > await db.put(combined)</span>
586
+ }
587
+ }
588
+ }
589
+ <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
590
+ message: "User synced.",
591
+ }
592
+ }
593
+ &nbsp;
594
+ exports.fetchMetadata = async function (ctx) {
595
+ const database = new CouchDB(ctx.appId)
596
+ const global = await getGlobalUsers(ctx.appId)
597
+ const metadata = await rawMetadata(database)
243
598
  const users = []
244
599
  for (let user of global) {
245
600
  // find the metadata that matches up to the global ID
@@ -267,7 +622,9 @@ exports.updateSelfMetadata = <span class="fstat-no" title="function not covered"
267
622
  exports.updateMetadata = async function (ctx) {
268
623
  const appId = ctx.appId
269
624
  const db = new CouchDB(appId)
270
- const user = removeGlobalProps(ctx.request.body)
625
+ const user = ctx.request.body
626
+ // this isn't applicable to the user
627
+ delete user.roles
271
628
  const metadata = {
272
629
  tableId: InternalTables.USER_METADATA,
273
630
  ...user,
@@ -298,7 +655,7 @@ exports.findMetadata = async function (ctx) {
298
655
  <div class='footer quiet pad2 space-top1 center small'>
299
656
  Code coverage generated by
300
657
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
301
- at Thu Nov 11 2021 11:32:22 GMT+0000 (Coordinated Universal Time)
658
+ at Mon Nov 22 2021 10:23:31 GMT+0000 (Coordinated Universal Time)
302
659
  </div>
303
660
  </div>
304
661
  <script src="../../prettify.js"></script>
@@ -118,7 +118,7 @@ exports.json = function (headers, rows) {
118
118
  <div class='footer quiet pad2 space-top1 center small'>
119
119
  Code coverage generated by
120
120
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
121
- at Thu Nov 11 2021 11:32:22 GMT+0000 (Coordinated Universal Time)
121
+ at Mon Nov 22 2021 10:23:31 GMT+0000 (Coordinated Universal Time)
122
122
  </div>
123
123
  </div>
124
124
  <script src="../../../prettify.js"></script>
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">62.34% </span>
33
+ <span class="strong">62.33% </span>
34
34
  <span class="quiet">Branches</span>
35
35
  <span class='fraction'>48/77</span>
36
36
  </div>
@@ -89,10 +89,10 @@
89
89
 
90
90
  <tr>
91
91
  <td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
92
- <td data-value="92.73" class="pic high">
92
+ <td data-value="92.72" class="pic high">
93
93
  <div class="chart"><div class="cover-fill" style="width: 92%"></div><div class="cover-empty" style="width: 8%"></div></div>
94
94
  </td>
95
- <td data-value="92.73" class="pct high">92.73%</td>
95
+ <td data-value="92.72" class="pct high">92.72%</td>
96
96
  <td data-value="55" class="abs high">51/55</td>
97
97
  <td data-value="68.42" class="pct medium">68.42%</td>
98
98
  <td data-value="19" class="abs medium">13/19</td>
@@ -109,9 +109,9 @@
109
109
  </td>
110
110
  <td data-value="50" class="pct medium">50%</td>
111
111
  <td data-value="76" class="abs medium">38/76</td>
112
- <td data-value="34.62" class="pct low">34.62%</td>
112
+ <td data-value="34.61" class="pct low">34.61%</td>
113
113
  <td data-value="26" class="abs low">9/26</td>
114
- <td data-value="66.67" class="pct medium">66.67%</td>
114
+ <td data-value="66.66" class="pct medium">66.66%</td>
115
115
  <td data-value="9" class="abs medium">6/9</td>
116
116
  <td data-value="50" class="pct medium">50%</td>
117
117
  <td data-value="76" class="abs medium">38/76</td>
@@ -119,16 +119,16 @@
119
119
 
120
120
  <tr>
121
121
  <td class="file high" data-value="viewBuilder.js"><a href="viewBuilder.js.html">viewBuilder.js</a></td>
122
- <td data-value="84.85" class="pic high">
122
+ <td data-value="84.84" class="pic high">
123
123
  <div class="chart"><div class="cover-fill" style="width: 84%"></div><div class="cover-empty" style="width: 16%"></div></div>
124
124
  </td>
125
- <td data-value="84.85" class="pct high">84.85%</td>
125
+ <td data-value="84.84" class="pct high">84.84%</td>
126
126
  <td data-value="33" class="abs high">28/33</td>
127
127
  <td data-value="83.33" class="pct high">83.33%</td>
128
128
  <td data-value="30" class="abs high">25/30</td>
129
129
  <td data-value="75" class="pct medium">75%</td>
130
130
  <td data-value="4" class="abs medium">3/4</td>
131
- <td data-value="84.85" class="pct high">84.85%</td>
131
+ <td data-value="84.84" class="pct high">84.84%</td>
132
132
  <td data-value="33" class="abs high">28/33</td>
133
133
  </tr>
134
134
 
@@ -140,7 +140,7 @@
140
140
  <div class='footer quiet pad2 space-top1 center small'>
141
141
  Code coverage generated by
142
142
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
143
- at Thu Nov 11 2021 11:32:22 GMT+0000 (Coordinated Universal Time)
143
+ at Mon Nov 22 2021 10:23:31 GMT+0000 (Coordinated Universal Time)
144
144
  </div>
145
145
  </div>
146
146
  <script src="../../../prettify.js"></script>
@@ -23,7 +23,7 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">92.73% </span>
26
+ <span class="strong">92.72% </span>
27
27
  <span class="quiet">Statements</span>
28
28
  <span class='fraction'>51/55</span>
29
29
  </div>
@@ -307,7 +307,7 @@ exports.exportView = async ctx =&gt; {
307
307
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Format must be specified, either csv or json")</span>
308
308
  }
309
309
  &nbsp;
310
- <span class="missing-if-branch" title="else path not taken" >E</span>if (view) {
310
+ if (view) {
311
311
  ctx.params.viewName = viewName
312
312
  // Fetch view rows
313
313
  ctx.query = {
@@ -316,7 +316,7 @@ exports.exportView = async ctx =&gt; {
316
316
  stats: !!view.meta.field,
317
317
  field: view.meta.field,
318
318
  }
319
- } else {
319
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>{
320
320
  // table all_ view
321
321
  /* istanbul ignore next */
322
322
  ctx.params.viewName = viewName
@@ -325,7 +325,7 @@ exports.exportView = async ctx =&gt; {
325
325
  await fetchView(ctx)
326
326
  &nbsp;
327
327
  let schema = view &amp;&amp; view.meta &amp;&amp; view.meta.schema
328
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!schema) {
328
+ if (!schema) {
329
329
  const tableId = ctx.params.tableId || view.meta.tableId
330
330
  const table = await db.get(tableId)
331
331
  schema = table.schema
@@ -346,7 +346,7 @@ exports.exportView = async ctx =&gt; {
346
346
  <div class='footer quiet pad2 space-top1 center small'>
347
347
  Code coverage generated by
348
348
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
349
- at Thu Nov 11 2021 11:32:22 GMT+0000 (Coordinated Universal Time)
349
+ at Mon Nov 22 2021 10:23:31 GMT+0000 (Coordinated Universal Time)
350
350
  </div>
351
351
  </div>
352
352
  <script src="../../../prettify.js"></script>