@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,20 +8,18 @@ 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 { getScreenParams, generateScreenID } = require("../../db/utils");
|
|
13
12
|
const { AccessController } = require("@budibase/backend-core/roles");
|
|
13
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
14
14
|
exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
-
const
|
|
16
|
-
const db = new CouchDB(appId);
|
|
15
|
+
const db = getAppDB();
|
|
17
16
|
const screens = (yield db.allDocs(getScreenParams(null, {
|
|
18
17
|
include_docs: true,
|
|
19
18
|
}))).rows.map(element => element.doc);
|
|
20
|
-
ctx.body = yield new AccessController(
|
|
19
|
+
ctx.body = yield new AccessController().checkScreensAccess(screens, ctx.user.role._id);
|
|
21
20
|
});
|
|
22
21
|
exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
-
const
|
|
24
|
-
const db = new CouchDB(appId);
|
|
22
|
+
const db = getAppDB();
|
|
25
23
|
let screen = ctx.request.body;
|
|
26
24
|
if (!screen._id) {
|
|
27
25
|
screen._id = generateScreenID();
|
|
@@ -31,7 +29,7 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
31
29
|
ctx.body = Object.assign(Object.assign({}, screen), { _id: response.id, _rev: response.rev });
|
|
32
30
|
});
|
|
33
31
|
exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
-
const db =
|
|
32
|
+
const db = getAppDB();
|
|
35
33
|
yield db.remove(ctx.params.screenId, ctx.params.screenRev);
|
|
36
34
|
ctx.body = {
|
|
37
35
|
message: "Screen deleted successfully",
|
|
@@ -15,13 +15,13 @@ const uuid = require("uuid");
|
|
|
15
15
|
const { ObjectStoreBuckets } = require("../../../constants");
|
|
16
16
|
const { processString } = require("@budibase/string-templates");
|
|
17
17
|
const { getAllApps } = require("@budibase/backend-core/db");
|
|
18
|
-
const CouchDB = require("../../../db");
|
|
19
18
|
const { loadHandlebarsFile, NODE_MODULES_PATH, TOP_LEVEL_PATH, } = require("../../../utilities/fileSystem");
|
|
20
19
|
const env = require("../../../environment");
|
|
21
20
|
const { clientLibraryPath } = require("../../../utilities");
|
|
22
21
|
const { upload } = require("../../../utilities/fileSystem");
|
|
23
22
|
const { attachmentsRelativeURL } = require("../../../utilities");
|
|
24
23
|
const { DocumentTypes } = require("../../../db/utils");
|
|
24
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
25
25
|
const AWS = require("aws-sdk");
|
|
26
26
|
const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1";
|
|
27
27
|
function prepareUpload({ s3Key, bucket, metadata, file }) {
|
|
@@ -48,7 +48,7 @@ function getAppIdFromUrl(ctx) {
|
|
|
48
48
|
// the "appId" component of the URL can be the id or the custom url
|
|
49
49
|
let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`;
|
|
50
50
|
// search prod apps for a url that matches, exclude dev where id is always used
|
|
51
|
-
const apps = yield getAllApps(
|
|
51
|
+
const apps = yield getAllApps({ dev: false });
|
|
52
52
|
const app = apps.filter(a => a.url && a.url.toLowerCase() === possibleAppUrl)[0];
|
|
53
53
|
if (app && app.appId) {
|
|
54
54
|
return app.appId;
|
|
@@ -86,7 +86,7 @@ exports.serveApp = function (ctx) {
|
|
|
86
86
|
return __awaiter(this, void 0, void 0, function* () {
|
|
87
87
|
let appId = yield getAppIdFromUrl(ctx);
|
|
88
88
|
const App = require("./templates/BudibaseApp.svelte").default;
|
|
89
|
-
const db =
|
|
89
|
+
const db = getAppDB({ skip_setup: true });
|
|
90
90
|
const appInfo = yield db.get(DocumentTypes.APP_METADATA);
|
|
91
91
|
const { head, html, css } = App.render({
|
|
92
92
|
title: appInfo.name,
|
|
@@ -113,7 +113,7 @@ exports.serveClientLibrary = function (ctx) {
|
|
|
113
113
|
exports.getSignedUploadURL = function (ctx) {
|
|
114
114
|
var _a, _b, _c;
|
|
115
115
|
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
const database =
|
|
116
|
+
const database = getAppDB();
|
|
117
117
|
// Ensure datasource is valid
|
|
118
118
|
let datasource;
|
|
119
119
|
try {
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
const { FieldTypes, FormulaTypes } = require("../../../constants");
|
|
12
|
+
const { getAllInternalTables, clearColumns } = require("./utils");
|
|
13
|
+
const { doesContainStrings } = require("@budibase/string-templates");
|
|
14
|
+
const { cloneDeep } = require("lodash/fp");
|
|
15
|
+
const { isEqual, uniq } = require("lodash");
|
|
16
|
+
const { updateAllFormulasInTable } = require("../row/staticFormula");
|
|
17
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
18
|
+
function isStaticFormula(column) {
|
|
19
|
+
return (column.type === FieldTypes.FORMULA &&
|
|
20
|
+
column.formulaType === FormulaTypes.STATIC);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* This retrieves the formula columns from a table schema that use a specified column name
|
|
24
|
+
* in the formula.
|
|
25
|
+
*/
|
|
26
|
+
function getFormulaThatUseColumn(table, columnNames) {
|
|
27
|
+
let formula = [];
|
|
28
|
+
columnNames = Array.isArray(columnNames) ? columnNames : [columnNames];
|
|
29
|
+
for (let column of Object.values(table.schema)) {
|
|
30
|
+
// not a static formula, or doesn't contain a relationship
|
|
31
|
+
if (!isStaticFormula(column)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (!doesContainStrings(column.formula, columnNames)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
formula.push(column.name);
|
|
38
|
+
}
|
|
39
|
+
return formula;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* This functions checks for when a related table, column or related column is deleted, if any
|
|
43
|
+
* tables need to have the formula column removed.
|
|
44
|
+
*/
|
|
45
|
+
function checkIfFormulaNeedsCleared(table, { oldTable, deletion }) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
// start by retrieving all tables, remove the current table from the list
|
|
48
|
+
const tables = (yield getAllInternalTables()).filter(tbl => tbl._id !== table._id);
|
|
49
|
+
const schemaToUse = oldTable ? oldTable.schema : table.schema;
|
|
50
|
+
let removedColumns = Object.values(schemaToUse).filter(column => deletion || !table.schema[column.name]);
|
|
51
|
+
// remove any formula columns that used related columns
|
|
52
|
+
for (let removed of removedColumns) {
|
|
53
|
+
let tableToUse = table;
|
|
54
|
+
// if relationship, get the related table
|
|
55
|
+
if (removed.type === FieldTypes.LINK) {
|
|
56
|
+
tableToUse = tables.find(table => table._id === removed.tableId);
|
|
57
|
+
}
|
|
58
|
+
const columnsToDelete = getFormulaThatUseColumn(tableToUse, removed.name);
|
|
59
|
+
if (columnsToDelete.length > 0) {
|
|
60
|
+
yield clearColumns(table, columnsToDelete);
|
|
61
|
+
}
|
|
62
|
+
// need a special case, where a column has been removed from this table, but was used
|
|
63
|
+
// in a different, related tables formula
|
|
64
|
+
if (!table.relatedFormula) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
for (let relatedTableId of table.relatedFormula) {
|
|
68
|
+
const relatedColumns = Object.values(table.schema).filter(column => column.tableId === relatedTableId);
|
|
69
|
+
const relatedTable = tables.find(table => table._id === relatedTableId);
|
|
70
|
+
// look to see if the column was used in a relationship formula,
|
|
71
|
+
// relationships won't be used for this
|
|
72
|
+
if (relatedTable && relatedColumns && removed.type !== FieldTypes.LINK) {
|
|
73
|
+
let relatedFormulaToRemove = [];
|
|
74
|
+
for (let column of relatedColumns) {
|
|
75
|
+
relatedFormulaToRemove = relatedFormulaToRemove.concat(getFormulaThatUseColumn(relatedTable, [
|
|
76
|
+
column.fieldName,
|
|
77
|
+
removed.name,
|
|
78
|
+
]));
|
|
79
|
+
}
|
|
80
|
+
if (relatedFormulaToRemove.length > 0) {
|
|
81
|
+
yield clearColumns(relatedTable, uniq(relatedFormulaToRemove));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* This function adds a note to related tables that they are
|
|
90
|
+
* used in a static formula - so that the link controller
|
|
91
|
+
* can manage hydrating related rows formula fields. This is
|
|
92
|
+
* specifically only for static formula.
|
|
93
|
+
*/
|
|
94
|
+
function updateRelatedFormulaLinksOnTables(table, { deletion } = { deletion: false }) {
|
|
95
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
+
const db = getAppDB();
|
|
97
|
+
// start by retrieving all tables, remove the current table from the list
|
|
98
|
+
const tables = (yield getAllInternalTables()).filter(tbl => tbl._id !== table._id);
|
|
99
|
+
// clone the tables, so we can compare at end
|
|
100
|
+
const initialTables = cloneDeep(tables);
|
|
101
|
+
// first find the related column names
|
|
102
|
+
const relatedColumns = Object.values(table.schema).filter(col => col.type === FieldTypes.LINK);
|
|
103
|
+
// we start by removing the formula field from all tables
|
|
104
|
+
for (let otherTable of tables) {
|
|
105
|
+
if (!otherTable.relatedFormula) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const index = otherTable.relatedFormula.indexOf(table._id);
|
|
109
|
+
if (index !== -1) {
|
|
110
|
+
otherTable.relatedFormula.splice(index, 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// if deleting, just remove the table IDs, don't try add
|
|
114
|
+
if (!deletion) {
|
|
115
|
+
for (let relatedCol of relatedColumns) {
|
|
116
|
+
let columns = getFormulaThatUseColumn(table, relatedCol.name);
|
|
117
|
+
if (!columns || columns.length === 0) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const relatedTable = tables.find(related => related._id === relatedCol.tableId);
|
|
121
|
+
// check if the table is already in the list of related formula, if it isn't, then add it
|
|
122
|
+
if (relatedTable &&
|
|
123
|
+
(!relatedTable.relatedFormula ||
|
|
124
|
+
!relatedTable.relatedFormula.includes(table._id))) {
|
|
125
|
+
relatedTable.relatedFormula = relatedTable.relatedFormula
|
|
126
|
+
? [...relatedTable.relatedFormula, table._id]
|
|
127
|
+
: [table._id];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// now we just need to compare all the tables and see if any need saved
|
|
132
|
+
for (let initial of initialTables) {
|
|
133
|
+
const found = tables.find(tbl => initial._id === tbl._id);
|
|
134
|
+
if (found && !isEqual(initial, found)) {
|
|
135
|
+
yield db.put(found);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function checkIfFormulaUpdated(table, { oldTable }) {
|
|
141
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
+
// look to see if any formula values have changed
|
|
143
|
+
const shouldUpdate = Object.values(table.schema).find(column => isStaticFormula(column) &&
|
|
144
|
+
(!oldTable ||
|
|
145
|
+
!oldTable.schema[column.name] ||
|
|
146
|
+
!isEqual(oldTable.schema[column.name], column)));
|
|
147
|
+
// if a static formula column has updated, then need to run the update
|
|
148
|
+
if (shouldUpdate != null) {
|
|
149
|
+
yield updateAllFormulasInTable(table);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
exports.runStaticFormulaChecks = (table, { oldTable, deletion }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
154
|
+
yield updateRelatedFormulaLinksOnTables(table, { deletion });
|
|
155
|
+
yield checkIfFormulaNeedsCleared(table, { oldTable, deletion });
|
|
156
|
+
if (!deletion) {
|
|
157
|
+
yield checkIfFormulaUpdated(table, { oldTable });
|
|
158
|
+
}
|
|
159
|
+
});
|
|
@@ -8,7 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const CouchDB = require("../../../db");
|
|
12
11
|
const { buildExternalTableId, breakExternalTableId, } = require("../../../integrations/utils");
|
|
13
12
|
const { getTable, generateForeignKey, generateJunctionTableName, foreignKeyStructure, hasTypeChanged, } = require("./utils");
|
|
14
13
|
const { DataSourceOperation, FieldTypes, RelationshipTypes, } = require("../../../constants");
|
|
@@ -16,6 +15,7 @@ const { makeExternalQuery } = require("../../../integrations/base/utils");
|
|
|
16
15
|
const { cloneDeep } = require("lodash/fp");
|
|
17
16
|
const csvParser = require("../../../utilities/csvParser");
|
|
18
17
|
const { handleRequest } = require("../row/external");
|
|
18
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
19
19
|
function makeTableRequest(datasource, operation, table, tables, oldTable = null) {
|
|
20
20
|
return __awaiter(this, void 0, void 0, function* () {
|
|
21
21
|
const json = {
|
|
@@ -134,7 +134,6 @@ function isRelationshipSetup(column) {
|
|
|
134
134
|
}
|
|
135
135
|
exports.save = function (ctx) {
|
|
136
136
|
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
-
const appId = ctx.appId;
|
|
138
137
|
const table = ctx.request.body;
|
|
139
138
|
// can't do this right now
|
|
140
139
|
delete table.dataImport;
|
|
@@ -146,12 +145,12 @@ exports.save = function (ctx) {
|
|
|
146
145
|
let tableToSave = Object.assign({ type: "table", _id: buildExternalTableId(datasourceId, table.name) }, table);
|
|
147
146
|
let oldTable;
|
|
148
147
|
if (ctx.request.body && ctx.request.body._id) {
|
|
149
|
-
oldTable = yield getTable(
|
|
148
|
+
oldTable = yield getTable(ctx.request.body._id);
|
|
150
149
|
}
|
|
151
150
|
if (hasTypeChanged(tableToSave, oldTable)) {
|
|
152
151
|
ctx.throw(400, "A column type has changed.");
|
|
153
152
|
}
|
|
154
|
-
const db =
|
|
153
|
+
const db = getAppDB();
|
|
155
154
|
const datasource = yield db.get(datasourceId);
|
|
156
155
|
const oldTables = cloneDeep(datasource.entities);
|
|
157
156
|
const tables = datasource.entities;
|
|
@@ -215,13 +214,12 @@ exports.save = function (ctx) {
|
|
|
215
214
|
};
|
|
216
215
|
exports.destroy = function (ctx) {
|
|
217
216
|
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
-
const
|
|
219
|
-
const tableToDelete = yield getTable(appId, ctx.params.tableId);
|
|
217
|
+
const tableToDelete = yield getTable(ctx.params.tableId);
|
|
220
218
|
if (!tableToDelete || !tableToDelete.created) {
|
|
221
219
|
ctx.throw(400, "Cannot delete tables which weren't created in Budibase.");
|
|
222
220
|
}
|
|
223
221
|
const datasourceId = getDatasourceId(tableToDelete);
|
|
224
|
-
const db =
|
|
222
|
+
const db = getAppDB();
|
|
225
223
|
const datasource = yield db.get(datasourceId);
|
|
226
224
|
const tables = datasource.entities;
|
|
227
225
|
const operation = DataSourceOperation.DELETE_TABLE;
|
|
@@ -234,14 +232,13 @@ exports.destroy = function (ctx) {
|
|
|
234
232
|
};
|
|
235
233
|
exports.bulkImport = function (ctx) {
|
|
236
234
|
return __awaiter(this, void 0, void 0, function* () {
|
|
237
|
-
const
|
|
238
|
-
const table = yield getTable(appId, ctx.params.tableId);
|
|
235
|
+
const table = yield getTable(ctx.params.tableId);
|
|
239
236
|
const { dataImport } = ctx.request.body;
|
|
240
237
|
if (!dataImport || !dataImport.schema || !dataImport.csvString) {
|
|
241
238
|
ctx.throw(400, "Provided data import information is invalid.");
|
|
242
239
|
}
|
|
243
240
|
const rows = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
|
|
244
|
-
yield handleRequest(
|
|
241
|
+
yield handleRequest(DataSourceOperation.BULK_CREATE, table._id, {
|
|
245
242
|
rows,
|
|
246
243
|
});
|
|
247
244
|
return table;
|
|
@@ -8,13 +8,13 @@ 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 internal = require("./internal");
|
|
13
12
|
const external = require("./external");
|
|
14
13
|
const csvParser = require("../../../utilities/csvParser");
|
|
15
14
|
const { isExternalTable, isSQL } = require("../../../integrations/utils");
|
|
16
|
-
const {
|
|
17
|
-
const {
|
|
15
|
+
const { getDatasourceParams } = require("../../../db/utils");
|
|
16
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
17
|
+
const { getTable, getAllInternalTables } = require("./utils");
|
|
18
18
|
function pickApi({ tableId, table }) {
|
|
19
19
|
if (table && !tableId) {
|
|
20
20
|
tableId = table._id;
|
|
@@ -30,11 +30,8 @@ function pickApi({ tableId, table }) {
|
|
|
30
30
|
// covers both internal and external
|
|
31
31
|
exports.fetch = function (ctx) {
|
|
32
32
|
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
-
const db =
|
|
34
|
-
const
|
|
35
|
-
include_docs: true,
|
|
36
|
-
}));
|
|
37
|
-
const internal = internalTables.rows.map(tableDoc => (Object.assign(Object.assign({}, tableDoc.doc), { type: "internal", sourceId: BudibaseInternalDB._id })));
|
|
33
|
+
const db = getAppDB();
|
|
34
|
+
const internal = yield getAllInternalTables();
|
|
38
35
|
const externalTables = yield db.allDocs(getDatasourceParams("plus", {
|
|
39
36
|
include_docs: true,
|
|
40
37
|
}));
|
|
@@ -53,7 +50,7 @@ exports.fetch = function (ctx) {
|
|
|
53
50
|
exports.find = function (ctx) {
|
|
54
51
|
return __awaiter(this, void 0, void 0, function* () {
|
|
55
52
|
const tableId = ctx.params.id;
|
|
56
|
-
ctx.body = yield getTable(
|
|
53
|
+
ctx.body = yield getTable(tableId);
|
|
57
54
|
});
|
|
58
55
|
};
|
|
59
56
|
exports.save = function (ctx) {
|
|
@@ -96,7 +93,7 @@ exports.validateCSVSchema = function (ctx) {
|
|
|
96
93
|
const { csvString, schema = {}, tableId } = ctx.request.body;
|
|
97
94
|
let existingTable;
|
|
98
95
|
if (tableId) {
|
|
99
|
-
existingTable = yield getTable(
|
|
96
|
+
existingTable = yield getTable(tableId);
|
|
100
97
|
}
|
|
101
98
|
let result = yield csvParser.parse(csvString, schema);
|
|
102
99
|
if (existingTable) {
|
|
@@ -19,16 +19,18 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
19
19
|
}
|
|
20
20
|
return t;
|
|
21
21
|
};
|
|
22
|
-
const CouchDB = require("../../../db");
|
|
23
22
|
const linkRows = require("../../../db/linkedRows");
|
|
24
23
|
const { getRowParams, generateTableID } = require("../../../db/utils");
|
|
25
24
|
const { FieldTypes } = require("../../../constants");
|
|
26
25
|
const { TableSaveFunctions, hasTypeChanged, getTable, handleDataImport, } = require("./utils");
|
|
27
26
|
const usageQuota = require("../../../utilities/usageQuota");
|
|
27
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
28
|
+
const env = require("../../../environment");
|
|
29
|
+
const { cleanupAttachments } = require("../../../utilities/rowProcessor");
|
|
30
|
+
const { runStaticFormulaChecks } = require("./bulkFormula");
|
|
28
31
|
exports.save = function (ctx) {
|
|
29
32
|
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
const
|
|
31
|
-
const db = new CouchDB(appId);
|
|
33
|
+
const db = getAppDB();
|
|
32
34
|
const _a = ctx.request.body, { dataImport } = _a, rest = __rest(_a, ["dataImport"]);
|
|
33
35
|
let tableToSave = Object.assign({ type: "table", _id: generateTableID(), views: {} }, rest);
|
|
34
36
|
// if the table obj had an _id then it will have been retrieved
|
|
@@ -42,8 +44,7 @@ exports.save = function (ctx) {
|
|
|
42
44
|
// saving a table is a complex operation, involving many different steps, this
|
|
43
45
|
// has been broken out into a utility to make it more obvious/easier to manipulate
|
|
44
46
|
const tableSaveFunctions = new TableSaveFunctions({
|
|
45
|
-
|
|
46
|
-
ctx,
|
|
47
|
+
user: ctx.user,
|
|
47
48
|
oldTable,
|
|
48
49
|
dataImport,
|
|
49
50
|
});
|
|
@@ -83,7 +84,6 @@ exports.save = function (ctx) {
|
|
|
83
84
|
// update linked rows
|
|
84
85
|
try {
|
|
85
86
|
const linkResp = yield linkRows.updateLinks({
|
|
86
|
-
appId,
|
|
87
87
|
eventType: oldTable
|
|
88
88
|
? linkRows.EventType.TABLE_UPDATED
|
|
89
89
|
: linkRows.EventType.TABLE_SAVE,
|
|
@@ -106,13 +106,14 @@ exports.save = function (ctx) {
|
|
|
106
106
|
const result = yield db.put(tableToSave);
|
|
107
107
|
tableToSave._rev = result.rev;
|
|
108
108
|
tableToSave = yield tableSaveFunctions.after(tableToSave);
|
|
109
|
+
// has to run after, make sure it has _id
|
|
110
|
+
yield runStaticFormulaChecks(tableToSave, { oldTable });
|
|
109
111
|
return tableToSave;
|
|
110
112
|
});
|
|
111
113
|
};
|
|
112
114
|
exports.destroy = function (ctx) {
|
|
113
115
|
return __awaiter(this, void 0, void 0, function* () {
|
|
114
|
-
const
|
|
115
|
-
const db = new CouchDB(appId);
|
|
116
|
+
const db = getAppDB();
|
|
116
117
|
const tableToDelete = yield db.get(ctx.params.tableId);
|
|
117
118
|
// Delete all rows for that table
|
|
118
119
|
const rows = yield db.allDocs(getRowParams(ctx.params.tableId, null, {
|
|
@@ -122,27 +123,30 @@ exports.destroy = function (ctx) {
|
|
|
122
123
|
yield usageQuota.update(usageQuota.Properties.ROW, -rows.rows.length);
|
|
123
124
|
// update linked rows
|
|
124
125
|
yield linkRows.updateLinks({
|
|
125
|
-
appId,
|
|
126
126
|
eventType: linkRows.EventType.TABLE_DELETE,
|
|
127
127
|
table: tableToDelete,
|
|
128
128
|
});
|
|
129
129
|
// don't remove the table itself until very end
|
|
130
130
|
yield db.remove(tableToDelete);
|
|
131
131
|
// remove table search index
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
if (!env.isTest()) {
|
|
133
|
+
const currentIndexes = yield db.getIndexes();
|
|
134
|
+
const existingIndex = currentIndexes.indexes.find(existing => existing.name === `search:${ctx.params.tableId}`);
|
|
135
|
+
if (existingIndex) {
|
|
136
|
+
yield db.deleteIndex(existingIndex);
|
|
137
|
+
}
|
|
136
138
|
}
|
|
139
|
+
// has to run after, make sure it has _id
|
|
140
|
+
yield runStaticFormulaChecks(tableToDelete, { deletion: true });
|
|
141
|
+
yield cleanupAttachments(tableToDelete, { rows });
|
|
137
142
|
return tableToDelete;
|
|
138
143
|
});
|
|
139
144
|
};
|
|
140
145
|
exports.bulkImport = function (ctx) {
|
|
141
146
|
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
-
const
|
|
143
|
-
const table = yield getTable(appId, ctx.params.tableId);
|
|
147
|
+
const table = yield getTable(ctx.params.tableId);
|
|
144
148
|
const { dataImport } = ctx.request.body;
|
|
145
|
-
yield handleDataImport(
|
|
149
|
+
yield handleDataImport(ctx.user, table, dataImport);
|
|
146
150
|
return table;
|
|
147
151
|
});
|
|
148
152
|
};
|
|
@@ -8,18 +8,30 @@ 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 csvParser = require("../../../utilities/csvParser");
|
|
13
|
-
const { getRowParams, generateRowID, InternalTables, } = require("../../../db/utils");
|
|
14
|
-
const { isEqual } = require("lodash
|
|
12
|
+
const { getRowParams, generateRowID, InternalTables, getTableParams, BudibaseInternalDB, } = require("../../../db/utils");
|
|
13
|
+
const { isEqual } = require("lodash");
|
|
15
14
|
const { AutoFieldSubTypes, FieldTypes } = require("../../../constants");
|
|
16
|
-
const { inputProcessing } = require("../../../utilities/rowProcessor");
|
|
15
|
+
const { inputProcessing, cleanupAttachments, } = require("../../../utilities/rowProcessor");
|
|
17
16
|
const { USERS_TABLE_SCHEMA, SwitchableTypes, CanSwitchTypes, } = require("../../../constants");
|
|
18
17
|
const { isExternalTable, breakExternalTableId, isSQL, } = require("../../../integrations/utils");
|
|
19
18
|
const { getViews, saveView } = require("../view/utils");
|
|
20
19
|
const viewTemplate = require("../view/viewBuilder");
|
|
21
20
|
const usageQuota = require("../../../utilities/usageQuota");
|
|
22
|
-
|
|
21
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
22
|
+
const { cloneDeep } = require("lodash/fp");
|
|
23
|
+
exports.clearColumns = (table, columnNames) => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
const db = getAppDB();
|
|
25
|
+
const rows = yield db.allDocs(getRowParams(table._id, null, {
|
|
26
|
+
include_docs: true,
|
|
27
|
+
}));
|
|
28
|
+
return db.bulkDocs(rows.rows.map(({ doc }) => {
|
|
29
|
+
columnNames.forEach(colName => delete doc[colName]);
|
|
30
|
+
return doc;
|
|
31
|
+
}));
|
|
32
|
+
});
|
|
33
|
+
exports.checkForColumnUpdates = (oldTable, updatedTable) => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
const db = getAppDB();
|
|
23
35
|
let updatedRows = [];
|
|
24
36
|
const rename = updatedTable._rename;
|
|
25
37
|
let deletedColumns = [];
|
|
@@ -32,18 +44,22 @@ exports.checkForColumnUpdates = (db, oldTable, updatedTable) => __awaiter(void 0
|
|
|
32
44
|
const rows = yield db.allDocs(getRowParams(updatedTable._id, null, {
|
|
33
45
|
include_docs: true,
|
|
34
46
|
}));
|
|
35
|
-
|
|
47
|
+
const rawRows = rows.rows.map(({ doc }) => doc);
|
|
48
|
+
updatedRows = rawRows.map(row => {
|
|
49
|
+
row = cloneDeep(row);
|
|
36
50
|
if (rename) {
|
|
37
|
-
|
|
38
|
-
delete
|
|
51
|
+
row[rename.updated] = row[rename.old];
|
|
52
|
+
delete row[rename.old];
|
|
39
53
|
}
|
|
40
54
|
else if (deletedColumns.length !== 0) {
|
|
41
|
-
deletedColumns.forEach(colName => delete
|
|
55
|
+
deletedColumns.forEach(colName => delete row[colName]);
|
|
42
56
|
}
|
|
43
|
-
return
|
|
57
|
+
return row;
|
|
44
58
|
});
|
|
59
|
+
// cleanup any attachments from object storage for deleted attachment columns
|
|
60
|
+
yield cleanupAttachments(updatedTable, { oldTable, rows: rawRows });
|
|
45
61
|
// Update views
|
|
46
|
-
yield exports.checkForViewUpdates(
|
|
62
|
+
yield exports.checkForViewUpdates(updatedTable, rename, deletedColumns);
|
|
47
63
|
delete updatedTable._rename;
|
|
48
64
|
}
|
|
49
65
|
return { rows: updatedRows, table: updatedTable };
|
|
@@ -66,11 +82,11 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
|
|
|
66
82
|
}
|
|
67
83
|
return tableToSave;
|
|
68
84
|
};
|
|
69
|
-
exports.handleDataImport = (
|
|
85
|
+
exports.handleDataImport = (user, table, dataImport) => __awaiter(void 0, void 0, void 0, function* () {
|
|
70
86
|
if (!dataImport || !dataImport.csvString) {
|
|
71
87
|
return table;
|
|
72
88
|
}
|
|
73
|
-
const db =
|
|
89
|
+
const db = getAppDB();
|
|
74
90
|
// Populate the table with rows imported from CSV in a bulk update
|
|
75
91
|
const data = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
|
|
76
92
|
let finalData = [];
|
|
@@ -105,8 +121,8 @@ exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0,
|
|
|
105
121
|
table._rev = response._rev;
|
|
106
122
|
return table;
|
|
107
123
|
});
|
|
108
|
-
exports.handleSearchIndexes = (
|
|
109
|
-
const db =
|
|
124
|
+
exports.handleSearchIndexes = (table) => __awaiter(void 0, void 0, void 0, function* () {
|
|
125
|
+
const db = getAppDB();
|
|
110
126
|
// create relevant search indexes
|
|
111
127
|
if (table.indexes && table.indexes.length > 0) {
|
|
112
128
|
const currentIndexes = yield db.getIndexes();
|
|
@@ -155,12 +171,9 @@ exports.checkStaticTables = table => {
|
|
|
155
171
|
return table;
|
|
156
172
|
};
|
|
157
173
|
class TableSaveFunctions {
|
|
158
|
-
constructor({
|
|
159
|
-
this.db =
|
|
160
|
-
this.
|
|
161
|
-
if (this.ctx && this.ctx.user) {
|
|
162
|
-
this.appId = this.ctx.appId;
|
|
163
|
-
}
|
|
174
|
+
constructor({ user, oldTable, dataImport }) {
|
|
175
|
+
this.db = getAppDB();
|
|
176
|
+
this.user = user;
|
|
164
177
|
this.oldTable = oldTable;
|
|
165
178
|
this.dataImport = dataImport;
|
|
166
179
|
// any rows that need updated
|
|
@@ -179,7 +192,7 @@ class TableSaveFunctions {
|
|
|
179
192
|
// when confirmed valid
|
|
180
193
|
mid(table) {
|
|
181
194
|
return __awaiter(this, void 0, void 0, function* () {
|
|
182
|
-
let response = yield exports.checkForColumnUpdates(this.
|
|
195
|
+
let response = yield exports.checkForColumnUpdates(this.oldTable, table);
|
|
183
196
|
this.rows = this.rows.concat(response.rows);
|
|
184
197
|
return table;
|
|
185
198
|
});
|
|
@@ -187,8 +200,8 @@ class TableSaveFunctions {
|
|
|
187
200
|
// after saving
|
|
188
201
|
after(table) {
|
|
189
202
|
return __awaiter(this, void 0, void 0, function* () {
|
|
190
|
-
table = yield exports.handleSearchIndexes(
|
|
191
|
-
table = yield exports.handleDataImport(this.
|
|
203
|
+
table = yield exports.handleSearchIndexes(table);
|
|
204
|
+
table = yield exports.handleDataImport(this.user, table, this.dataImport);
|
|
192
205
|
return table;
|
|
193
206
|
});
|
|
194
207
|
}
|
|
@@ -196,32 +209,39 @@ class TableSaveFunctions {
|
|
|
196
209
|
return this.rows;
|
|
197
210
|
}
|
|
198
211
|
}
|
|
199
|
-
exports.
|
|
200
|
-
const db =
|
|
212
|
+
exports.getAllInternalTables = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
213
|
+
const db = getAppDB();
|
|
214
|
+
const internalTables = yield db.allDocs(getTableParams(null, {
|
|
215
|
+
include_docs: true,
|
|
216
|
+
}));
|
|
217
|
+
return internalTables.rows.map(tableDoc => (Object.assign(Object.assign({}, tableDoc.doc), { type: "internal", sourceId: BudibaseInternalDB._id })));
|
|
218
|
+
});
|
|
219
|
+
exports.getAllExternalTables = (datasourceId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
220
|
+
const db = getAppDB();
|
|
201
221
|
const datasource = yield db.get(datasourceId);
|
|
202
222
|
if (!datasource || !datasource.entities) {
|
|
203
223
|
throw "Datasource is not configured fully.";
|
|
204
224
|
}
|
|
205
225
|
return datasource.entities;
|
|
206
226
|
});
|
|
207
|
-
exports.getExternalTable = (
|
|
208
|
-
const entities = yield exports.getAllExternalTables(
|
|
227
|
+
exports.getExternalTable = (datasourceId, tableName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
228
|
+
const entities = yield exports.getAllExternalTables(datasourceId);
|
|
209
229
|
return entities[tableName];
|
|
210
230
|
});
|
|
211
|
-
exports.getTable = (
|
|
212
|
-
const db =
|
|
231
|
+
exports.getTable = (tableId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
232
|
+
const db = getAppDB();
|
|
213
233
|
if (isExternalTable(tableId)) {
|
|
214
234
|
let { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
215
235
|
const datasource = yield db.get(datasourceId);
|
|
216
|
-
const table = yield exports.getExternalTable(
|
|
236
|
+
const table = yield exports.getExternalTable(datasourceId, tableName);
|
|
217
237
|
return Object.assign(Object.assign({}, table), { sql: isSQL(datasource) });
|
|
218
238
|
}
|
|
219
239
|
else {
|
|
220
240
|
return db.get(tableId);
|
|
221
241
|
}
|
|
222
242
|
});
|
|
223
|
-
exports.checkForViewUpdates = (
|
|
224
|
-
const views = yield getViews(
|
|
243
|
+
exports.checkForViewUpdates = (table, rename, deletedColumns) => __awaiter(void 0, void 0, void 0, function* () {
|
|
244
|
+
const views = yield getViews();
|
|
225
245
|
const tableViews = views.filter(view => view.meta.tableId === table._id);
|
|
226
246
|
// Check each table view to see if impacted by this table action
|
|
227
247
|
for (let view of tableViews) {
|
|
@@ -277,7 +297,7 @@ exports.checkForViewUpdates = (db, table, rename, deletedColumns) => __awaiter(v
|
|
|
277
297
|
// Update view if required
|
|
278
298
|
if (needsUpdated) {
|
|
279
299
|
const newViewTemplate = viewTemplate(view.meta);
|
|
280
|
-
yield saveView(
|
|
300
|
+
yield saveView(null, view.name, newViewTemplate);
|
|
281
301
|
if (!newViewTemplate.meta.schema) {
|
|
282
302
|
newViewTemplate.meta.schema = table.schema;
|
|
283
303
|
}
|