@budibase/server 2.0.30-alpha.0 → 2.0.30
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.ae93bd4f.js → index.86a96d03.js} +262 -262
- package/builder/assets/{index.e56da48a.css → index.dfa4073c.css} +2 -2
- package/builder/index.html +2 -2
- package/coverage/clover.xml +341 -344
- package/coverage/coverage-final.json +24 -24
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- 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/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +2 -2
- package/coverage/lcov-report/api/controllers/index.html +1 -1
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +12 -12
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +15 -15
- package/coverage/lcov-report/api/controllers/row/utils.js.html +13 -13
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +5 -5
- 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/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/api/routes/index.html +1 -1
- 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/migrations.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/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- 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/utils/index.html +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.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 +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +5 -5
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +3 -3
- package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +22 -22
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +1 -1
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +1 -1
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +11 -11
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +11 -11
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +3 -3
- package/coverage/lcov-report/db/newid.js.html +2 -2
- package/coverage/lcov-report/db/utils.js.html +16 -10
- 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 +2 -2
- package/coverage/lcov-report/events/utils.js.html +9 -9
- package/coverage/lcov-report/index.html +15 -15
- 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/builder.js.html +11 -11
- package/coverage/lcov-report/middleware/currentapp.js.html +34 -34
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +16 -16
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +1 -1
- package/coverage/lcov-report/utilities/plugins.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +13 -13
- 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 +38 -38
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +10 -10
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +1 -1
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +14 -14
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +11 -23
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +614 -619
- package/dist/api/controllers/application.js +2 -2
- package/dist/api/controllers/dev.js +1 -1
- package/dist/api/controllers/query/index.js +2 -6
- package/dist/api/controllers/row/index.js +10 -30
- package/dist/api/controllers/static/templates/preview.hbs +0 -10
- package/dist/api/controllers/table/internal.js +2 -8
- package/dist/api/controllers/table/utils.js +1 -3
- package/dist/automations/steps/updateRow.js +2 -2
- package/dist/automations/utils.js +3 -5
- package/dist/db/utils.js +1 -1
- package/dist/index.js +0 -1
- package/dist/integrations/rest.js +2 -39
- package/dist/migrations/functions/{usageQuotas/syncPlugins.js → pluginCount.js} +3 -1
- package/dist/migrations/functions/{syncQuotas.js → quotas1.js} +7 -3
- package/dist/migrations/functions/usageQuotas/syncApps.js +1 -0
- package/dist/migrations/functions/usageQuotas/syncRows.js +5 -9
- package/dist/migrations/index.js +9 -3
- package/dist/package.json +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/usageQuota/rows.js +4 -6
- package/package.json +7 -7
- package/src/api/controllers/application.ts +2 -2
- package/src/api/controllers/dev.js +1 -1
- package/src/api/controllers/query/index.ts +2 -7
- package/src/api/controllers/row/index.ts +13 -36
- package/src/api/controllers/static/templates/preview.hbs +0 -10
- package/src/api/controllers/table/internal.ts +2 -5
- package/src/api/controllers/table/utils.ts +1 -3
- package/src/api/routes/tests/row.spec.js +27 -22
- package/src/automations/steps/updateRow.js +2 -2
- package/src/automations/tests/automation.spec.js +6 -1
- package/src/automations/utils.ts +4 -6
- package/src/db/utils.js +2 -0
- package/src/definitions/datasource.ts +0 -1
- package/src/index.ts +0 -1
- package/src/integrations/rest.ts +2 -18
- package/src/integrations/tests/rest.spec.ts +9 -9
- package/src/migrations/functions/backfill/global.ts +1 -1
- package/src/migrations/functions/pluginCount.ts +12 -0
- package/src/migrations/functions/{syncQuotas.ts → quotas1.ts} +8 -3
- package/src/migrations/functions/tests/{syncQuotas.spec.js → quotas1.spec.js} +2 -5
- package/src/migrations/functions/usageQuotas/syncApps.ts +1 -0
- package/src/migrations/functions/usageQuotas/syncRows.ts +6 -15
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +1 -9
- package/src/migrations/index.ts +15 -3
- package/src/migrations/tests/index.spec.ts +1 -0
- package/src/utilities/usageQuota/rows.js +3 -7
- package/src/migrations/functions/usageQuotas/syncPlugins.ts +0 -10
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
const { getRowParams, USER_METDATA_PREFIX } = require("../../db/utils");
|
|
12
|
-
const { isDevAppID, getDevelopmentAppID,
|
|
12
|
+
const { isDevAppID, getDevelopmentAppID, doWithDB, } = require("@budibase/backend-core/db");
|
|
13
13
|
const ROW_EXCLUSIONS = [USER_METDATA_PREFIX];
|
|
14
14
|
const getAppPairs = appIds => {
|
|
15
15
|
// collect the app ids into dev / prod pairs
|
|
@@ -53,7 +53,7 @@ const getAppRows = (appId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
53
53
|
* Rows duplicates may exist across apps due to data import so they are not filtered out.
|
|
54
54
|
*/
|
|
55
55
|
exports.getUniqueRows = (appIds) => __awaiter(void 0, void 0, void 0, function* () {
|
|
56
|
-
let uniqueRows = []
|
|
56
|
+
let uniqueRows = [];
|
|
57
57
|
const pairs = getAppPairs(appIds);
|
|
58
58
|
for (let pair of Object.values(pairs)) {
|
|
59
59
|
let appRows = [];
|
|
@@ -73,9 +73,7 @@ exports.getUniqueRows = (appIds) => __awaiter(void 0, void 0, void 0, function*
|
|
|
73
73
|
// this can't be done on all rows because app import results in
|
|
74
74
|
// duplicate row ids across apps
|
|
75
75
|
// the array pre-concat is important to avoid stack overflow
|
|
76
|
-
|
|
77
|
-
rowsByApp[prodId] = [...new Set(appRows)];
|
|
78
|
-
uniqueRows = uniqueRows.concat(rowsByApp[prodId]);
|
|
76
|
+
uniqueRows = uniqueRows.concat([...new Set(appRows)]);
|
|
79
77
|
}
|
|
80
|
-
return
|
|
78
|
+
return uniqueRows;
|
|
81
79
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "2.0.30
|
|
4
|
+
"version": "2.0.30",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"license": "GPL-3.0",
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@apidevtools/swagger-parser": "10.0.3",
|
|
80
|
-
"@budibase/backend-core": "2.0.30
|
|
81
|
-
"@budibase/client": "2.0.30
|
|
80
|
+
"@budibase/backend-core": "^2.0.30",
|
|
81
|
+
"@budibase/client": "^2.0.30",
|
|
82
82
|
"@budibase/pro": "2.0.29",
|
|
83
|
-
"@budibase/string-templates": "2.0.30
|
|
84
|
-
"@budibase/types": "2.0.30
|
|
83
|
+
"@budibase/string-templates": "^2.0.30",
|
|
84
|
+
"@budibase/types": "^2.0.30",
|
|
85
85
|
"@bull-board/api": "3.7.0",
|
|
86
86
|
"@bull-board/koa": "3.9.4",
|
|
87
87
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
"to-json-schema": "0.2.5",
|
|
147
147
|
"uuid": "3.3.2",
|
|
148
148
|
"validate.js": "0.13.1",
|
|
149
|
-
"vm2": "3.9.
|
|
149
|
+
"vm2": "3.9.6",
|
|
150
150
|
"worker-farm": "1.7.0",
|
|
151
151
|
"xml2js": "0.4.23",
|
|
152
152
|
"yargs": "13.2.4",
|
|
@@ -199,5 +199,5 @@
|
|
|
199
199
|
"optionalDependencies": {
|
|
200
200
|
"oracledb": "5.3.0"
|
|
201
201
|
},
|
|
202
|
-
"gitHead": "
|
|
202
|
+
"gitHead": "ec85bd13aeabb93d9a68ae32bf9c2504b216c6ac"
|
|
203
203
|
}
|
|
@@ -359,7 +359,7 @@ const appPostCreate = async (ctx: any, app: App) => {
|
|
|
359
359
|
await creationEvents(ctx.request, app)
|
|
360
360
|
// app import & template creation
|
|
361
361
|
if (ctx.request.body.useTemplate === "true") {
|
|
362
|
-
const
|
|
362
|
+
const rows = await getUniqueRows([app.appId])
|
|
363
363
|
const rowCount = rows ? rows.length : 0
|
|
364
364
|
if (rowCount) {
|
|
365
365
|
try {
|
|
@@ -493,7 +493,7 @@ const destroyApp = async (ctx: any) => {
|
|
|
493
493
|
}
|
|
494
494
|
|
|
495
495
|
const preDestroyApp = async (ctx: any) => {
|
|
496
|
-
const
|
|
496
|
+
const rows = await getUniqueRows([ctx.params.appId])
|
|
497
497
|
ctx.rowCount = rows.length
|
|
498
498
|
}
|
|
499
499
|
|
|
@@ -153,10 +153,7 @@ export async function preview(ctx: any) {
|
|
|
153
153
|
auth: { ...authConfigCtx },
|
|
154
154
|
},
|
|
155
155
|
})
|
|
156
|
-
|
|
157
|
-
const { rows, keys, info, extra } = await quotas.addQuery(runFn, {
|
|
158
|
-
datasourceId: datasource._id,
|
|
159
|
-
})
|
|
156
|
+
const { rows, keys, info, extra } = await quotas.addQuery(runFn)
|
|
160
157
|
const schemaFields: any = {}
|
|
161
158
|
if (rows?.length > 0) {
|
|
162
159
|
for (let key of [...new Set(keys)] as string[]) {
|
|
@@ -237,9 +234,7 @@ async function execute(
|
|
|
237
234
|
},
|
|
238
235
|
})
|
|
239
236
|
|
|
240
|
-
const { rows, pagination, extra } = await quotas.addQuery(runFn
|
|
241
|
-
datasourceId: datasource._id,
|
|
242
|
-
})
|
|
237
|
+
const { rows, pagination, extra } = await quotas.addQuery(runFn)
|
|
243
238
|
// remove the raw from execution incase transformer being used to hide data
|
|
244
239
|
if (extra?.raw) {
|
|
245
240
|
delete extra.raw
|
|
@@ -31,11 +31,8 @@ export async function patch(ctx: any): Promise<any> {
|
|
|
31
31
|
return save(ctx)
|
|
32
32
|
}
|
|
33
33
|
try {
|
|
34
|
-
const { row, table } = await quotas.addQuery(
|
|
35
|
-
|
|
36
|
-
{
|
|
37
|
-
datasourceId: tableId,
|
|
38
|
-
}
|
|
34
|
+
const { row, table } = await quotas.addQuery(() =>
|
|
35
|
+
pickApi(tableId).patch(ctx)
|
|
39
36
|
)
|
|
40
37
|
ctx.status = 200
|
|
41
38
|
ctx.eventEmitter &&
|
|
@@ -57,9 +54,7 @@ export const save = async (ctx: any) => {
|
|
|
57
54
|
}
|
|
58
55
|
try {
|
|
59
56
|
const { row, table } = await quotas.addRow(() =>
|
|
60
|
-
quotas.addQuery(() => pickApi(tableId).save(ctx)
|
|
61
|
-
datasourceId: tableId,
|
|
62
|
-
})
|
|
57
|
+
quotas.addQuery(() => pickApi(tableId).save(ctx))
|
|
63
58
|
)
|
|
64
59
|
ctx.status = 200
|
|
65
60
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:save`, appId, row, table)
|
|
@@ -73,9 +68,7 @@ export const save = async (ctx: any) => {
|
|
|
73
68
|
export async function fetchView(ctx: any) {
|
|
74
69
|
const tableId = getTableId(ctx)
|
|
75
70
|
try {
|
|
76
|
-
ctx.body = await quotas.addQuery(() => pickApi(tableId).fetchView(ctx)
|
|
77
|
-
datasourceId: tableId,
|
|
78
|
-
})
|
|
71
|
+
ctx.body = await quotas.addQuery(() => pickApi(tableId).fetchView(ctx))
|
|
79
72
|
} catch (err) {
|
|
80
73
|
ctx.throw(400, err)
|
|
81
74
|
}
|
|
@@ -84,9 +77,7 @@ export async function fetchView(ctx: any) {
|
|
|
84
77
|
export async function fetch(ctx: any) {
|
|
85
78
|
const tableId = getTableId(ctx)
|
|
86
79
|
try {
|
|
87
|
-
ctx.body = await quotas.addQuery(() => pickApi(tableId).fetch(ctx)
|
|
88
|
-
datasourceId: tableId,
|
|
89
|
-
})
|
|
80
|
+
ctx.body = await quotas.addQuery(() => pickApi(tableId).fetch(ctx))
|
|
90
81
|
} catch (err) {
|
|
91
82
|
ctx.throw(400, err)
|
|
92
83
|
}
|
|
@@ -95,9 +86,7 @@ export async function fetch(ctx: any) {
|
|
|
95
86
|
export async function find(ctx: any) {
|
|
96
87
|
const tableId = getTableId(ctx)
|
|
97
88
|
try {
|
|
98
|
-
ctx.body = await quotas.addQuery(() => pickApi(tableId).find(ctx)
|
|
99
|
-
datasourceId: tableId,
|
|
100
|
-
})
|
|
89
|
+
ctx.body = await quotas.addQuery(() => pickApi(tableId).find(ctx))
|
|
101
90
|
} catch (err) {
|
|
102
91
|
ctx.throw(400, err)
|
|
103
92
|
}
|
|
@@ -109,11 +98,8 @@ export async function destroy(ctx: any) {
|
|
|
109
98
|
const tableId = getTableId(ctx)
|
|
110
99
|
let response, row
|
|
111
100
|
if (inputs.rows) {
|
|
112
|
-
let { rows } = await quotas.addQuery(
|
|
113
|
-
|
|
114
|
-
{
|
|
115
|
-
datasourceId: tableId,
|
|
116
|
-
}
|
|
101
|
+
let { rows } = await quotas.addQuery(() =>
|
|
102
|
+
pickApi(tableId).bulkDestroy(ctx)
|
|
117
103
|
)
|
|
118
104
|
await quotas.removeRows(rows.length)
|
|
119
105
|
response = rows
|
|
@@ -121,9 +107,7 @@ export async function destroy(ctx: any) {
|
|
|
121
107
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
|
|
122
108
|
}
|
|
123
109
|
} else {
|
|
124
|
-
let resp = await quotas.addQuery(() => pickApi(tableId).destroy(ctx)
|
|
125
|
-
datasourceId: tableId,
|
|
126
|
-
})
|
|
110
|
+
let resp = await quotas.addQuery(() => pickApi(tableId).destroy(ctx))
|
|
127
111
|
await quotas.removeRow()
|
|
128
112
|
response = resp.response
|
|
129
113
|
row = resp.row
|
|
@@ -139,9 +123,7 @@ export async function search(ctx: any) {
|
|
|
139
123
|
const tableId = getTableId(ctx)
|
|
140
124
|
try {
|
|
141
125
|
ctx.status = 200
|
|
142
|
-
ctx.body = await quotas.addQuery(() => pickApi(tableId).search(ctx)
|
|
143
|
-
datasourceId: tableId,
|
|
144
|
-
})
|
|
126
|
+
ctx.body = await quotas.addQuery(() => pickApi(tableId).search(ctx))
|
|
145
127
|
} catch (err) {
|
|
146
128
|
ctx.throw(400, err)
|
|
147
129
|
}
|
|
@@ -159,11 +141,8 @@ export async function validate(ctx: any) {
|
|
|
159
141
|
export async function fetchEnrichedRow(ctx: any) {
|
|
160
142
|
const tableId = getTableId(ctx)
|
|
161
143
|
try {
|
|
162
|
-
ctx.body = await quotas.addQuery(
|
|
163
|
-
|
|
164
|
-
{
|
|
165
|
-
datasourceId: tableId,
|
|
166
|
-
}
|
|
144
|
+
ctx.body = await quotas.addQuery(() =>
|
|
145
|
+
pickApi(tableId).fetchEnrichedRow(ctx)
|
|
167
146
|
)
|
|
168
147
|
} catch (err) {
|
|
169
148
|
ctx.throw(400, err)
|
|
@@ -173,9 +152,7 @@ export async function fetchEnrichedRow(ctx: any) {
|
|
|
173
152
|
export const exportRows = async (ctx: any) => {
|
|
174
153
|
const tableId = getTableId(ctx)
|
|
175
154
|
try {
|
|
176
|
-
ctx.body = await quotas.addQuery(() => pickApi(tableId).exportRows(ctx)
|
|
177
|
-
datasourceId: tableId,
|
|
178
|
-
})
|
|
155
|
+
ctx.body = await quotas.addQuery(() => pickApi(tableId).exportRows(ctx))
|
|
179
156
|
} catch (err) {
|
|
180
157
|
ctx.throw(400, err)
|
|
181
158
|
}
|
|
@@ -56,16 +56,6 @@
|
|
|
56
56
|
return
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
// If this is a custom event, try and handle it
|
|
60
|
-
if (parsed.runtimeEvent) {
|
|
61
|
-
const { name, payload } = parsed
|
|
62
|
-
if (window.handleBuilderRuntimeEvent) {
|
|
63
|
-
window.handleBuilderRuntimeEvent(name, payload)
|
|
64
|
-
}
|
|
65
|
-
return
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Otherwise this is a full reload message
|
|
69
59
|
// Extract data from message
|
|
70
60
|
const {
|
|
71
61
|
selectedComponentId,
|
|
@@ -18,7 +18,6 @@ import { Table } from "@budibase/types"
|
|
|
18
18
|
import { quotas } from "@budibase/pro"
|
|
19
19
|
import { isEqual } from "lodash"
|
|
20
20
|
import { cloneDeep } from "lodash/fp"
|
|
21
|
-
import env from "../../../environment"
|
|
22
21
|
|
|
23
22
|
function checkAutoColumns(table: Table, oldTable: Table) {
|
|
24
23
|
if (!table.schema) {
|
|
@@ -154,9 +153,7 @@ export async function destroy(ctx: any) {
|
|
|
154
153
|
await db.bulkDocs(
|
|
155
154
|
rows.rows.map((row: any) => ({ ...row.doc, _deleted: true }))
|
|
156
155
|
)
|
|
157
|
-
await quotas.removeRows(rows.rows.length
|
|
158
|
-
tableId: ctx.params.tableId,
|
|
159
|
-
})
|
|
156
|
+
await quotas.removeRows(rows.rows.length)
|
|
160
157
|
|
|
161
158
|
// update linked rows
|
|
162
159
|
await updateLinks({
|
|
@@ -168,7 +165,7 @@ export async function destroy(ctx: any) {
|
|
|
168
165
|
await db.remove(tableToDelete)
|
|
169
166
|
|
|
170
167
|
// remove table search index
|
|
171
|
-
if (!isTest()
|
|
168
|
+
if (!isTest()) {
|
|
172
169
|
const currentIndexes = await db.getIndexes()
|
|
173
170
|
const existingIndex = currentIndexes.indexes.find(
|
|
174
171
|
(existing: any) => existing.name === `search:${ctx.params.tableId}`
|
|
@@ -148,9 +148,7 @@ export async function handleDataImport(user: any, table: any, dataImport: any) {
|
|
|
148
148
|
finalData.push(row)
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
await quotas.addRows(finalData.length, () => db.bulkDocs(finalData)
|
|
152
|
-
tableId: table._id,
|
|
153
|
-
})
|
|
151
|
+
await quotas.addRows(finalData.length, () => db.bulkDocs(finalData))
|
|
154
152
|
await events.rows.imported(table, "csv", finalData.length)
|
|
155
153
|
return table
|
|
156
154
|
}
|
|
@@ -34,13 +34,18 @@ describe("/rows", () => {
|
|
|
34
34
|
.expect(status)
|
|
35
35
|
|
|
36
36
|
const getRowUsage = async () => {
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
return config.doInContext(null, () =>
|
|
38
|
+
quotas.getCurrentUsageValue(QuotaUsageType.STATIC, StaticQuotaName.ROWS)
|
|
39
|
+
)
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
const getQueryUsage = async () => {
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
return config.doInContext(null, () =>
|
|
44
|
+
quotas.getCurrentUsageValue(
|
|
45
|
+
QuotaUsageType.MONTHLY,
|
|
46
|
+
MonthlyQuotaName.QUERIES
|
|
47
|
+
)
|
|
48
|
+
)
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
const assertRowUsage = async expected => {
|
|
@@ -55,26 +60,26 @@ describe("/rows", () => {
|
|
|
55
60
|
|
|
56
61
|
describe("save, load, update", () => {
|
|
57
62
|
it("returns a success message when the row is created", async () => {
|
|
58
|
-
const rowUsage = await getRowUsage()
|
|
59
|
-
const queryUsage = await getQueryUsage()
|
|
60
|
-
|
|
61
|
-
const res = await request
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
expect(res.res.statusMessage).toEqual(`${table.name} saved successfully`)
|
|
68
|
-
expect(res.body.name).toEqual("Test Contact")
|
|
69
|
-
expect(res.body._rev).toBeDefined()
|
|
70
|
-
await assertRowUsage(rowUsage + 1)
|
|
71
|
-
await assertQueryUsage(queryUsage + 1)
|
|
63
|
+
// const rowUsage = await getRowUsage()
|
|
64
|
+
// const queryUsage = await getQueryUsage()
|
|
65
|
+
//
|
|
66
|
+
// const res = await request
|
|
67
|
+
// .post(`/api/${row.tableId}/rows`)
|
|
68
|
+
// .send(row)
|
|
69
|
+
// .set(config.defaultHeaders())
|
|
70
|
+
// .expect('Content-Type', /json/)
|
|
71
|
+
// .expect(200)
|
|
72
|
+
// expect(res.res.statusMessage).toEqual(`${table.name} saved successfully`)
|
|
73
|
+
// expect(res.body.name).toEqual("Test Contact")
|
|
74
|
+
// expect(res.body._rev).toBeDefined()
|
|
75
|
+
// await assertRowUsage(rowUsage + 1)
|
|
76
|
+
// await assertQueryUsage(queryUsage + 1)
|
|
72
77
|
})
|
|
73
78
|
|
|
74
79
|
it("updates a row successfully", async () => {
|
|
75
80
|
const existing = await config.createRow()
|
|
76
|
-
const rowUsage = await getRowUsage()
|
|
77
|
-
const queryUsage = await getQueryUsage()
|
|
81
|
+
// const rowUsage = await getRowUsage()
|
|
82
|
+
// const queryUsage = await getQueryUsage()
|
|
78
83
|
|
|
79
84
|
const res = await request
|
|
80
85
|
.post(`/api/${table._id}/rows`)
|
|
@@ -92,8 +97,8 @@ describe("/rows", () => {
|
|
|
92
97
|
`${table.name} updated successfully.`
|
|
93
98
|
)
|
|
94
99
|
expect(res.body.name).toEqual("Updated Name")
|
|
95
|
-
await assertRowUsage(rowUsage)
|
|
96
|
-
await assertQueryUsage(queryUsage + 1)
|
|
100
|
+
// await assertRowUsage(rowUsage)
|
|
101
|
+
// await assertQueryUsage(queryUsage + 1)
|
|
97
102
|
})
|
|
98
103
|
|
|
99
104
|
it("should load a row", async () => {
|
|
@@ -66,9 +66,9 @@ exports.run = async function ({ inputs, appId, emitter }) {
|
|
|
66
66
|
}
|
|
67
67
|
const tableId = inputs.row.tableId
|
|
68
68
|
|
|
69
|
-
// clear any
|
|
69
|
+
// clear any falsy properties so that they aren't updated
|
|
70
70
|
for (let propKey of Object.keys(inputs.row)) {
|
|
71
|
-
if (inputs.row[propKey]
|
|
71
|
+
if (!inputs.row[propKey] || inputs.row[propKey] === "") {
|
|
72
72
|
delete inputs.row[propKey]
|
|
73
73
|
}
|
|
74
74
|
}
|
|
@@ -29,11 +29,16 @@ describe("Run through some parts of the automations system", () => {
|
|
|
29
29
|
afterAll(setup.afterAll)
|
|
30
30
|
|
|
31
31
|
it("should be able to init in builder", async () => {
|
|
32
|
-
await triggers.externalTrigger(basicAutomation(), { a: 1
|
|
32
|
+
await triggers.externalTrigger(basicAutomation(), { a: 1 })
|
|
33
33
|
await wait(100)
|
|
34
34
|
expect(thread.execute).toHaveBeenCalled()
|
|
35
35
|
})
|
|
36
36
|
|
|
37
|
+
it("should be able to init in prod", async () => {
|
|
38
|
+
await triggers.externalTrigger(basicAutomation(), { a: 1 })
|
|
39
|
+
await wait(100)
|
|
40
|
+
})
|
|
41
|
+
|
|
37
42
|
it("should check coercion", async () => {
|
|
38
43
|
const table = await config.createTable()
|
|
39
44
|
const automation = basicAutomation()
|
package/src/automations/utils.ts
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
getAppId,
|
|
14
14
|
getProdAppDB,
|
|
15
15
|
} from "@budibase/backend-core/context"
|
|
16
|
-
import {
|
|
16
|
+
import { tenancy } from "@budibase/backend-core"
|
|
17
17
|
import { quotas } from "@budibase/pro"
|
|
18
18
|
import { Automation } from "@budibase/types"
|
|
19
19
|
|
|
@@ -28,14 +28,12 @@ const jobMessage = (job: any, message: string) => {
|
|
|
28
28
|
|
|
29
29
|
export async function processEvent(job: any) {
|
|
30
30
|
try {
|
|
31
|
-
const automationId = job.data.automation._id
|
|
32
31
|
console.log(jobMessage(job, "running"))
|
|
33
32
|
// need to actually await these so that an error can be captured properly
|
|
34
|
-
|
|
33
|
+
const tenantId = tenancy.getTenantIDFromAppID(job.data.event.appId)
|
|
34
|
+
return await tenancy.doInTenant(tenantId, async () => {
|
|
35
35
|
const runFn = () => Runner.run(job)
|
|
36
|
-
return quotas.addAutomation(runFn
|
|
37
|
-
automationId,
|
|
38
|
-
})
|
|
36
|
+
return quotas.addAutomation(runFn)
|
|
39
37
|
})
|
|
40
38
|
} catch (err) {
|
|
41
39
|
const errJson = JSON.stringify(err)
|
package/src/db/utils.js
CHANGED
package/src/index.ts
CHANGED
package/src/integrations/rest.ts
CHANGED
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
BearerAuthConfig,
|
|
15
15
|
} from "../definitions/datasource"
|
|
16
16
|
import { get } from "lodash"
|
|
17
|
-
import * as https from "https"
|
|
18
17
|
import qs from "querystring"
|
|
19
18
|
const fetch = require("node-fetch")
|
|
20
19
|
const { formatBytes } = require("../utilities")
|
|
@@ -77,11 +76,6 @@ const SCHEMA: Integration = {
|
|
|
77
76
|
required: false,
|
|
78
77
|
default: {},
|
|
79
78
|
},
|
|
80
|
-
rejectUnauthorized: {
|
|
81
|
-
type: DatasourceFieldType.BOOLEAN,
|
|
82
|
-
default: true,
|
|
83
|
-
required: false,
|
|
84
|
-
},
|
|
85
79
|
legacyHttpParser: {
|
|
86
80
|
display: "Legacy HTTP Support",
|
|
87
81
|
type: DatasourceFieldType.BOOLEAN,
|
|
@@ -224,12 +218,8 @@ class RestIntegration implements IntegrationBase {
|
|
|
224
218
|
}
|
|
225
219
|
}
|
|
226
220
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
queryString = "?" + qs.encode(qs.decode(queryString))
|
|
230
|
-
}
|
|
231
|
-
const main = `${path}${queryString}`
|
|
232
|
-
|
|
221
|
+
// make sure the query string is fully encoded
|
|
222
|
+
const main = `${path}?${qs.encode(qs.decode(queryString))}`
|
|
233
223
|
let complete = main
|
|
234
224
|
if (this.config.url && !main.startsWith("http")) {
|
|
235
225
|
complete = !this.config.url ? main : `${this.config.url}/${main}`
|
|
@@ -391,12 +381,6 @@ class RestIntegration implements IntegrationBase {
|
|
|
391
381
|
paginationValues
|
|
392
382
|
)
|
|
393
383
|
|
|
394
|
-
if (this.config.rejectUnauthorized == false) {
|
|
395
|
-
input.agent = new https.Agent({
|
|
396
|
-
rejectUnauthorized: false,
|
|
397
|
-
})
|
|
398
|
-
}
|
|
399
|
-
|
|
400
384
|
if (this.config.legacyHttpParser) {
|
|
401
385
|
// https://github.com/nodejs/node/issues/43798
|
|
402
386
|
input.extraHttpOptions = { insecureHTTPParser: true }
|
|
@@ -256,7 +256,7 @@ describe("REST Integration", () => {
|
|
|
256
256
|
authConfigId: "c59c14bd1898a43baa08da68959b24686",
|
|
257
257
|
}
|
|
258
258
|
await config.integration.read(query)
|
|
259
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}
|
|
259
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
|
|
260
260
|
method: "GET",
|
|
261
261
|
headers: {
|
|
262
262
|
Authorization: "Basic dXNlcjpwYXNzd29yZA==",
|
|
@@ -269,7 +269,7 @@ describe("REST Integration", () => {
|
|
|
269
269
|
authConfigId: "0d91d732f34e4befabeff50b392a8ff3",
|
|
270
270
|
}
|
|
271
271
|
await config.integration.read(query)
|
|
272
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}
|
|
272
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
|
|
273
273
|
method: "GET",
|
|
274
274
|
headers: {
|
|
275
275
|
Authorization: "Bearer mytoken",
|
|
@@ -327,7 +327,7 @@ describe("REST Integration", () => {
|
|
|
327
327
|
},
|
|
328
328
|
}
|
|
329
329
|
await config.integration.create(query)
|
|
330
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api
|
|
330
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
|
331
331
|
body: JSON.stringify({
|
|
332
332
|
[pageParam]: pageValue,
|
|
333
333
|
[sizeParam]: sizeValue,
|
|
@@ -359,7 +359,7 @@ describe("REST Integration", () => {
|
|
|
359
359
|
},
|
|
360
360
|
}
|
|
361
361
|
await config.integration.create(query)
|
|
362
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api
|
|
362
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
|
363
363
|
body: expect.any(FormData),
|
|
364
364
|
headers: {},
|
|
365
365
|
method: "POST",
|
|
@@ -390,7 +390,7 @@ describe("REST Integration", () => {
|
|
|
390
390
|
},
|
|
391
391
|
}
|
|
392
392
|
await config.integration.create(query)
|
|
393
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api
|
|
393
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
|
394
394
|
body: expect.any(URLSearchParams),
|
|
395
395
|
headers: {},
|
|
396
396
|
method: "POST",
|
|
@@ -456,7 +456,7 @@ describe("REST Integration", () => {
|
|
|
456
456
|
},
|
|
457
457
|
}
|
|
458
458
|
const res = await config.integration.create(query)
|
|
459
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api
|
|
459
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
|
460
460
|
body: JSON.stringify({
|
|
461
461
|
[pageParam]: pageValue,
|
|
462
462
|
[sizeParam]: sizeValue,
|
|
@@ -490,7 +490,7 @@ describe("REST Integration", () => {
|
|
|
490
490
|
},
|
|
491
491
|
}
|
|
492
492
|
const res = await config.integration.create(query)
|
|
493
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api
|
|
493
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
|
494
494
|
body: expect.any(FormData),
|
|
495
495
|
headers: {},
|
|
496
496
|
method: "POST",
|
|
@@ -523,7 +523,7 @@ describe("REST Integration", () => {
|
|
|
523
523
|
},
|
|
524
524
|
}
|
|
525
525
|
const res = await config.integration.create(query)
|
|
526
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api
|
|
526
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
|
527
527
|
body: expect.any(URLSearchParams),
|
|
528
528
|
headers: {},
|
|
529
529
|
method: "POST",
|
|
@@ -563,7 +563,7 @@ describe("REST Integration", () => {
|
|
|
563
563
|
legacyHttpParser: true,
|
|
564
564
|
})
|
|
565
565
|
await config.integration.read({})
|
|
566
|
-
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}
|
|
566
|
+
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
|
|
567
567
|
method: "GET",
|
|
568
568
|
headers: {},
|
|
569
569
|
extraHttpOptions: {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { tenancy, logging } from "@budibase/backend-core"
|
|
2
|
+
import { plugins } from "@budibase/pro"
|
|
3
|
+
|
|
4
|
+
export const run = async () => {
|
|
5
|
+
try {
|
|
6
|
+
await tenancy.doInTenant(tenancy.DEFAULT_TENANT_ID, async () => {
|
|
7
|
+
await plugins.checkPluginQuotas()
|
|
8
|
+
})
|
|
9
|
+
} catch (err) {
|
|
10
|
+
logging.logAlert("Failed to update plugin quotas", err)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { runQuotaMigration } from "./usageQuotas"
|
|
2
2
|
import * as syncApps from "./usageQuotas/syncApps"
|
|
3
3
|
import * as syncRows from "./usageQuotas/syncRows"
|
|
4
|
-
import * as syncPlugins from "./usageQuotas/syncPlugins"
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
|
-
*
|
|
6
|
+
* Date:
|
|
7
|
+
* January 2022
|
|
8
|
+
*
|
|
9
|
+
* Description:
|
|
10
|
+
* Synchronise the app and row quotas to the state of the db after it was
|
|
11
|
+
* discovered that the quota resets were still in place and the row quotas
|
|
12
|
+
* weren't being decremented correctly.
|
|
8
13
|
*/
|
|
14
|
+
|
|
9
15
|
export const run = async () => {
|
|
10
16
|
await runQuotaMigration(async () => {
|
|
11
17
|
await syncApps.run()
|
|
12
18
|
await syncRows.run()
|
|
13
|
-
await syncPlugins.run()
|
|
14
19
|
})
|
|
15
20
|
}
|
|
@@ -2,13 +2,11 @@ const TestConfig = require("../../../tests/utilities/TestConfiguration")
|
|
|
2
2
|
|
|
3
3
|
const syncApps = jest.fn()
|
|
4
4
|
const syncRows = jest.fn()
|
|
5
|
-
const syncPlugins = jest.fn()
|
|
6
5
|
|
|
7
6
|
jest.mock("../usageQuotas/syncApps", () => ({ run: syncApps }) )
|
|
8
7
|
jest.mock("../usageQuotas/syncRows", () => ({ run: syncRows }) )
|
|
9
|
-
jest.mock("../usageQuotas/syncPlugins", () => ({ run: syncPlugins }) )
|
|
10
8
|
|
|
11
|
-
const migration = require("../
|
|
9
|
+
const migration = require("../quotas1")
|
|
12
10
|
|
|
13
11
|
describe("run", () => {
|
|
14
12
|
let config = new TestConfig(false)
|
|
@@ -19,10 +17,9 @@ describe("run", () => {
|
|
|
19
17
|
|
|
20
18
|
afterAll(config.end)
|
|
21
19
|
|
|
22
|
-
it("
|
|
20
|
+
it("runs ", async () => {
|
|
23
21
|
await migration.run()
|
|
24
22
|
expect(syncApps).toHaveBeenCalledTimes(1)
|
|
25
23
|
expect(syncRows).toHaveBeenCalledTimes(1)
|
|
26
|
-
expect(syncPlugins).toHaveBeenCalledTimes(1)
|
|
27
24
|
})
|
|
28
25
|
})
|