@budibase/server 1.0.46-alpha.0 → 1.0.46-alpha.4
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.0df4f7ab.css → index.243ca52c.css} +1 -1
- package/builder/assets/{index.f163603e.js → index.c21ee1fb.js} +144 -144
- package/builder/index.html +2 -2
- package/coverage/clover.xml +1932 -1756
- package/coverage/coverage-final.json +138 -132
- package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
- package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
- package/coverage/lcov-report/api/controllers/application.js.html +90 -90
- package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
- package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
- package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
- package/coverage/lcov-report/api/controllers/cloud.js.html +12 -12
- package/coverage/lcov-report/api/controllers/component.js.html +8 -8
- package/coverage/lcov-report/api/controllers/datasource.js.html +30 -30
- package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
- package/coverage/lcov-report/api/controllers/hosting.js.html +8 -8
- package/coverage/lcov-report/api/controllers/index.html +1 -1
- package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
- package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
- package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
- 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 +9 -9
- package/coverage/lcov-report/api/controllers/role.js.html +9 -9
- package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
- package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- 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 +25 -25
- 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 +16 -16
- package/coverage/lcov-report/api/controllers/table/index.js.html +25 -25
- package/coverage/lcov-report/api/controllers/table/internal.js.html +40 -34
- package/coverage/lcov-report/api/controllers/table/utils.js.html +76 -61
- package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
- 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 +26 -26
- package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
- package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
- package/coverage/lcov-report/api/routes/application.js.html +9 -9
- package/coverage/lcov-report/api/routes/auth.js.html +6 -6
- package/coverage/lcov-report/api/routes/automation.js.html +14 -14
- package/coverage/lcov-report/api/routes/backup.js.html +8 -8
- package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
- package/coverage/lcov-report/api/routes/component.js.html +8 -8
- package/coverage/lcov-report/api/routes/datasource.js.html +13 -13
- package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
- package/coverage/lcov-report/api/routes/dev.js.html +13 -13
- package/coverage/lcov-report/api/routes/hosting.js.html +8 -8
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/index.js.html +30 -30
- package/coverage/lcov-report/api/routes/integration.js.html +8 -8
- package/coverage/lcov-report/api/routes/layout.js.html +8 -8
- package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
- package/coverage/lcov-report/api/routes/permission.js.html +12 -12
- package/coverage/lcov-report/api/routes/query.js.html +10 -10
- package/coverage/lcov-report/api/routes/role.js.html +12 -12
- package/coverage/lcov-report/api/routes/routing.js.html +8 -8
- package/coverage/lcov-report/api/routes/row.js.html +10 -10
- package/coverage/lcov-report/api/routes/screen.js.html +11 -11
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/static.js.html +28 -13
- package/coverage/lcov-report/api/routes/table.js.html +12 -12
- package/coverage/lcov-report/api/routes/templates.js.html +8 -8
- package/coverage/lcov-report/api/routes/user.js.html +8 -8
- package/coverage/lcov-report/api/routes/view.js.html +10 -10
- package/coverage/lcov-report/api/routes/webhook.js.html +11 -11
- 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 +7 -7
- package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
- package/coverage/lcov-report/automations/steps/createRow.js.html +13 -19
- package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
- 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 +1 -1
- package/coverage/lcov-report/constants/index.js.html +22 -22
- 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 +6 -6
- package/coverage/lcov-report/events/utils.js.html +3 -3
- package/coverage/lcov-report/index.html +68 -38
- 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 +5 -5
- package/coverage/lcov-report/middleware/authorized.js.html +15 -15
- package/coverage/lcov-report/middleware/builder.js.html +16 -16
- package/coverage/lcov-report/middleware/currentapp.js.html +43 -43
- package/coverage/lcov-report/middleware/index.html +20 -20
- package/coverage/lcov-report/middleware/joi-validator.js.html +6 -6
- package/coverage/lcov-report/middleware/resourceId.js.html +22 -22
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +291 -57
- package/coverage/lcov-report/middleware/utils.js.html +4 -4
- package/coverage/lcov-report/migrations/usageQuotas/index.html +141 -0
- package/coverage/lcov-report/migrations/usageQuotas/index.js.html +152 -0
- package/coverage/lcov-report/migrations/usageQuotas/syncApps.js.html +134 -0
- package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +143 -0
- package/coverage/lcov-report/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +1 -1
- package/coverage/lcov-report/threads/index.js.html +10 -10
- package/coverage/lcov-report/threads/query.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/utilities/index.js.html +25 -25
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -9
- 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 +6 -6
- 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/usageQuota/index.html +141 -0
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +356 -0
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +302 -0
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +134 -0
- package/coverage/lcov-report/utilities/users.js.html +5 -5
- package/coverage/lcov-report/utilities/workerRequests.js.html +31 -31
- package/coverage/lcov.info +2530 -2232
- package/dist/api/controllers/static/index.js +50 -0
- package/dist/api/controllers/table/internal.js +2 -0
- package/dist/api/controllers/table/utils.js +5 -0
- package/dist/api/routes/static.js +2 -1
- package/dist/automations/steps/createRow.js +2 -4
- package/dist/automations/steps/deleteRow.js +1 -4
- package/dist/environment.js +1 -0
- package/dist/middleware/usageQuota.js +82 -13
- package/dist/migrations/usageQuotas/index.js +24 -0
- package/dist/migrations/usageQuotas/syncApps.js +26 -0
- package/dist/migrations/usageQuotas/syncRows.js +29 -0
- package/dist/package.json +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/{usageQuota.js → usageQuota/index.js} +44 -31
- package/dist/utilities/usageQuota/rows.js +77 -0
- package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
- package/package.json +5 -5
- package/src/api/controllers/static/index.js +50 -0
- package/src/api/controllers/table/internal.js +2 -0
- package/src/api/controllers/table/utils.js +5 -0
- package/src/api/routes/static.js +5 -0
- package/src/api/routes/tests/static.spec.js +98 -0
- package/src/automations/steps/createRow.js +2 -4
- package/src/automations/steps/deleteRow.js +1 -4
- package/src/environment.js +1 -0
- package/src/middleware/tests/usageQuota.spec.js +18 -24
- package/src/middleware/usageQuota.js +93 -15
- package/src/migrations/tests/usageQuotas/index.spec.js +27 -0
- package/src/migrations/tests/usageQuotas/syncApps.spec.js +37 -0
- package/src/migrations/tests/usageQuotas/syncRows.spec.js +43 -0
- package/src/migrations/usageQuotas/index.js +24 -0
- package/src/migrations/usageQuotas/syncApps.js +18 -0
- package/src/migrations/usageQuotas/syncRows.js +21 -0
- package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
- package/src/utilities/usageQuota/index.js +92 -0
- package/src/utilities/usageQuota/rows.js +74 -0
- package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
- package/src/utilities/usageQuota.js +0 -73
|
@@ -22,6 +22,8 @@ const { clientLibraryPath } = require("../../../utilities");
|
|
|
22
22
|
const { upload } = require("../../../utilities/fileSystem");
|
|
23
23
|
const { attachmentsRelativeURL } = require("../../../utilities");
|
|
24
24
|
const { DocumentTypes } = require("../../../db/utils");
|
|
25
|
+
const AWS = require("aws-sdk");
|
|
26
|
+
const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1";
|
|
25
27
|
function prepareUpload({ s3Key, bucket, metadata, file }) {
|
|
26
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
29
|
const response = yield upload({
|
|
@@ -109,3 +111,51 @@ exports.serveClientLibrary = function (ctx) {
|
|
|
109
111
|
});
|
|
110
112
|
});
|
|
111
113
|
};
|
|
114
|
+
exports.getSignedUploadURL = function (ctx) {
|
|
115
|
+
var _a, _b, _c;
|
|
116
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
+
const database = new CouchDB(ctx.appId);
|
|
118
|
+
// Ensure datasource is valid
|
|
119
|
+
let datasource;
|
|
120
|
+
try {
|
|
121
|
+
const { datasourceId } = ctx.params;
|
|
122
|
+
datasource = yield database.get(datasourceId);
|
|
123
|
+
if (!datasource) {
|
|
124
|
+
ctx.throw(400, "The specified datasource could not be found");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
ctx.throw(400, "The specified datasource could not be found");
|
|
129
|
+
}
|
|
130
|
+
// Ensure we aren't using a custom endpoint
|
|
131
|
+
if ((_a = datasource === null || datasource === void 0 ? void 0 : datasource.config) === null || _a === void 0 ? void 0 : _a.endpoint) {
|
|
132
|
+
ctx.throw(400, "S3 datasources with custom endpoints are not supported");
|
|
133
|
+
}
|
|
134
|
+
// Determine type of datasource and generate signed URL
|
|
135
|
+
let signedUrl;
|
|
136
|
+
let publicUrl;
|
|
137
|
+
if (datasource.source === "S3") {
|
|
138
|
+
const { bucket, key } = ctx.request.body || {};
|
|
139
|
+
if (!bucket || !key) {
|
|
140
|
+
ctx.throw(400, "bucket and key values are required");
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
const s3 = new AWS.S3({
|
|
145
|
+
region: AWS_REGION,
|
|
146
|
+
accessKeyId: (_b = datasource === null || datasource === void 0 ? void 0 : datasource.config) === null || _b === void 0 ? void 0 : _b.accessKeyId,
|
|
147
|
+
secretAccessKey: (_c = datasource === null || datasource === void 0 ? void 0 : datasource.config) === null || _c === void 0 ? void 0 : _c.secretAccessKey,
|
|
148
|
+
apiVersion: "2006-03-01",
|
|
149
|
+
signatureVersion: "v4",
|
|
150
|
+
});
|
|
151
|
+
const params = { Bucket: bucket, Key: key };
|
|
152
|
+
signedUrl = s3.getSignedUrl("putObject", params);
|
|
153
|
+
publicUrl = `https://${bucket}.s3.${AWS_REGION}.amazonaws.com/${key}`;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
ctx.throw(400, error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
ctx.body = { signedUrl, publicUrl };
|
|
160
|
+
});
|
|
161
|
+
};
|
|
@@ -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;
|
|
@@ -43,5 +43,6 @@ router
|
|
|
43
43
|
.post("/api/attachments/process", authorized(BUILDER), controller.uploadFile)
|
|
44
44
|
.post("/api/attachments/:tableId/upload", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.WRITE), controller.uploadFile)
|
|
45
45
|
// TODO: this likely needs to be secured in some way
|
|
46
|
-
.get("/:appId/:path*", controller.serveApp)
|
|
46
|
+
.get("/:appId/:path*", controller.serveApp)
|
|
47
|
+
.post("/api/attachments/:datasourceId/url", authorized(PermissionTypes.TABLE, PermissionLevels.READ), controller.getSignedUploadURL);
|
|
47
48
|
module.exports = router;
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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,
|
package/dist/environment.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
82
|
-
|
|
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.
|
|
4
|
+
"version": "1.0.46-alpha.3",
|
|
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.
|
|
74
|
-
"@budibase/client": "^1.0.
|
|
75
|
-
"@budibase/string-templates": "^1.0.
|
|
73
|
+
"@budibase/backend-core": "^1.0.46-alpha.3",
|
|
74
|
+
"@budibase/client": "^1.0.46-alpha.3",
|
|
75
|
+
"@budibase/string-templates": "^1.0.46-alpha.3",
|
|
76
76
|
"@bull-board/api": "^3.7.0",
|
|
77
77
|
"@bull-board/koa": "^3.7.0",
|
|
78
78
|
"@elastic/elasticsearch": "7.10.0",
|