@budibase/server 1.0.46-alpha.2 → 1.0.46-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/builder/assets/{index.89280093.js → index.6eae2fa0.js} +28 -28
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +1412 -1236
  4. package/coverage/coverage-final.json +89 -83
  5. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/application.js.html +90 -90
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/index.html +1 -1
  17. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  19. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/index.js.html +19 -19
  23. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  24. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  25. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  27. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +44 -44
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +8 -8
  31. package/coverage/lcov-report/api/controllers/row/utils.js.html +25 -25
  32. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  33. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  35. package/coverage/lcov-report/api/controllers/table/index.html +16 -16
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +25 -25
  37. package/coverage/lcov-report/api/controllers/table/internal.js.html +40 -34
  38. package/coverage/lcov-report/api/controllers/table/utils.js.html +76 -61
  39. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/user.js.html +20 -20
  41. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  42. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  44. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  45. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  46. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  47. package/coverage/lcov-report/api/index.html +1 -1
  48. package/coverage/lcov-report/api/index.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/index.html +1 -1
  62. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  79. package/coverage/lcov-report/automations/actions.js.html +24 -24
  80. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  81. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  82. package/coverage/lcov-report/automations/index.html +1 -1
  83. package/coverage/lcov-report/automations/index.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  85. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -19
  86. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  87. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  88. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  89. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  90. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  91. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  92. package/coverage/lcov-report/automations/steps/index.html +13 -13
  93. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  94. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  95. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  96. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  97. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  98. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  99. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  101. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  102. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  103. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  104. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  106. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  107. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  108. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  111. package/coverage/lcov-report/automations/utils.js.html +32 -32
  112. package/coverage/lcov-report/constants/index.html +1 -1
  113. package/coverage/lcov-report/constants/index.js.html +22 -22
  114. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  115. package/coverage/lcov-report/constants/screens.js.html +4 -4
  116. package/coverage/lcov-report/db/client.js.html +18 -18
  117. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  118. package/coverage/lcov-report/db/index.html +15 -15
  119. package/coverage/lcov-report/db/index.js.html +3 -3
  120. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +18 -18
  121. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  122. package/coverage/lcov-report/db/linkedRows/index.js.html +31 -31
  123. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +15 -15
  124. package/coverage/lcov-report/db/newid.js.html +4 -4
  125. package/coverage/lcov-report/db/utils.js.html +83 -83
  126. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  127. package/coverage/lcov-report/events/index.html +1 -1
  128. package/coverage/lcov-report/events/index.js.html +5 -5
  129. package/coverage/lcov-report/events/utils.js.html +3 -3
  130. package/coverage/lcov-report/index.html +68 -38
  131. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  132. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  133. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  134. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  135. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  136. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  137. package/coverage/lcov-report/middleware/index.html +20 -20
  138. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  139. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  140. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  141. package/coverage/lcov-report/middleware/usageQuota.js.html +275 -41
  142. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  143. package/coverage/lcov-report/migrations/usageQuotas/index.html +141 -0
  144. package/coverage/lcov-report/migrations/usageQuotas/index.js.html +152 -0
  145. package/coverage/lcov-report/migrations/usageQuotas/syncApps.js.html +134 -0
  146. package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +143 -0
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +1 -1
  149. package/coverage/lcov-report/threads/index.js.html +10 -10
  150. package/coverage/lcov-report/threads/query.js.html +1 -1
  151. package/coverage/lcov-report/threads/utils.js.html +14 -14
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  154. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  155. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  156. package/coverage/lcov-report/utilities/global.js.html +14 -14
  157. package/coverage/lcov-report/utilities/index.html +1 -1
  158. package/coverage/lcov-report/utilities/index.js.html +25 -25
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  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 +1 -1
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +53 -53
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +10 -10
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  167. package/coverage/lcov-report/utilities/security.js.html +8 -8
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  170. package/coverage/lcov-report/utilities/usageQuota/index.js.html +356 -0
  171. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +302 -0
  172. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +134 -0
  173. package/coverage/lcov-report/utilities/users.js.html +5 -5
  174. package/coverage/lcov-report/utilities/workerRequests.js.html +31 -31
  175. package/coverage/lcov.info +1900 -1602
  176. package/dist/api/controllers/table/internal.js +2 -0
  177. package/dist/api/controllers/table/utils.js +5 -0
  178. package/dist/automations/steps/createRow.js +2 -4
  179. package/dist/automations/steps/deleteRow.js +1 -4
  180. package/dist/environment.js +1 -0
  181. package/dist/middleware/usageQuota.js +82 -13
  182. package/dist/migrations/usageQuotas/index.js +24 -0
  183. package/dist/migrations/usageQuotas/syncApps.js +26 -0
  184. package/dist/migrations/usageQuotas/syncRows.js +29 -0
  185. package/dist/package.json +4 -4
  186. package/dist/tsconfig.tsbuildinfo +1 -1
  187. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +44 -31
  188. package/dist/utilities/usageQuota/rows.js +77 -0
  189. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  190. package/package.json +5 -5
  191. package/src/api/controllers/table/internal.js +2 -0
  192. package/src/api/controllers/table/utils.js +5 -0
  193. package/src/automations/steps/createRow.js +2 -4
  194. package/src/automations/steps/deleteRow.js +1 -4
  195. package/src/environment.js +1 -0
  196. package/src/middleware/tests/usageQuota.spec.js +18 -24
  197. package/src/middleware/usageQuota.js +93 -15
  198. package/src/migrations/tests/usageQuotas/index.spec.js +27 -0
  199. package/src/migrations/tests/usageQuotas/syncApps.spec.js +37 -0
  200. package/src/migrations/tests/usageQuotas/syncRows.spec.js +43 -0
  201. package/src/migrations/usageQuotas/index.js +24 -0
  202. package/src/migrations/usageQuotas/syncApps.js +18 -0
  203. package/src/migrations/usageQuotas/syncRows.js +21 -0
  204. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  205. package/src/utilities/usageQuota/index.js +92 -0
  206. package/src/utilities/usageQuota/rows.js +74 -0
  207. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  208. package/src/utilities/usageQuota.js +0 -73
