@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.
- package/builder/assets/{index.dd9e386f.css → index.39e01193.css} +1 -1
- package/builder/assets/{index.af9e71d8.js → index.e083dcaf.js} +221 -223
- package/builder/assets/{vendor.3bd2f661.js → vendor.f9faf6ab.js} +12 -12
- package/builder/index.html +3 -3
- package/coverage/clover.xml +1637 -1793
- package/coverage/coverage-final.json +94 -98
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/application.js.html +126 -210
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +4 -4
- package/coverage/lcov-report/api/controllers/datasource.js.html +36 -72
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/{migrations/usageQuotas/syncRows.js.html → api/controllers/hosting.js.html} +44 -41
- package/coverage/lcov-report/api/controllers/index.html +42 -27
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.js.html +19 -19
- package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
- package/coverage/lcov-report/api/controllers/role.js.html +9 -9
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
- package/coverage/lcov-report/api/controllers/row/index.html +15 -15
- package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
- package/coverage/lcov-report/api/controllers/row/internal.js.html +44 -44
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +8 -8
- package/coverage/lcov-report/api/controllers/row/utils.js.html +57 -39
- package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
- package/coverage/lcov-report/api/controllers/script.js.html +4 -4
- package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
- package/coverage/lcov-report/api/controllers/table/index.html +32 -32
- package/coverage/lcov-report/api/controllers/table/index.js.html +39 -57
- package/coverage/lcov-report/api/controllers/table/internal.js.html +34 -40
- package/coverage/lcov-report/api/controllers/table/utils.js.html +122 -83
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +20 -20
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
- package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
- package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +10 -10
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/application.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/{migrations/usageQuotas/syncApps.js.html → api/routes/hosting.js.html} +27 -42
- package/coverage/lcov-report/api/routes/index.html +22 -7
- package/coverage/lcov-report/api/routes/index.js.html +10 -4
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/row.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/static.js.html +2 -17
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +24 -24
- package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
- package/coverage/lcov-report/automations/bullboard.js.html +16 -16
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
- package/coverage/lcov-report/automations/steps/createRow.js.html +19 -13
- package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +20 -11
- package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
- package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
- package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
- package/coverage/lcov-report/automations/steps/index.html +13 -13
- package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
- package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
- package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
- package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
- package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
- package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
- package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
- package/coverage/lcov-report/automations/triggers.js.html +18 -18
- package/coverage/lcov-report/automations/utils.js.html +32 -32
- package/coverage/lcov-report/constants/index.html +11 -11
- package/coverage/lcov-report/constants/index.js.html +37 -40
- package/coverage/lcov-report/constants/layouts.js.html +5 -5
- package/coverage/lcov-report/constants/screens.js.html +4 -4
- package/coverage/lcov-report/db/client.js.html +18 -18
- package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
- package/coverage/lcov-report/db/index.html +15 -15
- package/coverage/lcov-report/db/index.js.html +3 -3
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +18 -18
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +31 -31
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +15 -15
- package/coverage/lcov-report/db/newid.js.html +4 -4
- package/coverage/lcov-report/db/utils.js.html +85 -85
- package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +5 -5
- package/coverage/lcov-report/events/utils.js.html +3 -3
- package/coverage/lcov-report/index.html +86 -116
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
- package/coverage/lcov-report/middleware/authorized.js.html +11 -11
- package/coverage/lcov-report/middleware/builder.js.html +8 -8
- package/coverage/lcov-report/middleware/currentapp.js.html +29 -29
- package/coverage/lcov-report/middleware/index.html +20 -20
- package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
- package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +41 -275
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +15 -15
- package/coverage/lcov-report/threads/index.js.html +10 -10
- package/coverage/lcov-report/threads/query.js.html +8 -23
- package/coverage/lcov-report/threads/utils.js.html +14 -14
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
- package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
- package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
- package/coverage/lcov-report/utilities/global.js.html +26 -26
- package/coverage/lcov-report/utilities/index.html +19 -19
- package/coverage/lcov-report/utilities/index.js.html +25 -25
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +53 -53
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +10 -10
- package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
- package/coverage/lcov-report/utilities/security.js.html +8 -8
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +5 -5
- package/coverage/lcov-report/utilities/workerRequests.js.html +108 -39
- package/coverage/lcov.info +2332 -2599
- package/dist/api/controllers/application.js +20 -49
- package/dist/api/controllers/datasource.js +0 -11
- package/dist/api/controllers/hosting.js +30 -0
- package/dist/api/controllers/row/ExternalRequest.js +2 -1
- package/dist/api/controllers/row/utils.js +8 -6
- package/dist/api/controllers/static/index.js +10 -59
- package/dist/api/controllers/table/index.js +4 -10
- package/dist/api/controllers/table/internal.js +0 -2
- package/dist/api/controllers/table/utils.js +17 -11
- package/dist/api/routes/hosting.js +11 -0
- package/dist/api/routes/index.js +2 -0
- package/dist/api/routes/static.js +1 -2
- package/dist/automations/steps/createRow.js +4 -2
- package/dist/automations/steps/deleteRow.js +4 -1
- package/dist/constants/index.js +5 -8
- package/dist/definitions/datasource.js +0 -1
- package/dist/environment.js +0 -1
- package/dist/integrations/base/sql.js +6 -13
- package/dist/integrations/index.js +0 -3
- package/dist/integrations/utils.js +9 -56
- package/dist/middleware/usageQuota.js +13 -82
- package/dist/package.json +5 -8
- package/dist/tests/utilities/TestConfiguration.js +1 -3
- package/dist/threads/query.js +0 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/{usageQuota/index.js → usageQuota.js} +31 -44
- package/dist/utilities/workerRequests.js +20 -0
- package/nodemon.json +1 -1
- package/package.json +6 -9
- package/src/api/controllers/application.js +24 -52
- package/src/api/controllers/datasource.js +0 -12
- package/src/api/controllers/hosting.js +22 -0
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/controllers/row/utils.js +12 -6
- package/src/api/controllers/static/index.js +10 -63
- package/src/api/controllers/table/index.js +9 -15
- package/src/api/controllers/table/internal.js +0 -2
- package/src/api/controllers/table/utils.js +24 -11
- package/src/api/routes/hosting.js +13 -0
- package/src/api/routes/index.js +2 -0
- package/src/api/routes/static.js +0 -5
- package/src/api/routes/tests/application.spec.js +2 -2
- package/src/api/routes/tests/hosting.spec.js +36 -0
- package/src/automations/steps/createRow.js +4 -2
- package/src/automations/steps/deleteRow.js +4 -1
- package/src/constants/index.js +8 -9
- package/src/definitions/datasource.ts +0 -3
- package/src/environment.js +0 -1
- package/src/integrations/base/sql.ts +7 -14
- package/src/integrations/index.ts +0 -3
- package/src/integrations/tests/sql.spec.js +0 -16
- package/src/integrations/utils.ts +11 -70
- package/src/middleware/tests/usageQuota.spec.js +24 -18
- package/src/middleware/usageQuota.js +15 -93
- package/src/tests/utilities/TestConfiguration.js +1 -3
- package/src/threads/query.js +0 -5
- package/src/utilities/usageQuota.js +73 -0
- package/src/utilities/workerRequests.js +23 -0
- package/coverage/lcov-report/migrations/usageQuotas/index.html +0 -141
- package/coverage/lcov-report/migrations/usageQuotas/index.js.html +0 -152
- package/coverage/lcov-report/utilities/usageQuota/index.html +0 -141
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -356
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +0 -302
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +0 -134
- package/dist/integrations/googlesheets.js +0 -340
- package/dist/migrations/usageQuotas/index.js +0 -24
- package/dist/migrations/usageQuotas/syncApps.js +0 -26
- package/dist/migrations/usageQuotas/syncRows.js +0 -29
- package/dist/utilities/usageQuota/rows.js +0 -77
- package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
- package/src/api/routes/tests/static.spec.js +0 -98
- package/src/integrations/googlesheets.ts +0 -353
- package/src/migrations/tests/usageQuotas/index.spec.js +0 -27
- package/src/migrations/tests/usageQuotas/syncApps.spec.js +0 -37
- package/src/migrations/tests/usageQuotas/syncRows.spec.js +0 -43
- package/src/migrations/usageQuotas/index.js +0 -24
- package/src/migrations/usageQuotas/syncApps.js +0 -18
- package/src/migrations/usageQuotas/syncRows.js +0 -21
- package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
- package/src/utilities/usageQuota/index.js +0 -92
- package/src/utilities/usageQuota/rows.js +0 -74
- 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
|
|
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
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
78
|
-
|
|
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
|
-
|
|
103
|
-
async init(appName = newid()) {
|
|
101
|
+
async init(appName = "test_application") {
|
|
104
102
|
await this.globalUser()
|
|
105
103
|
return this.createApp(appName)
|
|
106
104
|
}
|
package/src/threads/query.js
CHANGED
|
@@ -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"> </span>
|
|
85
|
-
<span class="cline-any cline-neutral"> </span>
|
|
86
|
-
<span class="cline-any cline-neutral"> </span>
|
|
87
|
-
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
97
|
-
<span class="cline-any cline-neutral"> </span>
|
|
98
|
-
<span class="cline-any cline-neutral"> </span>
|
|
99
|
-
<span class="cline-any cline-yes">1x</span>
|
|
100
|
-
<span class="cline-any cline-neutral"> </span>
|
|
101
|
-
<span class="cline-any cline-neutral"> </span>
|
|
102
|
-
<span class="cline-any cline-neutral"> </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"> </span>
|
|
106
|
-
<span class="cline-any cline-neutral"> </span>
|
|
107
|
-
<span class="cline-any cline-neutral"> </span>
|
|
108
|
-
<span class="cline-any cline-neutral"> </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
|
-
|
|
117
|
-
exports.run = async () => {
|
|
118
|
-
if (!useQuotas()) {
|
|
119
|
-
return
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Jan 2022
|
|
123
|
-
await migrateIfRequired(
|
|
124
|
-
MIGRATION_DBS.GLOBAL_DB,
|
|
125
|
-
MIGRATIONS.QUOTAS_1,
|
|
126
|
-
async () => {
|
|
127
|
-
await syncApps.run()
|
|
128
|
-
await syncRows.run()
|
|
129
|
-
}
|
|
130
|
-
)
|
|
131
|
-
}
|
|
132
|
-
</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
|
-
|