@budibase/server 1.0.49-alpha.0 → 1.0.49-alpha.12
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.8184eed9.js → index.0bdf1cad.js} +195 -194
- package/builder/assets/{index.dd9e386f.css → index.83c0944f.css} +1 -1
- package/builder/assets/{vendor.3bd2f661.js → vendor.d526bfe8.js} +1 -1
- package/builder/index.html +3 -3
- package/coverage/clover.xml +2927 -2819
- package/coverage/coverage-final.json +104 -103
- 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 +157 -136
- package/coverage/lcov-report/api/controllers/auth.js.html +11 -14
- package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
- 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 +31 -37
- package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
- package/coverage/lcov-report/api/controllers/index.html +69 -54
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
- package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
- package/coverage/lcov-report/{migrations/usageQuotas/syncApps.js.html → api/controllers/migrations.js.html} +30 -45
- package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
- package/coverage/lcov-report/api/controllers/query/index.html +10 -10
- package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
- package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
- package/coverage/lcov-report/api/controllers/role.js.html +16 -16
- package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
- package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
- package/coverage/lcov-report/api/controllers/row/index.html +52 -37
- package/coverage/lcov-report/api/controllers/row/index.js.html +13 -13
- package/coverage/lcov-report/api/controllers/row/internal.js.html +108 -216
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +52 -34
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +548 -0
- package/coverage/lcov-report/api/controllers/row/utils.js.html +27 -24
- package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
- package/coverage/lcov-report/api/controllers/script.js.html +4 -4
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +599 -0
- package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
- package/coverage/lcov-report/api/controllers/table/index.html +57 -42
- package/coverage/lcov-report/api/controllers/table/index.js.html +28 -70
- package/coverage/lcov-report/api/controllers/table/internal.js.html +56 -47
- package/coverage/lcov-report/api/controllers/table/utils.js.html +169 -85
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +43 -52
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
- package/coverage/lcov-report/api/controllers/view/index.html +16 -16
- package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
- package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
- package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +3 -3
- 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 +22 -7
- package/coverage/lcov-report/api/routes/index.js.html +10 -4
- 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/{migrations/usageQuotas/index.js.html → api/routes/migrations.js.html} +25 -55
- 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 +24 -24
- package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
- package/coverage/lcov-report/automations/bullboard.js.html +16 -16
- 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 +6 -6
- package/coverage/lcov-report/automations/steps/createRow.js.html +7 -10
- package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
- package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
- package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
- package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
- package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
- package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
- package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
- package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
- package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
- package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
- package/coverage/lcov-report/automations/triggers.js.html +61 -55
- package/coverage/lcov-report/automations/utils.js.html +54 -42
- package/coverage/lcov-report/constants/index.html +5 -5
- package/coverage/lcov-report/constants/index.js.html +42 -27
- package/coverage/lcov-report/constants/layouts.js.html +5 -5
- package/coverage/lcov-report/constants/screens.js.html +4 -4
- package/coverage/lcov-report/db/client.js.html +18 -18
- package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
- 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 +15 -27
- package/coverage/lcov-report/db/linkedRows/index.html +27 -27
- package/coverage/lcov-report/db/linkedRows/index.js.html +40 -85
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +40 -40
- package/coverage/lcov-report/db/newid.js.html +4 -4
- package/coverage/lcov-report/db/utils.js.html +75 -75
- 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 +5 -5
- package/coverage/lcov-report/events/utils.js.html +3 -3
- package/coverage/lcov-report/index.html +107 -122
- 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 +3 -3
- 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 -35
- 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 +10 -10
- package/coverage/lcov-report/threads/query.js.html +26 -47
- package/coverage/lcov-report/threads/utils.js.html +14 -14
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
- package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
- package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
- package/coverage/lcov-report/utilities/global.js.html +57 -48
- package/coverage/lcov-report/utilities/index.html +27 -27
- package/coverage/lcov-report/utilities/index.js.html +42 -72
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
- 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 +27 -27
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +65 -71
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
- package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
- package/coverage/lcov-report/utilities/security.js.html +8 -8
- 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 +13 -10
- 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 +9 -9
- package/coverage/lcov-report/utilities/workerRequests.js.html +16 -16
- package/coverage/lcov.info +4620 -4358
- package/dist/api/controllers/application.js +49 -48
- 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/migrations.js +21 -0
- 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 +55 -93
- package/dist/api/controllers/row/internalSearch.js +23 -17
- package/dist/api/controllers/row/staticFormula.js +147 -0
- 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 +159 -0
- package/dist/api/controllers/table/external.js +7 -10
- package/dist/api/controllers/table/index.js +7 -10
- package/dist/api/controllers/table/internal.js +20 -16
- package/dist/api/controllers/table/utils.js +54 -34
- 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/index.js +2 -0
- package/dist/api/routes/migrations.js +9 -0
- package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
- package/dist/app.js +35 -5
- 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/constants/index.js +4 -0
- package/dist/db/linkedRows/LinkController.js +3 -7
- package/dist/db/linkedRows/index.js +16 -27
- package/dist/db/linkedRows/linkUtils.js +6 -6
- package/dist/db/views/staticViews.js +9 -10
- package/dist/environment.js +3 -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 -4
- package/dist/migrations/functions/appUrls.js +46 -0
- package/dist/migrations/functions/quotas1.js +50 -0
- package/dist/migrations/{usageQuotas → functions/usageQuotas}/index.js +6 -10
- package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncApps.js +12 -9
- package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncRows.js +16 -12
- package/dist/migrations/functions/userEmailViewCasing.js +24 -0
- package/dist/migrations/index.js +62 -0
- package/dist/package.json +4 -4
- package/dist/tests/utilities/TestConfiguration.js +70 -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 +23 -17
- package/dist/utilities/rowProcessor/utils.js +14 -4
- 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/scripts/likeCypress.ts +1 -1
- package/src/api/controllers/application.js +38 -31
- 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/migrations.js +13 -0
- 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 +54 -90
- package/src/api/controllers/row/internalSearch.js +23 -17
- package/src/api/controllers/row/staticFormula.js +156 -0
- 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 +173 -0
- package/src/api/controllers/table/external.js +7 -10
- package/src/api/controllers/table/index.js +7 -21
- package/src/api/controllers/table/internal.js +22 -19
- package/src/api/controllers/table/utils.js +70 -42
- 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/index.js +2 -0
- package/src/api/routes/migrations.js +14 -0
- 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/app.ts +18 -5
- 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/constants/index.js +5 -0
- package/src/db/linkedRows/LinkController.js +3 -7
- package/src/db/linkedRows/index.js +16 -31
- 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/definitions/common.ts +3 -0
- package/src/environment.js +3 -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 -4
- package/src/migrations/functions/appUrls.ts +34 -0
- package/src/migrations/functions/quotas1.ts +20 -0
- package/src/migrations/functions/tests/appUrls.spec.js +29 -0
- package/src/migrations/{tests/usageQuotas/index.spec.js → functions/tests/quotas1.spec.js} +5 -5
- package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
- package/src/migrations/functions/usageQuotas/index.ts +8 -0
- package/src/migrations/{usageQuotas/syncApps.js → functions/usageQuotas/syncApps.ts} +6 -6
- package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
- package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncApps.spec.js +4 -4
- package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncRows.spec.js +4 -4
- package/src/migrations/functions/userEmailViewCasing.ts +13 -0
- package/src/migrations/index.ts +56 -0
- package/src/module.d.ts +3 -0
- package/src/tests/utilities/TestConfiguration.js +73 -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 +25 -27
- package/src/utilities/rowProcessor/utils.js +23 -7
- 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
- package/coverage/lcov-report/migrations/usageQuotas/index.html +0 -141
- package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +0 -143
- package/src/migrations/usageQuotas/index.js +0 -24
- package/src/migrations/usageQuotas/syncRows.js +0 -21
|
@@ -8,11 +8,11 @@ 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("../index");
|
|
12
11
|
const { IncludeDocs, getLinkDocuments } = require("./linkUtils");
|
|
13
12
|
const { generateLinkID, InternalTables, getUserMetadataParams, } = require("../utils");
|
|
14
13
|
const Sentry = require("@sentry/node");
|
|
15
14
|
const { FieldTypes, RelationshipTypes } = require("../../constants");
|
|
15
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
16
16
|
/**
|
|
17
17
|
* Creates a new link document structure which can be put to the database. It is important to
|
|
18
18
|
* note that while this talks about linker/linked the link is bi-directional and for all intent
|
|
@@ -42,9 +42,8 @@ function LinkDocument(tableId1, fieldName1, rowId1, tableId2, fieldName2, rowId2
|
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
class LinkController {
|
|
45
|
-
constructor({
|
|
46
|
-
this.
|
|
47
|
-
this._db = new CouchDB(appId);
|
|
45
|
+
constructor({ tableId, row, table, oldTable }) {
|
|
46
|
+
this._db = getAppDB();
|
|
48
47
|
this._tableId = tableId;
|
|
49
48
|
this._row = row;
|
|
50
49
|
this._table = table;
|
|
@@ -90,7 +89,6 @@ class LinkController {
|
|
|
90
89
|
*/
|
|
91
90
|
getRowLinkDocs(rowId) {
|
|
92
91
|
return getLinkDocuments({
|
|
93
|
-
appId: this._appId,
|
|
94
92
|
tableId: this._tableId,
|
|
95
93
|
rowId,
|
|
96
94
|
includeDocs: IncludeDocs.INCLUDE,
|
|
@@ -101,7 +99,6 @@ class LinkController {
|
|
|
101
99
|
*/
|
|
102
100
|
getTableLinkDocs() {
|
|
103
101
|
return getLinkDocuments({
|
|
104
|
-
appId: this._appId,
|
|
105
102
|
tableId: this._tableId,
|
|
106
103
|
includeDocs: IncludeDocs.INCLUDE,
|
|
107
104
|
});
|
|
@@ -203,7 +200,6 @@ class LinkController {
|
|
|
203
200
|
for (let linkId of rowField) {
|
|
204
201
|
if (linkedSchema.relationshipType === RelationshipTypes.ONE_TO_MANY) {
|
|
205
202
|
let links = (yield getLinkDocuments({
|
|
206
|
-
appId: this._appId,
|
|
207
203
|
tableId: field.tableId,
|
|
208
204
|
rowId: linkId,
|
|
209
205
|
includeDocs: IncludeDocs.EXCLUDE,
|
|
@@ -11,12 +11,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
const LinkController = require("./LinkController");
|
|
12
12
|
const { IncludeDocs, getLinkDocuments, createLinkView, getUniqueByProp, getRelatedTableForField, getLinkedTableIDs, getLinkedTable, } = require("./linkUtils");
|
|
13
13
|
const { flatten } = require("lodash");
|
|
14
|
-
const CouchDB = require("../../db");
|
|
15
14
|
const { FieldTypes } = require("../../constants");
|
|
16
15
|
const { getMultiIDParams, USER_METDATA_PREFIX } = require("../../db/utils");
|
|
17
16
|
const { partition } = require("lodash");
|
|
18
17
|
const { getGlobalUsersFromMetadata } = require("../../utilities/global");
|
|
19
18
|
const { processFormulas } = require("../../utilities/rowProcessor/utils");
|
|
19
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
20
20
|
/**
|
|
21
21
|
* This functionality makes sure that when rows with links are created, updated or deleted they are processed
|
|
22
22
|
* correctly - making sure that no stale links are left around and that all links have been made successfully.
|
|
@@ -45,12 +45,11 @@ function clearRelationshipFields(table, rows) {
|
|
|
45
45
|
}
|
|
46
46
|
return rows;
|
|
47
47
|
}
|
|
48
|
-
function getLinksForRows(
|
|
48
|
+
function getLinksForRows(rows) {
|
|
49
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
50
|
const tableIds = [...new Set(rows.map(el => el.tableId))];
|
|
51
51
|
// start by getting all the link values for performance reasons
|
|
52
52
|
const responses = flatten(yield Promise.all(tableIds.map(tableId => getLinkDocuments({
|
|
53
|
-
appId,
|
|
54
53
|
tableId: tableId,
|
|
55
54
|
includeDocs: IncludeDocs.EXCLUDE,
|
|
56
55
|
}))));
|
|
@@ -61,10 +60,10 @@ function getLinksForRows(appId, rows) {
|
|
|
61
60
|
.map(el => (Object.assign(Object.assign({}, el), { unique: el.id + el.thisId + el.fieldName }))), "unique");
|
|
62
61
|
});
|
|
63
62
|
}
|
|
64
|
-
function getFullLinkedDocs(
|
|
63
|
+
function getFullLinkedDocs(links) {
|
|
65
64
|
return __awaiter(this, void 0, void 0, function* () {
|
|
66
65
|
// create DBs
|
|
67
|
-
const db =
|
|
66
|
+
const db = getAppDB();
|
|
68
67
|
const linkedRowIds = links.map(link => link.id);
|
|
69
68
|
const uniqueRowIds = [...new Set(linkedRowIds)];
|
|
70
69
|
let dbRows = (yield db.allDocs(getMultiIDParams(uniqueRowIds))).rows.map(row => row.doc);
|
|
@@ -74,7 +73,7 @@ function getFullLinkedDocs(ctx, appId, links) {
|
|
|
74
73
|
.filter(row => row != null);
|
|
75
74
|
// need to handle users as specific cases
|
|
76
75
|
let [users, other] = partition(linked, linkRow => linkRow._id.startsWith(USER_METDATA_PREFIX));
|
|
77
|
-
users = yield getGlobalUsersFromMetadata(
|
|
76
|
+
users = yield getGlobalUsersFromMetadata(users);
|
|
78
77
|
return [...other, ...users];
|
|
79
78
|
});
|
|
80
79
|
}
|
|
@@ -82,21 +81,17 @@ function getFullLinkedDocs(ctx, appId, links) {
|
|
|
82
81
|
* Update link documents for a row or table - this is to be called by the API controller when a change is occurring.
|
|
83
82
|
* @param {string} args.eventType states what type of change which is occurring, means this can be expanded upon in the
|
|
84
83
|
* future quite easily (all updates go through one function).
|
|
85
|
-
* @param {string} args.appId The ID of the instance in which the change is occurring.
|
|
86
84
|
* @param {string} args.tableId The ID of the of the table which is being changed.
|
|
87
|
-
* @param {object|
|
|
88
|
-
* @param {object|
|
|
89
|
-
* @param {object|
|
|
85
|
+
* @param {object|undefined} args.row The row which is changing, e.g. created, updated or deleted.
|
|
86
|
+
* @param {object|undefined} args.table If the table has already been retrieved this can be used to reduce database gets.
|
|
87
|
+
* @param {object|undefined} args.oldTable If the table is being updated then the old table can be provided for differencing.
|
|
90
88
|
* @returns {Promise<object>} When the update is complete this will respond successfully. Returns the row for
|
|
91
89
|
* row operations and the table for table operations.
|
|
92
90
|
*/
|
|
93
91
|
exports.updateLinks = function (args) {
|
|
94
92
|
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
-
const { eventType,
|
|
93
|
+
const { eventType, row, tableId, table, oldTable } = args;
|
|
96
94
|
const baseReturnObj = row == null ? table : row;
|
|
97
|
-
if (appId == null) {
|
|
98
|
-
throw "Cannot operate without an instance ID.";
|
|
99
|
-
}
|
|
100
95
|
// make sure table ID is set
|
|
101
96
|
if (tableId == null && table != null) {
|
|
102
97
|
args.tableId = table._id;
|
|
@@ -132,25 +127,21 @@ exports.updateLinks = function (args) {
|
|
|
132
127
|
/**
|
|
133
128
|
* Given a table and a list of rows this will retrieve all of the attached docs and enrich them into the row.
|
|
134
129
|
* This is required for formula fields, this may only be utilised internally (for now).
|
|
135
|
-
* @param {object} ctx The request which is looking for rows.
|
|
136
130
|
* @param {object} table The table from which the rows originated.
|
|
137
131
|
* @param {array<object>} rows The rows which are to be enriched.
|
|
138
132
|
* @return {Promise<*>} returns the rows with all of the enriched relationships on it.
|
|
139
133
|
*/
|
|
140
|
-
exports.attachFullLinkedDocs = (
|
|
141
|
-
const appId = ctx.appId;
|
|
134
|
+
exports.attachFullLinkedDocs = (table, rows) => __awaiter(void 0, void 0, void 0, function* () {
|
|
142
135
|
const linkedTableIds = getLinkedTableIDs(table);
|
|
143
136
|
if (linkedTableIds.length === 0) {
|
|
144
137
|
return rows;
|
|
145
138
|
}
|
|
146
|
-
// create DBs
|
|
147
|
-
const db = new CouchDB(appId);
|
|
148
139
|
// get all the links
|
|
149
|
-
const links = (yield getLinksForRows(
|
|
140
|
+
const links = (yield getLinksForRows(rows)).filter(link => rows.some(row => row._id === link.thisId));
|
|
150
141
|
// clear any existing links that could be dupe'd
|
|
151
142
|
rows = clearRelationshipFields(table, rows);
|
|
152
143
|
// now get the docs and combine into the rows
|
|
153
|
-
let linked = yield getFullLinkedDocs(
|
|
144
|
+
let linked = yield getFullLinkedDocs(links);
|
|
154
145
|
const linkedTables = [];
|
|
155
146
|
for (let row of rows) {
|
|
156
147
|
for (let link of links.filter(link => link.thisId === row._id)) {
|
|
@@ -160,7 +151,7 @@ exports.attachFullLinkedDocs = (ctx, table, rows) => __awaiter(void 0, void 0, v
|
|
|
160
151
|
const linkedRow = linked.find(row => row._id === link.id);
|
|
161
152
|
if (linkedRow) {
|
|
162
153
|
const linkedTableId = linkedRow.tableId || getRelatedTableForField(table, link.fieldName);
|
|
163
|
-
const linkedTable = yield getLinkedTable(
|
|
154
|
+
const linkedTable = yield getLinkedTable(linkedTableId, linkedTables);
|
|
164
155
|
if (linkedTable) {
|
|
165
156
|
row[link.fieldName].push(processFormulas(linkedTable, linkedRow));
|
|
166
157
|
}
|
|
@@ -171,18 +162,16 @@ exports.attachFullLinkedDocs = (ctx, table, rows) => __awaiter(void 0, void 0, v
|
|
|
171
162
|
});
|
|
172
163
|
/**
|
|
173
164
|
* This function will take the given enriched rows and squash the links to only contain the primary display field.
|
|
174
|
-
* @param {string} appId The app in which the tables/rows/links exist.
|
|
175
165
|
* @param {object} table The table from which the rows originated.
|
|
176
166
|
* @param {array<object>} enriched The pre-enriched rows (full docs) which are to be squashed.
|
|
177
167
|
* @returns {Promise<Array>} The rows after having their links squashed to only contain the ID and primary display.
|
|
178
168
|
*/
|
|
179
|
-
exports.squashLinksToPrimaryDisplay = (
|
|
180
|
-
const db = new CouchDB(appId);
|
|
169
|
+
exports.squashLinksToPrimaryDisplay = (table, enriched) => __awaiter(void 0, void 0, void 0, function* () {
|
|
181
170
|
// will populate this as we find them
|
|
182
171
|
const linkedTables = [table];
|
|
183
172
|
for (let row of enriched) {
|
|
184
173
|
// this only fetches the table if its not already in array
|
|
185
|
-
const rowTable = yield getLinkedTable(
|
|
174
|
+
const rowTable = yield getLinkedTable(row.tableId, linkedTables);
|
|
186
175
|
for (let [column, schema] of Object.entries(rowTable.schema)) {
|
|
187
176
|
if (schema.type !== FieldTypes.LINK || !Array.isArray(row[column])) {
|
|
188
177
|
continue;
|
|
@@ -190,7 +179,7 @@ exports.squashLinksToPrimaryDisplay = (appId, table, enriched) => __awaiter(void
|
|
|
190
179
|
const newLinks = [];
|
|
191
180
|
for (let link of row[column]) {
|
|
192
181
|
const linkTblId = link.tableId || getRelatedTableForField(table, column);
|
|
193
|
-
const linkedTable = yield getLinkedTable(
|
|
182
|
+
const linkedTable = yield getLinkedTable(linkTblId, linkedTables);
|
|
194
183
|
const obj = { _id: link._id };
|
|
195
184
|
if (link[linkedTable.primaryDisplay]) {
|
|
196
185
|
obj.primaryDisplay = link[linkedTable.primaryDisplay];
|
|
@@ -8,11 +8,11 @@ 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("../index");
|
|
12
11
|
const Sentry = require("@sentry/node");
|
|
13
12
|
const { ViewNames, getQueryIndex } = require("../utils");
|
|
14
13
|
const { FieldTypes } = require("../../constants");
|
|
15
14
|
const { createLinkView } = require("../views/staticViews");
|
|
15
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
16
16
|
/**
|
|
17
17
|
* Only needed so that boolean parameters are being used for includeDocs
|
|
18
18
|
* @type {{EXCLUDE: boolean, INCLUDE: boolean}}
|
|
@@ -24,7 +24,6 @@ exports.IncludeDocs = {
|
|
|
24
24
|
exports.createLinkView = createLinkView;
|
|
25
25
|
/**
|
|
26
26
|
* Gets the linking documents, not the linked documents themselves.
|
|
27
|
-
* @param {string} args.appId The instance in which we are searching for linked rows.
|
|
28
27
|
* @param {string} args.tableId The table which we are searching for linked rows against.
|
|
29
28
|
* @param {string|null} args.fieldName The name of column/field which is being altered, only looking for
|
|
30
29
|
* linking documents that are related to it. If this is not specified then the table level will be assumed.
|
|
@@ -38,8 +37,8 @@ exports.createLinkView = createLinkView;
|
|
|
38
37
|
*/
|
|
39
38
|
exports.getLinkDocuments = function (args) {
|
|
40
39
|
return __awaiter(this, arguments, void 0, function* () {
|
|
41
|
-
const {
|
|
42
|
-
const db =
|
|
40
|
+
const { tableId, rowId, includeDocs } = args;
|
|
41
|
+
const db = getAppDB();
|
|
43
42
|
let params;
|
|
44
43
|
if (rowId != null) {
|
|
45
44
|
params = { key: [tableId, rowId] };
|
|
@@ -75,7 +74,7 @@ exports.getLinkDocuments = function (args) {
|
|
|
75
74
|
catch (err) {
|
|
76
75
|
// check if the view doesn't exist, it should for all new instances
|
|
77
76
|
if (err != null && err.name === "not_found") {
|
|
78
|
-
yield exports.createLinkView(
|
|
77
|
+
yield exports.createLinkView();
|
|
79
78
|
return exports.getLinkDocuments(arguments[0]);
|
|
80
79
|
}
|
|
81
80
|
else {
|
|
@@ -95,7 +94,8 @@ exports.getLinkedTableIDs = table => {
|
|
|
95
94
|
.filter(column => column.type === FieldTypes.LINK)
|
|
96
95
|
.map(column => column.tableId);
|
|
97
96
|
};
|
|
98
|
-
exports.getLinkedTable = (
|
|
97
|
+
exports.getLinkedTable = (id, tables) => __awaiter(void 0, void 0, void 0, function* () {
|
|
98
|
+
const db = getAppDB();
|
|
99
99
|
let linkedTable = tables.find(table => table._id === id);
|
|
100
100
|
if (linkedTable) {
|
|
101
101
|
return linkedTable;
|
|
@@ -8,7 +8,7 @@ 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
|
|
11
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
12
12
|
const { DocumentTypes, SEPARATOR, ViewNames, SearchIndexes, } = require("../utils");
|
|
13
13
|
const SCREEN_PREFIX = DocumentTypes.SCREEN + SEPARATOR;
|
|
14
14
|
/**************************************************
|
|
@@ -24,12 +24,11 @@ const SCREEN_PREFIX = DocumentTypes.SCREEN + SEPARATOR;
|
|
|
24
24
|
/**
|
|
25
25
|
* Creates the link view for the instance, this will overwrite the existing one, but this should only
|
|
26
26
|
* be called if it is found that the view does not exist.
|
|
27
|
-
* @param {string} appId The instance to which the view should be added.
|
|
28
27
|
* @returns {Promise<void>} The view now exists, please note that the next view of this query will actually build it,
|
|
29
28
|
* so it may be slow.
|
|
30
29
|
*/
|
|
31
|
-
exports.createLinkView = (
|
|
32
|
-
const db =
|
|
30
|
+
exports.createLinkView = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
|
+
const db = getAppDB();
|
|
33
32
|
const designDoc = yield db.get("_design/database");
|
|
34
33
|
const view = {
|
|
35
34
|
map: function (doc) {
|
|
@@ -56,8 +55,8 @@ exports.createLinkView = (appId) => __awaiter(void 0, void 0, void 0, function*
|
|
|
56
55
|
designDoc.views = Object.assign(Object.assign({}, designDoc.views), { [ViewNames.LINK]: view });
|
|
57
56
|
yield db.put(designDoc);
|
|
58
57
|
});
|
|
59
|
-
exports.createRoutingView = (
|
|
60
|
-
const db =
|
|
58
|
+
exports.createRoutingView = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
const db = getAppDB();
|
|
61
60
|
const designDoc = yield db.get("_design/database");
|
|
62
61
|
const view = {
|
|
63
62
|
// if using variables in a map function need to inject them before use
|
|
@@ -73,9 +72,9 @@ exports.createRoutingView = (appId) => __awaiter(void 0, void 0, void 0, functio
|
|
|
73
72
|
designDoc.views = Object.assign(Object.assign({}, designDoc.views), { [ViewNames.ROUTING]: view });
|
|
74
73
|
yield db.put(designDoc);
|
|
75
74
|
});
|
|
76
|
-
function searchIndex(
|
|
75
|
+
function searchIndex(indexName, fnString) {
|
|
77
76
|
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
-
const db =
|
|
77
|
+
const db = getAppDB();
|
|
79
78
|
const designDoc = yield db.get("_design/database");
|
|
80
79
|
designDoc.indexes = {
|
|
81
80
|
[indexName]: {
|
|
@@ -86,8 +85,8 @@ function searchIndex(appId, indexName, fnString) {
|
|
|
86
85
|
yield db.put(designDoc);
|
|
87
86
|
});
|
|
88
87
|
}
|
|
89
|
-
exports.createAllSearchIndex = (
|
|
90
|
-
yield searchIndex(
|
|
88
|
+
exports.createAllSearchIndex = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
89
|
+
yield searchIndex(SearchIndexes.ROWS, function (doc) {
|
|
91
90
|
function idx(input, prev) {
|
|
92
91
|
for (let key of Object.keys(input)) {
|
|
93
92
|
let idxKey = prev != null ? `${prev}.${key}` : key;
|
package/dist/environment.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
function isTest() {
|
|
3
3
|
return (process.env.NODE_ENV === "jest" ||
|
|
4
4
|
process.env.NODE_ENV === "cypress" ||
|
|
5
|
-
process.env.JEST_WORKER_ID != null
|
|
5
|
+
(process.env.JEST_WORKER_ID != null &&
|
|
6
|
+
process.env.JEST_WORKER_ID !== "null"));
|
|
6
7
|
}
|
|
7
8
|
function isDev() {
|
|
8
9
|
return (process.env.NODE_ENV !== "production" &&
|
|
@@ -35,6 +36,7 @@ module.exports = {
|
|
|
35
36
|
REDIS_PASSWORD: process.env.REDIS_PASSWORD,
|
|
36
37
|
INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
|
|
37
38
|
MULTI_TENANCY: process.env.MULTI_TENANCY,
|
|
39
|
+
HTTP_MIGRATIONS: process.env.HTTP_MIGRATIONS,
|
|
38
40
|
// environment
|
|
39
41
|
NODE_ENV: process.env.NODE_ENV,
|
|
40
42
|
JEST_WORKER_ID: process.env.JEST_WORKER_ID,
|
|
@@ -177,20 +177,55 @@ class InternalBuilder {
|
|
|
177
177
|
if (!relationships) {
|
|
178
178
|
return query;
|
|
179
179
|
}
|
|
180
|
+
const tableSets = {};
|
|
181
|
+
// aggregate into table sets (all the same to tables)
|
|
180
182
|
for (let relationship of relationships) {
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
+
const keyObj = {
|
|
184
|
+
toTable: relationship.tableName,
|
|
185
|
+
throughTable: undefined,
|
|
186
|
+
};
|
|
187
|
+
if (relationship.through) {
|
|
188
|
+
keyObj.throughTable = relationship.through;
|
|
189
|
+
}
|
|
190
|
+
const key = JSON.stringify(keyObj);
|
|
191
|
+
if (tableSets[key]) {
|
|
192
|
+
tableSets[key].push(relationship);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
tableSets[key] = [relationship];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
for (let [key, relationships] of Object.entries(tableSets)) {
|
|
199
|
+
const { toTable, throughTable } = JSON.parse(key);
|
|
200
|
+
if (!throughTable) {
|
|
183
201
|
// @ts-ignore
|
|
184
|
-
query = query.
|
|
202
|
+
query = query.join(toTable, function () {
|
|
203
|
+
for (let relationship of relationships) {
|
|
204
|
+
const from = relationship.from, to = relationship.to;
|
|
205
|
+
// @ts-ignore
|
|
206
|
+
this.orOn(`${fromTable}.${from}`, "=", `${toTable}.${to}`);
|
|
207
|
+
}
|
|
208
|
+
}, "left");
|
|
185
209
|
}
|
|
186
210
|
else {
|
|
187
|
-
const throughTable = relationship.through;
|
|
188
|
-
const fromPrimary = relationship.fromPrimary;
|
|
189
|
-
const toPrimary = relationship.toPrimary;
|
|
190
211
|
query = query
|
|
191
212
|
// @ts-ignore
|
|
192
|
-
.
|
|
193
|
-
|
|
213
|
+
.join(throughTable, function () {
|
|
214
|
+
for (let relationship of relationships) {
|
|
215
|
+
const fromPrimary = relationship.fromPrimary;
|
|
216
|
+
const from = relationship.from;
|
|
217
|
+
// @ts-ignore
|
|
218
|
+
this.orOn(`${fromTable}.${fromPrimary}`, "=", `${throughTable}.${from}`);
|
|
219
|
+
}
|
|
220
|
+
}, "left")
|
|
221
|
+
.join(toTable, function () {
|
|
222
|
+
for (let relationship of relationships) {
|
|
223
|
+
const toPrimary = relationship.toPrimary;
|
|
224
|
+
const to = relationship.to;
|
|
225
|
+
// @ts-ignore
|
|
226
|
+
this.orOn(`${toTable}.${toPrimary}`, `${throughTable}.${to}`);
|
|
227
|
+
}
|
|
228
|
+
}, "left");
|
|
194
229
|
}
|
|
195
230
|
}
|
|
196
231
|
return query.limit(BASE_LIMIT);
|
|
@@ -52,6 +52,9 @@ function buildExternalTableId(datasourceId, tableName) {
|
|
|
52
52
|
}
|
|
53
53
|
exports.buildExternalTableId = buildExternalTableId;
|
|
54
54
|
function breakExternalTableId(tableId) {
|
|
55
|
+
if (!tableId) {
|
|
56
|
+
return {};
|
|
57
|
+
}
|
|
55
58
|
const parts = tableId.split(DOUBLE_SEPARATOR);
|
|
56
59
|
let tableName = parts.pop();
|
|
57
60
|
// if they need joined
|
|
@@ -13,6 +13,7 @@ const { PermissionTypes, doesHaveBasePermission, } = require("@budibase/backend-
|
|
|
13
13
|
const builderMiddleware = require("./builder");
|
|
14
14
|
const { isWebhookEndpoint } = require("./utils");
|
|
15
15
|
const { buildCsrfMiddleware } = require("@budibase/backend-core/auth");
|
|
16
|
+
const { getAppId } = require("@budibase/backend-core/context");
|
|
16
17
|
function hasResource(ctx) {
|
|
17
18
|
return ctx.resourceId != null;
|
|
18
19
|
}
|
|
@@ -38,7 +39,7 @@ const checkAuthorized = (ctx, resourceRoles, permType, permLevel) => __awaiter(v
|
|
|
38
39
|
const checkAuthorizedResource = (ctx, resourceRoles, permType, permLevel) => __awaiter(void 0, void 0, void 0, function* () {
|
|
39
40
|
// get the user's roles
|
|
40
41
|
const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC;
|
|
41
|
-
const userRoles = yield getUserRoleHierarchy(
|
|
42
|
+
const userRoles = yield getUserRoleHierarchy(roleId, {
|
|
42
43
|
idOnly: false,
|
|
43
44
|
});
|
|
44
45
|
const permError = "User does not have permission";
|
|
@@ -70,8 +71,9 @@ module.exports =
|
|
|
70
71
|
yield builderMiddleware(ctx, permType);
|
|
71
72
|
// get the resource roles
|
|
72
73
|
let resourceRoles = [];
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
const appId = getAppId();
|
|
75
|
+
if (appId && hasResource(ctx)) {
|
|
76
|
+
resourceRoles = yield getRequiredResourceRole(permLevel, ctx);
|
|
75
77
|
}
|
|
76
78
|
// if the resource is public, proceed
|
|
77
79
|
const isPublicResource = resourceRoles.includes(BUILTIN_ROLE_IDS.PUBLIC);
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
const { APP_DEV_PREFIX } = require("../db/utils");
|
|
12
12
|
const { doesUserHaveLock, updateLock, checkDebounce, setDebounce, } = require("../utilities/redis");
|
|
13
|
-
const
|
|
13
|
+
const { getDB } = require("@budibase/backend-core/db");
|
|
14
14
|
const { DocumentTypes } = require("../db/utils");
|
|
15
15
|
const { PermissionTypes } = require("@budibase/backend-core/permissions");
|
|
16
16
|
const { app: appCache } = require("@budibase/backend-core/cache");
|
|
@@ -49,7 +49,7 @@ function updateAppUpdatedAt(ctx) {
|
|
|
49
49
|
if (ctx.method === "GET" || (yield checkDebounce(appId))) {
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
const db =
|
|
52
|
+
const db = getDB(appId);
|
|
53
53
|
const metadata = yield db.get(DocumentTypes.APP_METADATA);
|
|
54
54
|
metadata.updatedAt = new Date().toISOString();
|
|
55
55
|
const response = yield db.put(metadata);
|
|
@@ -16,9 +16,9 @@ const { generateUserMetadataID, isDevAppID } = require("../db/utils");
|
|
|
16
16
|
const { dbExists } = require("@budibase/backend-core/db");
|
|
17
17
|
const { isUserInAppTenant } = require("@budibase/backend-core/tenancy");
|
|
18
18
|
const { getCachedSelf } = require("../utilities/global");
|
|
19
|
-
const CouchDB = require("../db");
|
|
20
19
|
const env = require("../environment");
|
|
21
20
|
const { isWebhookEndpoint } = require("./utils");
|
|
21
|
+
const { doInAppContext } = require("@budibase/backend-core/context");
|
|
22
22
|
module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
23
|
// try to get the appID from the request
|
|
24
24
|
let requestAppId = getAppId(ctx);
|
|
@@ -36,7 +36,7 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
36
36
|
// check the app exists referenced in cookie
|
|
37
37
|
if (appCookie) {
|
|
38
38
|
const appId = appCookie.appId;
|
|
39
|
-
const exists = yield dbExists(
|
|
39
|
+
const exists = yield dbExists(appId);
|
|
40
40
|
if (!exists) {
|
|
41
41
|
clearCookie(ctx, Cookies.CurrentApp);
|
|
42
42
|
return next();
|
|
@@ -45,11 +45,13 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
45
45
|
requestAppId = requestAppId || appId;
|
|
46
46
|
}
|
|
47
47
|
// deny access to application preview
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
if (!env.isTest()) {
|
|
49
|
+
if (isDevAppID(requestAppId) &&
|
|
50
|
+
!isWebhookEndpoint(ctx) &&
|
|
51
|
+
(!ctx.user || !ctx.user.builder || !ctx.user.builder.global)) {
|
|
52
|
+
clearCookie(ctx, Cookies.CurrentApp);
|
|
53
|
+
return ctx.redirect("/");
|
|
54
|
+
}
|
|
53
55
|
}
|
|
54
56
|
let appId, roleId = BUILTIN_ROLE_IDS.PUBLIC;
|
|
55
57
|
if (!ctx.user) {
|
|
@@ -67,34 +69,36 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
67
69
|
if (!appId) {
|
|
68
70
|
return next();
|
|
69
71
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
72
|
+
return doInAppContext(appId, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
73
|
+
let noCookieSet = false;
|
|
74
|
+
// if the user not in the right tenant then make sure they have no permissions
|
|
75
|
+
// need to judge this only based on the request app ID,
|
|
76
|
+
if (env.MULTI_TENANCY &&
|
|
77
|
+
ctx.user &&
|
|
78
|
+
requestAppId &&
|
|
79
|
+
!isUserInAppTenant(requestAppId)) {
|
|
80
|
+
// don't error, simply remove the users rights (they are a public user)
|
|
81
|
+
delete ctx.user.builder;
|
|
82
|
+
delete ctx.user.admin;
|
|
83
|
+
delete ctx.user.roles;
|
|
84
|
+
roleId = BUILTIN_ROLE_IDS.PUBLIC;
|
|
85
|
+
noCookieSet = true;
|
|
86
|
+
}
|
|
87
|
+
ctx.appId = appId;
|
|
88
|
+
if (roleId) {
|
|
89
|
+
ctx.roleId = roleId;
|
|
90
|
+
const userId = ctx.user ? generateUserMetadataID(ctx.user._id) : null;
|
|
91
|
+
ctx.user = Object.assign(Object.assign({}, ctx.user), {
|
|
92
|
+
// override userID with metadata one
|
|
93
|
+
_id: userId, userId,
|
|
94
|
+
roleId, role: yield getRole(roleId) });
|
|
95
|
+
}
|
|
96
|
+
if ((requestAppId !== appId ||
|
|
97
|
+
appCookie == null ||
|
|
98
|
+
appCookie.appId !== requestAppId) &&
|
|
99
|
+
!noCookieSet) {
|
|
100
|
+
setCookie(ctx, { appId }, Cookies.CurrentApp);
|
|
101
|
+
}
|
|
102
|
+
return next();
|
|
103
|
+
}));
|
|
100
104
|
});
|
|
@@ -8,11 +8,10 @@ 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 usageQuota = require("../utilities/usageQuota");
|
|
13
12
|
const { getUniqueRows } = require("../utilities/usageQuota/rows");
|
|
14
13
|
const { isExternalTable, isRowId: isExternalRowId, } = require("../integrations/utils");
|
|
15
|
-
const
|
|
14
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
16
15
|
// currently only counting new writes and deletes
|
|
17
16
|
const METHOD_MAP = {
|
|
18
17
|
POST: 1,
|
|
@@ -49,7 +48,7 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
49
48
|
const usageId = ctx.request.body._id;
|
|
50
49
|
try {
|
|
51
50
|
if (ctx.appId) {
|
|
52
|
-
const db =
|
|
51
|
+
const db = getAppDB();
|
|
53
52
|
yield db.get(usageId);
|
|
54
53
|
}
|
|
55
54
|
return next();
|
|
@@ -74,7 +73,6 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
74
73
|
usage = files.map(file => file.size).reduce((total, size) => total + size);
|
|
75
74
|
}
|
|
76
75
|
try {
|
|
77
|
-
yield migration.run();
|
|
78
76
|
yield performRequest(ctx, next, property, usage);
|
|
79
77
|
}
|
|
80
78
|
catch (err) {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.run = void 0;
|
|
13
|
+
const { DocumentTypes } = require("@budibase/backend-core/db");
|
|
14
|
+
const application_1 = require("../../api/controllers/application");
|
|
15
|
+
/**
|
|
16
|
+
* Date:
|
|
17
|
+
* January 2022
|
|
18
|
+
*
|
|
19
|
+
* Description:
|
|
20
|
+
* Add the url to the app metadata if it doesn't exist
|
|
21
|
+
*/
|
|
22
|
+
const run = (appDb) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
+
let metadata;
|
|
24
|
+
try {
|
|
25
|
+
metadata = yield appDb.get(DocumentTypes.APP_METADATA);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
// sometimes the metadata document doesn't exist
|
|
29
|
+
// exit early instead of failing the migration
|
|
30
|
+
console.error("Error retrieving app metadata. Skipping", e);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!metadata.url) {
|
|
34
|
+
const context = {
|
|
35
|
+
request: {
|
|
36
|
+
body: {
|
|
37
|
+
name: metadata.name,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
metadata.url = application_1.getAppUrl(context);
|
|
42
|
+
console.log(`Adding url to app: ${metadata.url}`);
|
|
43
|
+
yield appDb.put(metadata);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
exports.run = run;
|