@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
|
@@ -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,9 +25,7 @@ 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
|
|
@@ -181,7 +179,7 @@ exports.fetchEnrichedRow = async ctx => {
|
|
|
181
179
|
const id = ctx.params.rowId
|
|
182
180
|
const tableId = ctx.params.tableId
|
|
183
181
|
const { datasourceId, tableName } = breakExternalTableId(tableId)
|
|
184
|
-
const db =
|
|
182
|
+
const db = getAppDB()
|
|
185
183
|
const datasource = await db.get(datasourceId)
|
|
186
184
|
if (!datasource || !datasource.entities) {
|
|
187
185
|
ctx.throw(400, "Datasource has not been configured for plus API.")
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const CouchDB = require("../../../db")
|
|
2
1
|
const linkRows = require("../../../db/linkedRows")
|
|
3
2
|
const {
|
|
4
3
|
generateRowID,
|
|
@@ -25,6 +24,7 @@ const {
|
|
|
25
24
|
getFromMemoryDoc,
|
|
26
25
|
} = require("../view/utils")
|
|
27
26
|
const { cloneDeep } = require("lodash/fp")
|
|
27
|
+
const { getAppDB } = require("@budibase/backend-core/context")
|
|
28
28
|
const { finaliseRow, updateRelatedFormula } = require("./staticFormula")
|
|
29
29
|
|
|
30
30
|
const CALCULATION_TYPES = {
|
|
@@ -76,8 +76,7 @@ async function getRawTableData(ctx, db, tableId) {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
exports.patch = async ctx => {
|
|
79
|
-
const
|
|
80
|
-
const db = new CouchDB(appId)
|
|
79
|
+
const db = getAppDB()
|
|
81
80
|
const inputs = ctx.request.body
|
|
82
81
|
const tableId = inputs.tableId
|
|
83
82
|
const isUserTable = tableId === InternalTables.USER_METADATA
|
|
@@ -116,14 +115,13 @@ exports.patch = async ctx => {
|
|
|
116
115
|
|
|
117
116
|
// returned row is cleaned and prepared for writing to DB
|
|
118
117
|
row = await linkRows.updateLinks({
|
|
119
|
-
appId,
|
|
120
118
|
eventType: linkRows.EventType.ROW_UPDATE,
|
|
121
119
|
row,
|
|
122
120
|
tableId: row.tableId,
|
|
123
121
|
table,
|
|
124
122
|
})
|
|
125
123
|
// check if any attachments removed
|
|
126
|
-
await cleanupAttachments(
|
|
124
|
+
await cleanupAttachments(table, { oldRow, row })
|
|
127
125
|
|
|
128
126
|
if (isUserTable) {
|
|
129
127
|
// the row has been updated, need to put it into the ctx
|
|
@@ -132,15 +130,14 @@ exports.patch = async ctx => {
|
|
|
132
130
|
return { row: ctx.body, table }
|
|
133
131
|
}
|
|
134
132
|
|
|
135
|
-
return finaliseRow(
|
|
133
|
+
return finaliseRow(table, row, {
|
|
136
134
|
oldTable: dbTable,
|
|
137
135
|
updateFormula: true,
|
|
138
136
|
})
|
|
139
137
|
}
|
|
140
138
|
|
|
141
139
|
exports.save = async function (ctx) {
|
|
142
|
-
const
|
|
143
|
-
const db = new CouchDB(appId)
|
|
140
|
+
const db = getAppDB()
|
|
144
141
|
let inputs = ctx.request.body
|
|
145
142
|
inputs.tableId = ctx.params.tableId
|
|
146
143
|
|
|
@@ -162,21 +159,19 @@ exports.save = async function (ctx) {
|
|
|
162
159
|
|
|
163
160
|
// make sure link rows are up to date
|
|
164
161
|
row = await linkRows.updateLinks({
|
|
165
|
-
appId,
|
|
166
162
|
eventType: linkRows.EventType.ROW_SAVE,
|
|
167
163
|
row,
|
|
168
164
|
tableId: row.tableId,
|
|
169
165
|
table,
|
|
170
166
|
})
|
|
171
167
|
|
|
172
|
-
return finaliseRow(
|
|
168
|
+
return finaliseRow(table, row, {
|
|
173
169
|
oldTable: dbTable,
|
|
174
170
|
updateFormula: true,
|
|
175
171
|
})
|
|
176
172
|
}
|
|
177
173
|
|
|
178
174
|
exports.fetchView = async ctx => {
|
|
179
|
-
const appId = ctx.appId
|
|
180
175
|
const viewName = ctx.params.viewName
|
|
181
176
|
|
|
182
177
|
// if this is a table view being looked for just transfer to that
|
|
@@ -185,7 +180,7 @@ exports.fetchView = async ctx => {
|
|
|
185
180
|
return exports.fetch(ctx)
|
|
186
181
|
}
|
|
187
182
|
|
|
188
|
-
const db =
|
|
183
|
+
const db = getAppDB()
|
|
189
184
|
const { calculation, group, field } = ctx.query
|
|
190
185
|
const viewInfo = await getView(db, viewName)
|
|
191
186
|
let response
|
|
@@ -212,7 +207,7 @@ exports.fetchView = async ctx => {
|
|
|
212
207
|
schema: {},
|
|
213
208
|
}
|
|
214
209
|
}
|
|
215
|
-
rows = await outputProcessing(
|
|
210
|
+
rows = await outputProcessing(table, response.rows)
|
|
216
211
|
}
|
|
217
212
|
|
|
218
213
|
if (calculation === CALCULATION_TYPES.STATS) {
|
|
@@ -239,27 +234,24 @@ exports.fetchView = async ctx => {
|
|
|
239
234
|
}
|
|
240
235
|
|
|
241
236
|
exports.fetch = async ctx => {
|
|
242
|
-
const
|
|
243
|
-
const db = new CouchDB(appId)
|
|
237
|
+
const db = getAppDB()
|
|
244
238
|
|
|
245
239
|
const tableId = ctx.params.tableId
|
|
246
240
|
let table = await db.get(tableId)
|
|
247
241
|
let rows = await getRawTableData(ctx, db, tableId)
|
|
248
|
-
return outputProcessing(
|
|
242
|
+
return outputProcessing(table, rows)
|
|
249
243
|
}
|
|
250
244
|
|
|
251
245
|
exports.find = async ctx => {
|
|
252
|
-
const
|
|
253
|
-
const db = new CouchDB(appId)
|
|
246
|
+
const db = getAppDB()
|
|
254
247
|
const table = await db.get(ctx.params.tableId)
|
|
255
|
-
let row = await findRow(ctx,
|
|
256
|
-
row = await outputProcessing(
|
|
248
|
+
let row = await findRow(ctx, ctx.params.tableId, ctx.params.rowId)
|
|
249
|
+
row = await outputProcessing(table, row)
|
|
257
250
|
return row
|
|
258
251
|
}
|
|
259
252
|
|
|
260
253
|
exports.destroy = async function (ctx) {
|
|
261
|
-
const
|
|
262
|
-
const db = new CouchDB(appId)
|
|
254
|
+
const db = getAppDB()
|
|
263
255
|
const { _id, _rev } = ctx.request.body
|
|
264
256
|
let row = await db.get(_id)
|
|
265
257
|
|
|
@@ -268,18 +260,17 @@ exports.destroy = async function (ctx) {
|
|
|
268
260
|
}
|
|
269
261
|
const table = await db.get(row.tableId)
|
|
270
262
|
// update the row to include full relationships before deleting them
|
|
271
|
-
row = await outputProcessing(
|
|
263
|
+
row = await outputProcessing(table, row, { squash: false })
|
|
272
264
|
// now remove the relationships
|
|
273
265
|
await linkRows.updateLinks({
|
|
274
|
-
appId,
|
|
275
266
|
eventType: linkRows.EventType.ROW_DELETE,
|
|
276
267
|
row,
|
|
277
268
|
tableId: row.tableId,
|
|
278
269
|
})
|
|
279
270
|
// remove any attachments that were on the row from object storage
|
|
280
|
-
await cleanupAttachments(
|
|
271
|
+
await cleanupAttachments(table, { row })
|
|
281
272
|
// remove any static formula
|
|
282
|
-
await updateRelatedFormula(
|
|
273
|
+
await updateRelatedFormula(table, row)
|
|
283
274
|
|
|
284
275
|
let response
|
|
285
276
|
if (ctx.params.tableId === InternalTables.USER_METADATA) {
|
|
@@ -295,20 +286,18 @@ exports.destroy = async function (ctx) {
|
|
|
295
286
|
}
|
|
296
287
|
|
|
297
288
|
exports.bulkDestroy = async ctx => {
|
|
298
|
-
const
|
|
299
|
-
const db = new CouchDB(appId)
|
|
289
|
+
const db = getAppDB()
|
|
300
290
|
const tableId = ctx.params.tableId
|
|
301
291
|
const table = await db.get(tableId)
|
|
302
292
|
let { rows } = ctx.request.body
|
|
303
293
|
|
|
304
294
|
// before carrying out any updates, make sure the rows are ready to be returned
|
|
305
295
|
// they need to be the full rows (including previous relationships) for automations
|
|
306
|
-
rows = await outputProcessing(
|
|
296
|
+
rows = await outputProcessing(table, rows, { squash: false })
|
|
307
297
|
|
|
308
298
|
// remove the relationships first
|
|
309
299
|
let updates = rows.map(row =>
|
|
310
300
|
linkRows.updateLinks({
|
|
311
|
-
appId,
|
|
312
301
|
eventType: linkRows.EventType.ROW_DELETE,
|
|
313
302
|
row,
|
|
314
303
|
tableId: row.tableId,
|
|
@@ -327,8 +316,8 @@ exports.bulkDestroy = async ctx => {
|
|
|
327
316
|
await db.bulkDocs(rows.map(row => ({ ...row, _deleted: true })))
|
|
328
317
|
}
|
|
329
318
|
// remove any attachments that were on the rows from object storage
|
|
330
|
-
await cleanupAttachments(
|
|
331
|
-
await updateRelatedFormula(
|
|
319
|
+
await cleanupAttachments(table, { rows })
|
|
320
|
+
await updateRelatedFormula(table, rows)
|
|
332
321
|
await Promise.all(updates)
|
|
333
322
|
return { response: { ok: true }, rows }
|
|
334
323
|
}
|
|
@@ -339,28 +328,27 @@ exports.search = async ctx => {
|
|
|
339
328
|
return { rows: await exports.fetch(ctx) }
|
|
340
329
|
}
|
|
341
330
|
|
|
342
|
-
const appId = ctx.appId
|
|
343
331
|
const { tableId } = ctx.params
|
|
344
|
-
const db =
|
|
332
|
+
const db = getAppDB()
|
|
345
333
|
const { paginate, query, ...params } = ctx.request.body
|
|
346
334
|
params.version = ctx.version
|
|
347
335
|
params.tableId = tableId
|
|
348
336
|
|
|
349
337
|
let response
|
|
350
338
|
if (paginate) {
|
|
351
|
-
response = await paginatedSearch(
|
|
339
|
+
response = await paginatedSearch(query, params)
|
|
352
340
|
} else {
|
|
353
|
-
response = await fullSearch(
|
|
341
|
+
response = await fullSearch(query, params)
|
|
354
342
|
}
|
|
355
343
|
|
|
356
344
|
// Enrich search results with relationships
|
|
357
345
|
if (response.rows && response.rows.length) {
|
|
358
346
|
// enrich with global users if from users table
|
|
359
347
|
if (tableId === InternalTables.USER_METADATA) {
|
|
360
|
-
response.rows = await getGlobalUsersFromMetadata(
|
|
348
|
+
response.rows = await getGlobalUsersFromMetadata(response.rows)
|
|
361
349
|
}
|
|
362
350
|
const table = await db.get(tableId)
|
|
363
|
-
response.rows = await outputProcessing(
|
|
351
|
+
response.rows = await outputProcessing(table, response.rows)
|
|
364
352
|
}
|
|
365
353
|
|
|
366
354
|
return response
|
|
@@ -368,25 +356,22 @@ exports.search = async ctx => {
|
|
|
368
356
|
|
|
369
357
|
exports.validate = async ctx => {
|
|
370
358
|
return validate({
|
|
371
|
-
appId: ctx.appId,
|
|
372
359
|
tableId: ctx.params.tableId,
|
|
373
360
|
row: ctx.request.body,
|
|
374
361
|
})
|
|
375
362
|
}
|
|
376
363
|
|
|
377
364
|
exports.fetchEnrichedRow = async ctx => {
|
|
378
|
-
const
|
|
379
|
-
const db = new CouchDB(appId)
|
|
365
|
+
const db = getAppDB()
|
|
380
366
|
const tableId = ctx.params.tableId
|
|
381
367
|
const rowId = ctx.params.rowId
|
|
382
368
|
// need table to work out where links go in row
|
|
383
369
|
let [table, row] = await Promise.all([
|
|
384
370
|
db.get(tableId),
|
|
385
|
-
findRow(ctx,
|
|
371
|
+
findRow(ctx, tableId, rowId),
|
|
386
372
|
])
|
|
387
373
|
// get the link docs
|
|
388
374
|
const linkVals = await linkRows.getLinkDocuments({
|
|
389
|
-
appId,
|
|
390
375
|
tableId,
|
|
391
376
|
rowId,
|
|
392
377
|
})
|
|
@@ -413,7 +398,7 @@ exports.fetchEnrichedRow = async ctx => {
|
|
|
413
398
|
for (let [tableId, rows] of Object.entries(groups)) {
|
|
414
399
|
// need to include the IDs in these rows for any links they may have
|
|
415
400
|
linkedRows = linkedRows.concat(
|
|
416
|
-
await outputProcessing(
|
|
401
|
+
await outputProcessing(tables[tableId], rows)
|
|
417
402
|
)
|
|
418
403
|
}
|
|
419
404
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
const { SearchIndexes } = require("../../../db/utils")
|
|
2
2
|
const fetch = require("node-fetch")
|
|
3
3
|
const { getCouchUrl } = require("@budibase/backend-core/db")
|
|
4
|
+
const { getAppId } = require("@budibase/backend-core/context")
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Class to build lucene query URLs.
|
|
7
8
|
* Optionally takes a base lucene query object.
|
|
8
9
|
*/
|
|
9
10
|
class QueryBuilder {
|
|
10
|
-
constructor(
|
|
11
|
-
this.appId = appId
|
|
11
|
+
constructor(base) {
|
|
12
12
|
this.query = {
|
|
13
13
|
string: {},
|
|
14
14
|
fuzzy: {},
|
|
@@ -241,7 +241,8 @@ class QueryBuilder {
|
|
|
241
241
|
}
|
|
242
242
|
|
|
243
243
|
async run() {
|
|
244
|
-
const
|
|
244
|
+
const appId = getAppId()
|
|
245
|
+
const url = `${getCouchUrl()}/${appId}/_design/database/_search/${
|
|
245
246
|
SearchIndexes.ROWS
|
|
246
247
|
}`
|
|
247
248
|
const body = this.buildSearchBody()
|
|
@@ -278,7 +279,6 @@ const runQuery = async (url, body) => {
|
|
|
278
279
|
* Gets round the fixed limit of 200 results from a query by fetching as many
|
|
279
280
|
* pages as required and concatenating the results. This recursively operates
|
|
280
281
|
* until enough results have been found.
|
|
281
|
-
* @param appId {string} The app ID to search
|
|
282
282
|
* @param query {object} The JSON query structure
|
|
283
283
|
* @param params {object} The search params including:
|
|
284
284
|
* tableId {string} The table ID to search
|
|
@@ -291,7 +291,7 @@ const runQuery = async (url, body) => {
|
|
|
291
291
|
* rows {array|null} Current results in the recursive search
|
|
292
292
|
* @returns {Promise<*[]|*>}
|
|
293
293
|
*/
|
|
294
|
-
const recursiveSearch = async (
|
|
294
|
+
const recursiveSearch = async (query, params) => {
|
|
295
295
|
const bookmark = params.bookmark
|
|
296
296
|
const rows = params.rows || []
|
|
297
297
|
if (rows.length >= params.limit) {
|
|
@@ -301,7 +301,7 @@ const recursiveSearch = async (appId, query, params) => {
|
|
|
301
301
|
if (rows.length > params.limit - 200) {
|
|
302
302
|
pageSize = params.limit - rows.length
|
|
303
303
|
}
|
|
304
|
-
const page = await new QueryBuilder(
|
|
304
|
+
const page = await new QueryBuilder(query)
|
|
305
305
|
.setVersion(params.version)
|
|
306
306
|
.setTable(params.tableId)
|
|
307
307
|
.setBookmark(bookmark)
|
|
@@ -321,14 +321,13 @@ const recursiveSearch = async (appId, query, params) => {
|
|
|
321
321
|
bookmark: page.bookmark,
|
|
322
322
|
rows: [...rows, ...page.rows],
|
|
323
323
|
}
|
|
324
|
-
return await recursiveSearch(
|
|
324
|
+
return await recursiveSearch(query, newParams)
|
|
325
325
|
}
|
|
326
326
|
|
|
327
327
|
/**
|
|
328
328
|
* Performs a paginated search. A bookmark will be returned to allow the next
|
|
329
329
|
* page to be fetched. There is a max limit off 200 results per page in a
|
|
330
330
|
* paginated search.
|
|
331
|
-
* @param appId {string} The app ID to search
|
|
332
331
|
* @param query {object} The JSON query structure
|
|
333
332
|
* @param params {object} The search params including:
|
|
334
333
|
* tableId {string} The table ID to search
|
|
@@ -340,13 +339,13 @@ const recursiveSearch = async (appId, query, params) => {
|
|
|
340
339
|
* bookmark {string} The bookmark to resume from
|
|
341
340
|
* @returns {Promise<{hasNextPage: boolean, rows: *[]}>}
|
|
342
341
|
*/
|
|
343
|
-
exports.paginatedSearch = async (
|
|
342
|
+
exports.paginatedSearch = async (query, params) => {
|
|
344
343
|
let limit = params.limit
|
|
345
344
|
if (limit == null || isNaN(limit) || limit < 0) {
|
|
346
345
|
limit = 50
|
|
347
346
|
}
|
|
348
347
|
limit = Math.min(limit, 200)
|
|
349
|
-
const search = new QueryBuilder(
|
|
348
|
+
const search = new QueryBuilder(query)
|
|
350
349
|
.setVersion(params.version)
|
|
351
350
|
.setTable(params.tableId)
|
|
352
351
|
.setSort(params.sort)
|
|
@@ -375,7 +374,6 @@ exports.paginatedSearch = async (appId, query, params) => {
|
|
|
375
374
|
* desired amount of results. There is a limit of 1000 results to avoid
|
|
376
375
|
* heavy performance hits, and to avoid client components breaking from
|
|
377
376
|
* handling too much data.
|
|
378
|
-
* @param appId {string} The app ID to search
|
|
379
377
|
* @param query {object} The JSON query structure
|
|
380
378
|
* @param params {object} The search params including:
|
|
381
379
|
* tableId {string} The table ID to search
|
|
@@ -386,12 +384,12 @@ exports.paginatedSearch = async (appId, query, params) => {
|
|
|
386
384
|
* limit {number} The desired number of results
|
|
387
385
|
* @returns {Promise<{rows: *}>}
|
|
388
386
|
*/
|
|
389
|
-
exports.fullSearch = async (
|
|
387
|
+
exports.fullSearch = async (query, params) => {
|
|
390
388
|
let limit = params.limit
|
|
391
389
|
if (limit == null || isNaN(limit) || limit < 0) {
|
|
392
390
|
limit = 1000
|
|
393
391
|
}
|
|
394
392
|
params.limit = Math.min(limit, 1000)
|
|
395
|
-
const rows = await recursiveSearch(
|
|
393
|
+
const rows = await recursiveSearch(query, params)
|
|
396
394
|
return { rows }
|
|
397
395
|
}
|