@budibase/server 2.0.30-alpha.7 → 2.0.31

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 (215) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/{index.b1aa5e8a.js → index.c4b43e7e.js} +283 -287
  3. package/builder/assets/{index.a6a040bb.css → index.dfa4073c.css} +2 -2
  4. package/builder/index.html +2 -2
  5. package/coverage/clover.xml +491 -495
  6. package/coverage/coverage-final.json +26 -26
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/dev.js.html +2 -2
  13. package/coverage/lcov-report/api/controllers/index.html +1 -1
  14. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/internal.js.html +12 -12
  26. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +15 -15
  28. package/coverage/lcov-report/api/controllers/row/utils.js.html +13 -13
  29. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  42. package/coverage/lcov-report/api/index.html +1 -1
  43. package/coverage/lcov-report/api/index.js.html +5 -5
  44. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  45. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/index.html +1 -1
  54. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  68. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  71. package/coverage/lcov-report/automations/actions.js.html +1 -1
  72. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  73. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  74. package/coverage/lcov-report/automations/index.html +1 -1
  75. package/coverage/lcov-report/automations/index.js.html +5 -5
  76. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  77. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/index.html +1 -1
  83. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/updateRow.js.html +3 -3
  91. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  93. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  94. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggers.js.html +22 -22
  102. package/coverage/lcov-report/constants/index.html +1 -1
  103. package/coverage/lcov-report/constants/index.js.html +2 -8
  104. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  105. package/coverage/lcov-report/constants/screens.js.html +1 -1
  106. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  107. package/coverage/lcov-report/db/index.html +1 -1
  108. package/coverage/lcov-report/db/index.js.html +1 -1
  109. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +11 -11
  110. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  111. package/coverage/lcov-report/db/linkedRows/index.js.html +11 -11
  112. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +3 -3
  113. package/coverage/lcov-report/db/newid.js.html +2 -2
  114. package/coverage/lcov-report/db/utils.js.html +16 -10
  115. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  116. package/coverage/lcov-report/events/index.html +1 -1
  117. package/coverage/lcov-report/events/index.js.html +2 -2
  118. package/coverage/lcov-report/events/utils.js.html +9 -9
  119. package/coverage/lcov-report/index.html +24 -24
  120. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  121. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  122. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  123. package/coverage/lcov-report/middleware/builder.js.html +11 -11
  124. package/coverage/lcov-report/middleware/currentapp.js.html +34 -34
  125. package/coverage/lcov-report/middleware/index.html +1 -1
  126. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  127. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  128. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  129. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  130. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  131. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  132. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  133. package/coverage/lcov-report/utilities/csvParser.js.html +8 -11
  134. package/coverage/lcov-report/utilities/global.js.html +16 -16
  135. package/coverage/lcov-report/utilities/index.html +15 -15
  136. package/coverage/lcov-report/utilities/index.js.html +7 -7
  137. package/coverage/lcov-report/utilities/plugins.js.html +1 -1
  138. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +13 -13
  139. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  140. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  141. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  142. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  143. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +39 -54
  144. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +10 -10
  145. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  146. package/coverage/lcov-report/utilities/security.js.html +1 -1
  147. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  148. package/coverage/lcov-report/utilities/usageQuota/index.html +14 -14
  149. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +11 -23
  150. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  151. package/coverage/lcov-report/utilities/users.js.html +1 -1
  152. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  153. package/coverage/lcov.info +892 -900
  154. package/dist/api/controllers/application.js +2 -2
  155. package/dist/api/controllers/dev.js +1 -1
  156. package/dist/api/controllers/query/index.js +2 -7
  157. package/dist/api/controllers/row/index.js +10 -30
  158. package/dist/api/controllers/static/templates/preview.hbs +0 -10
  159. package/dist/api/controllers/table/internal.js +2 -8
  160. package/dist/api/controllers/table/utils.js +1 -3
  161. package/dist/automations/steps/updateRow.js +2 -2
  162. package/dist/automations/utils.js +3 -5
  163. package/dist/constants/index.js +0 -2
  164. package/dist/db/utils.js +1 -1
  165. package/dist/index.js +0 -1
  166. package/dist/integrations/base/sqlTable.js +0 -1
  167. package/dist/integrations/mongodb.js +11 -300
  168. package/dist/integrations/rest.js +5 -38
  169. package/dist/migrations/functions/{usageQuotas/syncPlugins.js → pluginCount.js} +3 -1
  170. package/dist/migrations/functions/{syncQuotas.js → quotas1.js} +7 -3
  171. package/dist/migrations/functions/usageQuotas/syncApps.js +1 -0
  172. package/dist/migrations/functions/usageQuotas/syncRows.js +5 -9
  173. package/dist/migrations/index.js +38 -9
  174. package/dist/package.json +9 -8
  175. package/dist/tsconfig.build.tsbuildinfo +1 -1
  176. package/dist/utilities/csvParser.js +0 -1
  177. package/dist/utilities/rowProcessor/index.js +0 -5
  178. package/dist/utilities/usageQuota/rows.js +4 -6
  179. package/package.json +10 -9
  180. package/specs/openapi.json +0 -3
  181. package/specs/openapi.yaml +0 -3
  182. package/src/api/controllers/application.ts +2 -2
  183. package/src/api/controllers/deploy/index.ts +1 -0
  184. package/src/api/controllers/dev.js +1 -1
  185. package/src/api/controllers/query/index.ts +2 -8
  186. package/src/api/controllers/row/index.ts +13 -36
  187. package/src/api/controllers/static/templates/preview.hbs +0 -10
  188. package/src/api/controllers/table/internal.ts +2 -5
  189. package/src/api/controllers/table/utils.ts +1 -3
  190. package/src/api/routes/tests/row.spec.js +27 -22
  191. package/src/automations/steps/updateRow.js +2 -2
  192. package/src/automations/tests/automation.spec.js +6 -1
  193. package/src/automations/utils.ts +4 -6
  194. package/src/constants/index.js +0 -2
  195. package/src/db/utils.js +2 -0
  196. package/src/definitions/datasource.ts +0 -1
  197. package/src/index.ts +0 -1
  198. package/src/integrations/base/sqlTable.ts +0 -1
  199. package/src/integrations/mongodb.ts +27 -290
  200. package/src/integrations/rest.ts +5 -17
  201. package/src/integrations/tests/mongo.spec.ts +19 -19
  202. package/src/integrations/tests/rest.spec.ts +22 -38
  203. package/src/migrations/functions/backfill/global.ts +1 -1
  204. package/src/migrations/functions/pluginCount.ts +12 -0
  205. package/src/migrations/functions/{syncQuotas.ts → quotas1.ts} +8 -3
  206. package/src/migrations/functions/tests/{syncQuotas.spec.js → quotas1.spec.js} +2 -5
  207. package/src/migrations/functions/usageQuotas/syncApps.ts +1 -0
  208. package/src/migrations/functions/usageQuotas/syncRows.ts +6 -15
  209. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +1 -9
  210. package/src/migrations/index.ts +45 -20
  211. package/src/migrations/tests/index.spec.ts +1 -0
  212. package/src/utilities/csvParser.js +0 -1
  213. package/src/utilities/rowProcessor/index.js +0 -5
  214. package/src/utilities/usageQuota/rows.js +3 -7
  215. package/src/migrations/functions/usageQuotas/syncPlugins.ts +0 -10