@@ -24,6 +24,7 @@ const linkRows = require("../../../db/linkedRows");
24
24
  const { getRowParams, generateTableID } = require("../../../db/utils");
25
25
  const { FieldTypes } = require("../../../constants");
26
26
  const { TableSaveFunctions, hasTypeChanged, getTable, handleDataImport, } = require("./utils");
27
+ const usageQuota = require("../../../utilities/usageQuota");
27
28
  exports.save = function (ctx) {
28
29
  return __awaiter(this, void 0, void 0, function* () {
29
30
  const appId = ctx.appId;
@@ -118,6 +119,7 @@ exports.destroy = function (ctx) {
118
119
  include_docs: true,
119
120
  }));
120
121
  yield db.bulkDocs(rows.rows.map(row => (Object.assign(Object.assign({}, row.doc), { _deleted: true }))));
122
+ yield usageQuota.update(usageQuota.Properties.ROW, -rows.rows.length);
121
123
  // update linked rows
122
124
  yield linkRows.updateLinks({
123
125
  appId,
@@ -18,6 +18,7 @@ const { USERS_TABLE_SCHEMA, SwitchableTypes } = require("../../../constants");
18
18
  const { isExternalTable, breakExternalTableId, isSQL, } = require("../../../integrations/utils");
19
19
  const { getViews, saveView } = require("../view/utils");
20
20
  const viewTemplate = require("../view/viewBuilder");
21
+ const usageQuota = require("../../../utilities/usageQuota");
21
22
  exports.checkForColumnUpdates = (db, oldTable, updatedTable) => __awaiter(void 0, void 0, void 0, function* () {
22
23
  let updatedRows = [];
23
24
  const rename = updatedTable._rename;
@@ -95,7 +96,11 @@ exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0,
95
96
  }
96
97
  finalData.push(row);
97
98
  }
99
+ yield usageQuota.update(usageQuota.Properties.ROW, finalData.length, {
100
+ dryRun: true,
101
+ });
98
102
  yield db.bulkDocs(finalData);
103
+ yield usageQuota.update(usageQuota.Properties.ROW, finalData.length);
99
104
  let response = yield db.put(table);
100
105
  table._rev = response._rev;
101
106
  return table;
@@ -10,7 +10,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const rowController = require("../../api/controllers/row");
12
12
  const automationUtils = require("../automationUtils");
13
- const env = require("../../environment");
14
13
  const usage = require("../../utilities/usageQuota");
15
14
  const { buildCtx } = require("./utils");
16
15
  exports.definition = {
@@ -87,10 +86,9 @@ exports.run = function ({ inputs, appId, emitter }) {
87
86
  });
88
87
  try {
89
88
  inputs.row = yield automationUtils.cleanUpRow(appId, inputs.row.tableId, inputs.row);
90
- if (env.USE_QUOTAS) {
91
- yield usage.update(usage.Properties.ROW, 1);
92
- }
89
+ yield usage.update(usage.Properties.ROW, 1, { dryRun: true });
93
90
  yield rowController.save(ctx);
91
+ yield usage.update(usage.Properties.ROW, 1);
94
92
  return {
95
93
  row: inputs.row,
96
94
  response: ctx.body,
@@ -9,7 +9,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  const rowController = require("../../api/controllers/row");
12
- const env = require("../../environment");
13
12
  const usage = require("../../utilities/usageQuota");
14
13
  const { buildCtx } = require("./utils");
15
14
  const automationUtils = require("../automationUtils");
@@ -81,9 +80,7 @@ exports.run = function ({ inputs, appId, emitter }) {
81
80
  },
82
81
  });
83
82
  try {
84
- if (env.isProd()) {
85
- yield usage.update(usage.Properties.ROW, -1);
86
- }
83
+ yield usage.update(usage.Properties.ROW, -1);
87
84
  yield rowController.destroy(ctx);
88
85
  return {
89
86
  response: ctx.body,
@@ -30,6 +30,7 @@ module.exports = {
30
30
  MINIO_ACCESS_KEY: process.env.MINIO_ACCESS_KEY,
31
31
  MINIO_SECRET_KEY: process.env.MINIO_SECRET_KEY,
32
32
  USE_QUOTAS: process.env.USE_QUOTAS,
33
+ EXCLUDE_QUOTAS_TENANTS: process.env.EXCLUDE_QUOTAS_TENANTS,
33
34
  REDIS_URL: process.env.REDIS_URL,
34
35
  REDIS_PASSWORD: process.env.REDIS_PASSWORD,
35
36
  INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
@@ -10,11 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const CouchDB = require("../db");
12
12
  const usageQuota = require("../utilities/usageQuota");
13
- const env = require("../environment");
14
- const { getTenantId } = require("@budibase/backend-core/tenancy");
13
+ const { getUniqueRows } = require("../utilities/usageQuota/rows");
15
14
  const { isExternalTable, isRowId: isExternalRowId, } = require("../integrations/utils");
16
- // tenants without limits
17
- const EXCLUDED_TENANTS = ["bb", "default", "bbtest", "bbstaging"];
15
+ const migration = require("../migrations/usageQuotas");
18
16
  // currently only counting new writes and deletes
19
17
  const METHOD_MAP = {
20
18
  POST: 1,
@@ -22,13 +20,13 @@ const METHOD_MAP = {
22
20
  };
23
21
  const DOMAIN_MAP = {
24
22
  rows: usageQuota.Properties.ROW,
25
- upload: usageQuota.Properties.UPLOAD,
26
- views: usageQuota.Properties.VIEW,
27
- users: usageQuota.Properties.USER,
23
+ // upload: usageQuota.Properties.UPLOAD, // doesn't work yet
24
+ // views: usageQuota.Properties.VIEW, // doesn't work yet
25
+ // users: usageQuota.Properties.USER, // doesn't work yet
28
26
  applications: usageQuota.Properties.APPS,
29
27
  // this will not be updated by endpoint calls
30
28
  // instead it will be updated by triggerInfo
31
- automationRuns: usageQuota.Properties.AUTOMATION,
29
+ // automationRuns: usageQuota.Properties.AUTOMATION, // doesn't work yet
32
30
  };
33
31
  function getProperty(url) {
34
32
  for (let domain of Object.keys(DOMAIN_MAP)) {
@@ -38,9 +36,7 @@ function getProperty(url) {
38
36
  }
39
37
  }
40
38
  module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
41
- const tenantId = getTenantId();
42
- // if in development or a self hosted cloud usage quotas should not be executed
43
- if (env.isDev() || env.SELF_HOSTED || EXCLUDED_TENANTS.includes(tenantId)) {
39
+ if (!usageQuota.useQuotas()) {
44
40
  return next();
45
41
  }
46
42
  let usage = METHOD_MAP[ctx.req.method];
@@ -78,10 +74,83 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
78
74
  usage = files.map(file => file.size).reduce((total, size) => total + size);
79
75
  }
80
76
  try {
81
- yield usageQuota.update(property, usage);
82
- return next();
77
+ yield migration.run();
78
+ yield performRequest(ctx, next, property, usage);
83
79
  }
84
80
  catch (err) {
85
81
  ctx.throw(400, err);
86
82
  }
87
83
  });
84
+ const performRequest = (ctx, next, property, usage) => __awaiter(void 0, void 0, void 0, function* () {
85
+ const usageContext = {
86
+ skipNext: false,
87
+ skipUsage: false,
88
+ [usageQuota.Properties.APPS]: {},
89
+ };
90
+ if (usage === -1) {
91
+ if (PRE_DELETE[property]) {
92
+ yield PRE_DELETE[property](ctx, usageContext);
93
+ }
94
+ }
95
+ else {
96
+ if (PRE_CREATE[property]) {
97
+ yield PRE_CREATE[property](ctx, usageContext);
98
+ }
99
+ }
100
+ // run the request
101
+ if (!usageContext.skipNext) {
102
+ yield usageQuota.update(property, usage, { dryRun: true });
103
+ yield next();
104
+ }
105
+ if (usage === -1) {
106
+ if (POST_DELETE[property]) {
107
+ yield POST_DELETE[property](ctx, usageContext);
108
+ }
109
+ }
110
+ else {
111
+ if (POST_CREATE[property]) {
112
+ yield POST_CREATE[property](ctx, usageContext);
113
+ }
114
+ }
115
+ // update the usage
116
+ if (!usageContext.skipUsage) {
117
+ yield usageQuota.update(property, usage);
118
+ }
119
+ });
120
+ const appPreDelete = (ctx, usageContext) => __awaiter(void 0, void 0, void 0, function* () {
121
+ if (ctx.query.unpublish) {
122
+ // don't run usage decrement for unpublish
123
+ usageContext.skipUsage = true;
124
+ return;
125
+ }
126
+ // store the row count to delete
127
+ const rows = yield getUniqueRows([ctx.appId]);
128
+ if (rows.length) {
129
+ usageContext[usageQuota.Properties.APPS] = { rowCount: rows.length };
130
+ }
131
+ });
132
+ const appPostDelete = (ctx, usageContext) => __awaiter(void 0, void 0, void 0, function* () {
133
+ // delete the app rows from usage
134
+ const rowCount = usageContext[usageQuota.Properties.APPS].rowCount;
135
+ if (rowCount) {
136
+ yield usageQuota.update(usageQuota.Properties.ROW, -rowCount);
137
+ }
138
+ });
139
+ const appPostCreate = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
140
+ // app import & template creation
141
+ if (ctx.request.body.useTemplate === "true") {
142
+ const rows = yield getUniqueRows([ctx.response.body.appId]);
143
+ const rowCount = rows ? rows.length : 0;
144
+ yield usageQuota.update(usageQuota.Properties.ROW, rowCount);
145
+ }
146
+ });
147
+ const PRE_DELETE = {
148
+ [usageQuota.Properties.APPS]: appPreDelete,
149
+ };
150
+ const POST_DELETE = {
151
+ [usageQuota.Properties.APPS]: appPostDelete,
152
+ };
153
+ const PRE_CREATE = {};
154
+ const POST_CREATE = {
155
+ [usageQuota.Properties.APPS]: appPostCreate,
156
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ const { MIGRATIONS, MIGRATION_DBS, migrateIfRequired, } = require("@budibase/backend-core/migrations");
12
+ const { useQuotas } = require("../../utilities/usageQuota");
13
+ const syncApps = require("./syncApps");
14
+ const syncRows = require("./syncRows");
15
+ exports.run = () => __awaiter(void 0, void 0, void 0, function* () {
16
+ if (!useQuotas()) {
17
+ return;
18
+ }
19
+ // Jan 2022
20
+ yield migrateIfRequired(MIGRATION_DBS.GLOBAL_DB, MIGRATIONS.QUOTAS_1, () => __awaiter(void 0, void 0, void 0, function* () {
21
+ yield syncApps.run();
22
+ yield syncRows.run();
23
+ }));
24
+ });
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy");
12
+ const { getAllApps } = require("@budibase/backend-core/db");
13
+ const CouchDB = require("../../db");
14
+ const { getUsageQuotaDoc } = require("../../utilities/usageQuota");
15
+ exports.run = () => __awaiter(void 0, void 0, void 0, function* () {
16
+ const db = getGlobalDB();
17
+ // get app count
18
+ const devApps = yield getAllApps(CouchDB, { dev: true });
19
+ const appCount = devApps ? devApps.length : 0;
20
+ // sync app count
21
+ const tenantId = getTenantId();
22
+ console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`);
23
+ const usageDoc = yield getUsageQuotaDoc(db);
24
+ usageDoc.usageQuota.apps = appCount;
25
+ yield db.put(usageDoc);
26
+ });
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy");
12
+ const { getAllApps } = require("@budibase/backend-core/db");
13
+ const CouchDB = require("../../db");
14
+ const { getUsageQuotaDoc } = require("../../utilities/usageQuota");
15
+ const { getUniqueRows } = require("../../utilities/usageQuota/rows");
16
+ exports.run = () => __awaiter(void 0, void 0, void 0, function* () {
17
+ const db = getGlobalDB();
18
+ // get all rows in all apps
19
+ const allApps = yield getAllApps(CouchDB, { all: true });
20
+ const appIds = allApps ? allApps.map(app => app.appId) : [];
21
+ const rows = yield getUniqueRows(appIds);
22
+ const rowCount = rows ? rows.length : 0;
23
+ // sync row count
24
+ const tenantId = getTenantId();
25
+ console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`);
26
+ const usageDoc = yield getUsageQuotaDoc(db);
27
+ usageDoc.usageQuota.rows = rowCount;
28
+ yield db.put(usageDoc);
29
+ });
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.46-alpha.1",
4
+ "version": "1.0.46-alpha.2",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -70,9 +70,9 @@
70
70
  "license": "GPL-3.0",
71
71
  "dependencies": {
72
72
  "@apidevtools/swagger-parser": "^10.0.3",
73
- "@budibase/backend-core": "^1.0.46-alpha.1",
74
- "@budibase/client": "^1.0.46-alpha.1",
75
- "@budibase/string-templates": "^1.0.46-alpha.1",
73
+ "@budibase/backend-core": "^1.0.46-alpha.2",
74
+ "@budibase/client": "^1.0.46-alpha.2",
75
+ "@budibase/string-templates": "^1.0.46-alpha.2",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",