@budibase/server 2.0.39 → 2.0.40-alpha.0

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 (295) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/__mocks__/node-fetch.ts +12 -2
  3. package/builder/assets/backups-default.8c011f1b.png +0 -0
  4. package/builder/assets/{index.e0ddd30b.css → index.442de33f.css} +2 -2
  5. package/builder/assets/{index.b20dee52.js → index.d7b4247d.js} +340 -332
  6. package/builder/index.html +2 -2
  7. package/coverage/clover.xml +1125 -1250
  8. package/coverage/coverage-final.json +73 -77
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  10. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +79 -67
  12. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/dev.js.html +21 -21
  14. package/coverage/lcov-report/api/controllers/index.html +17 -47
  15. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  16. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  18. package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
  19. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/validation.js.html +4 -4
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +13 -13
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +15 -15
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +13 -13
  30. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +12 -9
  32. package/coverage/lcov-report/api/controllers/table/external.js.html +10 -10
  33. package/coverage/lcov-report/api/controllers/table/index.html +16 -16
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +5 -5
  35. package/coverage/lcov-report/api/controllers/templates.js.html +6 -6
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +3 -3
  40. package/coverage/lcov-report/api/controllers/view/utils.js.html +13 -13
  41. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +8 -8
  42. package/coverage/lcov-report/api/index.html +1 -1
  43. package/coverage/lcov-report/api/index.js.html +30 -30
  44. package/coverage/lcov-report/api/routes/analytics.js.html +7 -7
  45. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  46. package/coverage/lcov-report/api/routes/automation.js.html +11 -11
  47. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  48. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  49. package/coverage/lcov-report/api/routes/datasource.js.html +9 -9
  50. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  51. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  52. package/coverage/lcov-report/api/routes/index.html +5 -35
  53. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  54. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  55. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  56. package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
  57. package/coverage/lcov-report/api/routes/permission.js.html +9 -9
  58. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  59. package/coverage/lcov-report/api/routes/role.js.html +9 -9
  60. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  61. package/coverage/lcov-report/api/routes/screen.js.html +9 -9
  62. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/table.js.html +10 -10
  64. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  65. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  66. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  67. package/coverage/lcov-report/api/routes/utils/validators.js.html +45 -45
  68. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  69. package/coverage/lcov-report/automations/actions.js.html +1 -1
  70. package/coverage/lcov-report/automations/automationUtils.js.html +6 -6
  71. package/coverage/lcov-report/automations/bullboard.js.html +24 -84
  72. package/coverage/lcov-report/automations/index.html +21 -21
  73. package/coverage/lcov-report/automations/index.js.html +9 -9
  74. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  75. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  76. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  77. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/index.html +15 -15
  81. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/updateRow.js.html +3 -3
  89. package/coverage/lcov-report/automations/steps/utils.js.html +10 -10
  90. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  91. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  92. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  93. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  94. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggers.js.html +49 -49
  100. package/coverage/lcov-report/constants/index.html +5 -5
  101. package/coverage/lcov-report/constants/index.js.html +10 -28
  102. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  103. package/coverage/lcov-report/constants/screens.js.html +1 -1
  104. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  105. package/coverage/lcov-report/db/index.html +19 -19
  106. package/coverage/lcov-report/db/index.js.html +1 -1
  107. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +17 -17
  108. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  109. package/coverage/lcov-report/db/linkedRows/index.js.html +28 -28
  110. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +15 -15
  111. package/coverage/lcov-report/db/newid.js.html +2 -2
  112. package/coverage/lcov-report/db/utils.js.html +37 -316
  113. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  114. package/coverage/lcov-report/events/index.html +1 -1
  115. package/coverage/lcov-report/events/index.js.html +3 -3
  116. package/coverage/lcov-report/events/utils.js.html +9 -9
  117. package/coverage/lcov-report/index.html +88 -88
  118. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  119. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  120. package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
  121. package/coverage/lcov-report/middleware/builder.js.html +19 -19
  122. package/coverage/lcov-report/middleware/currentapp.js.html +49 -49
  123. package/coverage/lcov-report/middleware/index.html +1 -1
  124. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  125. package/coverage/lcov-report/middleware/publicApi.js.html +5 -5
  126. package/coverage/lcov-report/middleware/resourceId.js.html +28 -28
  127. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  128. package/coverage/lcov-report/middleware/utils.js.html +4 -4
  129. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  130. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  131. package/coverage/lcov-report/utilities/csvParser.js.html +15 -12
  132. package/coverage/lcov-report/utilities/global.js.html +31 -31
  133. package/coverage/lcov-report/utilities/index.html +28 -28
  134. package/coverage/lcov-report/utilities/index.js.html +8 -8
  135. package/coverage/lcov-report/utilities/plugins.js.html +1 -1
  136. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +52 -52
  137. package/coverage/lcov-report/utilities/queue/index.html +21 -21
  138. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  139. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  140. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  141. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +72 -57
  142. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +15 -15
  143. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  144. package/coverage/lcov-report/utilities/security.js.html +2 -2
  145. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  146. package/coverage/lcov-report/utilities/usageQuota/index.html +14 -14
  147. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +23 -11
  148. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  149. package/coverage/lcov-report/utilities/users.js.html +1 -1
  150. package/coverage/lcov-report/utilities/workerRequests.js.html +46 -46
  151. package/coverage/lcov.info +1691 -1899
  152. package/dist/api/controllers/application.js +4 -7
  153. package/dist/api/controllers/backup.js +19 -13
  154. package/dist/api/controllers/cloud.js +38 -35
  155. package/dist/api/controllers/deploy/index.js +11 -2
  156. package/dist/api/controllers/dev.js +1 -1
  157. package/dist/api/controllers/query/index.js +7 -2
  158. package/dist/api/controllers/row/index.js +40 -66
  159. package/dist/api/controllers/row/internal.js +1 -1
  160. package/dist/api/controllers/static/index.js +3 -2
  161. package/dist/api/controllers/static/templates/BudibaseApp.svelte +11 -0
  162. package/dist/api/controllers/static/templates/preview.hbs +10 -0
  163. package/dist/api/controllers/table/bulkFormula.js +4 -3
  164. package/dist/api/controllers/table/external.js +5 -4
  165. package/dist/api/controllers/table/index.js +4 -4
  166. package/dist/api/controllers/table/internal.js +10 -3
  167. package/dist/api/controllers/table/utils.js +7 -49
  168. package/dist/api/controllers/view/index.js +2 -2
  169. package/dist/api/controllers/webhook.js +88 -89
  170. package/dist/api/routes/backup.js +34 -7
  171. package/dist/api/routes/index.js +9 -4
  172. package/dist/api/routes/utils/validators.js +2 -2
  173. package/dist/api/routes/webhook.js +39 -11
  174. package/dist/app.js +2 -68
  175. package/dist/automations/automationUtils.js +2 -2
  176. package/dist/automations/bullboard.js +12 -35
  177. package/dist/automations/index.js +4 -4
  178. package/dist/automations/steps/updateRow.js +2 -2
  179. package/dist/automations/triggers.js +6 -6
  180. package/dist/automations/utils.js +23 -49
  181. package/dist/constants/index.js +4 -8
  182. package/dist/db/utils.js +10 -75
  183. package/dist/index.js +1 -0
  184. package/dist/integrations/arangodb.js +2 -0
  185. package/dist/integrations/base/sqlTable.js +1 -0
  186. package/dist/integrations/mongodb.js +300 -11
  187. package/dist/integrations/rest.js +38 -5
  188. package/dist/migrations/functions/backfill/app/tables.js +5 -8
  189. package/dist/migrations/functions/{quotas1.js → syncQuotas.js} +3 -7
  190. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -1
  191. package/dist/migrations/functions/{pluginCount.js → usageQuotas/syncPlugins.js} +1 -3
  192. package/dist/migrations/functions/usageQuotas/syncRows.js +9 -5
  193. package/dist/migrations/index.js +10 -38
  194. package/dist/package.json +14 -14
  195. package/dist/sdk/app/automations/index.js +29 -0
  196. package/dist/sdk/app/automations/webhook.js +54 -0
  197. package/dist/sdk/app/backups/constants.js +5 -0
  198. package/dist/sdk/app/backups/exports.js +172 -0
  199. package/dist/sdk/app/backups/imports.js +190 -0
  200. package/dist/sdk/app/backups/index.js +29 -0
  201. package/dist/sdk/app/backups/statistics.js +73 -0
  202. package/dist/sdk/app/tables/index.js +61 -0
  203. package/dist/sdk/index.js +17 -0
  204. package/dist/startup.js +152 -0
  205. package/dist/tests/utilities/TestConfiguration.js +12 -2
  206. package/dist/threads/automation.js +12 -17
  207. package/dist/tsconfig.build.tsbuildinfo +1 -1
  208. package/dist/utilities/csvParser.js +1 -0
  209. package/dist/utilities/fileSystem/index.js +3 -95
  210. package/dist/utilities/fileSystem/utilities.js +2 -1
  211. package/dist/utilities/rowProcessor/index.js +5 -0
  212. package/dist/utilities/usageQuota/rows.js +6 -4
  213. package/package.json +15 -15
  214. package/specs/openapi.json +3 -0
  215. package/specs/openapi.yaml +3 -0
  216. package/src/api/controllers/application.ts +5 -12
  217. package/src/api/controllers/{backup.js → backup.ts} +7 -7
  218. package/src/api/controllers/cloud.js +44 -40
  219. package/src/api/controllers/deploy/index.ts +20 -8
  220. package/src/api/controllers/dev.js +1 -1
  221. package/src/api/controllers/query/index.ts +8 -2
  222. package/src/api/controllers/row/index.ts +50 -65
  223. package/src/api/controllers/row/internal.js +1 -1
  224. package/src/api/controllers/static/index.ts +4 -2
  225. package/src/api/controllers/static/templates/BudibaseApp.svelte +11 -0
  226. package/src/api/controllers/static/templates/preview.hbs +10 -0
  227. package/src/api/controllers/table/bulkFormula.js +4 -3
  228. package/src/api/controllers/table/external.js +4 -4
  229. package/src/api/controllers/table/index.js +4 -4
  230. package/src/api/controllers/table/internal.ts +8 -9
  231. package/src/api/controllers/table/utils.ts +4 -53
  232. package/src/api/controllers/view/index.js +2 -2
  233. package/src/api/controllers/{webhook.js → webhook.ts} +33 -48
  234. package/src/api/routes/backup.ts +10 -0
  235. package/src/api/routes/index.ts +11 -5
  236. package/src/api/routes/tests/backup.spec.js +1 -1
  237. package/src/api/routes/tests/{deployment.spec.js → deployment.spec.ts} +4 -4
  238. package/src/api/routes/tests/row.spec.js +22 -27
  239. package/src/api/routes/utils/validators.js +2 -2
  240. package/src/api/routes/{webhook.js → webhook.ts} +7 -6
  241. package/src/app.ts +3 -91
  242. package/src/automations/automationUtils.js +2 -2
  243. package/src/automations/bullboard.js +14 -34
  244. package/src/automations/index.js +4 -4
  245. package/src/automations/steps/updateRow.js +2 -2
  246. package/src/automations/tests/automation.spec.js +1 -6
  247. package/src/automations/triggers.js +6 -6
  248. package/src/automations/utils.ts +30 -32
  249. package/src/constants/index.js +4 -10
  250. package/src/db/utils.js +17 -110
  251. package/src/definitions/automations.ts +1 -18
  252. package/src/definitions/datasource.ts +1 -0
  253. package/src/index.ts +1 -0
  254. package/src/integrations/arangodb.ts +2 -0
  255. package/src/integrations/base/sqlTable.ts +1 -0
  256. package/src/integrations/mongodb.ts +290 -27
  257. package/src/integrations/rest.ts +17 -5
  258. package/src/integrations/tests/mongo.spec.ts +19 -19
  259. package/src/integrations/tests/rest.spec.ts +38 -22
  260. package/src/migrations/functions/backfill/app/tables.ts +7 -13
  261. package/src/migrations/functions/backfill/global.ts +1 -1
  262. package/src/migrations/functions/{quotas1.ts → syncQuotas.ts} +3 -8
  263. package/src/migrations/functions/tests/{quotas1.spec.js → syncQuotas.spec.js} +6 -5
  264. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +6 -4
  265. package/src/migrations/functions/usageQuotas/syncApps.ts +0 -1
  266. package/src/migrations/functions/usageQuotas/syncPlugins.ts +10 -0
  267. package/src/migrations/functions/usageQuotas/syncRows.ts +15 -6
  268. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +9 -1
  269. package/src/migrations/index.ts +21 -45
  270. package/src/migrations/tests/index.spec.ts +0 -1
  271. package/src/sdk/app/automations/index.ts +5 -0
  272. package/src/sdk/app/automations/webhook.ts +43 -0
  273. package/src/sdk/app/backups/constants.ts +2 -0
  274. package/src/sdk/app/backups/exports.ts +171 -0
  275. package/src/sdk/app/backups/imports.ts +206 -0
  276. package/src/sdk/app/backups/index.ts +9 -0
  277. package/src/sdk/app/backups/statistics.ts +78 -0
  278. package/src/sdk/app/tables/index.ts +61 -0
  279. package/src/sdk/index.ts +15 -0
  280. package/src/startup.ts +138 -0
  281. package/src/tests/utilities/TestConfiguration.js +12 -2
  282. package/src/threads/automation.ts +20 -27
  283. package/src/utilities/csvParser.js +1 -0
  284. package/src/utilities/fileSystem/index.js +2 -119
  285. package/src/utilities/fileSystem/utilities.js +2 -0
  286. package/src/utilities/rowProcessor/index.js +5 -0
  287. package/src/utilities/usageQuota/rows.js +7 -3
  288. package/coverage/lcov-report/api/controllers/backup.js.html +0 -142
  289. package/coverage/lcov-report/api/controllers/webhook.js.html +0 -424
  290. package/coverage/lcov-report/api/routes/backup.js.html +0 -115
  291. package/coverage/lcov-report/api/routes/webhook.js.html +0 -163
  292. package/dist/automations/listeners.js +0 -102
  293. package/src/api/routes/backup.js +0 -10
  294. package/src/automations/listeners.ts +0 -78
  295. package/src/migrations/functions/pluginCount.ts +0 -12
