@budibase/server 1.0.46-alpha.7 → 1.0.48

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 (251) hide show
  1. package/builder/assets/{index.dd9e386f.css → index.39e01193.css} +1 -1
  2. package/builder/assets/{index.af9e71d8.js → index.e083dcaf.js} +221 -223
  3. package/builder/assets/{vendor.3bd2f661.js → vendor.f9faf6ab.js} +12 -12
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +1637 -1793
  6. package/coverage/coverage-final.json +94 -98
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +126 -210
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +36 -72
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/{migrations/usageQuotas/syncRows.js.html → api/controllers/hosting.js.html} +44 -41
  18. package/coverage/lcov-report/api/controllers/index.html +42 -27
  19. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  21. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +19 -19
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  26. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  27. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  29. package/coverage/lcov-report/api/controllers/row/index.html +15 -15
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +44 -44
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +8 -8
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +57 -39
  34. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  35. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  37. package/coverage/lcov-report/api/controllers/table/index.html +32 -32
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +39 -57
  39. package/coverage/lcov-report/api/controllers/table/internal.js.html +34 -40
  40. package/coverage/lcov-report/api/controllers/table/utils.js.html +122 -83
  41. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/user.js.html +20 -20
  43. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  44. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  46. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  47. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  48. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  49. package/coverage/lcov-report/api/index.html +1 -1
  50. package/coverage/lcov-report/api/index.js.html +10 -10
  51. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  62. package/coverage/lcov-report/{migrations/usageQuotas/syncApps.js.html → api/routes/hosting.js.html} +27 -42
  63. package/coverage/lcov-report/api/routes/index.html +22 -7
  64. package/coverage/lcov-report/api/routes/index.js.html +10 -4
  65. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/static.js.html +2 -17
  76. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  81. package/coverage/lcov-report/automations/actions.js.html +24 -24
  82. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  83. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  84. package/coverage/lcov-report/automations/index.html +1 -1
  85. package/coverage/lcov-report/automations/index.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  87. package/coverage/lcov-report/automations/steps/createRow.js.html +19 -13
  88. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  89. package/coverage/lcov-report/automations/steps/deleteRow.js.html +20 -11
  90. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  91. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  92. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  93. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  94. package/coverage/lcov-report/automations/steps/index.html +13 -13
  95. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  96. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  97. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  98. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  99. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  100. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  101. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  102. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  104. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  105. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  106. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  108. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  113. package/coverage/lcov-report/automations/utils.js.html +32 -32
  114. package/coverage/lcov-report/constants/index.html +11 -11
  115. package/coverage/lcov-report/constants/index.js.html +37 -40
  116. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  117. package/coverage/lcov-report/constants/screens.js.html +4 -4
  118. package/coverage/lcov-report/db/client.js.html +18 -18
  119. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  120. package/coverage/lcov-report/db/index.html +15 -15
  121. package/coverage/lcov-report/db/index.js.html +3 -3
  122. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +18 -18
  123. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/index.js.html +31 -31
  125. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +15 -15
  126. package/coverage/lcov-report/db/newid.js.html +4 -4
  127. package/coverage/lcov-report/db/utils.js.html +85 -85
  128. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  129. package/coverage/lcov-report/events/index.html +1 -1
  130. package/coverage/lcov-report/events/index.js.html +5 -5
  131. package/coverage/lcov-report/events/utils.js.html +3 -3
  132. package/coverage/lcov-report/index.html +86 -116
  133. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  134. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  135. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  136. package/coverage/lcov-report/middleware/authorized.js.html +11 -11
  137. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  138. package/coverage/lcov-report/middleware/currentapp.js.html +29 -29
  139. package/coverage/lcov-report/middleware/index.html +20 -20
  140. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  141. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  142. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  143. package/coverage/lcov-report/middleware/usageQuota.js.html +41 -275
  144. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  145. package/coverage/lcov-report/threads/automation.js.html +1 -1
  146. package/coverage/lcov-report/threads/index.html +15 -15
  147. package/coverage/lcov-report/threads/index.js.html +10 -10
  148. package/coverage/lcov-report/threads/query.js.html +8 -23
  149. package/coverage/lcov-report/threads/utils.js.html +14 -14
  150. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  151. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  152. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  153. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  154. package/coverage/lcov-report/utilities/global.js.html +26 -26
  155. package/coverage/lcov-report/utilities/index.html +19 -19
  156. package/coverage/lcov-report/utilities/index.js.html +25 -25
  157. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  158. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  159. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  160. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  161. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  162. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +53 -53
  163. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +10 -10
  164. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  165. package/coverage/lcov-report/utilities/security.js.html +8 -8
  166. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  167. package/coverage/lcov-report/utilities/users.js.html +5 -5
  168. package/coverage/lcov-report/utilities/workerRequests.js.html +108 -39
  169. package/coverage/lcov.info +2332 -2599
  170. package/dist/api/controllers/application.js +20 -49
  171. package/dist/api/controllers/datasource.js +0 -11
  172. package/dist/api/controllers/hosting.js +30 -0
  173. package/dist/api/controllers/row/ExternalRequest.js +2 -1
  174. package/dist/api/controllers/row/utils.js +8 -6
  175. package/dist/api/controllers/static/index.js +10 -59
  176. package/dist/api/controllers/table/index.js +4 -10
  177. package/dist/api/controllers/table/internal.js +0 -2
  178. package/dist/api/controllers/table/utils.js +17 -11
  179. package/dist/api/routes/hosting.js +11 -0
  180. package/dist/api/routes/index.js +2 -0
  181. package/dist/api/routes/static.js +1 -2
  182. package/dist/automations/steps/createRow.js +4 -2
  183. package/dist/automations/steps/deleteRow.js +4 -1
  184. package/dist/constants/index.js +5 -8
  185. package/dist/definitions/datasource.js +0 -1
  186. package/dist/environment.js +0 -1
  187. package/dist/integrations/base/sql.js +6 -13
  188. package/dist/integrations/index.js +0 -3
  189. package/dist/integrations/utils.js +9 -56
  190. package/dist/middleware/usageQuota.js +13 -82
  191. package/dist/package.json +5 -8
  192. package/dist/tests/utilities/TestConfiguration.js +1 -3
  193. package/dist/threads/query.js +0 -4
  194. package/dist/tsconfig.tsbuildinfo +1 -1
  195. package/dist/utilities/{usageQuota/index.js → usageQuota.js} +31 -44
  196. package/dist/utilities/workerRequests.js +20 -0
  197. package/nodemon.json +1 -1
  198. package/package.json +6 -9
  199. package/src/api/controllers/application.js +24 -52
  200. package/src/api/controllers/datasource.js +0 -12
  201. package/src/api/controllers/hosting.js +22 -0
  202. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  203. package/src/api/controllers/row/utils.js +12 -6
  204. package/src/api/controllers/static/index.js +10 -63
  205. package/src/api/controllers/table/index.js +9 -15
  206. package/src/api/controllers/table/internal.js +0 -2
  207. package/src/api/controllers/table/utils.js +24 -11
  208. package/src/api/routes/hosting.js +13 -0
  209. package/src/api/routes/index.js +2 -0
  210. package/src/api/routes/static.js +0 -5
  211. package/src/api/routes/tests/application.spec.js +2 -2
  212. package/src/api/routes/tests/hosting.spec.js +36 -0
  213. package/src/automations/steps/createRow.js +4 -2
  214. package/src/automations/steps/deleteRow.js +4 -1
  215. package/src/constants/index.js +8 -9
  216. package/src/definitions/datasource.ts +0 -3
  217. package/src/environment.js +0 -1
  218. package/src/integrations/base/sql.ts +7 -14
  219. package/src/integrations/index.ts +0 -3
  220. package/src/integrations/tests/sql.spec.js +0 -16
  221. package/src/integrations/utils.ts +11 -70
  222. package/src/middleware/tests/usageQuota.spec.js +24 -18
  223. package/src/middleware/usageQuota.js +15 -93
  224. package/src/tests/utilities/TestConfiguration.js +1 -3
  225. package/src/threads/query.js +0 -5
  226. package/src/utilities/usageQuota.js +73 -0
  227. package/src/utilities/workerRequests.js +23 -0
  228. package/coverage/lcov-report/migrations/usageQuotas/index.html +0 -141
  229. package/coverage/lcov-report/migrations/usageQuotas/index.js.html +0 -152
  230. package/coverage/lcov-report/utilities/usageQuota/index.html +0 -141
  231. package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -356
  232. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +0 -302
  233. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +0 -134
  234. package/dist/integrations/googlesheets.js +0 -340
  235. package/dist/migrations/usageQuotas/index.js +0 -24
  236. package/dist/migrations/usageQuotas/syncApps.js +0 -26
  237. package/dist/migrations/usageQuotas/syncRows.js +0 -29
  238. package/dist/utilities/usageQuota/rows.js +0 -77
  239. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  240. package/src/api/routes/tests/static.spec.js +0 -98
  241. package/src/integrations/googlesheets.ts +0 -353
  242. package/src/migrations/tests/usageQuotas/index.spec.js +0 -27
  243. package/src/migrations/tests/usageQuotas/syncApps.spec.js +0 -37
  244. package/src/migrations/tests/usageQuotas/syncRows.spec.js +0 -43
  245. package/src/migrations/usageQuotas/index.js +0 -24
  246. package/src/migrations/usageQuotas/syncApps.js +0 -18
  247. package/src/migrations/usageQuotas/syncRows.js +0 -21
  248. package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
  249. package/src/utilities/usageQuota/index.js +0 -92
  250. package/src/utilities/usageQuota/rows.js +0 -74
  251. package/src/utilities/usageQuota/usageQuoteReset.js +0 -18
