@budibase/server 1.0.49-alpha.4 → 1.0.49-alpha.8
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.f763d886.js → index.94a9250f.js} +1 -1
- package/builder/index.html +1 -1
- package/coverage/clover.xml +1920 -1940
- 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 +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 +3192 -3209
- 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 +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/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 +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 +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/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 +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
- package/tsconfig.json +2 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const CouchDB = require("../../db")
|
|
2
1
|
const {
|
|
3
2
|
Role,
|
|
4
3
|
getRole,
|
|
@@ -10,6 +9,7 @@ const {
|
|
|
10
9
|
getUserMetadataParams,
|
|
11
10
|
InternalTables,
|
|
12
11
|
} = require("../../db/utils")
|
|
12
|
+
const { getAppDB } = require("@budibase/backend-core/context")
|
|
13
13
|
|
|
14
14
|
const UpdateRolesOptions = {
|
|
15
15
|
CREATED: "created",
|
|
@@ -40,15 +40,15 @@ async function updateRolesOnUserTable(db, roleId, updateOption) {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
exports.fetch = async function (ctx) {
|
|
43
|
-
ctx.body = await getAllRoles(
|
|
43
|
+
ctx.body = await getAllRoles()
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
exports.find = async function (ctx) {
|
|
47
|
-
ctx.body = await getRole(ctx.
|
|
47
|
+
ctx.body = await getRole(ctx.params.roleId)
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
exports.save = async function (ctx) {
|
|
51
|
-
const db =
|
|
51
|
+
const db = getAppDB()
|
|
52
52
|
let { _id, name, inherits, permissionId } = ctx.request.body
|
|
53
53
|
if (!_id) {
|
|
54
54
|
_id = generateRoleID()
|
|
@@ -69,7 +69,7 @@ exports.save = async function (ctx) {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
exports.destroy = async function (ctx) {
|
|
72
|
-
const db =
|
|
72
|
+
const db = getAppDB()
|
|
73
73
|
const roleId = ctx.params.roleId
|
|
74
74
|
if (isBuiltin(roleId)) {
|
|
75
75
|
ctx.throw(400, "Cannot delete builtin role.")
|
|
@@ -39,12 +39,11 @@ Routing.prototype.addScreenId = function (fullpath, roleId, screenId) {
|
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Gets the full routing structure by querying the routing view and processing the result into the tree.
|
|
42
|
-
* @param {string} appId The application to produce the routing structure for.
|
|
43
42
|
* @returns {Promise<object>} The routing structure, this is the full structure designed for use in the builder,
|
|
44
43
|
* if the client routing is required then the updateRoutingStructureForUserRole should be used.
|
|
45
44
|
*/
|
|
46
|
-
async function getRoutingStructure(
|
|
47
|
-
const screenRoutes = await getRoutingInfo(
|
|
45
|
+
async function getRoutingStructure() {
|
|
46
|
+
const screenRoutes = await getRoutingInfo()
|
|
48
47
|
const routing = new Routing()
|
|
49
48
|
|
|
50
49
|
for (let screenRoute of screenRoutes) {
|
|
@@ -57,13 +56,13 @@ async function getRoutingStructure(appId) {
|
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
exports.fetch = async ctx => {
|
|
60
|
-
ctx.body = await getRoutingStructure(
|
|
59
|
+
ctx.body = await getRoutingStructure()
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
exports.clientFetch = async ctx => {
|
|
64
|
-
const routing = await getRoutingStructure(
|
|
63
|
+
const routing = await getRoutingStructure()
|
|
65
64
|
let roleId = ctx.user.role._id
|
|
66
|
-
const roleIds = await getUserRoleHierarchy(
|
|
65
|
+
const roleIds = await getUserRoleHierarchy(roleId)
|
|
67
66
|
for (let topLevel of Object.values(routing.routes)) {
|
|
68
67
|
for (let subpathKey of Object.keys(topLevel.subpaths)) {
|
|
69
68
|
let found = false
|
|
@@ -19,6 +19,19 @@ import {
|
|
|
19
19
|
isRowId,
|
|
20
20
|
convertRowId,
|
|
21
21
|
} from "../../../integrations/utils"
|
|
22
|
+
import { getDatasourceAndQuery } from "./utils"
|
|
23
|
+
import {
|
|
24
|
+
DataSourceOperation,
|
|
25
|
+
FieldTypes,
|
|
26
|
+
RelationshipTypes,
|
|
27
|
+
} from "../../../constants"
|
|
28
|
+
import { breakExternalTableId, isSQL } from "../../../integrations/utils"
|
|
29
|
+
import { processObjectSync } from "@budibase/string-templates"
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
import { cloneDeep } from "lodash/fp"
|
|
32
|
+
import { processFormulas } from "../../../utilities/rowProcessor/utils"
|
|
33
|
+
// @ts-ignore
|
|
34
|
+
import { getAppDB } from "@budibase/backend-core/context"
|
|
22
35
|
|
|
23
36
|
interface ManyRelationship {
|
|
24
37
|
tableId?: string
|
|
@@ -38,18 +51,6 @@ interface RunConfig {
|
|
|
38
51
|
}
|
|
39
52
|
|
|
40
53
|
module External {
|
|
41
|
-
const { getDatasourceAndQuery } = require("./utils")
|
|
42
|
-
const {
|
|
43
|
-
DataSourceOperation,
|
|
44
|
-
FieldTypes,
|
|
45
|
-
RelationshipTypes,
|
|
46
|
-
} = require("../../../constants")
|
|
47
|
-
const { breakExternalTableId, isSQL } = require("../../../integrations/utils")
|
|
48
|
-
const { processObjectSync } = require("@budibase/string-templates")
|
|
49
|
-
const { cloneDeep } = require("lodash/fp")
|
|
50
|
-
const CouchDB = require("../../../db")
|
|
51
|
-
const { processFormulas } = require("../../../utilities/rowProcessor/utils")
|
|
52
|
-
|
|
53
54
|
function buildFilters(
|
|
54
55
|
id: string | undefined,
|
|
55
56
|
filters: SearchFilters,
|
|
@@ -210,19 +211,12 @@ module External {
|
|
|
210
211
|
}
|
|
211
212
|
|
|
212
213
|
class ExternalRequest {
|
|
213
|
-
private readonly appId: string
|
|
214
214
|
private operation: Operation
|
|
215
215
|
private tableId: string
|
|
216
216
|
private datasource: Datasource
|
|
217
217
|
private tables: { [key: string]: Table } = {}
|
|
218
218
|
|
|
219
|
-
constructor(
|
|
220
|
-
appId: string,
|
|
221
|
-
operation: Operation,
|
|
222
|
-
tableId: string,
|
|
223
|
-
datasource: Datasource
|
|
224
|
-
) {
|
|
225
|
-
this.appId = appId
|
|
219
|
+
constructor(operation: Operation, tableId: string, datasource: Datasource) {
|
|
226
220
|
this.operation = operation
|
|
227
221
|
this.tableId = tableId
|
|
228
222
|
this.datasource = datasource
|
|
@@ -231,12 +225,14 @@ module External {
|
|
|
231
225
|
}
|
|
232
226
|
}
|
|
233
227
|
|
|
234
|
-
getTable(tableId: string | undefined): Table {
|
|
228
|
+
getTable(tableId: string | undefined): Table | undefined {
|
|
235
229
|
if (!tableId) {
|
|
236
230
|
throw "Table ID is unknown, cannot find table"
|
|
237
231
|
}
|
|
238
232
|
const { tableName } = breakExternalTableId(tableId)
|
|
239
|
-
|
|
233
|
+
if (tableName) {
|
|
234
|
+
return this.tables[tableName]
|
|
235
|
+
}
|
|
240
236
|
}
|
|
241
237
|
|
|
242
238
|
inputProcessing(row: Row | undefined, table: Table) {
|
|
@@ -272,9 +268,11 @@ module External {
|
|
|
272
268
|
newRow[key] = row[key]
|
|
273
269
|
continue
|
|
274
270
|
}
|
|
275
|
-
const { tableName: linkTableName } = breakExternalTableId(
|
|
271
|
+
const { tableName: linkTableName } = breakExternalTableId(
|
|
272
|
+
field?.tableId
|
|
273
|
+
)
|
|
276
274
|
// table has to exist for many to many
|
|
277
|
-
if (!this.tables[linkTableName]) {
|
|
275
|
+
if (!linkTableName || !this.tables[linkTableName]) {
|
|
278
276
|
continue
|
|
279
277
|
}
|
|
280
278
|
const linkTable = this.tables[linkTableName]
|
|
@@ -422,7 +420,7 @@ module External {
|
|
|
422
420
|
}
|
|
423
421
|
const { tableName: linkTableName } = breakExternalTableId(field.tableId)
|
|
424
422
|
// no table to link to, this is not a valid relationships
|
|
425
|
-
if (!this.tables[linkTableName]) {
|
|
423
|
+
if (!linkTableName || !this.tables[linkTableName]) {
|
|
426
424
|
continue
|
|
427
425
|
}
|
|
428
426
|
const linkTable = this.tables[linkTableName]
|
|
@@ -460,6 +458,9 @@ module External {
|
|
|
460
458
|
async lookupRelations(tableId: string, row: Row) {
|
|
461
459
|
const related: { [key: string]: any } = {}
|
|
462
460
|
const { tableName } = breakExternalTableId(tableId)
|
|
461
|
+
if (!tableName) {
|
|
462
|
+
return related
|
|
463
|
+
}
|
|
463
464
|
const table = this.tables[tableName]
|
|
464
465
|
// @ts-ignore
|
|
465
466
|
const primaryKey = table.primary[0]
|
|
@@ -484,7 +485,7 @@ module External {
|
|
|
484
485
|
if (!lookupField || !row[lookupField]) {
|
|
485
486
|
continue
|
|
486
487
|
}
|
|
487
|
-
const response = await getDatasourceAndQuery(
|
|
488
|
+
const response = await getDatasourceAndQuery({
|
|
488
489
|
endpoint: getEndpoint(tableId, DataSourceOperation.READ),
|
|
489
490
|
filters: {
|
|
490
491
|
equal: {
|
|
@@ -515,28 +516,30 @@ module External {
|
|
|
515
516
|
row: Row,
|
|
516
517
|
relationships: ManyRelationship[]
|
|
517
518
|
) {
|
|
518
|
-
const { appId } = this
|
|
519
519
|
// if we're creating (in a through table) need to wipe the existing ones first
|
|
520
520
|
const promises = []
|
|
521
521
|
const related = await this.lookupRelations(mainTableId, row)
|
|
522
522
|
for (let relationship of relationships) {
|
|
523
523
|
const { key, tableId, isUpdate, id, ...rest } = relationship
|
|
524
|
-
const body = processObjectSync(rest, row)
|
|
524
|
+
const body: { [key: string]: any } = processObjectSync(rest, row, {})
|
|
525
525
|
const linkTable = this.getTable(tableId)
|
|
526
526
|
// @ts-ignore
|
|
527
|
-
const linkPrimary = linkTable
|
|
528
|
-
|
|
527
|
+
const linkPrimary = linkTable?.primary[0]
|
|
528
|
+
if (!linkTable || !linkPrimary) {
|
|
529
|
+
return
|
|
530
|
+
}
|
|
531
|
+
const rows = related[key].rows || []
|
|
529
532
|
const found = rows.find(
|
|
530
533
|
(row: { [key: string]: any }) =>
|
|
531
534
|
row[linkPrimary] === relationship.id ||
|
|
532
|
-
row[linkPrimary] === body[linkPrimary]
|
|
535
|
+
row[linkPrimary] === body?.[linkPrimary]
|
|
533
536
|
)
|
|
534
537
|
const operation = isUpdate
|
|
535
538
|
? DataSourceOperation.UPDATE
|
|
536
539
|
: DataSourceOperation.CREATE
|
|
537
540
|
if (!found) {
|
|
538
541
|
promises.push(
|
|
539
|
-
getDatasourceAndQuery(
|
|
542
|
+
getDatasourceAndQuery({
|
|
540
543
|
endpoint: getEndpoint(tableId, operation),
|
|
541
544
|
// if we're doing many relationships then we're writing, only one response
|
|
542
545
|
body,
|
|
@@ -552,9 +555,12 @@ module External {
|
|
|
552
555
|
for (let [colName, { isMany, rows, tableId }] of Object.entries(
|
|
553
556
|
related
|
|
554
557
|
)) {
|
|
555
|
-
const table: Table = this.getTable(tableId)
|
|
558
|
+
const table: Table | undefined = this.getTable(tableId)
|
|
556
559
|
// if its not the foreign key skip it, nothing to do
|
|
557
|
-
if (
|
|
560
|
+
if (
|
|
561
|
+
!table ||
|
|
562
|
+
(table.primary && table.primary.indexOf(colName) !== -1)
|
|
563
|
+
) {
|
|
558
564
|
continue
|
|
559
565
|
}
|
|
560
566
|
for (let row of rows) {
|
|
@@ -566,7 +572,7 @@ module External {
|
|
|
566
572
|
: DataSourceOperation.UPDATE
|
|
567
573
|
const body = isMany ? null : { [colName]: null }
|
|
568
574
|
promises.push(
|
|
569
|
-
getDatasourceAndQuery(
|
|
575
|
+
getDatasourceAndQuery({
|
|
570
576
|
endpoint: getEndpoint(tableId, op),
|
|
571
577
|
body,
|
|
572
578
|
filters,
|
|
@@ -605,20 +611,25 @@ module External {
|
|
|
605
611
|
continue
|
|
606
612
|
}
|
|
607
613
|
const { tableName: linkTableName } = breakExternalTableId(field.tableId)
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
614
|
+
if (linkTableName) {
|
|
615
|
+
const linkTable = this.tables[linkTableName]
|
|
616
|
+
if (linkTable) {
|
|
617
|
+
const linkedFields = extractRealFields(linkTable, fields)
|
|
618
|
+
fields = fields.concat(linkedFields)
|
|
619
|
+
}
|
|
612
620
|
}
|
|
613
621
|
}
|
|
614
622
|
return fields
|
|
615
623
|
}
|
|
616
624
|
|
|
617
625
|
async run(config: RunConfig) {
|
|
618
|
-
const {
|
|
626
|
+
const { operation, tableId } = this
|
|
619
627
|
let { datasourceId, tableName } = breakExternalTableId(tableId)
|
|
628
|
+
if (!tableName) {
|
|
629
|
+
throw "Unable to run without a table name"
|
|
630
|
+
}
|
|
620
631
|
if (!this.datasource) {
|
|
621
|
-
const db =
|
|
632
|
+
const db = getAppDB()
|
|
622
633
|
this.datasource = await db.get(datasourceId)
|
|
623
634
|
if (!this.datasource || !this.datasource.entities) {
|
|
624
635
|
throw "No tables found, fetch tables before query."
|
|
@@ -670,7 +681,7 @@ module External {
|
|
|
670
681
|
},
|
|
671
682
|
}
|
|
672
683
|
// can't really use response right now
|
|
673
|
-
const response = await getDatasourceAndQuery(
|
|
684
|
+
const response = await getDatasourceAndQuery(json)
|
|
674
685
|
// handle many to many relationships now if we know the ID (could be auto increment)
|
|
675
686
|
if (
|
|
676
687
|
operation !== DataSourceOperation.READ &&
|
|
@@ -9,9 +9,9 @@ const {
|
|
|
9
9
|
breakRowIdField,
|
|
10
10
|
} = require("../../../integrations/utils")
|
|
11
11
|
const ExternalRequest = require("./ExternalRequest")
|
|
12
|
-
const
|
|
12
|
+
const { getAppDB } = require("@budibase/backend-core/context")
|
|
13
13
|
|
|
14
|
-
async function handleRequest(
|
|
14
|
+
async function handleRequest(operation, tableId, opts = {}) {
|
|
15
15
|
// make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
|
|
16
16
|
if (opts && opts.filters) {
|
|
17
17
|
for (let filterField of NoEmptyFilterStrings) {
|
|
@@ -25,31 +25,27 @@ async function handleRequest(appId, operation, tableId, opts = {}) {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
return new ExternalRequest(
|
|
29
|
-
opts
|
|
30
|
-
)
|
|
28
|
+
return new ExternalRequest(operation, tableId, opts.datasource).run(opts)
|
|
31
29
|
}
|
|
32
30
|
|
|
33
31
|
exports.handleRequest = handleRequest
|
|
34
32
|
|
|
35
33
|
exports.patch = async ctx => {
|
|
36
|
-
const appId = ctx.appId
|
|
37
34
|
const inputs = ctx.request.body
|
|
38
35
|
const tableId = ctx.params.tableId
|
|
39
36
|
const id = breakRowIdField(inputs._id)
|
|
40
37
|
// don't save the ID to db
|
|
41
38
|
delete inputs._id
|
|
42
|
-
return handleRequest(
|
|
39
|
+
return handleRequest(DataSourceOperation.UPDATE, tableId, {
|
|
43
40
|
id,
|
|
44
41
|
row: inputs,
|
|
45
42
|
})
|
|
46
43
|
}
|
|
47
44
|
|
|
48
45
|
exports.save = async ctx => {
|
|
49
|
-
const appId = ctx.appId
|
|
50
46
|
const inputs = ctx.request.body
|
|
51
47
|
const tableId = ctx.params.tableId
|
|
52
|
-
return handleRequest(
|
|
48
|
+
return handleRequest(DataSourceOperation.CREATE, tableId, {
|
|
53
49
|
row: inputs,
|
|
54
50
|
})
|
|
55
51
|
}
|
|
@@ -63,49 +59,35 @@ exports.fetchView = async ctx => {
|
|
|
63
59
|
}
|
|
64
60
|
|
|
65
61
|
exports.fetch = async ctx => {
|
|
66
|
-
const appId = ctx.appId
|
|
67
62
|
const tableId = ctx.params.tableId
|
|
68
|
-
return handleRequest(
|
|
63
|
+
return handleRequest(DataSourceOperation.READ, tableId)
|
|
69
64
|
}
|
|
70
65
|
|
|
71
66
|
exports.find = async ctx => {
|
|
72
|
-
const appId = ctx.appId
|
|
73
67
|
const id = ctx.params.rowId
|
|
74
68
|
const tableId = ctx.params.tableId
|
|
75
|
-
const response = await handleRequest(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
tableId,
|
|
79
|
-
{
|
|
80
|
-
id,
|
|
81
|
-
}
|
|
82
|
-
)
|
|
69
|
+
const response = await handleRequest(DataSourceOperation.READ, tableId, {
|
|
70
|
+
id,
|
|
71
|
+
})
|
|
83
72
|
return response ? response[0] : response
|
|
84
73
|
}
|
|
85
74
|
|
|
86
75
|
exports.destroy = async ctx => {
|
|
87
|
-
const appId = ctx.appId
|
|
88
76
|
const tableId = ctx.params.tableId
|
|
89
77
|
const id = ctx.request.body._id
|
|
90
|
-
const { row } = await handleRequest(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
tableId,
|
|
94
|
-
{
|
|
95
|
-
id,
|
|
96
|
-
}
|
|
97
|
-
)
|
|
78
|
+
const { row } = await handleRequest(DataSourceOperation.DELETE, tableId, {
|
|
79
|
+
id,
|
|
80
|
+
})
|
|
98
81
|
return { response: { ok: true }, row }
|
|
99
82
|
}
|
|
100
83
|
|
|
101
84
|
exports.bulkDestroy = async ctx => {
|
|
102
|
-
const appId = ctx.appId
|
|
103
85
|
const { rows } = ctx.request.body
|
|
104
86
|
const tableId = ctx.params.tableId
|
|
105
87
|
let promises = []
|
|
106
88
|
for (let row of rows) {
|
|
107
89
|
promises.push(
|
|
108
|
-
handleRequest(
|
|
90
|
+
handleRequest(DataSourceOperation.DELETE, tableId, {
|
|
109
91
|
id: breakRowIdField(row._id),
|
|
110
92
|
})
|
|
111
93
|
)
|
|
@@ -115,7 +97,6 @@ exports.bulkDestroy = async ctx => {
|
|
|
115
97
|
}
|
|
116
98
|
|
|
117
99
|
exports.search = async ctx => {
|
|
118
|
-
const appId = ctx.appId
|
|
119
100
|
const tableId = ctx.params.tableId
|
|
120
101
|
const { paginate, query, ...params } = ctx.request.body
|
|
121
102
|
let { bookmark, limit } = params
|
|
@@ -145,26 +126,21 @@ exports.search = async ctx => {
|
|
|
145
126
|
[params.sort]: direction,
|
|
146
127
|
}
|
|
147
128
|
}
|
|
148
|
-
const rows = await handleRequest(
|
|
129
|
+
const rows = await handleRequest(DataSourceOperation.READ, tableId, {
|
|
149
130
|
filters: query,
|
|
150
131
|
sort,
|
|
151
132
|
paginate: paginateObj,
|
|
152
133
|
})
|
|
153
134
|
let hasNextPage = false
|
|
154
135
|
if (paginate && rows.length === limit) {
|
|
155
|
-
const nextRows = await handleRequest(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
limit: 1,
|
|
164
|
-
page: bookmark * limit + 1,
|
|
165
|
-
},
|
|
166
|
-
}
|
|
167
|
-
)
|
|
136
|
+
const nextRows = await handleRequest(DataSourceOperation.READ, tableId, {
|
|
137
|
+
filters: query,
|
|
138
|
+
sort,
|
|
139
|
+
paginate: {
|
|
140
|
+
limit: 1,
|
|
141
|
+
page: bookmark * limit + 1,
|
|
142
|
+
},
|
|
143
|
+
})
|
|
168
144
|
hasNextPage = nextRows.length > 0
|
|
169
145
|
}
|
|
170
146
|
// need wrapper object for bookmarks etc when paginating
|
|
@@ -177,25 +153,19 @@ exports.validate = async () => {
|
|
|
177
153
|
}
|
|
178
154
|
|
|
179
155
|
exports.fetchEnrichedRow = async ctx => {
|
|
180
|
-
const appId = ctx.appId
|
|
181
156
|
const id = ctx.params.rowId
|
|
182
157
|
const tableId = ctx.params.tableId
|
|
183
158
|
const { datasourceId, tableName } = breakExternalTableId(tableId)
|
|
184
|
-
const db =
|
|
159
|
+
const db = getAppDB()
|
|
185
160
|
const datasource = await db.get(datasourceId)
|
|
186
161
|
if (!datasource || !datasource.entities) {
|
|
187
162
|
ctx.throw(400, "Datasource has not been configured for plus API.")
|
|
188
163
|
}
|
|
189
164
|
const tables = datasource.entities
|
|
190
|
-
const response = await handleRequest(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
{
|
|
195
|
-
id,
|
|
196
|
-
datasource,
|
|
197
|
-
}
|
|
198
|
-
)
|
|
165
|
+
const response = await handleRequest(DataSourceOperation.READ, tableId, {
|
|
166
|
+
id,
|
|
167
|
+
datasource,
|
|
168
|
+
})
|
|
199
169
|
const table = tables[tableName]
|
|
200
170
|
const row = response[0]
|
|
201
171
|
// this seems like a lot of work, but basically we need to dig deeper for the enrich
|
|
@@ -214,7 +184,6 @@ exports.fetchEnrichedRow = async ctx => {
|
|
|
214
184
|
// don't support composite keys right now
|
|
215
185
|
const linkedIds = links.map(link => breakRowIdField(link._id)[0])
|
|
216
186
|
row[fieldName] = await handleRequest(
|
|
217
|
-
appId,
|
|
218
187
|
DataSourceOperation.READ,
|
|
219
188
|
linkedTableId,
|
|
220
189
|
{
|