@@ -8,6 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
11
18
  Object.defineProperty(exports, "__esModule", { value: true });
12
19
  const types_1 = require("@budibase/types");
13
20
  const mongodb_1 = require("mongodb");
@@ -40,6 +47,232 @@ const SCHEMA = {
40
47
  delete: {
41
48
  type: types_1.QueryType.JSON,
42
49
  },
50
+ aggregate: {
51
+ type: types_1.QueryType.JSON,
52
+ steps: [
53
+ {
54
+ key: "$addFields",
55
+ template: "{\n\t\n}",
56
+ },
57
+ {
58
+ key: "$bucket",
59
+ template: `{
60
+ "groupBy": "",
61
+ "boundaries": [],
62
+ "default": "",
63
+ "output": {}
64
+ }`,
65
+ },
66
+ {
67
+ key: "$bucketAuto",
68
+ template: `{
69
+ "groupBy": "",
70
+ "buckets": 1,
71
+ "output": {},
72
+ "granularity": "R5"
73
+ }`,
74
+ },
75
+ {
76
+ key: "$changeStream",
77
+ template: `{
78
+ "allChangesForCluster": true,
79
+ "fullDocument": "",
80
+ "fullDocumentBeforeChange": "",
81
+ "resumeAfter": 1,
82
+ "showExpandedEvents": true,
83
+ "startAfter": {},
84
+ "startAtOperationTime": ""
85
+ }`,
86
+ },
87
+ {
88
+ key: "$collStats",
89
+ template: `{
90
+ "latencyStats": { "histograms": true } },
91
+ "storageStats": { "scale": 1 } },
92
+ "count": {},
93
+ "queryExecStats": {}
94
+ }`,
95
+ },
96
+ {
97
+ key: "$count",
98
+ template: ``,
99
+ },
100
+ {
101
+ key: "$densify",
102
+ template: `{
103
+ "field": "",
104
+ "partitionByFields": [],
105
+ "range": {
106
+ "step": 1,
107
+ "unit": 1,
108
+ "bounds": "full"
109
+ }
110
+ }`,
111
+ },
112
+ {
113
+ key: "$documents",
114
+ template: `[]`,
115
+ },
116
+ {
117
+ key: "$facet",
118
+ template: `{\n\t\n}`,
119
+ },
120
+ {
121
+ key: "$fill",
122
+ template: `{
123
+ "partitionBy": "",
124
+ "partitionByFields": [],
125
+ "sortBy": {},
126
+ "output": {}
127
+ }`,
128
+ },
129
+ {
130
+ key: "$geoNear",
131
+ template: `{
132
+ "near": {
133
+ "type": "Point",
134
+ "coordinates": [
135
+ -73.98142, 40.71782
136
+ ]
137
+ },
138
+ "key": "location",
139
+ "distanceField": "dist.calculated",
140
+ "query": { "category": "Parks" }
141
+ }`,
142
+ },
143
+ {
144
+ key: "$graphLookup",
145
+ template: `{
146
+ "from": "",
147
+ "startWith": "",
148
+ "connectFromField": "",
149
+ "connectToField": "",
150
+ "as": "",
151
+ "maxDepth": 1,
152
+ "depthField": "",
153
+ "restrictSearchWithMatch": {}
154
+ }`,
155
+ },
156
+ {
157
+ key: "$group",
158
+ template: `{
159
+ "_id": ""
160
+ }`,
161
+ },
162
+ {
163
+ key: "$indexStats",
164
+ template: "{\n\t\n}",
165
+ },
166
+ {
167
+ key: "$limit",
168
+ template: `1`,
169
+ },
170
+ {
171
+ key: "$listLocalSessions",
172
+ template: `{\n\t\n}`,
173
+ },
174
+ {
175
+ key: "$listSessions",
176
+ template: `{\n\t\n}`,
177
+ },
178
+ {
179
+ key: "$lookup",
180
+ template: `{
181
+ "from": "",
182
+ "localField": "",
183
+ "foreignField": "",
184
+ "as": ""
185
+ }`,
186
+ },
187
+ {
188
+ key: "$match",
189
+ template: "{\n\t\n}",
190
+ },
191
+ {
192
+ key: "$merge",
193
+ template: `{
194
+ "into": {},
195
+ "on": "_id",
196
+ "whenMatched": "replace",
197
+ "whenNotMatched": "insert"
198
+ }`,
199
+ },
200
+ {
201
+ key: "$out",
202
+ template: `{
203
+ "db": "",
204
+ "coll": ""
205
+ }`,
206
+ },
207
+ {
208
+ key: "$planCacheStats",
209
+ template: "{\n\t\n}",
210
+ },
211
+ {
212
+ key: "$project",
213
+ template: "{\n\t\n}",
214
+ },
215
+ {
216
+ key: "$redact",
217
+ template: "",
218
+ },
219
+ {
220
+ key: "$replaceRoot",
221
+ template: `{ "newRoot": "" }`,
222
+ },
223
+ {
224
+ key: "$replaceWith",
225
+ template: ``,
226
+ },
227
+ {
228
+ key: "$sample",
229
+ template: `{ "size": 3 }`,
230
+ },
231
+ {
232
+ key: "$set",
233
+ template: "{\n\t\n}",
234
+ },
235
+ {
236
+ key: "$setWindowFields",
237
+ template: `{
238
+ "partitionBy": "",
239
+ "sortBy": {},
240
+ "output": {}
241
+ }`,
242
+ },
243
+ {
244
+ key: "$skip",
245
+ template: `1`,
246
+ },
247
+ {
248
+ key: "$sort",
249
+ template: "{\n\t\n}",
250
+ },
251
+ {
252
+ key: "$sortByCount",
253
+ template: "",
254
+ },
255
+ {
256
+ key: "$unionWith",
257
+ template: `{
258
+ "coll": "",
259
+ "pipeline": []
260
+ }`,
261
+ },
262
+ {
263
+ key: "$unset",
264
+ template: "",
265
+ },
266
+ {
267
+ key: "$unwind",
268
+ template: `{
269
+ "path": "",
270
+ "includeArrayIndex": "",
271
+ "preserveNullAndEmptyArrays": true
272
+ }`,
273
+ },
274
+ ],
275
+ },
43
276
  },
