@budibase/server 1.0.49-alpha.5 → 1.0.49-alpha.9
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.8f94a789.js → index.ad5370ae.js} +181 -181
- package/builder/index.html +1 -1
- package/coverage/clover.xml +1926 -1951
- 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 +33 -126
- package/coverage/lcov-report/api/controllers/row/index.html +28 -28
- 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 +90 -90
- 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 +25 -25
- package/coverage/lcov-report/threads/index.js.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +26 -47
- 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 +3197 -3223
- 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 +90 -67
- package/dist/api/controllers/row/external.js +14 -22
- 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/base/sql.js +43 -8
- 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/usageQuotas/syncApps.js +6 -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 +13 -19
- 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/integrations/postgres/init.sql +11 -6
- 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 +67 -43
- package/src/api/controllers/row/external.js +27 -58
- 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/base/sql.ts +55 -14
- 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/usageQuotas/syncApps.ts +4 -4
- package/src/migrations/functions/usageQuotas/syncRows.ts +5 -4
- package/src/module.d.ts +3 -0
- package/src/tests/utilities/TestConfiguration.js +69 -50
- package/src/threads/automation.js +17 -15
- package/src/threads/query.js +14 -21
- 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
- package/tsconfig.json +2 -1
|
@@ -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,
|
|
@@ -153,11 +155,11 @@ var External;
|
|
|
153
155
|
thisRow._id = generateIdForRow(row, table);
|
|
154
156
|
thisRow.tableId = table._id;
|
|
155
157
|
thisRow._rev = "rev";
|
|
156
|
-
return thisRow;
|
|
158
|
+
return utils_4.processFormulas(table, thisRow);
|
|
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];
|
|
@@ -275,14 +278,24 @@ var External;
|
|
|
275
278
|
* This iterates through the returned rows and works out what elements of the rows
|
|
276
279
|
* actually match up to another row (based on primary keys) - this is pretty specific
|
|
277
280
|
* to SQL and the way that SQL relationships are returned based on joins.
|
|
281
|
+
* This is complicated, but the idea is that when a SQL query returns all the relations
|
|
282
|
+
* will be separate rows, with all of the data in each row. We have to decipher what comes
|
|
283
|
+
* from where (which tables) and how to convert that into budibase columns.
|
|
278
284
|
*/
|
|
279
|
-
updateRelationshipColumns(row, rows, relationships) {
|
|
285
|
+
updateRelationshipColumns(table, row, rows, relationships) {
|
|
280
286
|
const columns = {};
|
|
281
287
|
for (let relationship of relationships) {
|
|
282
288
|
const linkedTable = this.tables[relationship.tableName];
|
|
283
289
|
if (!linkedTable) {
|
|
284
290
|
continue;
|
|
285
291
|
}
|
|
292
|
+
const fromColumn = `${table.name}.${relationship.from}`;
|
|
293
|
+
const toColumn = `${linkedTable.name}.${relationship.to}`;
|
|
294
|
+
// this is important when working with multiple relationships
|
|
295
|
+
// between the same tables, don't want to overlap/multiply the relations
|
|
296
|
+
if (!relationship.through && row[fromColumn] !== row[toColumn]) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
286
299
|
let linked = basicProcessing(row, linkedTable);
|
|
287
300
|
if (!linked._id) {
|
|
288
301
|
continue;
|
|
@@ -320,7 +333,7 @@ var External;
|
|
|
320
333
|
row._id = rowId;
|
|
321
334
|
// this is a relationship of some sort
|
|
322
335
|
if (finalRows[rowId]) {
|
|
323
|
-
finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
|
|
336
|
+
finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
|
|
324
337
|
continue;
|
|
325
338
|
}
|
|
326
339
|
const thisRow = fixArrayTypes(basicProcessing(row, table), table);
|
|
@@ -329,9 +342,9 @@ var External;
|
|
|
329
342
|
}
|
|
330
343
|
finalRows[thisRow._id] = thisRow;
|
|
331
344
|
// do this at end once its been added to the final rows
|
|
332
|
-
finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
|
|
345
|
+
finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
|
|
333
346
|
}
|
|
334
|
-
return processFormulas(table, Object.values(finalRows));
|
|
347
|
+
return utils_4.processFormulas(table, Object.values(finalRows));
|
|
335
348
|
}
|
|
336
349
|
/**
|
|
337
350
|
* Gets the list of relationship JSON structures based on the columns in the table,
|
|
@@ -341,12 +354,12 @@ var External;
|
|
|
341
354
|
buildRelationships(table) {
|
|
342
355
|
const relationships = [];
|
|
343
356
|
for (let [fieldName, field] of Object.entries(table.schema)) {
|
|
344
|
-
if (field.type !== FieldTypes.LINK) {
|
|
357
|
+
if (field.type !== constants_1.FieldTypes.LINK) {
|
|
345
358
|
continue;
|
|
346
359
|
}
|
|
347
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
360
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
|
|
348
361
|
// no table to link to, this is not a valid relationships
|
|
349
|
-
if (!this.tables[linkTableName]) {
|
|
362
|
+
if (!linkTableName || !this.tables[linkTableName]) {
|
|
350
363
|
continue;
|
|
351
364
|
}
|
|
352
365
|
const linkTable = this.tables[linkTableName];
|
|
@@ -362,7 +375,7 @@ var External;
|
|
|
362
375
|
column: fieldName,
|
|
363
376
|
};
|
|
364
377
|
if (field.through) {
|
|
365
|
-
const { tableName: throughTableName } = breakExternalTableId(field.through);
|
|
378
|
+
const { tableName: throughTableName } = utils_3.breakExternalTableId(field.through);
|
|
366
379
|
definition.through = throughTableName;
|
|
367
380
|
// don't support composite keys for relationships
|
|
368
381
|
definition.from = field.throughTo || table.primary[0];
|
|
@@ -381,21 +394,24 @@ var External;
|
|
|
381
394
|
lookupRelations(tableId, row) {
|
|
382
395
|
return __awaiter(this, void 0, void 0, function* () {
|
|
383
396
|
const related = {};
|
|
384
|
-
const { tableName } = breakExternalTableId(tableId);
|
|
397
|
+
const { tableName } = utils_3.breakExternalTableId(tableId);
|
|
398
|
+
if (!tableName) {
|
|
399
|
+
return related;
|
|
400
|
+
}
|
|
385
401
|
const table = this.tables[tableName];
|
|
386
402
|
// @ts-ignore
|
|
387
403
|
const primaryKey = table.primary[0];
|
|
388
404
|
// make a new request to get the row with all its relationships
|
|
389
405
|
// we need this to work out if any relationships need removed
|
|
390
406
|
for (let field of Object.values(table.schema)) {
|
|
391
|
-
if (field.type !== FieldTypes.LINK ||
|
|
407
|
+
if (field.type !== constants_1.FieldTypes.LINK ||
|
|
392
408
|
!field.fieldName ||
|
|
393
409
|
isOneSide(field)) {
|
|
394
410
|
continue;
|
|
395
411
|
}
|
|
396
|
-
const isMany = field.relationshipType === RelationshipTypes.MANY_TO_MANY;
|
|
412
|
+
const isMany = field.relationshipType === constants_1.RelationshipTypes.MANY_TO_MANY;
|
|
397
413
|
const tableId = isMany ? field.through : field.tableId;
|
|
398
|
-
const { tableName: relatedTableName } = breakExternalTableId(tableId);
|
|
414
|
+
const { tableName: relatedTableName } = utils_3.breakExternalTableId(tableId);
|
|
399
415
|
// @ts-ignore
|
|
400
416
|
const linkPrimaryKey = this.tables[relatedTableName].primary[0];
|
|
401
417
|
const manyKey = field.throughTo || primaryKey;
|
|
@@ -404,8 +420,8 @@ var External;
|
|
|
404
420
|
if (!lookupField || !row[lookupField]) {
|
|
405
421
|
continue;
|
|
406
422
|
}
|
|
407
|
-
const response = yield getDatasourceAndQuery(
|
|
408
|
-
endpoint: getEndpoint(tableId, DataSourceOperation.READ),
|
|
423
|
+
const response = yield utils_2.getDatasourceAndQuery({
|
|
424
|
+
endpoint: getEndpoint(tableId, constants_1.DataSourceOperation.READ),
|
|
409
425
|
filters: {
|
|
410
426
|
equal: {
|
|
411
427
|
[fieldName]: row[lookupField],
|
|
@@ -431,26 +447,27 @@ var External;
|
|
|
431
447
|
* all and then re-create, as theres no chance of losing data (e.g. delete succeed, but write fail).
|
|
432
448
|
*/
|
|
433
449
|
handleManyRelationships(mainTableId, row, relationships) {
|
|
434
|
-
var _a;
|
|
435
450
|
return __awaiter(this, void 0, void 0, function* () {
|
|
436
|
-
const { appId } = this;
|
|
437
451
|
// if we're creating (in a through table) need to wipe the existing ones first
|
|
438
452
|
const promises = [];
|
|
439
453
|
const related = yield this.lookupRelations(mainTableId, row);
|
|
440
454
|
for (let relationship of relationships) {
|
|
441
455
|
const { key, tableId, isUpdate, id } = relationship, rest = __rest(relationship, ["key", "tableId", "isUpdate", "id"]);
|
|
442
|
-
const body = processObjectSync(rest, row);
|
|
456
|
+
const body = string_templates_1.processObjectSync(rest, row, {});
|
|
443
457
|
const linkTable = this.getTable(tableId);
|
|
444
458
|
// @ts-ignore
|
|
445
|
-
const linkPrimary = linkTable.primary[0];
|
|
446
|
-
|
|
459
|
+
const linkPrimary = linkTable === null || linkTable === void 0 ? void 0 : linkTable.primary[0];
|
|
460
|
+
if (!linkTable || !linkPrimary) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
const rows = related[key].rows || [];
|
|
447
464
|
const found = rows.find((row) => row[linkPrimary] === relationship.id ||
|
|
448
|
-
row[linkPrimary] === body[linkPrimary]);
|
|
465
|
+
row[linkPrimary] === (body === null || body === void 0 ? void 0 : body[linkPrimary]));
|
|
449
466
|
const operation = isUpdate
|
|
450
|
-
? DataSourceOperation.UPDATE
|
|
451
|
-
: DataSourceOperation.CREATE;
|
|
467
|
+
? constants_1.DataSourceOperation.UPDATE
|
|
468
|
+
: constants_1.DataSourceOperation.CREATE;
|
|
452
469
|
if (!found) {
|
|
453
|
-
promises.push(getDatasourceAndQuery(
|
|
470
|
+
promises.push(utils_2.getDatasourceAndQuery({
|
|
454
471
|
endpoint: getEndpoint(tableId, operation),
|
|
455
472
|
// if we're doing many relationships then we're writing, only one response
|
|
456
473
|
body,
|
|
@@ -466,7 +483,8 @@ var External;
|
|
|
466
483
|
for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {
|
|
467
484
|
const table = this.getTable(tableId);
|
|
468
485
|
// if its not the foreign key skip it, nothing to do
|
|
469
|
-
if (table
|
|
486
|
+
if (!table ||
|
|
487
|
+
(table.primary && table.primary.indexOf(colName) !== -1)) {
|
|
470
488
|
continue;
|
|
471
489
|
}
|
|
472
490
|
for (let row of rows) {
|
|
@@ -474,10 +492,10 @@ var External;
|
|
|
474
492
|
// safety check, if there are no filters on deletion bad things happen
|
|
475
493
|
if (Object.keys(filters).length !== 0) {
|
|
476
494
|
const op = isMany
|
|
477
|
-
? DataSourceOperation.DELETE
|
|
478
|
-
: DataSourceOperation.UPDATE;
|
|
495
|
+
? constants_1.DataSourceOperation.DELETE
|
|
496
|
+
: constants_1.DataSourceOperation.UPDATE;
|
|
479
497
|
const body = isMany ? null : { [colName]: null };
|
|
480
|
-
promises.push(getDatasourceAndQuery(
|
|
498
|
+
promises.push(utils_2.getDatasourceAndQuery({
|
|
481
499
|
endpoint: getEndpoint(tableId, op),
|
|
482
500
|
body,
|
|
483
501
|
filters,
|
|
@@ -498,31 +516,36 @@ var External;
|
|
|
498
516
|
buildFields(table, includeRelations = datasource_1.IncludeRelationships.INCLUDE) {
|
|
499
517
|
function extractRealFields(table, existing = []) {
|
|
500
518
|
return Object.entries(table.schema)
|
|
501
|
-
.filter(column => column[1].type !== FieldTypes.LINK &&
|
|
502
|
-
column[1].type !== FieldTypes.FORMULA &&
|
|
519
|
+
.filter(column => column[1].type !== constants_1.FieldTypes.LINK &&
|
|
520
|
+
column[1].type !== constants_1.FieldTypes.FORMULA &&
|
|
503
521
|
!existing.find((field) => field === column[0]))
|
|
504
522
|
.map(column => `${table.name}.${column[0]}`);
|
|
505
523
|
}
|
|
506
524
|
let fields = extractRealFields(table);
|
|
507
525
|
for (let field of Object.values(table.schema)) {
|
|
508
|
-
if (field.type !== FieldTypes.LINK || !includeRelations) {
|
|
526
|
+
if (field.type !== constants_1.FieldTypes.LINK || !includeRelations) {
|
|
509
527
|
continue;
|
|
510
528
|
}
|
|
511
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
529
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
|
|
530
|
+
if (linkTableName) {
|
|
531
|
+
const linkTable = this.tables[linkTableName];
|
|
532
|
+
if (linkTable) {
|
|
533
|
+
const linkedFields = extractRealFields(linkTable, fields);
|
|
534
|
+
fields = fields.concat(linkedFields);
|
|
535
|
+
}
|
|
516
536
|
}
|
|
517
537
|
}
|
|
518
538
|
return fields;
|
|
519
539
|
}
|
|
520
540
|
run(config) {
|
|
521
541
|
return __awaiter(this, void 0, void 0, function* () {
|
|
522
|
-
const {
|
|
523
|
-
let { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
542
|
+
const { operation, tableId } = this;
|
|
543
|
+
let { datasourceId, tableName } = utils_3.breakExternalTableId(tableId);
|
|
544
|
+
if (!tableName) {
|
|
545
|
+
throw "Unable to run without a table name";
|
|
546
|
+
}
|
|
524
547
|
if (!this.datasource) {
|
|
525
|
-
const db =
|
|
548
|
+
const db = context_1.getAppDB();
|
|
526
549
|
this.datasource = yield db.get(datasourceId);
|
|
527
550
|
if (!this.datasource || !this.datasource.entities) {
|
|
528
551
|
throw "No tables found, fetch tables before query.";
|
|
@@ -530,7 +553,7 @@ var External;
|
|
|
530
553
|
this.tables = this.datasource.entities;
|
|
531
554
|
}
|
|
532
555
|
const table = this.tables[tableName];
|
|
533
|
-
let isSql = isSQL(this.datasource);
|
|
556
|
+
let isSql = utils_3.isSQL(this.datasource);
|
|
534
557
|
if (!table) {
|
|
535
558
|
throw `Unable to process query, table "${tableName}" not defined.`;
|
|
536
559
|
}
|
|
@@ -541,7 +564,7 @@ var External;
|
|
|
541
564
|
// clean up row on ingress using schema
|
|
542
565
|
const processed = this.inputProcessing(row, table);
|
|
543
566
|
row = processed.row;
|
|
544
|
-
if (operation === DataSourceOperation.DELETE &&
|
|
567
|
+
if (operation === constants_1.DataSourceOperation.DELETE &&
|
|
545
568
|
(filters == null || Object.keys(filters).length === 0)) {
|
|
546
569
|
throw "Deletion must be filtered";
|
|
547
570
|
}
|
|
@@ -569,15 +592,15 @@ var External;
|
|
|
569
592
|
},
|
|
570
593
|
};
|
|
571
594
|
// can't really use response right now
|
|
572
|
-
const response = yield getDatasourceAndQuery(
|
|
595
|
+
const response = yield utils_2.getDatasourceAndQuery(json);
|
|
573
596
|
// handle many to many relationships now if we know the ID (could be auto increment)
|
|
574
|
-
if (operation !== DataSourceOperation.READ &&
|
|
597
|
+
if (operation !== constants_1.DataSourceOperation.READ &&
|
|
575
598
|
processed.manyRelationships) {
|
|
576
599
|
yield this.handleManyRelationships(table._id || "", response[0], processed.manyRelationships);
|
|
577
600
|
}
|
|
578
601
|
const output = this.outputProcessing(response, table, relationships);
|
|
579
602
|
// if reading it'll just be an array of rows, return whole thing
|
|
580
|
-
return operation === DataSourceOperation.READ && Array.isArray(response)
|
|
603
|
+
return operation === constants_1.DataSourceOperation.READ && Array.isArray(response)
|
|
581
604
|
? output
|
|
582
605
|
: { row: output[0], table };
|
|
583
606
|
});
|