@@ -1,11 +1,14 @@
1
1
  const CouchDB = require("../db")
2
2
  const usageQuota = require("../utilities/usageQuota")
3
- const { getUniqueRows } = require("../utilities/usageQuota/rows")
3
+ const env = require("../environment")
4
+ const { getTenantId } = require("@budibase/backend-core/tenancy")
4
5
  const {
5
6
  isExternalTable,
6
7
  isRowId: isExternalRowId,
7
8
  } = require("../integrations/utils")
8
- const migration = require("../migrations/usageQuotas")
9
+
10
+ // tenants without limits
11
+ const EXCLUDED_TENANTS = ["bb", "default", "bbtest", "bbstaging"]
9
12
 
10
13
  // currently only counting new writes and deletes
11
14
  const METHOD_MAP = {
@@ -15,13 +18,13 @@ const METHOD_MAP = {
15
18
 
16
19
  const DOMAIN_MAP = {
17
20
  rows: usageQuota.Properties.ROW,
18
- // upload: usageQuota.Properties.UPLOAD, // doesn't work yet
19
- // views: usageQuota.Properties.VIEW, // doesn't work yet
20
- // users: usageQuota.Properties.USER, // doesn't work yet
21
+ upload: usageQuota.Properties.UPLOAD,
22
+ views: usageQuota.Properties.VIEW,
23
+ users: usageQuota.Properties.USER,
21
24
  applications: usageQuota.Properties.APPS,
22
25
  // this will not be updated by endpoint calls
23
26
  // instead it will be updated by triggerInfo
24
- // automationRuns: usageQuota.Properties.AUTOMATION, // doesn't work yet
27
+ automationRuns: usageQuota.Properties.AUTOMATION,
25
28
  }
26
29
 
27
30
  function getProperty(url) {
@@ -33,7 +36,10 @@ function getProperty(url) {
33
36
  }
34
37
 
35
38
  module.exports = async (ctx, next) => {
36
- if (!usageQuota.useQuotas()) {
39
+ const tenantId = getTenantId()
40
+
41
+ // if in development or a self hosted cloud usage quotas should not be executed
42
+ if (env.isDev() || env.SELF_HOSTED || EXCLUDED_TENANTS.includes(tenantId)) {
37
43
  return next()
38
44
  }
39
45
 
@@ -74,93 +80,9 @@ module.exports = async (ctx, next) => {
74
80
  usage = files.map(file => file.size).reduce((total, size) => total + size)
75
81
  }
76
82
  try {
77
- await migration.run()
78
- await performRequest(ctx, next, property, usage)
83
+ await usageQuota.update(property, usage)
84
+ return next()
79
85
  } catch (err) {
80
86
  ctx.throw(400, err)
81
87
  }
82
88
  }
83
-
84
- const performRequest = async (ctx, next, property, usage) => {
85
- const usageContext = {
86
- skipNext: false,
87
- skipUsage: false,
88
- [usageQuota.Properties.APPS]: {},
89
- }
90
-
91
- if (usage === -1) {
92
- if (PRE_DELETE[property]) {
93
- await PRE_DELETE[property](ctx, usageContext)
94
- }
95
- } else {
96
- if (PRE_CREATE[property]) {
97
- await PRE_CREATE[property](ctx, usageContext)
98
- }
99
- }
100
-
101
- // run the request
102
- if (!usageContext.skipNext) {
103
- await usageQuota.update(property, usage, { dryRun: true })
104
- await next()
105
- }
106
-
107
- if (usage === -1) {
108
- if (POST_DELETE[property]) {
109
- await POST_DELETE[property](ctx, usageContext)
110
- }
111
- } else {
112
- if (POST_CREATE[property]) {
113
- await POST_CREATE[property](ctx, usageContext)
114
- }
115
- }
116
-
117
- // update the usage
118
- if (!usageContext.skipUsage) {
119
- await usageQuota.update(property, usage)
120
- }
121
- }
122
-
123
- const appPreDelete = async (ctx, usageContext) => {
124
- if (ctx.query.unpublish) {
125
- // don't run usage decrement for unpublish
126
- usageContext.skipUsage = true
127
- return
128
- }
129
-
130
- // store the row count to delete
131
- const rows = await getUniqueRows([ctx.appId])
132
- if (rows.length) {
133
- usageContext[usageQuota.Properties.APPS] = { rowCount: rows.length }
134
- }
135
- }
136
-
137
- const appPostDelete = async (ctx, usageContext) => {
138
- // delete the app rows from usage
139
- const rowCount = usageContext[usageQuota.Properties.APPS].rowCount
140
- if (rowCount) {
141
- await usageQuota.update(usageQuota.Properties.ROW, -rowCount)
142
- }
143
- }
144
-
145
- const appPostCreate = async ctx => {
146
- // app import & template creation
147
- if (ctx.request.body.useTemplate === "true") {
148
- const rows = await getUniqueRows([ctx.response.body.appId])
149
- const rowCount = rows ? rows.length : 0
150
- await usageQuota.update(usageQuota.Properties.ROW, rowCount)
151
- }
152
- }
153
-
154
- const PRE_DELETE = {
155
- [usageQuota.Properties.APPS]: appPreDelete,
156
- }
157
-
158
- const POST_DELETE = {
159
- [usageQuota.Properties.APPS]: appPostDelete,
160
- }
161
-
162
- const PRE_CREATE = {}
163
-
164
- const POST_CREATE = {
165
- [usageQuota.Properties.APPS]: appPostCreate,
166
- }
@@ -22,7 +22,6 @@ const { getGlobalDB } = require("@budibase/backend-core/tenancy")
22
22
  const { createASession } = require("@budibase/backend-core/sessions")
23
23
  const { user: userCache } = require("@budibase/backend-core/cache")
24
24
  const CouchDB = require("../../db")
25
- const newid = require("../../db/newid")
26
25
  core.init(CouchDB)
27
26
 
28
27
  const GLOBAL_USER_ID = "us_uuid1"
@@ -99,8 +98,7 @@ class TestConfiguration {
99
98
  }
100
99
  }
101
100
 
102
- // use a new id as the name to avoid name collisions
103
- async init(appName = newid()) {
101
+ async init(appName = "test_application") {
104
102
  await this.globalUser()
105
103
  return this.createApp(appName)
106
104
  }
@@ -78,11 +78,6 @@ class QueryRunner {
78
78
  return this.execute()
79
79
  }
80
80
 
81
- // check for undefined response
82
- if (!rows) {
83
- rows = []
84
- }
85
-
86
81
  // needs to an array for next step
87
82
  if (!Array.isArray(rows)) {
88
83
  rows = [rows]
@@ -0,0 +1,73 @@
1
+ const env = require("../environment")
2
+ const { getGlobalDB } = require("@budibase/backend-core/tenancy")
3
+ const {
4
+ StaticDatabases,
5
+ generateNewUsageQuotaDoc,
6
+ } = require("@budibase/backend-core/db")
7
+
8
+ function getNewQuotaReset() {
9
+ return Date.now() + 2592000000
10
+ }
11
+
12
+ exports.Properties = {
13
+ ROW: "rows",
14
+ UPLOAD: "storage",
15
+ VIEW: "views",
16
+ USER: "users",
17
+ AUTOMATION: "automationRuns",
18
+ APPS: "apps",
19
+ EMAILS: "emails",
20
+ }
21
+
22
+ async function getUsageQuotaDoc(db) {
23
+ let quota
24
+ try {
25
+ quota = await db.get(StaticDatabases.PLATFORM_INFO.docs.usageQuota)
26
+ } catch (err) {
27
+ // doc doesn't exist. Create it
28
+ quota = await db.post(generateNewUsageQuotaDoc())
29
+ }
30
+
31
+ return quota
32
+ }
33
+
34
+ /**
35
+ * Given a specified tenantId this will add to the usage object for the specified property.
36
+ * @param {string} property The property which is to be added to (within the nested usageQuota object).
37
+ * @param {number} usage The amount (this can be negative) to adjust the number by.
38
+ * @returns {Promise<void>} When this completes the API key will now be up to date - the quota period may have
39
+ * also been reset after this call.
40
+ */
41
+ exports.update = async (property, usage) => {
42
+ if (!env.USE_QUOTAS) {
43
+ return
44
+ }
45
+
46
+ try {
47
+ const db = getGlobalDB()
48
+ const quota = await getUsageQuotaDoc(db)
49
+
50
+ // Check if the quota needs reset
51
+ if (Date.now() >= quota.quotaReset) {
52
+ quota.quotaReset = getNewQuotaReset()
53
+ for (let prop of Object.keys(quota.usageQuota)) {
54
+ quota.usageQuota[prop] = 0
55
+ }
56
+ }
57
+
58
+ // increment the quota
59
+ quota.usageQuota[property] += usage
60
+
61
+ if (quota.usageQuota[property] > quota.usageLimits[property]) {
62
+ throw new Error(
63
+ `You have exceeded your usage quota of ${quota.usageLimits[property]} ${property}.`
64
+ )
65
+ }
66
+
67
+ // update the usage quotas
68
+ await db.put(quota)
69
+ } catch (err) {
70
+ console.error(`Error updating usage quotas for ${property}`, err)
71
+ throw err
72
+ }
73
+ }
@@ -58,6 +58,29 @@ exports.sendSmtpEmail = async (to, from, subject, contents, automation) => {
58
58
  return response.json()
59
59
  }
60
60
 
61
+ exports.getDeployedApps = async () => {
62
+ try {
63
+ const response = await fetch(
64
+ checkSlashesInUrl(env.WORKER_URL + `/api/apps`),
65
+ request(null, {
66
+ method: "GET",
67
+ })
68
+ )
69
+ const json = await response.json()
70
+ const apps = {}
71
+ for (let [key, value] of Object.entries(json)) {
72
+ if (value.url) {
73
+ value.url = value.url.toLowerCase()
74
+ apps[key.toLowerCase()] = value
75
+ }
76
+ }
77
+ return apps
78
+ } catch (err) {
79
+ // error, cannot determine deployed apps, don't stop app creation - sort this later
80
+ return {}
81
+ }
82
+ }
83
+
61
84
  exports.getGlobalSelf = async (ctx, appId = null) => {
62
85
  const endpoint = `/api/global/users/self`
63
86
  const response = await fetch(
@@ -1,141 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for migrations/usageQuotas</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> migrations/usageQuotas</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>40/40</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">62.5% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>5/8</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>5/5</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>39/39</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- </div>
58
- <div class='status-line high'></div>
59
- <div class="pad1">
60
- <table class="coverage-summary">
61
- <thead>
62
- <tr>
63
- <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
64
- <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
65
- <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
66
- <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
67
- <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
68
- <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
69
- <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
70
- <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
71
- <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
72
- <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
73
- </tr>
74
- </thead>
75
- <tbody><tr>
76
- <td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
77
- <td data-value="100" class="pic high">
78
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
79
- </td>
80
- <td data-value="100" class="pct high">100%</td>
81
- <td data-value="10" class="abs high">10/10</td>
82
- <td data-value="100" class="pct high">100%</td>
83
- <td data-value="2" class="abs high">2/2</td>
84
- <td data-value="100" class="pct high">100%</td>
85
- <td data-value="2" class="abs high">2/2</td>
86
- <td data-value="100" class="pct high">100%</td>
87
- <td data-value="10" class="abs high">10/10</td>
88
- </tr>
89
-
90
- <tr>
91
- <td class="file high" data-value="syncApps.js"><a href="syncApps.js.html">syncApps.js</a></td>
92
- <td data-value="100" class="pic high">
93
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
94
- </td>
95
- <td data-value="100" class="pct high">100%</td>
96
- <td data-value="13" class="abs high">13/13</td>
97
- <td data-value="50" class="pct medium">50%</td>
98
- <td data-value="2" class="abs medium">1/2</td>
99
- <td data-value="100" class="pct high">100%</td>
100
- <td data-value="1" class="abs high">1/1</td>
101
- <td data-value="100" class="pct high">100%</td>
102
- <td data-value="13" class="abs high">13/13</td>
103
- </tr>
104
-
105
- <tr>
106
- <td class="file high" data-value="syncRows.js"><a href="syncRows.js.html">syncRows.js</a></td>
107
- <td data-value="100" class="pic high">
108
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
109
- </td>
110
- <td data-value="100" class="pct high">100%</td>
111
- <td data-value="17" class="abs high">17/17</td>
112
- <td data-value="50" class="pct medium">50%</td>
113
- <td data-value="4" class="abs medium">2/4</td>
114
- <td data-value="100" class="pct high">100%</td>
115
- <td data-value="2" class="abs high">2/2</td>
116
- <td data-value="100" class="pct high">100%</td>
117
- <td data-value="16" class="abs high">16/16</td>
118
- </tr>
119
-
120
- </tbody>
121
- </table>
122
- </div>
123
- <div class='push'></div><!-- for sticky footer -->
124
- </div><!-- /wrapper -->
125
- <div class='footer quiet pad2 space-top1 center small'>
126
- Code coverage generated by
127
- <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
128
- at Fri Jan 28 2022 15:12:12 GMT+0000 (Coordinated Universal Time)
129
- </div>
130
- </div>
131
- <script src="../../prettify.js"></script>
132
- <script>
133
- window.onload = function () {
134
- prettyPrint();
135
- };
136
- </script>
137
- <script src="../../sorter.js"></script>
138
- <script src="../../block-navigation.js"></script>
139
- </body>
140
- </html>
141
-
@@ -1,152 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for migrations/usageQuotas/index.js</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">migrations/usageQuotas</a> index.js</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>10/10</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>2/2</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>2/2</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>10/10</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- </div>
58
- <div class='status-line high'></div>
59
- <pre><table class="coverage">
60
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
- <a name='L2'></a><a href='#L2'>2</a>
62
- <a name='L3'></a><a href='#L3'>3</a>
63
- <a name='L4'></a><a href='#L4'>4</a>
64
- <a name='L5'></a><a href='#L5'>5</a>
65
- <a name='L6'></a><a href='#L6'>6</a>
66
- <a name='L7'></a><a href='#L7'>7</a>
67
- <a name='L8'></a><a href='#L8'>8</a>
68
- <a name='L9'></a><a href='#L9'>9</a>
69
- <a name='L10'></a><a href='#L10'>10</a>
70
- <a name='L11'></a><a href='#L11'>11</a>
71
- <a name='L12'></a><a href='#L12'>12</a>
72
- <a name='L13'></a><a href='#L13'>13</a>
73
- <a name='L14'></a><a href='#L14'>14</a>
74
- <a name='L15'></a><a href='#L15'>15</a>
75
- <a name='L16'></a><a href='#L16'>16</a>
76
- <a name='L17'></a><a href='#L17'>17</a>
77
- <a name='L18'></a><a href='#L18'>18</a>
78
- <a name='L19'></a><a href='#L19'>19</a>
79
- <a name='L20'></a><a href='#L20'>20</a>
80
- <a name='L21'></a><a href='#L21'>21</a>
81
- <a name='L22'></a><a href='#L22'>22</a>
82
- <a name='L23'></a><a href='#L23'>23</a>
83
- <a name='L24'></a><a href='#L24'>24</a>
84
- <a name='L25'></a><a href='#L25'>25</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
85
- <span class="cline-any cline-neutral">&nbsp;</span>
86
- <span class="cline-any cline-neutral">&nbsp;</span>
87
- <span class="cline-any cline-neutral">&nbsp;</span>
88
- <span class="cline-any cline-yes">25x</span>
89
- <span class="cline-any cline-yes">25x</span>
90
- <span class="cline-any cline-yes">25x</span>
91
- <span class="cline-any cline-yes">25x</span>
92
- <span class="cline-any cline-neutral">&nbsp;</span>
93
- <span class="cline-any cline-yes">25x</span>
94
- <span class="cline-any cline-yes">4x</span>
95
- <span class="cline-any cline-yes">3x</span>
96
- <span class="cline-any cline-neutral">&nbsp;</span>
97
- <span class="cline-any cline-neutral">&nbsp;</span>
98
- <span class="cline-any cline-neutral">&nbsp;</span>
99
- <span class="cline-any cline-yes">1x</span>
100
- <span class="cline-any cline-neutral">&nbsp;</span>
101
- <span class="cline-any cline-neutral">&nbsp;</span>
102
- <span class="cline-any cline-neutral">&nbsp;</span>
103
- <span class="cline-any cline-yes">1x</span>
104
- <span class="cline-any cline-yes">1x</span>
105
- <span class="cline-any cline-neutral">&nbsp;</span>
106
- <span class="cline-any cline-neutral">&nbsp;</span>
107
- <span class="cline-any cline-neutral">&nbsp;</span>
108
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const {
109
- MIGRATIONS,
110
- MIGRATION_DBS,
111
- migrateIfRequired,
112
- } = require("@budibase/backend-core/migrations")
113
- const { useQuotas } = require("../../utilities/usageQuota")
114
- const syncApps = require("./syncApps")
115
- const syncRows = require("./syncRows")
116
- &nbsp;
117
- exports.run = async () =&gt; {
118
- if (!useQuotas()) {
119
- return
120
- }
121
- &nbsp;
122
- // Jan 2022
123
- await migrateIfRequired(
124
- MIGRATION_DBS.GLOBAL_DB,
125
- MIGRATIONS.QUOTAS_1,
126
- async () =&gt; {
127
- await syncApps.run()
128
- await syncRows.run()
129
- }
130
- )
131
- }
132
- &nbsp;</pre></td></tr></table></pre>
133
-
134
- <div class='push'></div><!-- for sticky footer -->
135
- </div><!-- /wrapper -->
136
- <div class='footer quiet pad2 space-top1 center small'>
137
- Code coverage generated by
138
- <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
139
- at Fri Jan 28 2022 15:12:12 GMT+0000 (Coordinated Universal Time)
140
- </div>
141
- </div>
142
- <script src="../../prettify.js"></script>
143
- <script>
144
- window.onload = function () {
145
- prettyPrint();
146
- };
147
- </script>
148
- <script src="../../sorter.js"></script>
149
- <script src="../../block-navigation.js"></script>
150
- </body>
151
- </html>
152
-