44
277
  extra: {
45
278
  collection: {
@@ -47,8 +280,8 @@ const SCHEMA = {
47
280
  type: types_1.DatasourceFieldType.STRING,
48
281
  required: true,
49
282
  },
50
- actionTypes: {
51
- displayName: "Action Types",
283
+ actionType: {
284
+ displayName: "Query Type",
52
285
  type: types_1.DatasourceFieldType.LIST,
53
286
  required: true,
54
287
  data: {
@@ -56,6 +289,7 @@ const SCHEMA = {
56
289
  create: ["insertOne", "insertMany"],
57
290
  update: ["updateOne", "updateMany"],
58
291
  delete: ["deleteOne", "deleteMany"],
292
+ aggregate: ["json", "pipeline"],
59
293
  },
60
294
  },
61
295
  },
@@ -82,7 +316,7 @@ class MongoIntegration {
82
316
  json[field].toLowerCase().startsWith("objectid")) {
83
317
  const id = (_a = json[field].match(/(?<=objectid\(['"]).*(?=['"]\))/gi)) === null || _a === void 0 ? void 0 : _a[0];
84
318
  if (id) {
85
- json[field] = mongodb_1.ObjectID.createFromHexString(id);
319
+ json[field] = mongodb_1.ObjectId.createFromHexString(id);
86
320
  }
87
321
  }
88
322
  }
@@ -145,7 +379,7 @@ class MongoIntegration {
145
379
  let json = this.createObjectIds(query.json);
146
380
  // For mongodb we add an extra actionType to specify
147
381
  // which method we want to call on the collection
148
- switch (query.extra.actionTypes) {
382
+ switch (query.extra.actionType) {
149
383
  case "insertOne": {
150
384
  return yield collection.insertOne(json);
151
385
  }
@@ -153,7 +387,7 @@ class MongoIntegration {
153
387
  return yield collection.insertMany(json);
154
388
  }
155
389
  default: {
156
- throw new Error(`actionType ${query.extra.actionTypes} does not exist on DB for create`);
390
+ throw new Error(`actionType ${query.extra.actionType} does not exist on DB for create`);
157
391
  }
158
392
  }
159
393
  }
@@ -173,7 +407,7 @@ class MongoIntegration {
173
407
  const db = this.client.db(this.config.db);
174
408
  const collection = db.collection(query.extra.collection);
175
409
  let json = this.createObjectIds(query.json);
176
- switch (query.extra.actionTypes) {
410
+ switch (query.extra.actionType) {
177
411
  case "find": {
178
412
  return yield collection.find(json).toArray();
179
413
  }
@@ -194,7 +428,7 @@ class MongoIntegration {
194
428
  return yield collection.distinct(json);
195
429
  }
196
430
  default: {
197
- throw new Error(`actionType ${query.extra.actionTypes} does not exist on DB for read`);
431
+ throw new Error(`actionType ${query.extra.actionType} does not exist on DB for read`);
198
432
  }
199
433
  }
200
434
  }
@@ -218,7 +452,7 @@ class MongoIntegration {
218
452
  queryJson = this.parseQueryParams(queryJson, "update");
219
453
  }
220
454
  let json = this.createObjectIds(queryJson);
221
- switch (query.extra.actionTypes) {
455
+ switch (query.extra.actionType) {
222
456
  case "updateOne": {
223
457
  return yield collection.updateOne(json.filter, json.update, json.options);
224
458
  }
@@ -226,7 +460,7 @@ class MongoIntegration {
226
460
  return yield collection.updateMany(json.filter, json.update, json.options);
227
461
  }
228
462
  default: {
229
- throw new Error(`actionType ${query.extra.actionTypes} does not exist on DB for update`);
463
+ throw new Error(`actionType ${query.extra.actionType} does not exist on DB for update`);
230
464
  }
231
465
  }
232
466
  }
@@ -256,7 +490,7 @@ class MongoIntegration {
256
490
  options: {},
257
491
  };
258
492
  }
259
- switch (query.extra.actionTypes) {
493
+ switch (query.extra.actionType) {
260
494
  case "deleteOne": {
261
495
  return yield collection.deleteOne(json.filter, json.options);
262
496
  }
@@ -264,9 +498,64 @@ class MongoIntegration {
264
498
  return yield collection.deleteMany(json.filter, json.options);
265
499
  }
266
500
  default: {
267
- throw new Error(`actionType ${query.extra.actionTypes} does not exist on DB for delete`);
501
+ throw new Error(`actionType ${query.extra.actionType} does not exist on DB for delete`);
502
+ }
503
+ }
504
+ }
505
+ catch (err) {
506
+ console.error("Error writing to mongodb", err);
507
+ throw err;
508
+ }
509
+ finally {
510
+ yield this.client.close();
511
+ }
512
+ });
513
+ }
514
+ aggregate(query) {
515
+ var e_1, _a, e_2, _b;
516
+ var _c;
517
+ return __awaiter(this, void 0, void 0, function* () {
518
+ try {
519
+ yield this.connect();
520
+ const db = this.client.db(this.config.db);
521
+ const collection = db.collection(query.extra.collection);
522
+ let response = [];
523
+ if (((_c = query.extra) === null || _c === void 0 ? void 0 : _c.actionType) === "pipeline") {
524
+ try {
525
+ for (var _d = __asyncValues(collection.aggregate(query.steps.map(({ key, value }) => {
526
+ let temp = {};
527
+ temp[key] = JSON.parse(value.value);
528
+ return this.createObjectIds(temp);
529
+ }))), _e; _e = yield _d.next(), !_e.done;) {
530
+ const doc = _e.value;
531
+ response.push(doc);
532
+ }
533
+ }
534
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
535
+ finally {
536
+ try {
537
+ if (_e && !_e.done && (_a = _d.return)) yield _a.call(_d);
538
+ }
539
+ finally { if (e_1) throw e_1.error; }
540
+ }
541
+ }
542
+ else {
543
+ const stages = query.json;
544
+ try {
545
+ for (var _f = __asyncValues(collection.aggregate(stages ? this.createObjectIds(stages) : [])), _g; _g = yield _f.next(), !_g.done;) {
546
+ const doc = _g.value;
547
+ response.push(doc);
548
+ }
549
+ }
550
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
551
+ finally {
552
+ try {
553
+ if (_g && !_g.done && (_b = _f.return)) yield _b.call(_f);
554
+ }
555
+ finally { if (e_2) throw e_2.error; }
268
556
  }
269
557
  }
558
+ return response;
270
559
  }
271
560
  catch (err) {
272
561
  console.error("Error writing to mongodb", err);
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -15,6 +38,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
38
  const types_1 = require("@budibase/types");
16
39
  const datasource_1 = require("../definitions/datasource");
17
40
  const lodash_1 = require("lodash");
41
+ const https = __importStar(require("https"));
18
42
  const querystring_1 = __importDefault(require("querystring"));
19
43
  const fetch = require("node-fetch");
20
44
  const { formatBytes } = require("../utilities");
@@ -72,11 +96,11 @@ const SCHEMA = {
72
96
  required: false,
73
97
  default: {},
74
98
  },
75
- legacyHttpParser: {
76
- display: "Legacy HTTP Support",
99
+ rejectUnauthorized: {
100
+ display: "Reject Unauthorized",
77
101
  type: types_1.DatasourceFieldType.BOOLEAN,
102
+ default: true,
78
103
  required: false,
79
- default: false,
80
104
  },
81
105
  },
82
106
  query: {
@@ -197,8 +221,11 @@ class RestIntegration {
197
221
  queryString = `${paginationString}&${queryString}`;
198
222
  }
199
223
  }
200
- // make sure the query string is fully encoded
201
- const main = `${path}?${querystring_1.default.encode(querystring_1.default.decode(queryString))}`;
224
+ if (queryString) {
225
+ // make sure the query string is fully encoded
226
+ queryString = "?" + querystring_1.default.encode(querystring_1.default.decode(queryString));
227
+ }
228
+ const main = `${path}${queryString}`;
202
229
  let complete = main;
203
230
  if (this.config.url && !main.startsWith("http")) {
204
231
  complete = !this.config.url ? main : `${this.config.url}/${main}`;
@@ -318,6 +345,12 @@ class RestIntegration {
318
345
  }
319
346
  let input = { method, headers: this.headers };
320
347
  input = this.addBody(bodyType, requestBody, input, pagination, paginationValues);
348
+ if (this.config.rejectUnauthorized == false) {
349
+ input.agent = new https.Agent({
350
+ rejectUnauthorized: false,
351
+ });
352
+ }
353
+ // Deprecated by rejectUnauthorized
321
354
  if (this.config.legacyHttpParser) {
322
355
  // https://github.com/nodejs/node/issues/43798
323
356
  input.extraHttpOptions = { insecureHTTPParser: true };
@@ -8,19 +8,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.backfill = void 0;
13
16
  const backend_core_1 = require("@budibase/backend-core");
14
- const utils_1 = require("../../../../db/utils");
15
- const getTables = (appDb) => __awaiter(void 0, void 0, void 0, function* () {
16
- const response = yield appDb.allDocs((0, utils_1.getTableParams)(null, {
17
- include_docs: true,
18
- }));
19
- return response.rows.map((row) => row.doc);
20
- });
17
+ const sdk_1 = __importDefault(require("../../../../sdk"));
21
18
  const backfill = (appDb, timestamp) => __awaiter(void 0, void 0, void 0, function* () {
22
19
  var _a;
23
- const tables = yield getTables(appDb);
20
+ const tables = yield sdk_1.default.tables.getAllInternalTables(appDb);
24
21
  for (const table of tables) {
25
22
  yield backend_core_1.events.table.created(table, timestamp);
26
23
  if (table.views) {
@@ -36,19 +36,15 @@ exports.run = void 0;
36
36
  const usageQuotas_1 = require("./usageQuotas");
37
37
  const syncApps = __importStar(require("./usageQuotas/syncApps"));
38
38
  const syncRows = __importStar(require("./usageQuotas/syncRows"));
39
+ const syncPlugins = __importStar(require("./usageQuotas/syncPlugins"));
39
40
  /**
40
- * Date:
41
- * January 2022
42
- *
43
- * Description:
44
- * Synchronise the app and row quotas to the state of the db after it was
45
- * discovered that the quota resets were still in place and the row quotas
46
- * weren't being decremented correctly.
41
+ * Synchronise quotas to the state of the db.
47
42
  */
48
43
  const run = () => __awaiter(void 0, void 0, void 0, function* () {
49
44
  yield (0, usageQuotas_1.runQuotaMigration)(() => __awaiter(void 0, void 0, void 0, function* () {
50
45
  yield syncApps.run();
51
46
  yield syncRows.run();
47
+ yield syncPlugins.run();
52
48
  }));
53
49
  });
54
50
  exports.run = run;
@@ -16,7 +16,6 @@ const pro_1 = require("@budibase/pro");
16
16
  const types_1 = require("@budibase/types");
17
17
  const run = () => __awaiter(void 0, void 0, void 0, function* () {
18
18
  // get app count
19
- // @ts-ignore
20
19
  const devApps = yield (0, db_1.getAllApps)({ dev: true });
21
20
  const appCount = devApps ? devApps.length : 0;
22
21
  // sync app count
@@ -14,9 +14,7 @@ const backend_core_1 = require("@budibase/backend-core");
14
14
  const pro_1 = require("@budibase/pro");
15
15
  const run = () => __awaiter(void 0, void 0, void 0, function* () {
16
16
  try {
17
- yield backend_core_1.tenancy.doInTenant(backend_core_1.tenancy.DEFAULT_TENANT_ID, () => __awaiter(void 0, void 0, void 0, function* () {
18
- yield pro_1.plugins.checkPluginQuotas();
19
- }));
17
+ yield pro_1.plugins.checkPluginQuotas();
20
18
  }
21
19
  catch (err) {
22
20
  backend_core_1.logging.logAlert("Failed to update plugin quotas", err);
@@ -17,15 +17,19 @@ const pro_1 = require("@budibase/pro");
17
17
  const types_1 = require("@budibase/types");
18
18
  const run = () => __awaiter(void 0, void 0, void 0, function* () {
19
19
  // get all rows in all apps
20
- // @ts-ignore
21
20
  const allApps = yield (0, db_1.getAllApps)({ all: true });
22
- // @ts-ignore
23
21
  const appIds = allApps ? allApps.map((app) => app.appId) : [];
24
- const rows = yield (0, rows_1.getUniqueRows)(appIds);
25
- const rowCount = rows ? rows.length : 0;
22
+ const { appRows } = yield (0, rows_1.getUniqueRows)(appIds);
23
+ // get the counts per app
24
+ const counts = {};
25
+ let rowCount = 0;
26
+ Object.entries(appRows).forEach(([appId, rows]) => {
27
+ counts[appId] = rows.length;
28
+ rowCount += rows.length;
29
+ });
26
30
  // sync row count
27
31
  const tenantId = (0, tenancy_1.getTenantId)();
28
32
  console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`);
29
- yield pro_1.quotas.setUsage(rowCount, types_1.StaticQuotaName.ROWS, types_1.QuotaUsageType.STATIC);
33
+ yield pro_1.quotas.setUsagePerApp(counts, types_1.StaticQuotaName.ROWS, types_1.QuotaUsageType.STATIC);
30
34
  });
31
35
  exports.run = run;
@@ -41,10 +41,9 @@ const types_1 = require("@budibase/types");
41
41
  const environment_1 = __importDefault(require("../environment"));
42
42
  // migration functions
43
43
  const userEmailViewCasing = __importStar(require("./functions/userEmailViewCasing"));
44
- const quota1 = __importStar(require("./functions/quotas1"));
44
+ const syncQuotas = __importStar(require("./functions/syncQuotas"));
45
45
  const appUrls = __importStar(require("./functions/appUrls"));
46
46
  const backfill = __importStar(require("./functions/backfill"));
47
- const pluginCount = __importStar(require("./functions/pluginCount"));
48
47
  /**
49
48
  * Populate the migration function and additional configuration from
50
49
  * the static migration definitions.
@@ -58,8 +57,8 @@ const buildMigrations = () => {
58
57
  serverMigrations.push(Object.assign(Object.assign({}, definition), { fn: userEmailViewCasing.run }));
59
58
  break;
60
59
  }
61
- case types_1.MigrationName.QUOTAS_1: {
62
- serverMigrations.push(Object.assign(Object.assign({}, definition), { fn: quota1.run }));
60
+ case types_1.MigrationName.SYNC_QUOTAS: {
61
+ serverMigrations.push(Object.assign(Object.assign({}, definition), { fn: syncQuotas.run }));
63
62
  break;
64
63
  }
65
64
  case types_1.MigrationName.APP_URLS: {
@@ -78,11 +77,6 @@ const buildMigrations = () => {
78
77
  serverMigrations.push(Object.assign(Object.assign({}, definition), { fn: backfill.installation.run, silent: !!environment_1.default.SELF_HOSTED, preventRetry: !!environment_1.default.SELF_HOSTED }));
79
78
  break;
80
79
  }
81
- case types_1.MigrationName.PLUGIN_COUNT: {
82
- if (environment_1.default.SELF_HOSTED) {
83
- serverMigrations.push(Object.assign(Object.assign({}, definition), { fn: pluginCount.run, silent: !!environment_1.default.SELF_HOSTED, preventRetry: false }));
84
- }
85
- }
86
80
  }
87
81
  }
88
82
  return serverMigrations;
@@ -101,34 +95,12 @@ const migrate = (options) => __awaiter(void 0, void 0, void 0, function* () {
101
95
  });
102
96
  exports.migrate = migrate;
103
97
  const migrateWithLock = (options) => __awaiter(void 0, void 0, void 0, function* () {
104
- // get a new lock client
105
- const redlock = yield backend_core_1.redis.clients.getMigrationsRedlock();
106
- // lock for 15 minutes
107
- const ttl = 1000 * 60 * 15;
108
- let migrationLock;
109
- // acquire lock
110
- try {
111
- migrationLock = yield redlock.lock("migrations", ttl);
112
- }
113
- catch (e) {
114
- if (e.name === "LockError") {
115
- return;
116
- }
117
- else {
118
- throw e;
119
- }
120
- }
121
- // run migrations
122
- try {
98
+ yield backend_core_1.locks.doWithLock({
99
+ type: types_1.LockType.TRY_ONCE,
100
+ name: types_1.LockName.MIGRATIONS,
101
+ ttl: 1000 * 60 * 15,
102
+ systemLock: true,
103
+ }, () => __awaiter(void 0, void 0, void 0, function* () {
123
104
  yield backend_core_1.migrations.runMigrations(exports.MIGRATIONS, options);
124
- }
125
- finally {
126
- // release lock
127
- try {
128
- yield migrationLock.unlock();
129
- }
130
- catch (e) {
131
- console.error("unable to release migration lock");
132
- }
133
- }
105
+ }));
134
106
  });