@@ -1,16 +1,17 @@
1
- const mockFetch = jest.fn(() => ({
2
- headers: {
3
- raw: () => {
4
- return { "content-type": ["application/json"] }
1
+ jest.mock("node-fetch", () =>
2
+ jest.fn(() => ({
3
+ headers: {
4
+ raw: () => {
5
+ return { "content-type": ["application/json"] }
6
+ },
7
+ get: () => ["application/json"],
5
8
  },
6
- get: () => ["application/json"],
7
- },
8
- json: jest.fn(() => ({
9
- my_next_cursor: 123,
10
- })),
11
- text: jest.fn(),
12
- }))
13
- jest.mock("node-fetch", () => mockFetch)
9
+ json: jest.fn(() => ({
10
+ my_next_cursor: 123,
11
+ })),
12
+ text: jest.fn(),
13
+ }))
14
+ )
14
15
  import fetch from "node-fetch"
15
16
  import { default as RestIntegration } from "../rest"
16
17
  const FormData = require("form-data")
@@ -255,7 +256,7 @@ describe("REST Integration", () => {
255
256
  authConfigId: "c59c14bd1898a43baa08da68959b24686",
256
257
  }
257
258
  await config.integration.read(query)
258
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/`, {
259
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
259
260
  method: "GET",
260
261
  headers: {
261
262
  Authorization: "Basic dXNlcjpwYXNzd29yZA==",
@@ -268,7 +269,7 @@ describe("REST Integration", () => {
268
269
  authConfigId: "0d91d732f34e4befabeff50b392a8ff3",
269
270
  }
270
271
  await config.integration.read(query)
271
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/`, {
272
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
272
273
  method: "GET",
273
274
  headers: {
274
275
  Authorization: "Bearer mytoken",
@@ -326,7 +327,7 @@ describe("REST Integration", () => {
326
327
  },
327
328
  }
328
329
  await config.integration.create(query)
329
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api`, {
330
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
330
331
  body: JSON.stringify({
331
332
  [pageParam]: pageValue,
332
333
  [sizeParam]: sizeValue,
@@ -358,7 +359,7 @@ describe("REST Integration", () => {
358
359
  },
359
360
  }
360
361
  await config.integration.create(query)
361
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api`, {
362
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
362
363
  body: expect.any(FormData),
363
364
  headers: {},
364
365
  method: "POST",
@@ -389,7 +390,7 @@ describe("REST Integration", () => {
389
390
  },
390
391
  }
391
392
  await config.integration.create(query)
392
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api`, {
393
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
393
394
  body: expect.any(URLSearchParams),
394
395
  headers: {},
395
396
  method: "POST",
@@ -455,7 +456,7 @@ describe("REST Integration", () => {
455
456
  },
456
457
  }
457
458
  const res = await config.integration.create(query)
458
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api`, {
459
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
459
460
  body: JSON.stringify({
460
461
  [pageParam]: pageValue,
461
462
  [sizeParam]: sizeValue,
@@ -489,7 +490,7 @@ describe("REST Integration", () => {
489
490
  },
490
491
  }
491
492
  const res = await config.integration.create(query)
492
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api`, {
493
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
493
494
  body: expect.any(FormData),
494
495
  headers: {},
495
496
  method: "POST",
@@ -522,7 +523,7 @@ describe("REST Integration", () => {
522
523
  },
523
524
  }
524
525
  const res = await config.integration.create(query)
525
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api`, {
526
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
526
527
  body: expect.any(URLSearchParams),
527
528
  headers: {},
528
529
  method: "POST",
@@ -562,7 +563,7 @@ describe("REST Integration", () => {
562
563
  legacyHttpParser: true,
563
564
  })
564
565
  await config.integration.read({})
565
- expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/`, {
566
+ expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
566
567
  method: "GET",
567
568
  headers: {},
568
569
  extraHttpOptions: {
@@ -571,21 +572,4 @@ describe("REST Integration", () => {
571
572
  })
572
573
  })
573
574
  })
574
-
575
- it("Attaches custom agent when Reject Unauthorized option is false", async () => {
576
- config = new TestConfiguration({
577
- url: BASE_URL,
578
- rejectUnauthorized: false,
579
- })
580
- await config.integration.read({})
581
-
582
- const calls: any = mockFetch.mock.calls[0]
583
- const url = calls[0]
584
- expect(url).toBe(`${BASE_URL}/`)
585
-
586
- const calledConfig = calls[1]
587
- expect(calledConfig.method).toBe("GET")
588
- expect(calledConfig.headers).toEqual({})
589
- expect(calledConfig.agent.options.rejectUnauthorized).toBe(false)
590
- })
591
575
  })
@@ -8,7 +8,7 @@ import {
8
8
  accounts,
9
9
  db as dbUtils,
10
10
  } from "@budibase/backend-core"
11
- import { QuotaUsage } from "@budibase/types"
11
+ import { QuotaUsage } from "@budibase/pro"
12
12
  import {
13
13
  CloudAccount,
14
14
  App,
@@ -0,0 +1,12 @@
1
+ import { tenancy, logging } from "@budibase/backend-core"
2
+ import { plugins } from "@budibase/pro"
3
+
4
+ export const run = async () => {
5
+ try {
6
+ await tenancy.doInTenant(tenancy.DEFAULT_TENANT_ID, async () => {
7
+ await plugins.checkPluginQuotas()
8
+ })
9
+ } catch (err) {
10
+ logging.logAlert("Failed to update plugin quotas", err)
11
+ }
12
+ }
@@ -1,15 +1,20 @@
1
1
  import { runQuotaMigration } from "./usageQuotas"
2
2
  import * as syncApps from "./usageQuotas/syncApps"
3
3
  import * as syncRows from "./usageQuotas/syncRows"
4
- import * as syncPlugins from "./usageQuotas/syncPlugins"
5
4
 
6
5
  /**
7
- * Synchronise quotas to the state of the db.
6
+ * Date:
7
+ * January 2022
8
+ *
9
+ * Description:
10
+ * Synchronise the app and row quotas to the state of the db after it was
11
+ * discovered that the quota resets were still in place and the row quotas
12
+ * weren't being decremented correctly.
8
13
  */
14
+
9
15
  export const run = async () => {
10
16
  await runQuotaMigration(async () => {
11
17
  await syncApps.run()
12
18
  await syncRows.run()
13
- await syncPlugins.run()
14
19
  })
15
20
  }
@@ -2,13 +2,11 @@ const TestConfig = require("../../../tests/utilities/TestConfiguration")
2
2
 
3
3
  const syncApps = jest.fn()
4
4
  const syncRows = jest.fn()
5
- const syncPlugins = jest.fn()
6
5
 
7
6
  jest.mock("../usageQuotas/syncApps", () => ({ run: syncApps }) )
8
7
  jest.mock("../usageQuotas/syncRows", () => ({ run: syncRows }) )
9
- jest.mock("../usageQuotas/syncPlugins", () => ({ run: syncPlugins }) )
10
8
 
11
- const migration = require("../syncQuotas")
9
+ const migration = require("../quotas1")
12
10
 
13
11
  describe("run", () => {
14
12
  let config = new TestConfig(false)
@@ -19,10 +17,9 @@ describe("run", () => {
19
17
 
20
18
  afterAll(config.end)
21
19
 
22
- it("run", async () => {
20
+ it("runs ", async () => {
23
21
  await migration.run()
24
22
  expect(syncApps).toHaveBeenCalledTimes(1)
25
23
  expect(syncRows).toHaveBeenCalledTimes(1)
26
- expect(syncPlugins).toHaveBeenCalledTimes(1)
27
24
  })
28
25
  })
@@ -5,6 +5,7 @@ import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
5
5
 
6
6
  export const run = async () => {
7
7
  // get app count
8
+ // @ts-ignore
8
9
  const devApps = await getAllApps({ dev: true })
9
10
  const appCount = devApps ? devApps.length : 0
10
11
 
@@ -2,28 +2,19 @@ import { getTenantId } from "@budibase/backend-core/tenancy"
2
2
  import { getAllApps } from "@budibase/backend-core/db"
3
3
  import { getUniqueRows } from "../../../utilities/usageQuota/rows"
4
4
  import { quotas } from "@budibase/pro"
5
- import { StaticQuotaName, QuotaUsageType } from "@budibase/types"
5
+ import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
6
6
 
7
7
  export const run = async () => {
8
8
  // get all rows in all apps
9
+ // @ts-ignore
9
10
  const allApps = await getAllApps({ all: true })
11
+ // @ts-ignore
10
12
  const appIds = allApps ? allApps.map((app: { appId: any }) => app.appId) : []
11
- const { appRows } = await getUniqueRows(appIds)
12
-
13
- // get the counts per app
14
- const counts: { [key: string]: number } = {}
15
- let rowCount = 0
16
- Object.entries(appRows).forEach(([appId, rows]) => {
17
- counts[appId] = rows.length
18
- rowCount += rows.length
19
- })
13
+ const rows = await getUniqueRows(appIds)
14
+ const rowCount = rows ? rows.length : 0
20
15
 
21
16
  // sync row count
22
17
  const tenantId = getTenantId()
23
18
  console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`)
24
- await quotas.setUsagePerApp(
25
- counts,
26
- StaticQuotaName.ROWS,
27
- QuotaUsageType.STATIC
28
- )
19
+ await quotas.setUsage(rowCount, StaticQuotaName.ROWS, QuotaUsageType.STATIC)
29
20
  }
@@ -2,7 +2,6 @@ import TestConfig from "../../../../tests/utilities/TestConfiguration"
2
2
  import * as syncRows from "../syncRows"
3
3
  import { quotas } from "@budibase/pro"
4
4
  import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
5
- const { getProdAppID } = require("@budibase/backend-core/db")
6
5
 
7
6
  describe("syncRows", () => {
8
7
  let config = new TestConfig(false)
@@ -23,11 +22,10 @@ describe("syncRows", () => {
23
22
  expect(usageDoc.usageQuota.rows).toEqual(300)
24
23
 
25
24
  // app 1
26
- const app1 = config.app
27
25
  await config.createTable()
28
26
  await config.createRow()
29
27
  // app 2
30
- const app2 = await config.createApp("second-app")
28
+ await config.createApp("second-app")
31
29
  await config.createTable()
32
30
  await config.createRow()
33
31
  await config.createRow()
@@ -38,12 +36,6 @@ describe("syncRows", () => {
38
36
  // assert the migration worked
39
37
  usageDoc = await quotas.getQuotaUsage()
40
38
  expect(usageDoc.usageQuota.rows).toEqual(3)
41
- expect(usageDoc.apps?.[getProdAppID(app1.appId)].usageQuota.rows).toEqual(
42
- 1
43
- )
44
- expect(usageDoc.apps?.[getProdAppID(app2.appId)].usageQuota.rows).toEqual(
45
- 2
46
- )
47
39
  })
48
40
  })
49
41
  })
@@ -1,18 +1,14 @@
1
- import { locks, migrations } from "@budibase/backend-core"
2
- import {
3
- Migration,
4
- MigrationOptions,
5
- MigrationName,
6
- LockType,
7
- LockName,
8
- } from "@budibase/types"
1
+ import { migrations, redis } from "@budibase/backend-core"
2
+ import { Migration, MigrationOptions, MigrationName } from "@budibase/types"
9
3
  import env from "../environment"
10
4
 
11
5
  // migration functions
12
6
  import * as userEmailViewCasing from "./functions/userEmailViewCasing"
13
- import * as syncQuotas from "./functions/syncQuotas"
7
+ import * as quota1 from "./functions/quotas1"
14
8
  import * as appUrls from "./functions/appUrls"
15
9
  import * as backfill from "./functions/backfill"
10
+ import * as pluginCount from "./functions/pluginCount"
11
+
16
12
  /**
17
13
  * Populate the migration function and additional configuration from
18
14
  * the static migration definitions.
@@ -30,10 +26,10 @@ export const buildMigrations = () => {
30
26
  })
31
27
  break
32
28
  }
33
- case MigrationName.SYNC_QUOTAS: {
29
+ case MigrationName.QUOTAS_1: {
34
30
  serverMigrations.push({
35
31
  ...definition,
36
- fn: syncQuotas.run,
32
+ fn: quota1.run,
37
33
  })
38
34
  break
39
35
  }
@@ -73,6 +69,16 @@ export const buildMigrations = () => {
73
69
  })
74
70
  break
75
71
  }
72
+ case MigrationName.PLUGIN_COUNT: {
73
+ if (env.SELF_HOSTED) {
74
+ serverMigrations.push({
75
+ ...definition,
76
+ fn: pluginCount.run,
77
+ silent: !!env.SELF_HOSTED,
78
+ preventRetry: false,
79
+ })
80
+ }
81
+ }
76
82
  }
77
83
  }
78
84
 
@@ -92,14 +98,33 @@ export const migrate = async (options?: MigrationOptions) => {
92
98
  }
93
99
 
94
100
  const migrateWithLock = async (options?: MigrationOptions) => {
95
- await locks.doWithLock(
96
- {
97
- type: LockType.TRY_ONCE,
98
- name: LockName.MIGRATIONS,
99
- ttl: 1000 * 60 * 15, // auto expire the migration lock after 15 minutes
100
- },
101
- async () => {
102
- await migrations.runMigrations(MIGRATIONS, options)
101
+ // get a new lock client
102
+ const redlock = await redis.clients.getMigrationsRedlock()
103
+ // lock for 15 minutes
104
+ const ttl = 1000 * 60 * 15
105
+
106
+ let migrationLock
107
+
108
+ // acquire lock
109
+ try {
110
+ migrationLock = await redlock.lock("migrations", ttl)
111
+ } catch (e: any) {
112
+ if (e.name === "LockError") {
113
+ return
114
+ } else {
115
+ throw e
103
116
  }
104
- )
117
+ }
118
+
119
+ // run migrations
120
+ try {
121
+ await migrations.runMigrations(MIGRATIONS, options)
122
+ } finally {
123
+ // release lock
124
+ try {
125
+ await migrationLock.unlock()
126
+ } catch (e) {
127
+ console.error("unable to release migration lock")
128
+ }
129
+ }
105
130
  }
@@ -4,6 +4,7 @@ import {
4
4
  tenancy,
5
5
  DocumentType,
6
6
  context,
7
+ db,
7
8
  } from "@budibase/backend-core"
8
9
  import TestConfig from "../../tests/utilities/TestConfiguration"
9
10
  import structures from "../../tests/utilities/structures"
@@ -4,7 +4,6 @@ const { FieldTypes } = require("../constants")
4
4
  const VALIDATORS = {
5
5
  [FieldTypes.STRING]: () => true,
6
6
  [FieldTypes.OPTIONS]: () => true,
7
- [FieldTypes.BARCODEQR]: () => true,
8
7
  [FieldTypes.NUMBER]: attribute => {
9
8
  // allow not to be present
10
9
  if (!attribute) {
@@ -48,11 +48,6 @@ const TYPE_TRANSFORM_MAP = {
48
48
  [null]: "",
49
49
  [undefined]: undefined,
50
50
  },
51
- [FieldTypes.BARCODEQR]: {
52
- "": "",
53
- [null]: "",
54
- [undefined]: undefined,
55
- },
56
51
  [FieldTypes.FORMULA]: {
57
52
  "": "",
58
53
  [null]: "",
@@ -2,7 +2,6 @@ const { getRowParams, USER_METDATA_PREFIX } = require("../../db/utils")
2
2
  const {
3
3
  isDevAppID,
4
4
  getDevelopmentAppID,
5
- getProdAppID,
6
5
  doWithDB,
7
6
  } = require("@budibase/backend-core/db")
8
7
 
@@ -53,8 +52,7 @@ const getAppRows = async appId => {
53
52
  * Rows duplicates may exist across apps due to data import so they are not filtered out.
54
53
  */
55
54
  exports.getUniqueRows = async appIds => {
56
- let uniqueRows = [],
57
- rowsByApp = {}
55
+ let uniqueRows = []
58
56
  const pairs = getAppPairs(appIds)
59
57
 
60
58
  for (let pair of Object.values(pairs)) {
@@ -75,10 +73,8 @@ exports.getUniqueRows = async appIds => {
75
73
  // this can't be done on all rows because app import results in
76
74
  // duplicate row ids across apps
77
75
  // the array pre-concat is important to avoid stack overflow
78
- const prodId = getProdAppID(pair.devId || pair.prodId)
79
- rowsByApp[prodId] = [...new Set(appRows)]
80
- uniqueRows = uniqueRows.concat(rowsByApp[prodId])
76
+ uniqueRows = uniqueRows.concat([...new Set(appRows)])
81
77
  }
82
78
 
83
- return { rows: uniqueRows, appRows: rowsByApp }
79
+ return uniqueRows
84
80
  }
@@ -1,10 +0,0 @@
1
- import { logging } from "@budibase/backend-core"
2
- import { plugins } from "@budibase/pro"
3
-
4
- export const run = async () => {
5
- try {
6
- await plugins.checkPluginQuotas()
7
- } catch (err) {
8
- logging.logAlert("Failed to update plugin quotas", err)
9
- }
10
- }