@budibase/server 1.0.49-alpha.2 → 1.0.49-alpha.6
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/__mocks__/arangojs.ts +1 -1
- package/__mocks__/aws-sdk.ts +4 -4
- package/__mocks__/mongodb.ts +4 -5
- package/__mocks__/mssql.ts +3 -3
- package/__mocks__/node-fetch.ts +2 -1
- package/__mocks__/pg.ts +3 -5
- package/builder/assets/{index.82e12602.js → index.1b905242.js} +1 -1
- package/builder/index.html +1 -1
- package/coverage/clover.xml +1917 -1929
- package/coverage/coverage-final.json +54 -54
- 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 +58 -37
- package/coverage/lcov-report/api/controllers/auth.js.html +11 -14
- package/coverage/lcov-report/api/controllers/automation.js.html +21 -51
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
- package/coverage/lcov-report/api/controllers/component.js.html +10 -13
- package/coverage/lcov-report/api/controllers/datasource.js.html +17 -23
- package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
- package/coverage/lcov-report/api/controllers/index.html +52 -52
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +4 -4
- package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
- package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +6 -6
- package/coverage/lcov-report/api/controllers/query/index.html +10 -10
- package/coverage/lcov-report/api/controllers/query/index.js.html +21 -18
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +9 -9
- package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
- package/coverage/lcov-report/api/controllers/row/external.js.html +6 -12
- package/coverage/lcov-report/api/controllers/row/index.html +22 -22
- package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +37 -82
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +19 -25
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +14 -17
- package/coverage/lcov-report/api/controllers/row/utils.js.html +15 -12
- package/coverage/lcov-report/api/controllers/screen.js.html +10 -16
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +20 -50
- package/coverage/lcov-report/api/controllers/table/external.js.html +15 -24
- package/coverage/lcov-report/api/controllers/table/index.html +37 -37
- package/coverage/lcov-report/api/controllers/table/index.js.html +7 -7
- package/coverage/lcov-report/api/controllers/table/internal.js.html +36 -45
- package/coverage/lcov-report/api/controllers/table/utils.js.html +40 -76
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +26 -35
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +16 -16
- package/coverage/lcov-report/api/controllers/view/index.js.html +15 -21
- package/coverage/lcov-report/api/controllers/view/utils.js.html +25 -10
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +21 -15
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +1 -1
- 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/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/index.js.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/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 +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/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 +4 -7
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +18 -18
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/createRow.js.html +2 -5
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/deleteRow.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/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 +2 -2
- 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 +46 -40
- package/coverage/lcov-report/automations/utils.js.html +24 -12
- 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/client.js.html +18 -18
- 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 +3 -3
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +11 -23
- package/coverage/lcov-report/db/linkedRows/index.html +27 -27
- package/coverage/lcov-report/db/linkedRows/index.js.html +24 -66
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +28 -28
- package/coverage/lcov-report/db/newid.js.html +1 -1
- package/coverage/lcov-report/db/utils.js.html +5 -5
- 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 +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +88 -88
- 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 +21 -15
- package/coverage/lcov-report/middleware/builder.js.html +3 -3
- package/coverage/lcov-report/middleware/currentapp.js.html +72 -60
- package/coverage/lcov-report/middleware/index.html +28 -28
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- 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 +29 -29
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/threads/automation.js.html +30 -24
- package/coverage/lcov-report/threads/index.html +16 -16
- package/coverage/lcov-report/threads/index.js.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +17 -17
- package/coverage/lcov-report/threads/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- 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 +44 -35
- package/coverage/lcov-report/utilities/index.html +27 -27
- package/coverage/lcov-report/utilities/index.js.html +40 -70
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- 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 +7 -7
- package/coverage/lcov-report/utilities/rowProcessor/index.html +11 -11
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +16 -58
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +5 -2
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +5 -2
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +5 -5
- package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
- package/coverage/lcov.info +3189 -3198
- package/dist/api/controllers/application.js +31 -28
- package/dist/api/controllers/auth.js +4 -5
- package/dist/api/controllers/automation.js +14 -19
- package/dist/api/controllers/cloud.js +2 -3
- package/dist/api/controllers/component.js +3 -4
- package/dist/api/controllers/datasource.js +9 -10
- package/dist/api/controllers/deploy/Deployment.js +3 -6
- package/dist/api/controllers/deploy/index.js +12 -13
- package/dist/api/controllers/dev.js +5 -5
- package/dist/api/controllers/layout.js +3 -3
- package/dist/api/controllers/metadata.js +4 -4
- package/dist/api/controllers/permission.js +4 -4
- package/dist/api/controllers/query/import/index.js +4 -6
- package/dist/api/controllers/query/index.js +11 -10
- package/dist/api/controllers/role.js +5 -5
- package/dist/api/controllers/routing.js +5 -6
- package/dist/api/controllers/row/ExternalRequest.js +76 -63
- package/dist/api/controllers/row/external.js +4 -4
- package/dist/api/controllers/row/internal.js +29 -44
- package/dist/api/controllers/row/internalSearch.js +11 -13
- package/dist/api/controllers/row/staticFormula.js +11 -11
- package/dist/api/controllers/row/utils.js +7 -6
- package/dist/api/controllers/screen.js +5 -7
- package/dist/api/controllers/static/index.js +4 -4
- package/dist/api/controllers/table/bulkFormula.js +14 -15
- package/dist/api/controllers/table/external.js +7 -10
- package/dist/api/controllers/table/index.js +5 -5
- package/dist/api/controllers/table/internal.js +16 -19
- package/dist/api/controllers/table/utils.js +29 -31
- package/dist/api/controllers/user.js +16 -20
- package/dist/api/controllers/view/index.js +8 -10
- package/dist/api/controllers/view/utils.js +9 -4
- package/dist/api/controllers/webhook.js +10 -8
- package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
- package/dist/automations/automationUtils.js +2 -3
- package/dist/automations/steps/createRow.js +1 -1
- package/dist/automations/steps/updateRow.js +1 -1
- package/dist/automations/triggers.js +27 -25
- package/dist/automations/utils.js +10 -5
- package/dist/db/linkedRows/LinkController.js +3 -7
- package/dist/db/linkedRows/index.js +16 -26
- package/dist/db/linkedRows/linkUtils.js +6 -6
- package/dist/db/views/staticViews.js +9 -10
- package/dist/environment.js +2 -1
- package/dist/integrations/utils.js +3 -0
- package/dist/middleware/authorized.js +5 -3
- package/dist/middleware/builder.js +2 -2
- package/dist/middleware/currentapp.js +41 -37
- package/dist/middleware/usageQuota.js +2 -2
- package/dist/migrations/functions/appUrls.js +11 -2
- package/dist/migrations/functions/usageQuotas/syncApps.js +7 -9
- package/dist/migrations/functions/usageQuotas/syncRows.js +7 -9
- package/dist/package.json +4 -4
- package/dist/tests/utilities/TestConfiguration.js +67 -44
- package/dist/threads/automation.js +13 -11
- package/dist/threads/query.js +11 -11
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +4 -3
- package/dist/utilities/global.js +15 -12
- package/dist/utilities/index.js +7 -17
- package/dist/utilities/routing/index.js +5 -5
- package/dist/utilities/rowProcessor/index.js +9 -10
- package/dist/utilities/usageQuota/index.js +1 -0
- package/dist/utilities/usageQuota/rows.js +1 -0
- package/dist/utilities/users.js +3 -3
- package/dist/utilities/workerRequests.js +4 -4
- package/package.json +5 -5
- package/scripts/likeCypress.ts +1 -1
- package/src/api/controllers/application.js +35 -28
- package/src/api/controllers/auth.js +4 -5
- package/src/api/controllers/automation.js +13 -23
- package/src/api/controllers/cloud.js +2 -3
- package/src/api/controllers/component.js +3 -4
- package/src/api/controllers/datasource.js +9 -11
- package/src/api/controllers/deploy/Deployment.js +3 -7
- package/src/api/controllers/deploy/index.js +20 -13
- package/src/api/controllers/dev.js +5 -5
- package/src/api/controllers/layout.js +3 -3
- package/src/api/controllers/metadata.js +4 -9
- package/src/api/controllers/permission.js +4 -4
- package/src/api/controllers/query/import/index.ts +4 -6
- package/src/api/controllers/query/import/tests/index.spec.js +2 -1
- package/src/api/controllers/query/index.js +11 -10
- package/src/api/controllers/role.js +5 -5
- package/src/api/controllers/routing.js +5 -6
- package/src/api/controllers/row/ExternalRequest.ts +53 -42
- package/src/api/controllers/row/external.js +4 -6
- package/src/api/controllers/row/internal.js +29 -44
- package/src/api/controllers/row/internalSearch.js +11 -13
- package/src/api/controllers/row/staticFormula.js +10 -11
- package/src/api/controllers/row/utils.js +7 -6
- package/src/api/controllers/screen.js +5 -7
- package/src/api/controllers/static/index.js +4 -4
- package/src/api/controllers/table/bulkFormula.js +13 -23
- package/src/api/controllers/table/external.js +7 -10
- package/src/api/controllers/table/index.js +5 -5
- package/src/api/controllers/table/internal.js +18 -21
- package/src/api/controllers/table/utils.js +29 -41
- package/src/api/controllers/user.js +17 -20
- package/src/api/controllers/view/index.js +8 -10
- package/src/api/controllers/view/utils.js +9 -4
- package/src/api/controllers/webhook.js +10 -8
- package/src/api/routes/tests/automation.spec.js +1 -0
- package/src/api/routes/tests/misc.spec.js +0 -1
- package/src/api/routes/tests/routing.spec.js +21 -12
- package/src/api/routes/tests/row.spec.js +7 -4
- package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
- package/src/automations/automationUtils.js +2 -3
- package/src/automations/steps/createRow.js +0 -1
- package/src/automations/steps/updateRow.js +1 -1
- package/src/automations/triggers.js +33 -31
- package/src/automations/utils.js +9 -5
- package/src/db/linkedRows/LinkController.js +3 -7
- package/src/db/linkedRows/index.js +16 -30
- package/src/db/linkedRows/linkUtils.js +6 -6
- package/src/db/tests/linkController.spec.js +0 -1
- package/src/db/tests/linkTests.spec.js +5 -6
- package/src/db/views/staticViews.js +8 -10
- package/src/environment.js +2 -1
- package/src/integrations/utils.ts +4 -1
- package/src/middleware/authorized.js +5 -3
- package/src/middleware/builder.js +2 -2
- package/src/middleware/currentapp.js +50 -46
- package/src/middleware/tests/authorized.spec.js +7 -2
- package/src/middleware/tests/currentapp.spec.js +6 -0
- package/src/middleware/usageQuota.js +2 -2
- package/src/migrations/functions/appUrls.ts +11 -2
- package/src/migrations/functions/usageQuotas/syncApps.ts +5 -4
- package/src/migrations/functions/usageQuotas/syncRows.ts +5 -4
- package/src/tests/utilities/TestConfiguration.js +69 -50
- package/src/threads/automation.js +17 -15
- package/src/threads/query.js +12 -12
- package/src/utilities/fileSystem/index.js +4 -3
- package/src/utilities/global.js +15 -12
- package/src/utilities/index.js +7 -17
- package/src/utilities/routing/index.js +5 -5
- package/src/utilities/rowProcessor/index.js +9 -23
- package/src/utilities/usageQuota/index.js +1 -0
- package/src/utilities/usageQuota/rows.js +1 -0
- package/src/utilities/users.js +3 -3
- package/src/utilities/workerRequests.js +4 -4
|
@@ -9,9 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
const { MetadataTypes } = require("../../constants");
|
|
12
|
-
const CouchDB = require("../../db");
|
|
13
12
|
const { generateMetadataID } = require("../../db/utils");
|
|
14
13
|
const { saveEntityMetadata, deleteEntityMetadata } = require("../../utilities");
|
|
14
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
15
15
|
exports.getTypes = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
16
|
ctx.body = {
|
|
17
17
|
types: MetadataTypes,
|
|
@@ -22,18 +22,18 @@ exports.saveMetadata = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
22
22
|
if (type === MetadataTypes.AUTOMATION_TEST_HISTORY) {
|
|
23
23
|
ctx.throw(400, "Cannot save automation history type");
|
|
24
24
|
}
|
|
25
|
-
ctx.body = yield saveEntityMetadata(
|
|
25
|
+
ctx.body = yield saveEntityMetadata(type, entityId, ctx.request.body);
|
|
26
26
|
});
|
|
27
27
|
exports.deleteMetadata = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
28
|
const { type, entityId } = ctx.params;
|
|
29
|
-
yield deleteEntityMetadata(
|
|
29
|
+
yield deleteEntityMetadata(type, entityId);
|
|
30
30
|
ctx.body = {
|
|
31
31
|
message: "Metadata deleted successfully",
|
|
32
32
|
};
|
|
33
33
|
});
|
|
34
34
|
exports.getMetadata = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
35
|
const { type, entityId } = ctx.params;
|
|
36
|
-
const db =
|
|
36
|
+
const db = getAppDB();
|
|
37
37
|
const id = generateMetadataID(type, entityId);
|
|
38
38
|
try {
|
|
39
39
|
ctx.body = yield db.get(id);
|
|
@@ -11,9 +11,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
const { getBuiltinPermissions } = require("@budibase/backend-core/permissions");
|
|
12
12
|
const { isBuiltin, getDBRoleID, getExternalRoleID, getBuiltinRoles, } = require("@budibase/backend-core/roles");
|
|
13
13
|
const { getRoleParams } = require("../../db/utils");
|
|
14
|
-
const CouchDB = require("../../db");
|
|
15
14
|
const { CURRENTLY_SUPPORTED_LEVELS, getBasePermissions, } = require("../../utilities/security");
|
|
16
15
|
const { removeFromArray } = require("../../utilities");
|
|
16
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
17
17
|
const PermissionUpdateType = {
|
|
18
18
|
REMOVE: "remove",
|
|
19
19
|
ADD: "add",
|
|
@@ -30,7 +30,7 @@ function getAllDBRoles(db) {
|
|
|
30
30
|
}
|
|
31
31
|
function updatePermissionOnRole(appId, { roleId, resourceId, level }, updateType) {
|
|
32
32
|
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
-
const db =
|
|
33
|
+
const db = getAppDB();
|
|
34
34
|
const remove = updateType === PermissionUpdateType.REMOVE;
|
|
35
35
|
const isABuiltin = isBuiltin(roleId);
|
|
36
36
|
const dbRoleId = getDBRoleID(roleId);
|
|
@@ -93,7 +93,7 @@ exports.fetchLevels = function (ctx) {
|
|
|
93
93
|
};
|
|
94
94
|
exports.fetch = function (ctx) {
|
|
95
95
|
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
-
const db =
|
|
96
|
+
const db = getAppDB();
|
|
97
97
|
const roles = yield getAllDBRoles(db);
|
|
98
98
|
let permissions = {};
|
|
99
99
|
// create an object with structure role ID -> resource ID -> level
|
|
@@ -121,7 +121,7 @@ exports.fetch = function (ctx) {
|
|
|
121
121
|
exports.getResourcePerms = function (ctx) {
|
|
122
122
|
return __awaiter(this, void 0, void 0, function* () {
|
|
123
123
|
const resourceId = ctx.params.resourceId;
|
|
124
|
-
const db =
|
|
124
|
+
const db = getAppDB();
|
|
125
125
|
const body = yield db.allDocs(getRoleParams(null, {
|
|
126
126
|
include_docs: true,
|
|
127
127
|
}));
|
|
@@ -8,16 +8,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
12
|
exports.RestImporter = void 0;
|
|
16
|
-
const db_1 = __importDefault(require("../../../../db"));
|
|
17
13
|
const validation_1 = require("../validation");
|
|
18
14
|
const utils_1 = require("../../../../db/utils");
|
|
19
15
|
const openapi2_1 = require("./sources/openapi2");
|
|
20
16
|
const curl_1 = require("./sources/curl");
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
const context_1 = require("@budibase/backend-core/context");
|
|
21
19
|
class RestImporter {
|
|
22
20
|
constructor(data) {
|
|
23
21
|
this.init = () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -31,7 +29,7 @@ class RestImporter {
|
|
|
31
29
|
this.getInfo = () => __awaiter(this, void 0, void 0, function* () {
|
|
32
30
|
return this.source.getInfo();
|
|
33
31
|
});
|
|
34
|
-
this.importQueries = (
|
|
32
|
+
this.importQueries = (datasourceId) => __awaiter(this, void 0, void 0, function* () {
|
|
35
33
|
// constuct the queries
|
|
36
34
|
let queries = yield this.source.getQueries(datasourceId);
|
|
37
35
|
// validate queries
|
|
@@ -51,7 +49,7 @@ class RestImporter {
|
|
|
51
49
|
return query;
|
|
52
50
|
});
|
|
53
51
|
// persist queries
|
|
54
|
-
const db =
|
|
52
|
+
const db = context_1.getAppDB();
|
|
55
53
|
const response = yield db.bulkDocs(queries);
|
|
56
54
|
// create index to seperate queries and errors
|
|
57
55
|
const queryIndex = queries.reduce((acc, query) => {
|
|
@@ -8,7 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const CouchDB = require("../../../db");
|
|
12
11
|
const { generateQueryID, getQueryParams, isProdAppID, } = require("../../../db/utils");
|
|
13
12
|
const { BaseQueryVerbs } = require("../../../constants");
|
|
14
13
|
const { Thread, ThreadType } = require("../../../threads");
|
|
@@ -16,6 +15,7 @@ const { save: saveDatasource } = require("../datasource");
|
|
|
16
15
|
const { RestImporter } = require("./import");
|
|
17
16
|
const { invalidateDynamicVariables } = require("../../../threads/utils");
|
|
18
17
|
const environment = require("../../../environment");
|
|
18
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
19
19
|
const Runner = new Thread(ThreadType.QUERY, {
|
|
20
20
|
timeoutMs: environment.QUERY_THREAD_TIMEOUT || 10000,
|
|
21
21
|
});
|
|
@@ -32,7 +32,7 @@ function enrichQueries(input) {
|
|
|
32
32
|
}
|
|
33
33
|
exports.fetch = function (ctx) {
|
|
34
34
|
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
-
const db =
|
|
35
|
+
const db = getAppDB();
|
|
36
36
|
const body = yield db.allDocs(getQueryParams(null, {
|
|
37
37
|
include_docs: true,
|
|
38
38
|
}));
|
|
@@ -67,13 +67,13 @@ exports.import = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
67
67
|
// use existing datasource
|
|
68
68
|
datasourceId = body.datasourceId;
|
|
69
69
|
}
|
|
70
|
-
const importResult = yield importer.importQueries(
|
|
70
|
+
const importResult = yield importer.importQueries(datasourceId);
|
|
71
71
|
ctx.body = Object.assign(Object.assign({}, importResult), { datasourceId });
|
|
72
72
|
ctx.status = 200;
|
|
73
73
|
});
|
|
74
74
|
exports.save = function (ctx) {
|
|
75
75
|
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
-
const db =
|
|
76
|
+
const db = getAppDB();
|
|
77
77
|
const query = ctx.request.body;
|
|
78
78
|
if (!query._id) {
|
|
79
79
|
query._id = generateQueryID(query.datasourceId);
|
|
@@ -86,7 +86,7 @@ exports.save = function (ctx) {
|
|
|
86
86
|
};
|
|
87
87
|
exports.find = function (ctx) {
|
|
88
88
|
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
-
const db =
|
|
89
|
+
const db = getAppDB();
|
|
90
90
|
const query = enrichQueries(yield db.get(ctx.params.queryId));
|
|
91
91
|
// remove properties that could be dangerous in real app
|
|
92
92
|
if (isProdAppID(ctx.appId)) {
|
|
@@ -98,7 +98,7 @@ exports.find = function (ctx) {
|
|
|
98
98
|
};
|
|
99
99
|
exports.preview = function (ctx) {
|
|
100
100
|
return __awaiter(this, void 0, void 0, function* () {
|
|
101
|
-
const db =
|
|
101
|
+
const db = getAppDB();
|
|
102
102
|
const datasource = yield db.get(ctx.request.body.datasourceId);
|
|
103
103
|
// preview may not have a queryId as it hasn't been saved, but if it does
|
|
104
104
|
// this stops dynamic variables from calling the same query
|
|
@@ -127,7 +127,7 @@ exports.preview = function (ctx) {
|
|
|
127
127
|
};
|
|
128
128
|
function execute(ctx, opts = { rowsOnly: false }) {
|
|
129
129
|
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
-
const db =
|
|
130
|
+
const db = getAppDB();
|
|
131
131
|
const query = yield db.get(ctx.params.queryId);
|
|
132
132
|
const datasource = yield db.get(query.datasourceId);
|
|
133
133
|
const enrichedParameters = ctx.request.body.parameters || {};
|
|
@@ -173,7 +173,8 @@ exports.executeV2 = function (ctx) {
|
|
|
173
173
|
return execute(ctx, { rowsOnly: false });
|
|
174
174
|
});
|
|
175
175
|
};
|
|
176
|
-
const removeDynamicVariables = (
|
|
176
|
+
const removeDynamicVariables = (queryId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
177
|
+
const db = getAppDB();
|
|
177
178
|
const query = yield db.get(queryId);
|
|
178
179
|
const datasource = yield db.get(query.datasourceId);
|
|
179
180
|
const dynamicVariables = datasource.config.dynamicVariables;
|
|
@@ -188,8 +189,8 @@ const removeDynamicVariables = (db, queryId) => __awaiter(void 0, void 0, void 0
|
|
|
188
189
|
});
|
|
189
190
|
exports.destroy = function (ctx) {
|
|
190
191
|
return __awaiter(this, void 0, void 0, function* () {
|
|
191
|
-
const db =
|
|
192
|
-
yield removeDynamicVariables(
|
|
192
|
+
const db = getAppDB();
|
|
193
|
+
yield removeDynamicVariables(ctx.params.queryId);
|
|
193
194
|
yield db.remove(ctx.params.queryId, ctx.params.revId);
|
|
194
195
|
ctx.message = `Query deleted.`;
|
|
195
196
|
ctx.status = 200;
|
|
@@ -8,9 +8,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const CouchDB = require("../../db");
|
|
12
11
|
const { Role, getRole, isBuiltin, getAllRoles, } = require("@budibase/backend-core/roles");
|
|
13
12
|
const { generateRoleID, getUserMetadataParams, InternalTables, } = require("../../db/utils");
|
|
13
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
14
14
|
const UpdateRolesOptions = {
|
|
15
15
|
CREATED: "created",
|
|
16
16
|
REMOVED: "removed",
|
|
@@ -42,17 +42,17 @@ function updateRolesOnUserTable(db, roleId, updateOption) {
|
|
|
42
42
|
}
|
|
43
43
|
exports.fetch = function (ctx) {
|
|
44
44
|
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
-
ctx.body = yield getAllRoles(
|
|
45
|
+
ctx.body = yield getAllRoles();
|
|
46
46
|
});
|
|
47
47
|
};
|
|
48
48
|
exports.find = function (ctx) {
|
|
49
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
ctx.body = yield getRole(ctx.
|
|
50
|
+
ctx.body = yield getRole(ctx.params.roleId);
|
|
51
51
|
});
|
|
52
52
|
};
|
|
53
53
|
exports.save = function (ctx) {
|
|
54
54
|
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
-
const db =
|
|
55
|
+
const db = getAppDB();
|
|
56
56
|
let { _id, name, inherits, permissionId } = ctx.request.body;
|
|
57
57
|
if (!_id) {
|
|
58
58
|
_id = generateRoleID();
|
|
@@ -75,7 +75,7 @@ exports.save = function (ctx) {
|
|
|
75
75
|
};
|
|
76
76
|
exports.destroy = function (ctx) {
|
|
77
77
|
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
-
const db =
|
|
78
|
+
const db = getAppDB();
|
|
79
79
|
const roleId = ctx.params.roleId;
|
|
80
80
|
if (isBuiltin(roleId)) {
|
|
81
81
|
ctx.throw(400, "Cannot delete builtin role.");
|
|
@@ -40,13 +40,12 @@ Routing.prototype.addScreenId = function (fullpath, roleId, screenId) {
|
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Gets the full routing structure by querying the routing view and processing the result into the tree.
|
|
43
|
-
* @param {string} appId The application to produce the routing structure for.
|
|
44
43
|
* @returns {Promise<object>} The routing structure, this is the full structure designed for use in the builder,
|
|
45
44
|
* if the client routing is required then the updateRoutingStructureForUserRole should be used.
|
|
46
45
|
*/
|
|
47
|
-
function getRoutingStructure(
|
|
46
|
+
function getRoutingStructure() {
|
|
48
47
|
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
const screenRoutes = yield getRoutingInfo(
|
|
48
|
+
const screenRoutes = yield getRoutingInfo();
|
|
50
49
|
const routing = new Routing();
|
|
51
50
|
for (let screenRoute of screenRoutes) {
|
|
52
51
|
let fullpath = screenRoute.routing.route;
|
|
@@ -57,12 +56,12 @@ function getRoutingStructure(appId) {
|
|
|
57
56
|
});
|
|
58
57
|
}
|
|
59
58
|
exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
-
ctx.body = yield getRoutingStructure(
|
|
59
|
+
ctx.body = yield getRoutingStructure();
|
|
61
60
|
});
|
|
62
61
|
exports.clientFetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
-
const routing = yield getRoutingStructure(
|
|
62
|
+
const routing = yield getRoutingStructure();
|
|
64
63
|
let roleId = ctx.user.role._id;
|
|
65
|
-
const roleIds = yield getUserRoleHierarchy(
|
|
64
|
+
const roleIds = yield getUserRoleHierarchy(roleId);
|
|
66
65
|
for (let topLevel of Object.values(routing.routes)) {
|
|
67
66
|
for (let subpathKey of Object.keys(topLevel.subpaths)) {
|
|
68
67
|
let found = false;
|
|
@@ -22,19 +22,21 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
23
|
const datasource_1 = require("../../../definitions/datasource");
|
|
24
24
|
const utils_1 = require("../../../integrations/utils");
|
|
25
|
+
const utils_2 = require("./utils");
|
|
26
|
+
const constants_1 = require("../../../constants");
|
|
27
|
+
const utils_3 = require("../../../integrations/utils");
|
|
28
|
+
const string_templates_1 = require("@budibase/string-templates");
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
const fp_1 = require("lodash/fp");
|
|
31
|
+
const utils_4 = require("../../../utilities/rowProcessor/utils");
|
|
32
|
+
// @ts-ignore
|
|
33
|
+
const context_1 = require("@budibase/backend-core/context");
|
|
25
34
|
var External;
|
|
26
35
|
(function (External) {
|
|
27
|
-
const { getDatasourceAndQuery } = require("./utils");
|
|
28
|
-
const { DataSourceOperation, FieldTypes, RelationshipTypes, } = require("../../../constants");
|
|
29
|
-
const { breakExternalTableId, isSQL } = require("../../../integrations/utils");
|
|
30
|
-
const { processObjectSync } = require("@budibase/string-templates");
|
|
31
|
-
const { cloneDeep } = require("lodash/fp");
|
|
32
|
-
const CouchDB = require("../../../db");
|
|
33
|
-
const { processFormulas } = require("../../../utilities/rowProcessor/utils");
|
|
34
36
|
function buildFilters(id, filters, table) {
|
|
35
37
|
const primary = table.primary;
|
|
36
38
|
// if passed in array need to copy for shifting etc
|
|
37
|
-
let idCopy = cloneDeep(id);
|
|
39
|
+
let idCopy = fp_1.cloneDeep(id);
|
|
38
40
|
if (filters) {
|
|
39
41
|
// need to map over the filters and make sure the _id field isn't present
|
|
40
42
|
for (let filter of Object.values(filters)) {
|
|
@@ -77,10 +79,10 @@ var External;
|
|
|
77
79
|
*/
|
|
78
80
|
function cleanupConfig(config, table) {
|
|
79
81
|
const primaryOptions = [
|
|
80
|
-
FieldTypes.STRING,
|
|
81
|
-
FieldTypes.LONGFORM,
|
|
82
|
-
FieldTypes.OPTIONS,
|
|
83
|
-
FieldTypes.NUMBER,
|
|
82
|
+
constants_1.FieldTypes.STRING,
|
|
83
|
+
constants_1.FieldTypes.LONGFORM,
|
|
84
|
+
constants_1.FieldTypes.OPTIONS,
|
|
85
|
+
constants_1.FieldTypes.NUMBER,
|
|
84
86
|
];
|
|
85
87
|
// filter out fields which cannot be keys
|
|
86
88
|
const fieldNames = Object.entries(table.schema)
|
|
@@ -133,7 +135,7 @@ var External;
|
|
|
133
135
|
if (!tableId) {
|
|
134
136
|
return {};
|
|
135
137
|
}
|
|
136
|
-
const { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
138
|
+
const { datasourceId, tableName } = utils_3.breakExternalTableId(tableId);
|
|
137
139
|
return {
|
|
138
140
|
datasourceId,
|
|
139
141
|
entityId: tableName,
|
|
@@ -157,7 +159,7 @@ var External;
|
|
|
157
159
|
}
|
|
158
160
|
function fixArrayTypes(row, table) {
|
|
159
161
|
for (let [fieldName, schema] of Object.entries(table.schema)) {
|
|
160
|
-
if (schema.type === FieldTypes.ARRAY &&
|
|
162
|
+
if (schema.type === constants_1.FieldTypes.ARRAY &&
|
|
161
163
|
typeof row[fieldName] === "string") {
|
|
162
164
|
try {
|
|
163
165
|
row[fieldName] = JSON.parse(row[fieldName]);
|
|
@@ -174,9 +176,8 @@ var External;
|
|
|
174
176
|
return (field.relationshipType && field.relationshipType.split("-")[0] === "one");
|
|
175
177
|
}
|
|
176
178
|
class ExternalRequest {
|
|
177
|
-
constructor(
|
|
179
|
+
constructor(operation, tableId, datasource) {
|
|
178
180
|
this.tables = {};
|
|
179
|
-
this.appId = appId;
|
|
180
181
|
this.operation = operation;
|
|
181
182
|
this.tableId = tableId;
|
|
182
183
|
this.datasource = datasource;
|
|
@@ -188,8 +189,10 @@ var External;
|
|
|
188
189
|
if (!tableId) {
|
|
189
190
|
throw "Table ID is unknown, cannot find table";
|
|
190
191
|
}
|
|
191
|
-
const { tableName } = breakExternalTableId(tableId);
|
|
192
|
-
|
|
192
|
+
const { tableName } = utils_3.breakExternalTableId(tableId);
|
|
193
|
+
if (tableName) {
|
|
194
|
+
return this.tables[tableName];
|
|
195
|
+
}
|
|
193
196
|
}
|
|
194
197
|
inputProcessing(row, table) {
|
|
195
198
|
if (!row) {
|
|
@@ -204,7 +207,7 @@ var External;
|
|
|
204
207
|
if (row[key] == null ||
|
|
205
208
|
newRow[key] ||
|
|
206
209
|
field.autocolumn ||
|
|
207
|
-
field.type === FieldTypes.FORMULA) {
|
|
210
|
+
field.type === constants_1.FieldTypes.FORMULA) {
|
|
208
211
|
continue;
|
|
209
212
|
}
|
|
210
213
|
// if its an empty string then it means return the column to null (if possible)
|
|
@@ -213,17 +216,17 @@ var External;
|
|
|
213
216
|
continue;
|
|
214
217
|
}
|
|
215
218
|
// parse floats/numbers
|
|
216
|
-
if (field.type === FieldTypes.NUMBER && !isNaN(parseFloat(row[key]))) {
|
|
219
|
+
if (field.type === constants_1.FieldTypes.NUMBER && !isNaN(parseFloat(row[key]))) {
|
|
217
220
|
newRow[key] = parseFloat(row[key]);
|
|
218
221
|
}
|
|
219
222
|
// if its not a link then just copy it over
|
|
220
|
-
if (field.type !== FieldTypes.LINK) {
|
|
223
|
+
if (field.type !== constants_1.FieldTypes.LINK) {
|
|
221
224
|
newRow[key] = row[key];
|
|
222
225
|
continue;
|
|
223
226
|
}
|
|
224
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
227
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field === null || field === void 0 ? void 0 : field.tableId);
|
|
225
228
|
// table has to exist for many to many
|
|
226
|
-
if (!this.tables[linkTableName]) {
|
|
229
|
+
if (!linkTableName || !this.tables[linkTableName]) {
|
|
227
230
|
continue;
|
|
228
231
|
}
|
|
229
232
|
const linkTable = this.tables[linkTableName];
|
|
@@ -331,7 +334,7 @@ var External;
|
|
|
331
334
|
// do this at end once its been added to the final rows
|
|
332
335
|
finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
|
|
333
336
|
}
|
|
334
|
-
return processFormulas(table, Object.values(finalRows));
|
|
337
|
+
return utils_4.processFormulas(table, Object.values(finalRows));
|
|
335
338
|
}
|
|
336
339
|
/**
|
|
337
340
|
* Gets the list of relationship JSON structures based on the columns in the table,
|
|
@@ -341,12 +344,12 @@ var External;
|
|
|
341
344
|
buildRelationships(table) {
|
|
342
345
|
const relationships = [];
|
|
343
346
|
for (let [fieldName, field] of Object.entries(table.schema)) {
|
|
344
|
-
if (field.type !== FieldTypes.LINK) {
|
|
347
|
+
if (field.type !== constants_1.FieldTypes.LINK) {
|
|
345
348
|
continue;
|
|
346
349
|
}
|
|
347
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
350
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
|
|
348
351
|
// no table to link to, this is not a valid relationships
|
|
349
|
-
if (!this.tables[linkTableName]) {
|
|
352
|
+
if (!linkTableName || !this.tables[linkTableName]) {
|
|
350
353
|
continue;
|
|
351
354
|
}
|
|
352
355
|
const linkTable = this.tables[linkTableName];
|
|
@@ -362,7 +365,7 @@ var External;
|
|
|
362
365
|
column: fieldName,
|
|
363
366
|
};
|
|
364
367
|
if (field.through) {
|
|
365
|
-
const { tableName: throughTableName } = breakExternalTableId(field.through);
|
|
368
|
+
const { tableName: throughTableName } = utils_3.breakExternalTableId(field.through);
|
|
366
369
|
definition.through = throughTableName;
|
|
367
370
|
// don't support composite keys for relationships
|
|
368
371
|
definition.from = field.throughTo || table.primary[0];
|
|
@@ -381,21 +384,24 @@ var External;
|
|
|
381
384
|
lookupRelations(tableId, row) {
|
|
382
385
|
return __awaiter(this, void 0, void 0, function* () {
|
|
383
386
|
const related = {};
|
|
384
|
-
const { tableName } = breakExternalTableId(tableId);
|
|
387
|
+
const { tableName } = utils_3.breakExternalTableId(tableId);
|
|
388
|
+
if (!tableName) {
|
|
389
|
+
return related;
|
|
390
|
+
}
|
|
385
391
|
const table = this.tables[tableName];
|
|
386
392
|
// @ts-ignore
|
|
387
393
|
const primaryKey = table.primary[0];
|
|
388
394
|
// make a new request to get the row with all its relationships
|
|
389
395
|
// we need this to work out if any relationships need removed
|
|
390
396
|
for (let field of Object.values(table.schema)) {
|
|
391
|
-
if (field.type !== FieldTypes.LINK ||
|
|
397
|
+
if (field.type !== constants_1.FieldTypes.LINK ||
|
|
392
398
|
!field.fieldName ||
|
|
393
399
|
isOneSide(field)) {
|
|
394
400
|
continue;
|
|
395
401
|
}
|
|
396
|
-
const isMany = field.relationshipType === RelationshipTypes.MANY_TO_MANY;
|
|
402
|
+
const isMany = field.relationshipType === constants_1.RelationshipTypes.MANY_TO_MANY;
|
|
397
403
|
const tableId = isMany ? field.through : field.tableId;
|
|
398
|
-
const { tableName: relatedTableName } = breakExternalTableId(tableId);
|
|
404
|
+
const { tableName: relatedTableName } = utils_3.breakExternalTableId(tableId);
|
|
399
405
|
// @ts-ignore
|
|
400
406
|
const linkPrimaryKey = this.tables[relatedTableName].primary[0];
|
|
401
407
|
const manyKey = field.throughTo || primaryKey;
|
|
@@ -404,8 +410,8 @@ var External;
|
|
|
404
410
|
if (!lookupField || !row[lookupField]) {
|
|
405
411
|
continue;
|
|
406
412
|
}
|
|
407
|
-
const response = yield getDatasourceAndQuery(
|
|
408
|
-
endpoint: getEndpoint(tableId, DataSourceOperation.READ),
|
|
413
|
+
const response = yield utils_2.getDatasourceAndQuery({
|
|
414
|
+
endpoint: getEndpoint(tableId, constants_1.DataSourceOperation.READ),
|
|
409
415
|
filters: {
|
|
410
416
|
equal: {
|
|
411
417
|
[fieldName]: row[lookupField],
|
|
@@ -431,26 +437,27 @@ var External;
|
|
|
431
437
|
* all and then re-create, as theres no chance of losing data (e.g. delete succeed, but write fail).
|
|
432
438
|
*/
|
|
433
439
|
handleManyRelationships(mainTableId, row, relationships) {
|
|
434
|
-
var _a;
|
|
435
440
|
return __awaiter(this, void 0, void 0, function* () {
|
|
436
|
-
const { appId } = this;
|
|
437
441
|
// if we're creating (in a through table) need to wipe the existing ones first
|
|
438
442
|
const promises = [];
|
|
439
443
|
const related = yield this.lookupRelations(mainTableId, row);
|
|
440
444
|
for (let relationship of relationships) {
|
|
441
445
|
const { key, tableId, isUpdate, id } = relationship, rest = __rest(relationship, ["key", "tableId", "isUpdate", "id"]);
|
|
442
|
-
const body = processObjectSync(rest, row);
|
|
446
|
+
const body = string_templates_1.processObjectSync(rest, row, {});
|
|
443
447
|
const linkTable = this.getTable(tableId);
|
|
444
448
|
// @ts-ignore
|
|
445
|
-
const linkPrimary = linkTable.primary[0];
|
|
446
|
-
|
|
449
|
+
const linkPrimary = linkTable === null || linkTable === void 0 ? void 0 : linkTable.primary[0];
|
|
450
|
+
if (!linkTable || !linkPrimary) {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
const rows = related[key].rows || [];
|
|
447
454
|
const found = rows.find((row) => row[linkPrimary] === relationship.id ||
|
|
448
|
-
row[linkPrimary] === body[linkPrimary]);
|
|
455
|
+
row[linkPrimary] === (body === null || body === void 0 ? void 0 : body[linkPrimary]));
|
|
449
456
|
const operation = isUpdate
|
|
450
|
-
? DataSourceOperation.UPDATE
|
|
451
|
-
: DataSourceOperation.CREATE;
|
|
457
|
+
? constants_1.DataSourceOperation.UPDATE
|
|
458
|
+
: constants_1.DataSourceOperation.CREATE;
|
|
452
459
|
if (!found) {
|
|
453
|
-
promises.push(getDatasourceAndQuery(
|
|
460
|
+
promises.push(utils_2.getDatasourceAndQuery({
|
|
454
461
|
endpoint: getEndpoint(tableId, operation),
|
|
455
462
|
// if we're doing many relationships then we're writing, only one response
|
|
456
463
|
body,
|
|
@@ -466,7 +473,8 @@ var External;
|
|
|
466
473
|
for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {
|
|
467
474
|
const table = this.getTable(tableId);
|
|
468
475
|
// if its not the foreign key skip it, nothing to do
|
|
469
|
-
if (table
|
|
476
|
+
if (!table ||
|
|
477
|
+
(table.primary && table.primary.indexOf(colName) !== -1)) {
|
|
470
478
|
continue;
|
|
471
479
|
}
|
|
472
480
|
for (let row of rows) {
|
|
@@ -474,10 +482,10 @@ var External;
|
|
|
474
482
|
// safety check, if there are no filters on deletion bad things happen
|
|
475
483
|
if (Object.keys(filters).length !== 0) {
|
|
476
484
|
const op = isMany
|
|
477
|
-
? DataSourceOperation.DELETE
|
|
478
|
-
: DataSourceOperation.UPDATE;
|
|
485
|
+
? constants_1.DataSourceOperation.DELETE
|
|
486
|
+
: constants_1.DataSourceOperation.UPDATE;
|
|
479
487
|
const body = isMany ? null : { [colName]: null };
|
|
480
|
-
promises.push(getDatasourceAndQuery(
|
|
488
|
+
promises.push(utils_2.getDatasourceAndQuery({
|
|
481
489
|
endpoint: getEndpoint(tableId, op),
|
|
482
490
|
body,
|
|
483
491
|
filters,
|
|
@@ -498,31 +506,36 @@ var External;
|
|
|
498
506
|
buildFields(table, includeRelations = datasource_1.IncludeRelationships.INCLUDE) {
|
|
499
507
|
function extractRealFields(table, existing = []) {
|
|
500
508
|
return Object.entries(table.schema)
|
|
501
|
-
.filter(column => column[1].type !== FieldTypes.LINK &&
|
|
502
|
-
column[1].type !== FieldTypes.FORMULA &&
|
|
509
|
+
.filter(column => column[1].type !== constants_1.FieldTypes.LINK &&
|
|
510
|
+
column[1].type !== constants_1.FieldTypes.FORMULA &&
|
|
503
511
|
!existing.find((field) => field === column[0]))
|
|
504
512
|
.map(column => `${table.name}.${column[0]}`);
|
|
505
513
|
}
|
|
506
514
|
let fields = extractRealFields(table);
|
|
507
515
|
for (let field of Object.values(table.schema)) {
|
|
508
|
-
if (field.type !== FieldTypes.LINK || !includeRelations) {
|
|
516
|
+
if (field.type !== constants_1.FieldTypes.LINK || !includeRelations) {
|
|
509
517
|
continue;
|
|
510
518
|
}
|
|
511
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
519
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
|
|
520
|
+
if (linkTableName) {
|
|
521
|
+
const linkTable = this.tables[linkTableName];
|
|
522
|
+
if (linkTable) {
|
|
523
|
+
const linkedFields = extractRealFields(linkTable, fields);
|
|
524
|
+
fields = fields.concat(linkedFields);
|
|
525
|
+
}
|
|
516
526
|
}
|
|
517
527
|
}
|
|
518
528
|
return fields;
|
|
519
529
|
}
|
|
520
530
|
run(config) {
|
|
521
531
|
return __awaiter(this, void 0, void 0, function* () {
|
|
522
|
-
const {
|
|
523
|
-
let { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
532
|
+
const { operation, tableId } = this;
|
|
533
|
+
let { datasourceId, tableName } = utils_3.breakExternalTableId(tableId);
|
|
534
|
+
if (!tableName) {
|
|
535
|
+
throw "Unable to run without a table name";
|
|
536
|
+
}
|
|
524
537
|
if (!this.datasource) {
|
|
525
|
-
const db =
|
|
538
|
+
const db = context_1.getAppDB();
|
|
526
539
|
this.datasource = yield db.get(datasourceId);
|
|
527
540
|
if (!this.datasource || !this.datasource.entities) {
|
|
528
541
|
throw "No tables found, fetch tables before query.";
|
|
@@ -530,7 +543,7 @@ var External;
|
|
|
530
543
|
this.tables = this.datasource.entities;
|
|
531
544
|
}
|
|
532
545
|
const table = this.tables[tableName];
|
|
533
|
-
let isSql = isSQL(this.datasource);
|
|
546
|
+
let isSql = utils_3.isSQL(this.datasource);
|
|
534
547
|
if (!table) {
|
|
535
548
|
throw `Unable to process query, table "${tableName}" not defined.`;
|
|
536
549
|
}
|
|
@@ -541,7 +554,7 @@ var External;
|
|
|
541
554
|
// clean up row on ingress using schema
|
|
542
555
|
const processed = this.inputProcessing(row, table);
|
|
543
556
|
row = processed.row;
|
|
544
|
-
if (operation === DataSourceOperation.DELETE &&
|
|
557
|
+
if (operation === constants_1.DataSourceOperation.DELETE &&
|
|
545
558
|
(filters == null || Object.keys(filters).length === 0)) {
|
|
546
559
|
throw "Deletion must be filtered";
|
|
547
560
|
}
|
|
@@ -569,15 +582,15 @@ var External;
|
|
|
569
582
|
},
|
|
570
583
|
};
|
|
571
584
|
// can't really use response right now
|
|
572
|
-
const response = yield getDatasourceAndQuery(
|
|
585
|
+
const response = yield utils_2.getDatasourceAndQuery(json);
|
|
573
586
|
// handle many to many relationships now if we know the ID (could be auto increment)
|
|
574
|
-
if (operation !== DataSourceOperation.READ &&
|
|
587
|
+
if (operation !== constants_1.DataSourceOperation.READ &&
|
|
575
588
|
processed.manyRelationships) {
|
|
576
589
|
yield this.handleManyRelationships(table._id || "", response[0], processed.manyRelationships);
|
|
577
590
|
}
|
|
578
591
|
const output = this.outputProcessing(response, table, relationships);
|
|
579
592
|
// if reading it'll just be an array of rows, return whole thing
|
|
580
|
-
return operation === DataSourceOperation.READ && Array.isArray(response)
|
|
593
|
+
return operation === constants_1.DataSourceOperation.READ && Array.isArray(response)
|
|
581
594
|
? output
|
|
582
595
|
: { row: output[0], table };
|
|
583
596
|
});
|
|
@@ -22,8 +22,8 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
22
22
|
const { DataSourceOperation, SortDirection, FieldTypes, NoEmptyFilterStrings, } = require("../../../constants");
|
|
23
23
|
const { breakExternalTableId, breakRowIdField, } = require("../../../integrations/utils");
|
|
24
24
|
const ExternalRequest = require("./ExternalRequest");
|
|
25
|
-
const
|
|
26
|
-
function handleRequest(
|
|
25
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
26
|
+
function handleRequest(operation, tableId, opts = {}) {
|
|
27
27
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
28
|
// make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
|
|
29
29
|
if (opts && opts.filters) {
|
|
@@ -38,7 +38,7 @@ function handleRequest(appId, operation, tableId, opts = {}) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
return new ExternalRequest(
|
|
41
|
+
return new ExternalRequest(operation, tableId, opts.datasource).run(opts);
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
exports.handleRequest = handleRequest;
|
|
@@ -164,7 +164,7 @@ exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function*
|
|
|
164
164
|
const id = ctx.params.rowId;
|
|
165
165
|
const tableId = ctx.params.tableId;
|
|
166
166
|
const { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
167
|
-
const db =
|
|
167
|
+
const db = getAppDB();
|
|
168
168
|
const datasource = yield db.get(datasourceId);
|
|
169
169
|
if (!datasource || !datasource.entities) {
|
|
170
170
|
ctx.throw(400, "Datasource has not been configured for plus API.");
|