@budibase/server 1.0.49 → 1.0.50-alpha.3
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.2c37968e.js → index.9fe798bd.js} +252 -249
- package/builder/assets/index.c0cc369d.css +6 -0
- 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 +4 -2
- 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
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
const CouchDB = require("../../../db")
|
|
2
1
|
const csvParser = require("../../../utilities/csvParser")
|
|
3
2
|
const {
|
|
4
3
|
getRowParams,
|
|
5
4
|
generateRowID,
|
|
6
5
|
InternalTables,
|
|
6
|
+
getTableParams,
|
|
7
|
+
BudibaseInternalDB,
|
|
7
8
|
} = require("../../../db/utils")
|
|
8
|
-
const { isEqual } = require("lodash
|
|
9
|
+
const { isEqual } = require("lodash")
|
|
9
10
|
const { AutoFieldSubTypes, FieldTypes } = require("../../../constants")
|
|
10
|
-
const {
|
|
11
|
+
const {
|
|
12
|
+
inputProcessing,
|
|
13
|
+
cleanupAttachments,
|
|
14
|
+
} = require("../../../utilities/rowProcessor")
|
|
11
15
|
const {
|
|
12
16
|
USERS_TABLE_SCHEMA,
|
|
13
17
|
SwitchableTypes,
|
|
@@ -16,11 +20,31 @@ const {
|
|
|
16
20
|
const {
|
|
17
21
|
isExternalTable,
|
|
18
22
|
breakExternalTableId,
|
|
23
|
+
isSQL,
|
|
19
24
|
} = require("../../../integrations/utils")
|
|
20
25
|
const { getViews, saveView } = require("../view/utils")
|
|
21
26
|
const viewTemplate = require("../view/viewBuilder")
|
|
27
|
+
const usageQuota = require("../../../utilities/usageQuota")
|
|
28
|
+
const { getAppDB } = require("@budibase/backend-core/context")
|
|
29
|
+
const { cloneDeep } = require("lodash/fp")
|
|
30
|
+
|
|
31
|
+
exports.clearColumns = async (table, columnNames) => {
|
|
32
|
+
const db = getAppDB()
|
|
33
|
+
const rows = await db.allDocs(
|
|
34
|
+
getRowParams(table._id, null, {
|
|
35
|
+
include_docs: true,
|
|
36
|
+
})
|
|
37
|
+
)
|
|
38
|
+
return db.bulkDocs(
|
|
39
|
+
rows.rows.map(({ doc }) => {
|
|
40
|
+
columnNames.forEach(colName => delete doc[colName])
|
|
41
|
+
return doc
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
}
|
|
22
45
|
|
|
23
|
-
exports.checkForColumnUpdates = async (
|
|
46
|
+
exports.checkForColumnUpdates = async (oldTable, updatedTable) => {
|
|
47
|
+
const db = getAppDB()
|
|
24
48
|
let updatedRows = []
|
|
25
49
|
const rename = updatedTable._rename
|
|
26
50
|
let deletedColumns = []
|
|
@@ -37,18 +61,22 @@ exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
|
|
|
37
61
|
include_docs: true,
|
|
38
62
|
})
|
|
39
63
|
)
|
|
40
|
-
|
|
64
|
+
const rawRows = rows.rows.map(({ doc }) => doc)
|
|
65
|
+
updatedRows = rawRows.map(row => {
|
|
66
|
+
row = cloneDeep(row)
|
|
41
67
|
if (rename) {
|
|
42
|
-
|
|
43
|
-
delete
|
|
68
|
+
row[rename.updated] = row[rename.old]
|
|
69
|
+
delete row[rename.old]
|
|
44
70
|
} else if (deletedColumns.length !== 0) {
|
|
45
|
-
deletedColumns.forEach(colName => delete
|
|
71
|
+
deletedColumns.forEach(colName => delete row[colName])
|
|
46
72
|
}
|
|
47
|
-
return
|
|
73
|
+
return row
|
|
48
74
|
})
|
|
49
75
|
|
|
76
|
+
// cleanup any attachments from object storage for deleted attachment columns
|
|
77
|
+
await cleanupAttachments(updatedTable, { oldTable, rows: rawRows })
|
|
50
78
|
// Update views
|
|
51
|
-
await exports.checkForViewUpdates(
|
|
79
|
+
await exports.checkForViewUpdates(updatedTable, rename, deletedColumns)
|
|
52
80
|
delete updatedTable._rename
|
|
53
81
|
}
|
|
54
82
|
return { rows: updatedRows, table: updatedTable }
|
|
@@ -75,12 +103,12 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
|
|
|
75
103
|
return tableToSave
|
|
76
104
|
}
|
|
77
105
|
|
|
78
|
-
exports.handleDataImport = async (
|
|
106
|
+
exports.handleDataImport = async (user, table, dataImport) => {
|
|
79
107
|
if (!dataImport || !dataImport.csvString) {
|
|
80
108
|
return table
|
|
81
109
|
}
|
|
82
110
|
|
|
83
|
-
const db =
|
|
111
|
+
const db = getAppDB()
|
|
84
112
|
// Populate the table with rows imported from CSV in a bulk update
|
|
85
113
|
const data = await csvParser.transform({
|
|
86
114
|
...dataImport,
|
|
@@ -115,14 +143,18 @@ exports.handleDataImport = async (appId, user, table, dataImport) => {
|
|
|
115
143
|
finalData.push(row)
|
|
116
144
|
}
|
|
117
145
|
|
|
146
|
+
await usageQuota.update(usageQuota.Properties.ROW, finalData.length, {
|
|
147
|
+
dryRun: true,
|
|
148
|
+
})
|
|
118
149
|
await db.bulkDocs(finalData)
|
|
150
|
+
await usageQuota.update(usageQuota.Properties.ROW, finalData.length)
|
|
119
151
|
let response = await db.put(table)
|
|
120
152
|
table._rev = response._rev
|
|
121
153
|
return table
|
|
122
154
|
}
|
|
123
155
|
|
|
124
|
-
exports.handleSearchIndexes = async
|
|
125
|
-
const db =
|
|
156
|
+
exports.handleSearchIndexes = async table => {
|
|
157
|
+
const db = getAppDB()
|
|
126
158
|
// create relevant search indexes
|
|
127
159
|
if (table.indexes && table.indexes.length > 0) {
|
|
128
160
|
const currentIndexes = await db.getIndexes()
|
|
@@ -179,12 +211,9 @@ exports.checkStaticTables = table => {
|
|
|
179
211
|
}
|
|
180
212
|
|
|
181
213
|
class TableSaveFunctions {
|
|
182
|
-
constructor({
|
|
183
|
-
this.db =
|
|
184
|
-
this.
|
|
185
|
-
if (this.ctx && this.ctx.user) {
|
|
186
|
-
this.appId = this.ctx.appId
|
|
187
|
-
}
|
|
214
|
+
constructor({ user, oldTable, dataImport }) {
|
|
215
|
+
this.db = getAppDB()
|
|
216
|
+
this.user = user
|
|
188
217
|
this.oldTable = oldTable
|
|
189
218
|
this.dataImport = dataImport
|
|
190
219
|
// any rows that need updated
|
|
@@ -202,24 +231,15 @@ class TableSaveFunctions {
|
|
|
202
231
|
|
|
203
232
|
// when confirmed valid
|
|
204
233
|
async mid(table) {
|
|
205
|
-
let response = await exports.checkForColumnUpdates(
|
|
206
|
-
this.db,
|
|
207
|
-
this.oldTable,
|
|
208
|
-
table
|
|
209
|
-
)
|
|
234
|
+
let response = await exports.checkForColumnUpdates(this.oldTable, table)
|
|
210
235
|
this.rows = this.rows.concat(response.rows)
|
|
211
236
|
return table
|
|
212
237
|
}
|
|
213
238
|
|
|
214
239
|
// after saving
|
|
215
240
|
async after(table) {
|
|
216
|
-
table = await exports.handleSearchIndexes(
|
|
217
|
-
table = await exports.handleDataImport(
|
|
218
|
-
this.appId,
|
|
219
|
-
this.ctx.user,
|
|
220
|
-
table,
|
|
221
|
-
this.dataImport
|
|
222
|
-
)
|
|
241
|
+
table = await exports.handleSearchIndexes(table)
|
|
242
|
+
table = await exports.handleDataImport(this.user, table, this.dataImport)
|
|
223
243
|
return table
|
|
224
244
|
}
|
|
225
245
|
|
|
@@ -228,8 +248,22 @@ class TableSaveFunctions {
|
|
|
228
248
|
}
|
|
229
249
|
}
|
|
230
250
|
|
|
231
|
-
exports.
|
|
232
|
-
const db =
|
|
251
|
+
exports.getAllInternalTables = async () => {
|
|
252
|
+
const db = getAppDB()
|
|
253
|
+
const internalTables = await db.allDocs(
|
|
254
|
+
getTableParams(null, {
|
|
255
|
+
include_docs: true,
|
|
256
|
+
})
|
|
257
|
+
)
|
|
258
|
+
return internalTables.rows.map(tableDoc => ({
|
|
259
|
+
...tableDoc.doc,
|
|
260
|
+
type: "internal",
|
|
261
|
+
sourceId: BudibaseInternalDB._id,
|
|
262
|
+
}))
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
exports.getAllExternalTables = async datasourceId => {
|
|
266
|
+
const db = getAppDB()
|
|
233
267
|
const datasource = await db.get(datasourceId)
|
|
234
268
|
if (!datasource || !datasource.entities) {
|
|
235
269
|
throw "Datasource is not configured fully."
|
|
@@ -237,23 +271,25 @@ exports.getAllExternalTables = async (appId, datasourceId) => {
|
|
|
237
271
|
return datasource.entities
|
|
238
272
|
}
|
|
239
273
|
|
|
240
|
-
exports.getExternalTable = async (
|
|
241
|
-
const entities = await exports.getAllExternalTables(
|
|
274
|
+
exports.getExternalTable = async (datasourceId, tableName) => {
|
|
275
|
+
const entities = await exports.getAllExternalTables(datasourceId)
|
|
242
276
|
return entities[tableName]
|
|
243
277
|
}
|
|
244
278
|
|
|
245
|
-
exports.getTable = async
|
|
246
|
-
const db =
|
|
279
|
+
exports.getTable = async tableId => {
|
|
280
|
+
const db = getAppDB()
|
|
247
281
|
if (isExternalTable(tableId)) {
|
|
248
282
|
let { datasourceId, tableName } = breakExternalTableId(tableId)
|
|
249
|
-
|
|
283
|
+
const datasource = await db.get(datasourceId)
|
|
284
|
+
const table = await exports.getExternalTable(datasourceId, tableName)
|
|
285
|
+
return { ...table, sql: isSQL(datasource) }
|
|
250
286
|
} else {
|
|
251
287
|
return db.get(tableId)
|
|
252
288
|
}
|
|
253
289
|
}
|
|
254
290
|
|
|
255
|
-
exports.checkForViewUpdates = async (
|
|
256
|
-
const views = await getViews(
|
|
291
|
+
exports.checkForViewUpdates = async (table, rename, deletedColumns) => {
|
|
292
|
+
const views = await getViews()
|
|
257
293
|
const tableViews = views.filter(view => view.meta.tableId === table._id)
|
|
258
294
|
|
|
259
295
|
// Check each table view to see if impacted by this table action
|
|
@@ -315,7 +351,7 @@ exports.checkForViewUpdates = async (db, table, rename, deletedColumns) => {
|
|
|
315
351
|
// Update view if required
|
|
316
352
|
if (needsUpdated) {
|
|
317
353
|
const newViewTemplate = viewTemplate(view.meta)
|
|
318
|
-
await saveView(
|
|
354
|
+
await saveView(null, view.name, newViewTemplate)
|
|
319
355
|
if (!newViewTemplate.meta.schema) {
|
|
320
356
|
newViewTemplate.meta.schema = table.schema
|
|
321
357
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const CouchDB = require("../../db")
|
|
2
1
|
const {
|
|
3
2
|
generateUserMetadataID,
|
|
4
3
|
getUserMetadataParams,
|
|
@@ -11,12 +10,14 @@ const { isEqual } = require("lodash")
|
|
|
11
10
|
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
|
|
12
11
|
const {
|
|
13
12
|
getDevelopmentAppID,
|
|
14
|
-
|
|
13
|
+
getProdAppIDs,
|
|
14
|
+
dbExists,
|
|
15
15
|
} = require("@budibase/backend-core/db")
|
|
16
|
-
const { doesDatabaseExist } = require("../../utilities")
|
|
17
16
|
const { UserStatus } = require("@budibase/backend-core/constants")
|
|
17
|
+
const { getAppDB, doInAppContext } = require("@budibase/backend-core/context")
|
|
18
18
|
|
|
19
|
-
async function rawMetadata(
|
|
19
|
+
async function rawMetadata() {
|
|
20
|
+
const db = getAppDB()
|
|
20
21
|
return (
|
|
21
22
|
await db.allDocs(
|
|
22
23
|
getUserMetadataParams(null, {
|
|
@@ -54,13 +55,10 @@ function combineMetadataAndUser(user, metadata) {
|
|
|
54
55
|
return null
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
exports.syncGlobalUsers = async
|
|
58
|
+
exports.syncGlobalUsers = async () => {
|
|
58
59
|
// sync user metadata
|
|
59
|
-
const db =
|
|
60
|
-
const [users, metadata] = await Promise.all([
|
|
61
|
-
getGlobalUsers(appId),
|
|
62
|
-
rawMetadata(db),
|
|
63
|
-
])
|
|
60
|
+
const db = getAppDB()
|
|
61
|
+
const [users, metadata] = await Promise.all([getGlobalUsers(), rawMetadata()])
|
|
64
62
|
const toWrite = []
|
|
65
63
|
for (let user of users) {
|
|
66
64
|
const combined = await combineMetadataAndUser(user, metadata)
|
|
@@ -94,7 +92,7 @@ exports.syncUser = async function (ctx) {
|
|
|
94
92
|
let prodAppIds
|
|
95
93
|
// if they are a builder then get all production app IDs
|
|
96
94
|
if ((user.builder && user.builder.global) || deleting) {
|
|
97
|
-
prodAppIds = await
|
|
95
|
+
prodAppIds = await getProdAppIDs()
|
|
98
96
|
} else {
|
|
99
97
|
prodAppIds = Object.entries(roles)
|
|
100
98
|
.filter(entry => entry[1] !== BUILTIN_ROLE_IDS.PUBLIC)
|
|
@@ -104,37 +102,39 @@ exports.syncUser = async function (ctx) {
|
|
|
104
102
|
const roleId = roles[prodAppId]
|
|
105
103
|
const devAppId = getDevelopmentAppID(prodAppId)
|
|
106
104
|
for (let appId of [prodAppId, devAppId]) {
|
|
107
|
-
if (!(await
|
|
105
|
+
if (!(await dbExists(appId))) {
|
|
108
106
|
continue
|
|
109
107
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
108
|
+
await doInAppContext(appId, async () => {
|
|
109
|
+
const db = getAppDB()
|
|
110
|
+
const metadataId = generateUserMetadataID(userId)
|
|
111
|
+
let metadata
|
|
112
|
+
try {
|
|
113
|
+
metadata = await db.get(metadataId)
|
|
114
|
+
} catch (err) {
|
|
115
|
+
if (deleting) {
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
metadata = {
|
|
119
|
+
tableId: InternalTables.USER_METADATA,
|
|
120
|
+
}
|
|
118
121
|
}
|
|
119
|
-
metadata
|
|
120
|
-
|
|
122
|
+
// assign the roleId for the metadata doc
|
|
123
|
+
if (roleId) {
|
|
124
|
+
metadata.roleId = roleId
|
|
121
125
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// if its null then there was no updates required
|
|
135
|
-
if (combined) {
|
|
136
|
-
await db.put(combined)
|
|
137
|
-
}
|
|
126
|
+
let combined = !deleting
|
|
127
|
+
? combineMetadataAndUser(user, metadata)
|
|
128
|
+
: {
|
|
129
|
+
...metadata,
|
|
130
|
+
status: UserStatus.INACTIVE,
|
|
131
|
+
metadata: BUILTIN_ROLE_IDS.PUBLIC,
|
|
132
|
+
}
|
|
133
|
+
// if its null then there was no updates required
|
|
134
|
+
if (combined) {
|
|
135
|
+
await db.put(combined)
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
ctx.body = {
|
|
@@ -143,8 +143,8 @@ exports.syncUser = async function (ctx) {
|
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
exports.fetchMetadata = async function (ctx) {
|
|
146
|
-
const database =
|
|
147
|
-
const global = await getGlobalUsers(
|
|
146
|
+
const database = getAppDB()
|
|
147
|
+
const global = await getGlobalUsers()
|
|
148
148
|
const metadata = await rawMetadata(database)
|
|
149
149
|
const users = []
|
|
150
150
|
for (let user of global) {
|
|
@@ -167,12 +167,13 @@ exports.updateSelfMetadata = async function (ctx) {
|
|
|
167
167
|
ctx.request.body._id = ctx.user._id
|
|
168
168
|
// make sure no stale rev
|
|
169
169
|
delete ctx.request.body._rev
|
|
170
|
+
// make sure no csrf token
|
|
171
|
+
delete ctx.request.body.csrfToken
|
|
170
172
|
await exports.updateMetadata(ctx)
|
|
171
173
|
}
|
|
172
174
|
|
|
173
175
|
exports.updateMetadata = async function (ctx) {
|
|
174
|
-
const
|
|
175
|
-
const db = new CouchDB(appId)
|
|
176
|
+
const db = getAppDB()
|
|
176
177
|
const user = ctx.request.body
|
|
177
178
|
// this isn't applicable to the user
|
|
178
179
|
delete user.roles
|
|
@@ -184,7 +185,7 @@ exports.updateMetadata = async function (ctx) {
|
|
|
184
185
|
}
|
|
185
186
|
|
|
186
187
|
exports.destroyMetadata = async function (ctx) {
|
|
187
|
-
const db =
|
|
188
|
+
const db = getAppDB()
|
|
188
189
|
try {
|
|
189
190
|
const dbUser = await db.get(ctx.params.id)
|
|
190
191
|
await db.remove(dbUser._id, dbUser._rev)
|
|
@@ -207,7 +208,7 @@ exports.setFlag = async function (ctx) {
|
|
|
207
208
|
ctx.throw(400, "Must supply a 'flag' field in request body.")
|
|
208
209
|
}
|
|
209
210
|
const flagDocId = generateUserFlagID(userId)
|
|
210
|
-
const db =
|
|
211
|
+
const db = getAppDB()
|
|
211
212
|
let doc
|
|
212
213
|
try {
|
|
213
214
|
doc = await db.get(flagDocId)
|
|
@@ -222,7 +223,7 @@ exports.setFlag = async function (ctx) {
|
|
|
222
223
|
exports.getFlags = async function (ctx) {
|
|
223
224
|
const userId = ctx.user._id
|
|
224
225
|
const docId = generateUserFlagID(userId)
|
|
225
|
-
const db =
|
|
226
|
+
const db = getAppDB()
|
|
226
227
|
let doc
|
|
227
228
|
try {
|
|
228
229
|
doc = await db.get(docId)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const CouchDB = require("../../../db")
|
|
2
1
|
const viewTemplate = require("./viewBuilder")
|
|
3
2
|
const { apiFileReturn } = require("../../../utilities/fileSystem")
|
|
4
3
|
const exporters = require("./exporters")
|
|
@@ -6,14 +5,14 @@ const { saveView, getView, getViews, deleteView } = require("./utils")
|
|
|
6
5
|
const { fetchView } = require("../row")
|
|
7
6
|
const { getTable } = require("../table/utils")
|
|
8
7
|
const { FieldTypes } = require("../../../constants")
|
|
8
|
+
const { getAppDB } = require("@budibase/backend-core/context")
|
|
9
9
|
|
|
10
10
|
exports.fetch = async ctx => {
|
|
11
|
-
|
|
12
|
-
ctx.body = await getViews(db)
|
|
11
|
+
ctx.body = await getViews()
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
exports.save = async ctx => {
|
|
16
|
-
const db =
|
|
15
|
+
const db = getAppDB()
|
|
17
16
|
const { originalName, ...viewToSave } = ctx.request.body
|
|
18
17
|
const view = viewTemplate(viewToSave)
|
|
19
18
|
|
|
@@ -21,7 +20,7 @@ exports.save = async ctx => {
|
|
|
21
20
|
ctx.throw(400, "Cannot create view without a name")
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
await saveView(
|
|
23
|
+
await saveView(originalName, viewToSave.name, view)
|
|
25
24
|
|
|
26
25
|
// add views to table document
|
|
27
26
|
const table = await db.get(ctx.request.body.tableId)
|
|
@@ -42,9 +41,9 @@ exports.save = async ctx => {
|
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
exports.destroy = async ctx => {
|
|
45
|
-
const db =
|
|
44
|
+
const db = getAppDB()
|
|
46
45
|
const viewName = decodeURI(ctx.params.viewName)
|
|
47
|
-
const view = await deleteView(
|
|
46
|
+
const view = await deleteView(viewName)
|
|
48
47
|
const table = await db.get(view.meta.tableId)
|
|
49
48
|
delete table.views[viewName]
|
|
50
49
|
await db.put(table)
|
|
@@ -53,9 +52,8 @@ exports.destroy = async ctx => {
|
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
exports.exportView = async ctx => {
|
|
56
|
-
const db = new CouchDB(ctx.appId)
|
|
57
55
|
const viewName = decodeURI(ctx.query.view)
|
|
58
|
-
const view = await getView(
|
|
56
|
+
const view = await getView(viewName)
|
|
59
57
|
|
|
60
58
|
const format = ctx.query.format
|
|
61
59
|
if (!format || !Object.values(exporters.ExportFormats).includes(format)) {
|
|
@@ -83,7 +81,7 @@ exports.exportView = async ctx => {
|
|
|
83
81
|
let schema = view && view.meta && view.meta.schema
|
|
84
82
|
if (!schema) {
|
|
85
83
|
const tableId = ctx.params.tableId || view.meta.tableId
|
|
86
|
-
const table = await getTable(
|
|
84
|
+
const table = await getTable(tableId)
|
|
87
85
|
schema = table.schema
|
|
88
86
|
}
|
|
89
87
|
|
|
@@ -6,8 +6,10 @@ const {
|
|
|
6
6
|
SEPARATOR,
|
|
7
7
|
} = require("../../../db/utils")
|
|
8
8
|
const env = require("../../../environment")
|
|
9
|
+
const { getAppDB } = require("@budibase/backend-core/context")
|
|
9
10
|
|
|
10
|
-
exports.getView = async
|
|
11
|
+
exports.getView = async viewName => {
|
|
12
|
+
const db = getAppDB()
|
|
11
13
|
if (env.SELF_HOSTED) {
|
|
12
14
|
const designDoc = await db.get("_design/database")
|
|
13
15
|
return designDoc.views[viewName]
|
|
@@ -22,7 +24,8 @@ exports.getView = async (db, viewName) => {
|
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
exports.getViews = async
|
|
27
|
+
exports.getViews = async () => {
|
|
28
|
+
const db = getAppDB()
|
|
26
29
|
const response = []
|
|
27
30
|
if (env.SELF_HOSTED) {
|
|
28
31
|
const designDoc = await db.get("_design/database")
|
|
@@ -54,7 +57,8 @@ exports.getViews = async db => {
|
|
|
54
57
|
return response
|
|
55
58
|
}
|
|
56
59
|
|
|
57
|
-
exports.saveView = async (
|
|
60
|
+
exports.saveView = async (originalName, viewName, viewTemplate) => {
|
|
61
|
+
const db = getAppDB()
|
|
58
62
|
if (env.SELF_HOSTED) {
|
|
59
63
|
const designDoc = await db.get("_design/database")
|
|
60
64
|
designDoc.views = {
|
|
@@ -91,7 +95,8 @@ exports.saveView = async (db, originalName, viewName, viewTemplate) => {
|
|
|
91
95
|
}
|
|
92
96
|
}
|
|
93
97
|
|
|
94
|
-
exports.deleteView = async
|
|
98
|
+
exports.deleteView = async viewName => {
|
|
99
|
+
const db = getAppDB()
|
|
95
100
|
if (env.SELF_HOSTED) {
|
|
96
101
|
const designDoc = await db.get("_design/database")
|
|
97
102
|
const view = designDoc.views[viewName]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const CouchDB = require("../../db")
|
|
2
1
|
const { generateWebhookID, getWebhookParams } = require("../../db/utils")
|
|
3
2
|
const toJsonSchema = require("to-json-schema")
|
|
4
3
|
const validate = require("jsonschema").validate
|
|
5
4
|
const triggers = require("../../automations/triggers")
|
|
6
|
-
const {
|
|
5
|
+
const { getProdAppID } = require("@budibase/backend-core/db")
|
|
6
|
+
const { getAppDB, updateAppId } = require("@budibase/backend-core/context")
|
|
7
7
|
|
|
8
8
|
const AUTOMATION_DESCRIPTION = "Generated from Webhook Schema"
|
|
9
9
|
|
|
@@ -23,7 +23,7 @@ exports.WebhookType = {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
exports.fetch = async ctx => {
|
|
26
|
-
const db =
|
|
26
|
+
const db = getAppDB()
|
|
27
27
|
const response = await db.allDocs(
|
|
28
28
|
getWebhookParams(null, {
|
|
29
29
|
include_docs: true,
|
|
@@ -33,7 +33,7 @@ exports.fetch = async ctx => {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
exports.save = async ctx => {
|
|
36
|
-
const db =
|
|
36
|
+
const db = getAppDB()
|
|
37
37
|
const webhook = ctx.request.body
|
|
38
38
|
webhook.appId = ctx.appId
|
|
39
39
|
|
|
@@ -52,12 +52,13 @@ exports.save = async ctx => {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
exports.destroy = async ctx => {
|
|
55
|
-
const db =
|
|
55
|
+
const db = getAppDB()
|
|
56
56
|
ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
exports.buildSchema = async ctx => {
|
|
60
|
-
|
|
60
|
+
updateAppId(ctx.params.instance)
|
|
61
|
+
const db = getAppDB()
|
|
61
62
|
const webhook = await db.get(ctx.params.id)
|
|
62
63
|
webhook.bodySchema = toJsonSchema(ctx.request.body)
|
|
63
64
|
// update the automation outputs
|
|
@@ -81,9 +82,10 @@ exports.buildSchema = async ctx => {
|
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
exports.trigger = async ctx => {
|
|
84
|
-
const prodAppId =
|
|
85
|
+
const prodAppId = getProdAppID(ctx.params.instance)
|
|
86
|
+
updateAppId(prodAppId)
|
|
85
87
|
try {
|
|
86
|
-
const db =
|
|
88
|
+
const db = getAppDB()
|
|
87
89
|
const webhook = await db.get(ctx.params.id)
|
|
88
90
|
// validate against the schema
|
|
89
91
|
if (webhook.bodySchema) {
|
package/src/api/routes/index.js
CHANGED
|
@@ -20,11 +20,11 @@ const integrationRoutes = require("./integration")
|
|
|
20
20
|
const permissionRoutes = require("./permission")
|
|
21
21
|
const datasourceRoutes = require("./datasource")
|
|
22
22
|
const queryRoutes = require("./query")
|
|
23
|
-
const hostingRoutes = require("./hosting")
|
|
24
23
|
const backupRoutes = require("./backup")
|
|
25
24
|
const metadataRoutes = require("./metadata")
|
|
26
25
|
const devRoutes = require("./dev")
|
|
27
26
|
const cloudRoutes = require("./cloud")
|
|
27
|
+
const migrationRoutes = require("./migrations")
|
|
28
28
|
|
|
29
29
|
exports.mainRoutes = [
|
|
30
30
|
authRoutes,
|
|
@@ -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,6 +54,7 @@ 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
|
|
|
60
60
|
exports.staticRoutes = staticRoutes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const Router = require("@koa/router")
|
|
2
|
+
const migrationsController = require("../controllers/migrations")
|
|
3
|
+
const router = Router()
|
|
4
|
+
const { internalApi } = require("@budibase/backend-core/auth")
|
|
5
|
+
|
|
6
|
+
router
|
|
7
|
+
.post("/api/migrations/run", internalApi, migrationsController.migrate)
|
|
8
|
+
.get(
|
|
9
|
+
"/api/migrations/definitions",
|
|
10
|
+
internalApi,
|
|
11
|
+
migrationsController.fetchDefinitions
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
module.exports = router
|
package/src/api/routes/static.js
CHANGED
|
@@ -46,5 +46,10 @@ router
|
|
|
46
46
|
)
|
|
47
47
|
// TODO: this likely needs to be secured in some way
|
|
48
48
|
.get("/:appId/:path*", controller.serveApp)
|
|
49
|
+
.post(
|
|
50
|
+
"/api/attachments/:datasourceId/url",
|
|
51
|
+
authorized(PermissionTypes.TABLE, PermissionLevels.READ),
|
|
52
|
+
controller.getSignedUploadURL
|
|
53
|
+
)
|
|
49
54
|
|
|
50
55
|
module.exports = router
|
|
@@ -53,8 +53,8 @@ describe("/applications", () => {
|
|
|
53
53
|
|
|
54
54
|
describe("fetch", () => {
|
|
55
55
|
it("lists all applications", async () => {
|
|
56
|
-
await config.createApp(
|
|
57
|
-
await config.createApp(
|
|
56
|
+
await config.createApp("app1")
|
|
57
|
+
await config.createApp("app2")
|
|
58
58
|
|
|
59
59
|
const res = await request
|
|
60
60
|
.get(`/api/applications?status=${AppStatus.DEV}`)
|
|
@@ -13,10 +13,9 @@ describe("/authenticate", () => {
|
|
|
13
13
|
|
|
14
14
|
describe("fetch self", () => {
|
|
15
15
|
it("should be able to fetch self", async () => {
|
|
16
|
-
const headers = await config.login()
|
|
17
16
|
const res = await request
|
|
18
17
|
.get(`/api/self`)
|
|
19
|
-
.set(
|
|
18
|
+
.set(config.defaultHeaders())
|
|
20
19
|
.expect("Content-Type", /json/)
|
|
21
20
|
.expect(200)
|
|
22
21
|
expect(res.body._id).toEqual(generateUserMetadataID("us_uuid1"))
|
|
@@ -145,6 +145,7 @@ describe("/automations", () => {
|
|
|
145
145
|
let table = await config.createTable()
|
|
146
146
|
automation.definition.trigger.inputs.tableId = table._id
|
|
147
147
|
automation.definition.steps[0].inputs.row.tableId = table._id
|
|
148
|
+
automation.appId = config.appId
|
|
148
149
|
automation = await config.createAutomation(automation)
|
|
149
150
|
await setup.delay(500)
|
|
150
151
|
const res = await testAutomation(config, automation)
|