@budibase/server 1.0.49 → 1.0.50-alpha.0
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.c0cc369d.css +6 -0
- package/builder/assets/{index.2c37968e.js → index.ff2bad21.js} +252 -249
- package/builder/assets/{vendor.f9faf6ab.js → vendor.5ad9695a.js} +202 -106
- package/builder/index.html +3 -3
- package/coverage/clover.xml +3105 -2814
- package/coverage/coverage-final.json +106 -101
- 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 +257 -152
- package/coverage/lcov-report/api/controllers/auth.js.html +22 -13
- 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 +13 -16
- package/coverage/lcov-report/api/controllers/datasource.js.html +81 -51
- package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
- package/coverage/lcov-report/api/controllers/index.html +78 -78
- 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/api/controllers/migrations.js.html +119 -0
- 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 +55 -40
- package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
- package/coverage/lcov-report/api/controllers/row/internal.js.html +118 -226
- 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 +47 -62
- 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 +58 -43
- package/coverage/lcov-report/api/controllers/table/index.js.html +58 -82
- package/coverage/lcov-report/api/controllers/table/internal.js.html +81 -66
- package/coverage/lcov-report/api/controllers/table/utils.js.html +218 -110
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +79 -76
- 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 +8 -8
- 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 +18 -18
- package/coverage/lcov-report/api/routes/index.js.html +3 -3
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/{hosting.js.html → migrations.js.html} +17 -14
- 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 +17 -2
- 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 +13 -22
- package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
- 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 +13 -13
- 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 +53 -26
- 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 +15 -15
- package/coverage/lcov-report/db/index.js.html +3 -3
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +25 -37
- package/coverage/lcov-report/db/linkedRows/index.html +27 -27
- package/coverage/lcov-report/db/linkedRows/index.js.html +51 -96
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +42 -42
- package/coverage/lcov-report/db/newid.js.html +4 -4
- package/coverage/lcov-report/db/utils.js.html +87 -87
- 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 +135 -120
- 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 +173 -65
- package/coverage/lcov-report/middleware/builder.js.html +10 -10
- package/coverage/lcov-report/middleware/currentapp.js.html +95 -83
- package/coverage/lcov-report/middleware/index.html +38 -38
- 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 +281 -53
- 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 +26 -26
- package/coverage/lcov-report/threads/index.js.html +10 -10
- package/coverage/lcov-report/threads/query.js.html +39 -24
- 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 +58 -49
- package/coverage/lcov-report/utilities/index.html +37 -37
- package/coverage/lcov-report/utilities/index.js.html +43 -73
- 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 +97 -103
- 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 +141 -0
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +305 -0
- package/coverage/lcov-report/{api/controllers/hosting.js.html → utilities/usageQuota/usageQuoteReset.js.html} +36 -48
- package/coverage/lcov-report/utilities/users.js.html +9 -9
- package/coverage/lcov-report/utilities/workerRequests.js.html +43 -112
- package/coverage/lcov.info +5010 -4425
- package/dist/api/controllers/application.js +90 -60
- package/dist/api/controllers/auth.js +8 -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 +20 -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 +13 -14
- package/dist/api/controllers/screen.js +5 -7
- package/dist/api/controllers/static/index.js +62 -16
- 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 +16 -13
- package/dist/api/controllers/table/internal.js +22 -16
- package/dist/api/controllers/table/utils.js +62 -35
- package/dist/api/controllers/user.js +43 -43
- 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 -2
- package/dist/api/routes/migrations.js +9 -0
- package/dist/api/routes/static.js +2 -1
- 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 +3 -5
- package/dist/automations/steps/deleteRow.js +1 -4
- 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 +7 -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/definitions/datasource.js +1 -0
- package/dist/environment.js +4 -1
- package/dist/integrations/base/sql.js +62 -21
- package/dist/integrations/googlesheets.js +340 -0
- package/dist/integrations/index.js +3 -0
- package/dist/integrations/utils.js +60 -9
- package/dist/middleware/authorized.js +57 -30
- package/dist/middleware/builder.js +2 -2
- package/dist/middleware/currentapp.js +41 -37
- package/dist/middleware/usageQuota.js +82 -15
- package/dist/migrations/functions/appUrls.js +46 -0
- package/dist/migrations/functions/quotas1.js +50 -0
- package/dist/migrations/functions/usageQuotas/index.js +20 -0
- package/dist/migrations/functions/usageQuotas/syncApps.js +29 -0
- package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
- package/dist/migrations/functions/userEmailViewCasing.js +24 -0
- package/dist/migrations/index.js +62 -0
- package/dist/package.json +8 -5
- package/dist/tests/utilities/TestConfiguration.js +80 -50
- package/dist/threads/automation.js +13 -11
- package/dist/threads/query.js +15 -11
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +4 -3
- package/dist/utilities/global.js +15 -12
- package/dist/utilities/index.js +7 -17
- package/dist/utilities/routing/index.js +5 -5
- package/dist/utilities/rowProcessor/index.js +23 -17
- package/dist/utilities/rowProcessor/utils.js +14 -4
- package/dist/utilities/{usageQuota.js → usageQuota/index.js} +45 -31
- package/dist/utilities/usageQuota/rows.js +78 -0
- package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
- package/dist/utilities/users.js +3 -3
- package/dist/utilities/workerRequests.js +4 -24
- package/nodemon.json +1 -1
- package/package.json +9 -6
- package/scripts/integrations/mssql/data/Dockerfile +1 -1
- package/scripts/integrations/mssql/data/setup.sql +17 -4
- package/scripts/integrations/postgres/init.sql +11 -6
- package/scripts/likeCypress.ts +1 -1
- package/src/api/controllers/application.js +85 -50
- package/src/api/controllers/auth.js +8 -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 +21 -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 +13 -18
- package/src/api/controllers/screen.js +5 -7
- package/src/api/controllers/static/index.js +66 -15
- 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 +20 -28
- package/src/api/controllers/table/internal.js +24 -19
- package/src/api/controllers/table/utils.js +78 -42
- package/src/api/controllers/user.js +46 -45
- 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 -2
- package/src/api/routes/migrations.js +14 -0
- package/src/api/routes/static.js +5 -0
- package/src/api/routes/tests/application.spec.js +2 -2
- package/src/api/routes/tests/auth.spec.js +1 -2
- 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/static.spec.js +98 -0
- 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 +2 -5
- package/src/automations/steps/deleteRow.js +1 -4
- 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 +9 -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/definitions/datasource.ts +3 -0
- package/src/environment.js +4 -1
- package/src/integrations/base/sql.ts +75 -29
- package/src/integrations/googlesheets.ts +353 -0
- package/src/integrations/index.ts +3 -0
- package/src/integrations/tests/sql.spec.js +16 -0
- package/src/integrations/utils.ts +75 -12
- package/src/middleware/authorized.js +66 -30
- package/src/middleware/builder.js +2 -2
- package/src/middleware/currentapp.js +50 -46
- package/src/middleware/tests/authorized.spec.js +13 -6
- package/src/middleware/tests/currentapp.spec.js +6 -0
- package/src/middleware/tests/usageQuota.spec.js +18 -24
- package/src/middleware/usageQuota.js +93 -17
- 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/functions/tests/quotas1.spec.js +27 -0
- package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
- package/src/migrations/functions/usageQuotas/index.ts +8 -0
- package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
- package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
- 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 +82 -55
- package/src/threads/automation.js +17 -15
- package/src/threads/query.js +17 -12
- package/src/utilities/fileSystem/index.js +4 -3
- package/src/utilities/global.js +15 -12
- package/src/utilities/index.js +7 -17
- package/src/utilities/routing/index.js +5 -5
- package/src/utilities/rowProcessor/index.js +25 -27
- package/src/utilities/rowProcessor/utils.js +23 -7
- package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
- package/src/utilities/usageQuota/index.js +93 -0
- package/src/utilities/usageQuota/rows.js +75 -0
- package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
- package/src/utilities/users.js +3 -3
- package/src/utilities/workerRequests.js +4 -27
- package/tsconfig.json +2 -1
- package/builder/assets/index.39e01193.css +0 -1
- package/dist/api/controllers/hosting.js +0 -30
- package/dist/api/routes/hosting.js +0 -11
- package/src/api/controllers/hosting.js +0 -22
- package/src/api/routes/hosting.js +0 -13
- package/src/api/routes/tests/hosting.spec.js +0 -36
- package/src/utilities/usageQuota.js +0 -73
|
@@ -8,17 +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
|
-
const { isExternalTable, breakExternalTableId, } = require("../../../integrations/utils");
|
|
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");
|
|
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();
|
|
22
35
|
let updatedRows = [];
|
|
23
36
|
const rename = updatedTable._rename;
|
|
24
37
|
let deletedColumns = [];
|
|
@@ -31,18 +44,22 @@ exports.checkForColumnUpdates = (db, oldTable, updatedTable) => __awaiter(void 0
|
|
|
31
44
|
const rows = yield db.allDocs(getRowParams(updatedTable._id, null, {
|
|
32
45
|
include_docs: true,
|
|
33
46
|
}));
|
|
34
|
-
|
|
47
|
+
const rawRows = rows.rows.map(({ doc }) => doc);
|
|
48
|
+
updatedRows = rawRows.map(row => {
|
|
49
|
+
row = cloneDeep(row);
|
|
35
50
|
if (rename) {
|
|
36
|
-
|
|
37
|
-
delete
|
|
51
|
+
row[rename.updated] = row[rename.old];
|
|
52
|
+
delete row[rename.old];
|
|
38
53
|
}
|
|
39
54
|
else if (deletedColumns.length !== 0) {
|
|
40
|
-
deletedColumns.forEach(colName => delete
|
|
55
|
+
deletedColumns.forEach(colName => delete row[colName]);
|
|
41
56
|
}
|
|
42
|
-
return
|
|
57
|
+
return row;
|
|
43
58
|
});
|
|
59
|
+
// cleanup any attachments from object storage for deleted attachment columns
|
|
60
|
+
yield cleanupAttachments(updatedTable, { oldTable, rows: rawRows });
|
|
44
61
|
// Update views
|
|
45
|
-
yield exports.checkForViewUpdates(
|
|
62
|
+
yield exports.checkForViewUpdates(updatedTable, rename, deletedColumns);
|
|
46
63
|
delete updatedTable._rename;
|
|
47
64
|
}
|
|
48
65
|
return { rows: updatedRows, table: updatedTable };
|
|
@@ -65,11 +82,11 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
|
|
|
65
82
|
}
|
|
66
83
|
return tableToSave;
|
|
67
84
|
};
|
|
68
|
-
exports.handleDataImport = (
|
|
85
|
+
exports.handleDataImport = (user, table, dataImport) => __awaiter(void 0, void 0, void 0, function* () {
|
|
69
86
|
if (!dataImport || !dataImport.csvString) {
|
|
70
87
|
return table;
|
|
71
88
|
}
|
|
72
|
-
const db =
|
|
89
|
+
const db = getAppDB();
|
|
73
90
|
// Populate the table with rows imported from CSV in a bulk update
|
|
74
91
|
const data = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
|
|
75
92
|
let finalData = [];
|
|
@@ -95,13 +112,17 @@ exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0,
|
|
|
95
112
|
}
|
|
96
113
|
finalData.push(row);
|
|
97
114
|
}
|
|
115
|
+
yield usageQuota.update(usageQuota.Properties.ROW, finalData.length, {
|
|
116
|
+
dryRun: true,
|
|
117
|
+
});
|
|
98
118
|
yield db.bulkDocs(finalData);
|
|
119
|
+
yield usageQuota.update(usageQuota.Properties.ROW, finalData.length);
|
|
99
120
|
let response = yield db.put(table);
|
|
100
121
|
table._rev = response._rev;
|
|
101
122
|
return table;
|
|
102
123
|
});
|
|
103
|
-
exports.handleSearchIndexes = (
|
|
104
|
-
const db =
|
|
124
|
+
exports.handleSearchIndexes = (table) => __awaiter(void 0, void 0, void 0, function* () {
|
|
125
|
+
const db = getAppDB();
|
|
105
126
|
// create relevant search indexes
|
|
106
127
|
if (table.indexes && table.indexes.length > 0) {
|
|
107
128
|
const currentIndexes = yield db.getIndexes();
|
|
@@ -150,12 +171,9 @@ exports.checkStaticTables = table => {
|
|
|
150
171
|
return table;
|
|
151
172
|
};
|
|
152
173
|
class TableSaveFunctions {
|
|
153
|
-
constructor({
|
|
154
|
-
this.db =
|
|
155
|
-
this.
|
|
156
|
-
if (this.ctx && this.ctx.user) {
|
|
157
|
-
this.appId = this.ctx.appId;
|
|
158
|
-
}
|
|
174
|
+
constructor({ user, oldTable, dataImport }) {
|
|
175
|
+
this.db = getAppDB();
|
|
176
|
+
this.user = user;
|
|
159
177
|
this.oldTable = oldTable;
|
|
160
178
|
this.dataImport = dataImport;
|
|
161
179
|
// any rows that need updated
|
|
@@ -174,7 +192,7 @@ class TableSaveFunctions {
|
|
|
174
192
|
// when confirmed valid
|
|
175
193
|
mid(table) {
|
|
176
194
|
return __awaiter(this, void 0, void 0, function* () {
|
|
177
|
-
let response = yield exports.checkForColumnUpdates(this.
|
|
195
|
+
let response = yield exports.checkForColumnUpdates(this.oldTable, table);
|
|
178
196
|
this.rows = this.rows.concat(response.rows);
|
|
179
197
|
return table;
|
|
180
198
|
});
|
|
@@ -182,8 +200,8 @@ class TableSaveFunctions {
|
|
|
182
200
|
// after saving
|
|
183
201
|
after(table) {
|
|
184
202
|
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
-
table = yield exports.handleSearchIndexes(
|
|
186
|
-
table = yield exports.handleDataImport(this.
|
|
203
|
+
table = yield exports.handleSearchIndexes(table);
|
|
204
|
+
table = yield exports.handleDataImport(this.user, table, this.dataImport);
|
|
187
205
|
return table;
|
|
188
206
|
});
|
|
189
207
|
}
|
|
@@ -191,30 +209,39 @@ class TableSaveFunctions {
|
|
|
191
209
|
return this.rows;
|
|
192
210
|
}
|
|
193
211
|
}
|
|
194
|
-
exports.
|
|
195
|
-
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();
|
|
196
221
|
const datasource = yield db.get(datasourceId);
|
|
197
222
|
if (!datasource || !datasource.entities) {
|
|
198
223
|
throw "Datasource is not configured fully.";
|
|
199
224
|
}
|
|
200
225
|
return datasource.entities;
|
|
201
226
|
});
|
|
202
|
-
exports.getExternalTable = (
|
|
203
|
-
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);
|
|
204
229
|
return entities[tableName];
|
|
205
230
|
});
|
|
206
|
-
exports.getTable = (
|
|
207
|
-
const db =
|
|
231
|
+
exports.getTable = (tableId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
232
|
+
const db = getAppDB();
|
|
208
233
|
if (isExternalTable(tableId)) {
|
|
209
234
|
let { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
210
|
-
|
|
235
|
+
const datasource = yield db.get(datasourceId);
|
|
236
|
+
const table = yield exports.getExternalTable(datasourceId, tableName);
|
|
237
|
+
return Object.assign(Object.assign({}, table), { sql: isSQL(datasource) });
|
|
211
238
|
}
|
|
212
239
|
else {
|
|
213
240
|
return db.get(tableId);
|
|
214
241
|
}
|
|
215
242
|
});
|
|
216
|
-
exports.checkForViewUpdates = (
|
|
217
|
-
const views = yield getViews(
|
|
243
|
+
exports.checkForViewUpdates = (table, rename, deletedColumns) => __awaiter(void 0, void 0, void 0, function* () {
|
|
244
|
+
const views = yield getViews();
|
|
218
245
|
const tableViews = views.filter(view => view.meta.tableId === table._id);
|
|
219
246
|
// Check each table view to see if impacted by this table action
|
|
220
247
|
for (let view of tableViews) {
|
|
@@ -270,7 +297,7 @@ exports.checkForViewUpdates = (db, table, rename, deletedColumns) => __awaiter(v
|
|
|
270
297
|
// Update view if required
|
|
271
298
|
if (needsUpdated) {
|
|
272
299
|
const newViewTemplate = viewTemplate(view.meta);
|
|
273
|
-
yield saveView(
|
|
300
|
+
yield saveView(null, view.name, newViewTemplate);
|
|
274
301
|
if (!newViewTemplate.meta.schema) {
|
|
275
302
|
newViewTemplate.meta.schema = table.schema;
|
|
276
303
|
}
|
|
@@ -8,18 +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 { generateUserMetadataID, getUserMetadataParams, generateUserFlagID, } = require("../../db/utils");
|
|
13
12
|
const { InternalTables } = require("../../db/utils");
|
|
14
13
|
const { getGlobalUsers, getRawGlobalUser } = require("../../utilities/global");
|
|
15
14
|
const { getFullUser } = require("../../utilities/users");
|
|
16
15
|
const { isEqual } = require("lodash");
|
|
17
16
|
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
|
|
18
|
-
const { getDevelopmentAppID,
|
|
19
|
-
const { doesDatabaseExist } = require("../../utilities");
|
|
17
|
+
const { getDevelopmentAppID, getProdAppIDs, dbExists, } = require("@budibase/backend-core/db");
|
|
20
18
|
const { UserStatus } = require("@budibase/backend-core/constants");
|
|
21
|
-
|
|
19
|
+
const { getAppDB, doInAppContext } = require("@budibase/backend-core/context");
|
|
20
|
+
function rawMetadata() {
|
|
22
21
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
const db = getAppDB();
|
|
23
23
|
return (yield db.allDocs(getUserMetadataParams(null, {
|
|
24
24
|
include_docs: true,
|
|
25
25
|
}))).rows.map(row => row.doc);
|
|
@@ -45,13 +45,10 @@ function combineMetadataAndUser(user, metadata) {
|
|
|
45
45
|
}
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
48
|
-
exports.syncGlobalUsers = (
|
|
48
|
+
exports.syncGlobalUsers = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
49
|
// sync user metadata
|
|
50
|
-
const db =
|
|
51
|
-
const [users, metadata] = yield Promise.all([
|
|
52
|
-
getGlobalUsers(appId),
|
|
53
|
-
rawMetadata(db),
|
|
54
|
-
]);
|
|
50
|
+
const db = getAppDB();
|
|
51
|
+
const [users, metadata] = yield Promise.all([getGlobalUsers(), rawMetadata()]);
|
|
55
52
|
const toWrite = [];
|
|
56
53
|
for (let user of users) {
|
|
57
54
|
const combined = yield combineMetadataAndUser(user, metadata);
|
|
@@ -86,7 +83,7 @@ exports.syncUser = function (ctx) {
|
|
|
86
83
|
let prodAppIds;
|
|
87
84
|
// if they are a builder then get all production app IDs
|
|
88
85
|
if ((user.builder && user.builder.global) || deleting) {
|
|
89
|
-
prodAppIds = yield
|
|
86
|
+
prodAppIds = yield getProdAppIDs();
|
|
90
87
|
}
|
|
91
88
|
else {
|
|
92
89
|
prodAppIds = Object.entries(roles)
|
|
@@ -97,34 +94,36 @@ exports.syncUser = function (ctx) {
|
|
|
97
94
|
const roleId = roles[prodAppId];
|
|
98
95
|
const devAppId = getDevelopmentAppID(prodAppId);
|
|
99
96
|
for (let appId of [prodAppId, devAppId]) {
|
|
100
|
-
if (!(yield
|
|
97
|
+
if (!(yield dbExists(appId))) {
|
|
101
98
|
continue;
|
|
102
99
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
catch (err) {
|
|
110
|
-
if (deleting) {
|
|
111
|
-
continue;
|
|
100
|
+
yield doInAppContext(appId, () => __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
const db = getAppDB();
|
|
102
|
+
const metadataId = generateUserMetadataID(userId);
|
|
103
|
+
let metadata;
|
|
104
|
+
try {
|
|
105
|
+
metadata = yield db.get(metadataId);
|
|
112
106
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (deleting) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
metadata = {
|
|
112
|
+
tableId: InternalTables.USER_METADATA,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// assign the roleId for the metadata doc
|
|
116
|
+
if (roleId) {
|
|
117
|
+
metadata.roleId = roleId;
|
|
118
|
+
}
|
|
119
|
+
let combined = !deleting
|
|
120
|
+
? combineMetadataAndUser(user, metadata)
|
|
121
|
+
: Object.assign(Object.assign({}, metadata), { status: UserStatus.INACTIVE, metadata: BUILTIN_ROLE_IDS.PUBLIC });
|
|
122
|
+
// if its null then there was no updates required
|
|
123
|
+
if (combined) {
|
|
124
|
+
yield db.put(combined);
|
|
125
|
+
}
|
|
126
|
+
}));
|
|
128
127
|
}
|
|
129
128
|
}
|
|
130
129
|
ctx.body = {
|
|
@@ -134,8 +133,8 @@ exports.syncUser = function (ctx) {
|
|
|
134
133
|
};
|
|
135
134
|
exports.fetchMetadata = function (ctx) {
|
|
136
135
|
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
-
const database =
|
|
138
|
-
const global = yield getGlobalUsers(
|
|
136
|
+
const database = getAppDB();
|
|
137
|
+
const global = yield getGlobalUsers();
|
|
139
138
|
const metadata = yield rawMetadata(database);
|
|
140
139
|
const users = [];
|
|
141
140
|
for (let user of global) {
|
|
@@ -155,13 +154,14 @@ exports.updateSelfMetadata = function (ctx) {
|
|
|
155
154
|
ctx.request.body._id = ctx.user._id;
|
|
156
155
|
// make sure no stale rev
|
|
157
156
|
delete ctx.request.body._rev;
|
|
157
|
+
// make sure no csrf token
|
|
158
|
+
delete ctx.request.body.csrfToken;
|
|
158
159
|
yield exports.updateMetadata(ctx);
|
|
159
160
|
});
|
|
160
161
|
};
|
|
161
162
|
exports.updateMetadata = function (ctx) {
|
|
162
163
|
return __awaiter(this, void 0, void 0, function* () {
|
|
163
|
-
const
|
|
164
|
-
const db = new CouchDB(appId);
|
|
164
|
+
const db = getAppDB();
|
|
165
165
|
const user = ctx.request.body;
|
|
166
166
|
// this isn't applicable to the user
|
|
167
167
|
delete user.roles;
|
|
@@ -171,7 +171,7 @@ exports.updateMetadata = function (ctx) {
|
|
|
171
171
|
};
|
|
172
172
|
exports.destroyMetadata = function (ctx) {
|
|
173
173
|
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
-
const db =
|
|
174
|
+
const db = getAppDB();
|
|
175
175
|
try {
|
|
176
176
|
const dbUser = yield db.get(ctx.params.id);
|
|
177
177
|
yield db.remove(dbUser._id, dbUser._rev);
|
|
@@ -197,7 +197,7 @@ exports.setFlag = function (ctx) {
|
|
|
197
197
|
ctx.throw(400, "Must supply a 'flag' field in request body.");
|
|
198
198
|
}
|
|
199
199
|
const flagDocId = generateUserFlagID(userId);
|
|
200
|
-
const db =
|
|
200
|
+
const db = getAppDB();
|
|
201
201
|
let doc;
|
|
202
202
|
try {
|
|
203
203
|
doc = yield db.get(flagDocId);
|
|
@@ -214,7 +214,7 @@ exports.getFlags = function (ctx) {
|
|
|
214
214
|
return __awaiter(this, void 0, void 0, function* () {
|
|
215
215
|
const userId = ctx.user._id;
|
|
216
216
|
const docId = generateUserFlagID(userId);
|
|
217
|
-
const db =
|
|
217
|
+
const db = getAppDB();
|
|
218
218
|
let doc;
|
|
219
219
|
try {
|
|
220
220
|
doc = yield db.get(docId);
|
|
@@ -19,7 +19,6 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
19
19
|
}
|
|
20
20
|
return t;
|
|
21
21
|
};
|
|
22
|
-
const CouchDB = require("../../../db");
|
|
23
22
|
const viewTemplate = require("./viewBuilder");
|
|
24
23
|
const { apiFileReturn } = require("../../../utilities/fileSystem");
|
|
25
24
|
const exporters = require("./exporters");
|
|
@@ -27,18 +26,18 @@ const { saveView, getView, getViews, deleteView } = require("./utils");
|
|
|
27
26
|
const { fetchView } = require("../row");
|
|
28
27
|
const { getTable } = require("../table/utils");
|
|
29
28
|
const { FieldTypes } = require("../../../constants");
|
|
29
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
30
30
|
exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
|
-
|
|
32
|
-
ctx.body = yield getViews(db);
|
|
31
|
+
ctx.body = yield getViews();
|
|
33
32
|
});
|
|
34
33
|
exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
|
-
const db =
|
|
34
|
+
const db = getAppDB();
|
|
36
35
|
const _a = ctx.request.body, { originalName } = _a, viewToSave = __rest(_a, ["originalName"]);
|
|
37
36
|
const view = viewTemplate(viewToSave);
|
|
38
37
|
if (!viewToSave.name) {
|
|
39
38
|
ctx.throw(400, "Cannot create view without a name");
|
|
40
39
|
}
|
|
41
|
-
yield saveView(
|
|
40
|
+
yield saveView(originalName, viewToSave.name, view);
|
|
42
41
|
// add views to table document
|
|
43
42
|
const table = yield db.get(ctx.request.body.tableId);
|
|
44
43
|
if (!table.views)
|
|
@@ -54,18 +53,17 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
54
53
|
ctx.body = Object.assign(Object.assign({}, table.views[viewToSave.name]), { name: viewToSave.name });
|
|
55
54
|
});
|
|
56
55
|
exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
57
|
-
const db =
|
|
56
|
+
const db = getAppDB();
|
|
58
57
|
const viewName = decodeURI(ctx.params.viewName);
|
|
59
|
-
const view = yield deleteView(
|
|
58
|
+
const view = yield deleteView(viewName);
|
|
60
59
|
const table = yield db.get(view.meta.tableId);
|
|
61
60
|
delete table.views[viewName];
|
|
62
61
|
yield db.put(table);
|
|
63
62
|
ctx.body = view;
|
|
64
63
|
});
|
|
65
64
|
exports.exportView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
66
|
-
const db = new CouchDB(ctx.appId);
|
|
67
65
|
const viewName = decodeURI(ctx.query.view);
|
|
68
|
-
const view = yield getView(
|
|
66
|
+
const view = yield getView(viewName);
|
|
69
67
|
const format = ctx.query.format;
|
|
70
68
|
if (!format || !Object.values(exporters.ExportFormats).includes(format)) {
|
|
71
69
|
ctx.throw(400, "Format must be specified, either csv or json");
|
|
@@ -90,7 +88,7 @@ exports.exportView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
90
88
|
let schema = view && view.meta && view.meta.schema;
|
|
91
89
|
if (!schema) {
|
|
92
90
|
const tableId = ctx.params.tableId || view.meta.tableId;
|
|
93
|
-
const table = yield getTable(
|
|
91
|
+
const table = yield getTable(tableId);
|
|
94
92
|
schema = table.schema;
|
|
95
93
|
}
|
|
96
94
|
// remove any relationships
|
|
@@ -10,7 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
const { ViewNames, generateMemoryViewID, getMemoryViewParams, DocumentTypes, SEPARATOR, } = require("../../../db/utils");
|
|
12
12
|
const env = require("../../../environment");
|
|
13
|
-
|
|
13
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
14
|
+
exports.getView = (viewName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
const db = getAppDB();
|
|
14
16
|
if (env.SELF_HOSTED) {
|
|
15
17
|
const designDoc = yield db.get("_design/database");
|
|
16
18
|
return designDoc.views[viewName];
|
|
@@ -24,7 +26,8 @@ exports.getView = (db, viewName) => __awaiter(void 0, void 0, void 0, function*
|
|
|
24
26
|
return viewDoc.view;
|
|
25
27
|
}
|
|
26
28
|
});
|
|
27
|
-
exports.getViews = (
|
|
29
|
+
exports.getViews = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
30
|
+
const db = getAppDB();
|
|
28
31
|
const response = [];
|
|
29
32
|
if (env.SELF_HOSTED) {
|
|
30
33
|
const designDoc = yield db.get("_design/database");
|
|
@@ -46,7 +49,8 @@ exports.getViews = (db) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
46
49
|
}
|
|
47
50
|
return response;
|
|
48
51
|
});
|
|
49
|
-
exports.saveView = (
|
|
52
|
+
exports.saveView = (originalName, viewName, viewTemplate) => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const db = getAppDB();
|
|
50
54
|
if (env.SELF_HOSTED) {
|
|
51
55
|
const designDoc = yield db.get("_design/database");
|
|
52
56
|
designDoc.views = Object.assign(Object.assign({}, designDoc.views), { [viewName]: viewTemplate });
|
|
@@ -81,7 +85,8 @@ exports.saveView = (db, originalName, viewName, viewTemplate) => __awaiter(void
|
|
|
81
85
|
yield db.put(viewDoc);
|
|
82
86
|
}
|
|
83
87
|
});
|
|
84
|
-
exports.deleteView = (
|
|
88
|
+
exports.deleteView = (viewName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
89
|
+
const db = getAppDB();
|
|
85
90
|
if (env.SELF_HOSTED) {
|
|
86
91
|
const designDoc = yield db.get("_design/database");
|
|
87
92
|
const view = designDoc.views[viewName];
|
|
@@ -8,12 +8,12 @@ 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 { generateWebhookID, getWebhookParams } = require("../../db/utils");
|
|
13
12
|
const toJsonSchema = require("to-json-schema");
|
|
14
13
|
const validate = require("jsonschema").validate;
|
|
15
14
|
const triggers = require("../../automations/triggers");
|
|
16
|
-
const {
|
|
15
|
+
const { getProdAppID } = require("@budibase/backend-core/db");
|
|
16
|
+
const { getAppDB, updateAppId } = require("@budibase/backend-core/context");
|
|
17
17
|
const AUTOMATION_DESCRIPTION = "Generated from Webhook Schema";
|
|
18
18
|
function Webhook(name, type, target) {
|
|
19
19
|
this.live = true;
|
|
@@ -28,14 +28,14 @@ exports.WebhookType = {
|
|
|
28
28
|
AUTOMATION: "automation",
|
|
29
29
|
};
|
|
30
30
|
exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
|
-
const db =
|
|
31
|
+
const db = getAppDB();
|
|
32
32
|
const response = yield db.allDocs(getWebhookParams(null, {
|
|
33
33
|
include_docs: true,
|
|
34
34
|
}));
|
|
35
35
|
ctx.body = response.rows.map(row => row.doc);
|
|
36
36
|
});
|
|
37
37
|
exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
|
-
const db =
|
|
38
|
+
const db = getAppDB();
|
|
39
39
|
const webhook = ctx.request.body;
|
|
40
40
|
webhook.appId = ctx.appId;
|
|
41
41
|
// check that the webhook exists
|
|
@@ -53,11 +53,12 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
53
53
|
};
|
|
54
54
|
});
|
|
55
55
|
exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
56
|
-
const db =
|
|
56
|
+
const db = getAppDB();
|
|
57
57
|
ctx.body = yield db.remove(ctx.params.id, ctx.params.rev);
|
|
58
58
|
});
|
|
59
59
|
exports.buildSchema = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
-
|
|
60
|
+
updateAppId(ctx.params.instance);
|
|
61
|
+
const db = getAppDB();
|
|
61
62
|
const webhook = yield db.get(ctx.params.id);
|
|
62
63
|
webhook.bodySchema = toJsonSchema(ctx.request.body);
|
|
63
64
|
// update the automation outputs
|
|
@@ -80,9 +81,10 @@ exports.buildSchema = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
80
81
|
ctx.body = yield db.put(webhook);
|
|
81
82
|
});
|
|
82
83
|
exports.trigger = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
83
|
-
const prodAppId =
|
|
84
|
+
const prodAppId = getProdAppID(ctx.params.instance);
|
|
85
|
+
updateAppId(prodAppId);
|
|
84
86
|
try {
|
|
85
|
-
const db =
|
|
87
|
+
const db = getAppDB();
|
|
86
88
|
const webhook = yield db.get(ctx.params.id);
|
|
87
89
|
// validate against the schema
|
|
88
90
|
if (webhook.bodySchema) {
|
package/dist/api/routes/index.js
CHANGED
|
@@ -21,11 +21,11 @@ const integrationRoutes = require("./integration");
|
|
|
21
21
|
const permissionRoutes = require("./permission");
|
|
22
22
|
const datasourceRoutes = require("./datasource");
|
|
23
23
|
const queryRoutes = require("./query");
|
|
24
|
-
const hostingRoutes = require("./hosting");
|
|
25
24
|
const backupRoutes = require("./backup");
|
|
26
25
|
const metadataRoutes = require("./metadata");
|
|
27
26
|
const devRoutes = require("./dev");
|
|
28
27
|
const cloudRoutes = require("./cloud");
|
|
28
|
+
const migrationRoutes = require("./migrations");
|
|
29
29
|
exports.mainRoutes = [
|
|
30
30
|
authRoutes,
|
|
31
31
|
deployRoutes,
|
|
@@ -46,7 +46,6 @@ exports.mainRoutes = [
|
|
|
46
46
|
permissionRoutes,
|
|
47
47
|
datasourceRoutes,
|
|
48
48
|
queryRoutes,
|
|
49
|
-
hostingRoutes,
|
|
50
49
|
backupRoutes,
|
|
51
50
|
metadataRoutes,
|
|
52
51
|
devRoutes,
|
|
@@ -55,5 +54,6 @@ exports.mainRoutes = [
|
|
|
55
54
|
// this could be breaking as koa may recognise other routes as this
|
|
56
55
|
tableRoutes,
|
|
57
56
|
rowRoutes,
|
|
57
|
+
migrationRoutes,
|
|
58
58
|
];
|
|
59
59
|
exports.staticRoutes = staticRoutes;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const Router = require("@koa/router");
|
|
3
|
+
const migrationsController = require("../controllers/migrations");
|
|
4
|
+
const router = Router();
|
|
5
|
+
const { internalApi } = require("@budibase/backend-core/auth");
|
|
6
|
+
router
|
|
7
|
+
.post("/api/migrations/run", internalApi, migrationsController.migrate)
|
|
8
|
+
.get("/api/migrations/definitions", internalApi, migrationsController.fetchDefinitions);
|
|
9
|
+
module.exports = router;
|
|
@@ -43,5 +43,6 @@ router
|
|
|
43
43
|
.post("/api/attachments/process", authorized(BUILDER), controller.uploadFile)
|
|
44
44
|
.post("/api/attachments/:tableId/upload", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.WRITE), controller.uploadFile)
|
|
45
45
|
// TODO: this likely needs to be secured in some way
|
|
46
|
-
.get("/:appId/:path*", controller.serveApp)
|
|
46
|
+
.get("/:appId/:path*", controller.serveApp)
|
|
47
|
+
.post("/api/attachments/:datasourceId/url", authorized(PermissionTypes.TABLE, PermissionLevels.READ), controller.getSignedUploadURL);
|
|
47
48
|
module.exports = router;
|
|
@@ -10,18 +10,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
const rowController = require("../../../controllers/row");
|
|
12
12
|
const appController = require("../../../controllers/application");
|
|
13
|
-
const CouchDB = require("../../../../db");
|
|
14
13
|
const { AppStatus } = require("../../../../db/utils");
|
|
15
14
|
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
|
|
16
15
|
const { TENANT_ID } = require("../../../../tests/utilities/structures");
|
|
16
|
+
const { getAppDB, doInAppContext } = require("@budibase/backend-core/context");
|
|
17
|
+
const env = require("../../../../environment");
|
|
17
18
|
function Request(appId, params) {
|
|
18
19
|
this.appId = appId;
|
|
19
20
|
this.params = params;
|
|
20
21
|
this.request = {};
|
|
21
22
|
}
|
|
23
|
+
function runRequest(appId, controlFunc, request) {
|
|
24
|
+
return doInAppContext(appId, () => __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
return controlFunc(request);
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
22
28
|
exports.getAllTableRows = (config) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
29
|
const req = new Request(config.appId, { tableId: config.table._id });
|
|
24
|
-
yield rowController.fetch
|
|
30
|
+
yield runRequest(config.appId, rowController.fetch, req);
|
|
25
31
|
return req.body;
|
|
26
32
|
});
|
|
27
33
|
exports.clearAllApps = (tenantId = TENANT_ID) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -33,13 +39,16 @@ exports.clearAllApps = (tenantId = TENANT_ID) => __awaiter(void 0, void 0, void
|
|
|
33
39
|
}
|
|
34
40
|
for (let app of apps) {
|
|
35
41
|
const { appId } = app;
|
|
36
|
-
|
|
42
|
+
const req = new Request(null, { appId });
|
|
43
|
+
yield runRequest(appId, appController.delete, req);
|
|
37
44
|
}
|
|
38
45
|
});
|
|
39
46
|
exports.clearAllAutomations = (config) => __awaiter(void 0, void 0, void 0, function* () {
|
|
40
47
|
const automations = yield config.getAllAutomations();
|
|
41
48
|
for (let auto of automations) {
|
|
42
|
-
yield config.
|
|
49
|
+
yield doInAppContext(config.appId, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
+
yield config.deleteAutomation(auto);
|
|
51
|
+
}));
|
|
43
52
|
}
|
|
44
53
|
});
|
|
45
54
|
exports.createRequest = (request, method, url, body) => {
|
|
@@ -92,19 +101,30 @@ exports.checkPermissionsEndpoint = ({ config, method, url, body, passRole, failR
|
|
|
92
101
|
.set(failHeader)
|
|
93
102
|
.expect(403);
|
|
94
103
|
});
|
|
95
|
-
exports.getDB =
|
|
96
|
-
return
|
|
104
|
+
exports.getDB = () => {
|
|
105
|
+
return getAppDB();
|
|
97
106
|
};
|
|
98
107
|
exports.testAutomation = (config, automation) => __awaiter(void 0, void 0, void 0, function* () {
|
|
99
|
-
return
|
|
100
|
-
.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
return runRequest(automation.appId, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
109
|
+
return yield config.request
|
|
110
|
+
.post(`/api/automations/${automation._id}/test`)
|
|
111
|
+
.send({
|
|
112
|
+
row: {
|
|
113
|
+
name: "Test",
|
|
114
|
+
description: "TEST",
|
|
115
|
+
},
|
|
116
|
+
})
|
|
117
|
+
.set(config.defaultHeaders())
|
|
118
|
+
.expect("Content-Type", /json/)
|
|
119
|
+
.expect(200);
|
|
120
|
+
}));
|
|
121
|
+
});
|
|
122
|
+
exports.runInProd = (func) => __awaiter(void 0, void 0, void 0, function* () {
|
|
123
|
+
const nodeEnv = env.NODE_ENV;
|
|
124
|
+
const workerId = env.JEST_WORKER_ID;
|
|
125
|
+
env._set("NODE_ENV", "PRODUCTION");
|
|
126
|
+
env._set("JEST_WORKER_ID", null);
|
|
127
|
+
yield func();
|
|
128
|
+
env._set("NODE_ENV", nodeEnv);
|
|
129
|
+
env._set("JEST_WORKER_ID", workerId);
|
|
110
130
|
});
|