@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
|
@@ -12,9 +12,50 @@ const { getUserRoleHierarchy, getRequiredResourceRole, BUILTIN_ROLE_IDS, } = req
|
|
|
12
12
|
const { PermissionTypes, doesHaveBasePermission, } = require("@budibase/backend-core/permissions");
|
|
13
13
|
const builderMiddleware = require("./builder");
|
|
14
14
|
const { isWebhookEndpoint } = require("./utils");
|
|
15
|
+
const { buildCsrfMiddleware } = require("@budibase/backend-core/auth");
|
|
16
|
+
const { getAppId } = require("@budibase/backend-core/context");
|
|
15
17
|
function hasResource(ctx) {
|
|
16
18
|
return ctx.resourceId != null;
|
|
17
19
|
}
|
|
20
|
+
const csrf = buildCsrfMiddleware();
|
|
21
|
+
/**
|
|
22
|
+
* Apply authorization to the requested resource:
|
|
23
|
+
* - If this is a builder resource the user must be a builder.
|
|
24
|
+
* - Builders can access all resources.
|
|
25
|
+
* - Otherwise the user must have the required role.
|
|
26
|
+
*/
|
|
27
|
+
const checkAuthorized = (ctx, resourceRoles, permType, permLevel) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
|
+
// check if this is a builder api and the user is not a builder
|
|
29
|
+
const isBuilder = ctx.user && ctx.user.builder && ctx.user.builder.global;
|
|
30
|
+
const isBuilderApi = permType === PermissionTypes.BUILDER;
|
|
31
|
+
if (isBuilderApi && !isBuilder) {
|
|
32
|
+
return ctx.throw(403, "Not Authorized");
|
|
33
|
+
}
|
|
34
|
+
// check for resource authorization
|
|
35
|
+
if (!isBuilder) {
|
|
36
|
+
yield checkAuthorizedResource(ctx, resourceRoles, permType, permLevel);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const checkAuthorizedResource = (ctx, resourceRoles, permType, permLevel) => __awaiter(void 0, void 0, void 0, function* () {
|
|
40
|
+
// get the user's roles
|
|
41
|
+
const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC;
|
|
42
|
+
const userRoles = yield getUserRoleHierarchy(roleId, {
|
|
43
|
+
idOnly: false,
|
|
44
|
+
});
|
|
45
|
+
const permError = "User does not have permission";
|
|
46
|
+
// check if the user has the required role
|
|
47
|
+
if (resourceRoles.length > 0) {
|
|
48
|
+
// deny access if the user doesn't have the required resource role
|
|
49
|
+
const found = userRoles.find(role => resourceRoles.indexOf(role._id) !== -1);
|
|
50
|
+
if (!found) {
|
|
51
|
+
ctx.throw(403, permError);
|
|
52
|
+
}
|
|
53
|
+
// fallback to the base permissions when no resource roles are found
|
|
54
|
+
}
|
|
55
|
+
else if (!doesHaveBasePermission(permType, permLevel, userRoles)) {
|
|
56
|
+
ctx.throw(403, permError);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
18
59
|
module.exports =
|
|
19
60
|
(permType, permLevel = null) => (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
61
|
// webhooks don't need authentication, each webhook unique
|
|
@@ -28,37 +69,23 @@ module.exports =
|
|
|
28
69
|
// check general builder stuff, this middleware is a good way
|
|
29
70
|
// to find API endpoints which are builder focused
|
|
30
71
|
yield builderMiddleware(ctx, permType);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return next();
|
|
37
|
-
}
|
|
38
|
-
else if (isBuilderApi && !isBuilder) {
|
|
39
|
-
return ctx.throw(403, "Not Authorized");
|
|
72
|
+
// get the resource roles
|
|
73
|
+
let resourceRoles = [];
|
|
74
|
+
const appId = getAppId();
|
|
75
|
+
if (appId && hasResource(ctx)) {
|
|
76
|
+
resourceRoles = yield getRequiredResourceRole(permLevel, ctx);
|
|
40
77
|
}
|
|
41
|
-
//
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
});
|
|
46
|
-
const permError = "User does not have permission";
|
|
47
|
-
let possibleRoleIds = [];
|
|
48
|
-
if (hasResource(ctx)) {
|
|
49
|
-
possibleRoleIds = yield getRequiredResourceRole(ctx.appId, permLevel, ctx);
|
|
50
|
-
}
|
|
51
|
-
// check if we found a role, if not fallback to base permissions
|
|
52
|
-
if (possibleRoleIds.length > 0) {
|
|
53
|
-
const found = hierarchy.find(role => possibleRoleIds.indexOf(role._id) !== -1);
|
|
54
|
-
return found ? next() : ctx.throw(403, permError);
|
|
55
|
-
}
|
|
56
|
-
else if (!doesHaveBasePermission(permType, permLevel, hierarchy)) {
|
|
57
|
-
ctx.throw(403, permError);
|
|
78
|
+
// if the resource is public, proceed
|
|
79
|
+
const isPublicResource = resourceRoles.includes(BUILTIN_ROLE_IDS.PUBLIC);
|
|
80
|
+
if (isPublicResource) {
|
|
81
|
+
return next();
|
|
58
82
|
}
|
|
59
|
-
//
|
|
60
|
-
if (!
|
|
61
|
-
ctx.throw(403, "Session not authenticated");
|
|
83
|
+
// check authenticated
|
|
84
|
+
if (!ctx.isAuthenticated) {
|
|
85
|
+
return ctx.throw(403, "Session not authenticated");
|
|
62
86
|
}
|
|
63
|
-
|
|
87
|
+
// check authorized
|
|
88
|
+
yield checkAuthorized(ctx, resourceRoles, permType, permLevel);
|
|
89
|
+
// csrf protection
|
|
90
|
+
return csrf(ctx, next);
|
|
64
91
|
});
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
const { APP_DEV_PREFIX } = require("../db/utils");
|
|
12
12
|
const { doesUserHaveLock, updateLock, checkDebounce, setDebounce, } = require("../utilities/redis");
|
|
13
|
-
const
|
|
13
|
+
const { getDB } = require("@budibase/backend-core/db");
|
|
14
14
|
const { DocumentTypes } = require("../db/utils");
|
|
15
15
|
const { PermissionTypes } = require("@budibase/backend-core/permissions");
|
|
16
16
|
const { app: appCache } = require("@budibase/backend-core/cache");
|
|
@@ -49,7 +49,7 @@ function updateAppUpdatedAt(ctx) {
|
|
|
49
49
|
if (ctx.method === "GET" || (yield checkDebounce(appId))) {
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
const db =
|
|
52
|
+
const db = getDB(appId);
|
|
53
53
|
const metadata = yield db.get(DocumentTypes.APP_METADATA);
|
|
54
54
|
metadata.updatedAt = new Date().toISOString();
|
|
55
55
|
const response = yield db.put(metadata);
|
|
@@ -16,9 +16,9 @@ const { generateUserMetadataID, isDevAppID } = require("../db/utils");
|
|
|
16
16
|
const { dbExists } = require("@budibase/backend-core/db");
|
|
17
17
|
const { isUserInAppTenant } = require("@budibase/backend-core/tenancy");
|
|
18
18
|
const { getCachedSelf } = require("../utilities/global");
|
|
19
|
-
const CouchDB = require("../db");
|
|
20
19
|
const env = require("../environment");
|
|
21
20
|
const { isWebhookEndpoint } = require("./utils");
|
|
21
|
+
const { doInAppContext } = require("@budibase/backend-core/context");
|
|
22
22
|
module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
23
|
// try to get the appID from the request
|
|
24
24
|
let requestAppId = getAppId(ctx);
|
|
@@ -36,7 +36,7 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
36
36
|
// check the app exists referenced in cookie
|
|
37
37
|
if (appCookie) {
|
|
38
38
|
const appId = appCookie.appId;
|
|
39
|
-
const exists = yield dbExists(
|
|
39
|
+
const exists = yield dbExists(appId);
|
|
40
40
|
if (!exists) {
|
|
41
41
|
clearCookie(ctx, Cookies.CurrentApp);
|
|
42
42
|
return next();
|
|
@@ -45,11 +45,13 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
45
45
|
requestAppId = requestAppId || appId;
|
|
46
46
|
}
|
|
47
47
|
// deny access to application preview
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
if (!env.isTest()) {
|
|
49
|
+
if (isDevAppID(requestAppId) &&
|
|
50
|
+
!isWebhookEndpoint(ctx) &&
|
|
51
|
+
(!ctx.user || !ctx.user.builder || !ctx.user.builder.global)) {
|
|
52
|
+
clearCookie(ctx, Cookies.CurrentApp);
|
|
53
|
+
return ctx.redirect("/");
|
|
54
|
+
}
|
|
53
55
|
}
|
|
54
56
|
let appId, roleId = BUILTIN_ROLE_IDS.PUBLIC;
|
|
55
57
|
if (!ctx.user) {
|
|
@@ -67,34 +69,36 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
67
69
|
if (!appId) {
|
|
68
70
|
return next();
|
|
69
71
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
72
|
+
return doInAppContext(appId, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
73
|
+
let noCookieSet = false;
|
|
74
|
+
// if the user not in the right tenant then make sure they have no permissions
|
|
75
|
+
// need to judge this only based on the request app ID,
|
|
76
|
+
if (env.MULTI_TENANCY &&
|
|
77
|
+
ctx.user &&
|
|
78
|
+
requestAppId &&
|
|
79
|
+
!isUserInAppTenant(requestAppId)) {
|
|
80
|
+
// don't error, simply remove the users rights (they are a public user)
|
|
81
|
+
delete ctx.user.builder;
|
|
82
|
+
delete ctx.user.admin;
|
|
83
|
+
delete ctx.user.roles;
|
|
84
|
+
roleId = BUILTIN_ROLE_IDS.PUBLIC;
|
|
85
|
+
noCookieSet = true;
|
|
86
|
+
}
|
|
87
|
+
ctx.appId = appId;
|
|
88
|
+
if (roleId) {
|
|
89
|
+
ctx.roleId = roleId;
|
|
90
|
+
const userId = ctx.user ? generateUserMetadataID(ctx.user._id) : null;
|
|
91
|
+
ctx.user = Object.assign(Object.assign({}, ctx.user), {
|
|
92
|
+
// override userID with metadata one
|
|
93
|
+
_id: userId, userId,
|
|
94
|
+
roleId, role: yield getRole(roleId) });
|
|
95
|
+
}
|
|
96
|
+
if ((requestAppId !== appId ||
|
|
97
|
+
appCookie == null ||
|
|
98
|
+
appCookie.appId !== requestAppId) &&
|
|
99
|
+
!noCookieSet) {
|
|
100
|
+
setCookie(ctx, { appId }, Cookies.CurrentApp);
|
|
101
|
+
}
|
|
102
|
+
return next();
|
|
103
|
+
}));
|
|
100
104
|
});
|
|
@@ -8,13 +8,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const CouchDB = require("../db");
|
|
12
11
|
const usageQuota = require("../utilities/usageQuota");
|
|
13
|
-
const
|
|
14
|
-
const { getTenantId } = require("@budibase/backend-core/tenancy");
|
|
12
|
+
const { getUniqueRows } = require("../utilities/usageQuota/rows");
|
|
15
13
|
const { isExternalTable, isRowId: isExternalRowId, } = require("../integrations/utils");
|
|
16
|
-
|
|
17
|
-
const EXCLUDED_TENANTS = ["bb", "default", "bbtest", "bbstaging"];
|
|
14
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
18
15
|
// currently only counting new writes and deletes
|
|
19
16
|
const METHOD_MAP = {
|
|
20
17
|
POST: 1,
|
|
@@ -22,13 +19,13 @@ const METHOD_MAP = {
|
|
|
22
19
|
};
|
|
23
20
|
const DOMAIN_MAP = {
|
|
24
21
|
rows: usageQuota.Properties.ROW,
|
|
25
|
-
upload: usageQuota.Properties.UPLOAD,
|
|
26
|
-
views: usageQuota.Properties.VIEW,
|
|
27
|
-
users: usageQuota.Properties.USER,
|
|
22
|
+
// upload: usageQuota.Properties.UPLOAD, // doesn't work yet
|
|
23
|
+
// views: usageQuota.Properties.VIEW, // doesn't work yet
|
|
24
|
+
// users: usageQuota.Properties.USER, // doesn't work yet
|
|
28
25
|
applications: usageQuota.Properties.APPS,
|
|
29
26
|
// this will not be updated by endpoint calls
|
|
30
27
|
// instead it will be updated by triggerInfo
|
|
31
|
-
automationRuns: usageQuota.Properties.AUTOMATION,
|
|
28
|
+
// automationRuns: usageQuota.Properties.AUTOMATION, // doesn't work yet
|
|
32
29
|
};
|
|
33
30
|
function getProperty(url) {
|
|
34
31
|
for (let domain of Object.keys(DOMAIN_MAP)) {
|
|
@@ -38,9 +35,7 @@ function getProperty(url) {
|
|
|
38
35
|
}
|
|
39
36
|
}
|
|
40
37
|
module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
41
|
-
|
|
42
|
-
// if in development or a self hosted cloud usage quotas should not be executed
|
|
43
|
-
if (env.isDev() || env.SELF_HOSTED || EXCLUDED_TENANTS.includes(tenantId)) {
|
|
38
|
+
if (!usageQuota.useQuotas()) {
|
|
44
39
|
return next();
|
|
45
40
|
}
|
|
46
41
|
let usage = METHOD_MAP[ctx.req.method];
|
|
@@ -53,7 +48,7 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
53
48
|
const usageId = ctx.request.body._id;
|
|
54
49
|
try {
|
|
55
50
|
if (ctx.appId) {
|
|
56
|
-
const db =
|
|
51
|
+
const db = getAppDB();
|
|
57
52
|
yield db.get(usageId);
|
|
58
53
|
}
|
|
59
54
|
return next();
|
|
@@ -78,10 +73,82 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
78
73
|
usage = files.map(file => file.size).reduce((total, size) => total + size);
|
|
79
74
|
}
|
|
80
75
|
try {
|
|
81
|
-
yield
|
|
82
|
-
return next();
|
|
76
|
+
yield performRequest(ctx, next, property, usage);
|
|
83
77
|
}
|
|
84
78
|
catch (err) {
|
|
85
79
|
ctx.throw(400, err);
|
|
86
80
|
}
|
|
87
81
|
});
|
|
82
|
+
const performRequest = (ctx, next, property, usage) => __awaiter(void 0, void 0, void 0, function* () {
|
|
83
|
+
const usageContext = {
|
|
84
|
+
skipNext: false,
|
|
85
|
+
skipUsage: false,
|
|
86
|
+
[usageQuota.Properties.APPS]: {},
|
|
87
|
+
};
|
|
88
|
+
if (usage === -1) {
|
|
89
|
+
if (PRE_DELETE[property]) {
|
|
90
|
+
yield PRE_DELETE[property](ctx, usageContext);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
if (PRE_CREATE[property]) {
|
|
95
|
+
yield PRE_CREATE[property](ctx, usageContext);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// run the request
|
|
99
|
+
if (!usageContext.skipNext) {
|
|
100
|
+
yield usageQuota.update(property, usage, { dryRun: true });
|
|
101
|
+
yield next();
|
|
102
|
+
}
|
|
103
|
+
if (usage === -1) {
|
|
104
|
+
if (POST_DELETE[property]) {
|
|
105
|
+
yield POST_DELETE[property](ctx, usageContext);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
if (POST_CREATE[property]) {
|
|
110
|
+
yield POST_CREATE[property](ctx, usageContext);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// update the usage
|
|
114
|
+
if (!usageContext.skipUsage) {
|
|
115
|
+
yield usageQuota.update(property, usage);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const appPreDelete = (ctx, usageContext) => __awaiter(void 0, void 0, void 0, function* () {
|
|
119
|
+
if (ctx.query.unpublish) {
|
|
120
|
+
// don't run usage decrement for unpublish
|
|
121
|
+
usageContext.skipUsage = true;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// store the row count to delete
|
|
125
|
+
const rows = yield getUniqueRows([ctx.appId]);
|
|
126
|
+
if (rows.length) {
|
|
127
|
+
usageContext[usageQuota.Properties.APPS] = { rowCount: rows.length };
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
const appPostDelete = (ctx, usageContext) => __awaiter(void 0, void 0, void 0, function* () {
|
|
131
|
+
// delete the app rows from usage
|
|
132
|
+
const rowCount = usageContext[usageQuota.Properties.APPS].rowCount;
|
|
133
|
+
if (rowCount) {
|
|
134
|
+
yield usageQuota.update(usageQuota.Properties.ROW, -rowCount);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
const appPostCreate = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
138
|
+
// app import & template creation
|
|
139
|
+
if (ctx.request.body.useTemplate === "true") {
|
|
140
|
+
const rows = yield getUniqueRows([ctx.response.body.appId]);
|
|
141
|
+
const rowCount = rows ? rows.length : 0;
|
|
142
|
+
yield usageQuota.update(usageQuota.Properties.ROW, rowCount);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
const PRE_DELETE = {
|
|
146
|
+
[usageQuota.Properties.APPS]: appPreDelete,
|
|
147
|
+
};
|
|
148
|
+
const POST_DELETE = {
|
|
149
|
+
[usageQuota.Properties.APPS]: appPostDelete,
|
|
150
|
+
};
|
|
151
|
+
const PRE_CREATE = {};
|
|
152
|
+
const POST_CREATE = {
|
|
153
|
+
[usageQuota.Properties.APPS]: appPostCreate,
|
|
154
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.run = void 0;
|
|
13
|
+
const { DocumentTypes } = require("@budibase/backend-core/db");
|
|
14
|
+
const application_1 = require("../../api/controllers/application");
|
|
15
|
+
/**
|
|
16
|
+
* Date:
|
|
17
|
+
* January 2022
|
|
18
|
+
*
|
|
19
|
+
* Description:
|
|
20
|
+
* Add the url to the app metadata if it doesn't exist
|
|
21
|
+
*/
|
|
22
|
+
const run = (appDb) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
+
let metadata;
|
|
24
|
+
try {
|
|
25
|
+
metadata = yield appDb.get(DocumentTypes.APP_METADATA);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
// sometimes the metadata document doesn't exist
|
|
29
|
+
// exit early instead of failing the migration
|
|
30
|
+
console.error("Error retrieving app metadata. Skipping", e);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!metadata.url) {
|
|
34
|
+
const context = {
|
|
35
|
+
request: {
|
|
36
|
+
body: {
|
|
37
|
+
name: metadata.name,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
metadata.url = application_1.getAppUrl(context);
|
|
42
|
+
console.log(`Adding url to app: ${metadata.url}`);
|
|
43
|
+
yield appDb.put(metadata);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
exports.run = run;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.run = void 0;
|
|
32
|
+
const usageQuotas_1 = require("./usageQuotas");
|
|
33
|
+
const syncApps = __importStar(require("./usageQuotas/syncApps"));
|
|
34
|
+
const syncRows = __importStar(require("./usageQuotas/syncRows"));
|
|
35
|
+
/**
|
|
36
|
+
* Date:
|
|
37
|
+
* January 2022
|
|
38
|
+
*
|
|
39
|
+
* Description:
|
|
40
|
+
* Synchronise the app and row quotas to the state of the db after it was
|
|
41
|
+
* discovered that the quota resets were still in place and the row quotas
|
|
42
|
+
* weren't being decremented correctly.
|
|
43
|
+
*/
|
|
44
|
+
const run = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
45
|
+
yield usageQuotas_1.runQuotaMigration(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
46
|
+
yield syncApps.run();
|
|
47
|
+
yield syncRows.run();
|
|
48
|
+
}));
|
|
49
|
+
});
|
|
50
|
+
exports.run = run;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.runQuotaMigration = void 0;
|
|
13
|
+
const { useQuotas } = require("../../../utilities/usageQuota");
|
|
14
|
+
const runQuotaMigration = (migration) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
if (!useQuotas()) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
yield migration();
|
|
19
|
+
});
|
|
20
|
+
exports.runQuotaMigration = runQuotaMigration;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.run = void 0;
|
|
13
|
+
const tenancy_1 = require("@budibase/backend-core/tenancy");
|
|
14
|
+
const db_1 = require("@budibase/backend-core/db");
|
|
15
|
+
const usageQuota_1 = require("../../../utilities/usageQuota");
|
|
16
|
+
const run = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
const db = tenancy_1.getGlobalDB();
|
|
18
|
+
// get app count
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
const devApps = yield db_1.getAllApps({ dev: true });
|
|
21
|
+
const appCount = devApps ? devApps.length : 0;
|
|
22
|
+
// sync app count
|
|
23
|
+
const tenantId = tenancy_1.getTenantId();
|
|
24
|
+
console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`);
|
|
25
|
+
const usageDoc = yield usageQuota_1.getUsageQuotaDoc(db);
|
|
26
|
+
usageDoc.usageQuota.apps = appCount;
|
|
27
|
+
yield db.put(usageDoc);
|
|
28
|
+
});
|
|
29
|
+
exports.run = run;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.run = void 0;
|
|
13
|
+
const tenancy_1 = require("@budibase/backend-core/tenancy");
|
|
14
|
+
const db_1 = require("@budibase/backend-core/db");
|
|
15
|
+
const usageQuota_1 = require("../../../utilities/usageQuota");
|
|
16
|
+
const rows_1 = require("../../../utilities/usageQuota/rows");
|
|
17
|
+
const run = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
+
const db = tenancy_1.getGlobalDB();
|
|
19
|
+
// get all rows in all apps
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
const allApps = yield db_1.getAllApps({ all: true });
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
const appIds = allApps ? allApps.map((app) => app.appId) : [];
|
|
24
|
+
const rows = yield rows_1.getUniqueRows(appIds);
|
|
25
|
+
const rowCount = rows ? rows.length : 0;
|
|
26
|
+
// sync row count
|
|
27
|
+
const tenantId = tenancy_1.getTenantId();
|
|
28
|
+
console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`);
|
|
29
|
+
const usageDoc = yield usageQuota_1.getUsageQuotaDoc(db);
|
|
30
|
+
usageDoc.usageQuota.rows = rowCount;
|
|
31
|
+
yield db.put(usageDoc);
|
|
32
|
+
});
|
|
33
|
+
exports.run = run;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.run = void 0;
|
|
13
|
+
const { createUserEmailView } = require("@budibase/backend-core/db");
|
|
14
|
+
/**
|
|
15
|
+
* Date:
|
|
16
|
+
* October 2021
|
|
17
|
+
*
|
|
18
|
+
* Description:
|
|
19
|
+
* Recreate the user email view to include latest changes i.e. lower casing the email address
|
|
20
|
+
*/
|
|
21
|
+
const run = (db) => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
|
+
yield createUserEmailView(db);
|
|
23
|
+
});
|
|
24
|
+
exports.run = run;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
|
+
};
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.migrate = exports.MIGRATIONS = void 0;
|
|
35
|
+
const db_1 = __importDefault(require("../db"));
|
|
36
|
+
const { MIGRATION_TYPES, runMigrations, } = require("@budibase/backend-core/migrations");
|
|
37
|
+
// migration functions
|
|
38
|
+
const userEmailViewCasing = __importStar(require("./functions/userEmailViewCasing"));
|
|
39
|
+
const quota1 = __importStar(require("./functions/quotas1"));
|
|
40
|
+
const appUrls = __importStar(require("./functions/appUrls"));
|
|
41
|
+
exports.MIGRATIONS = [
|
|
42
|
+
{
|
|
43
|
+
type: MIGRATION_TYPES.GLOBAL,
|
|
44
|
+
name: "user_email_view_casing",
|
|
45
|
+
fn: userEmailViewCasing.run,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
type: MIGRATION_TYPES.GLOBAL,
|
|
49
|
+
name: "quotas_1",
|
|
50
|
+
fn: quota1.run,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: MIGRATION_TYPES.APP,
|
|
54
|
+
name: "app_urls",
|
|
55
|
+
opts: { all: true },
|
|
56
|
+
fn: appUrls.run,
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
const migrate = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
+
yield runMigrations(db_1.default, exports.MIGRATIONS, options);
|
|
61
|
+
});
|
|
62
|
+
exports.migrate = migrate;
|