@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
|
@@ -22,19 +22,21 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
23
|
const datasource_1 = require("../../../definitions/datasource");
|
|
24
24
|
const utils_1 = require("../../../integrations/utils");
|
|
25
|
+
const utils_2 = require("./utils");
|
|
26
|
+
const constants_1 = require("../../../constants");
|
|
27
|
+
const utils_3 = require("../../../integrations/utils");
|
|
28
|
+
const string_templates_1 = require("@budibase/string-templates");
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
const fp_1 = require("lodash/fp");
|
|
31
|
+
const utils_4 = require("../../../utilities/rowProcessor/utils");
|
|
32
|
+
// @ts-ignore
|
|
33
|
+
const context_1 = require("@budibase/backend-core/context");
|
|
25
34
|
var External;
|
|
26
35
|
(function (External) {
|
|
27
|
-
const { getDatasourceAndQuery } = require("./utils");
|
|
28
|
-
const { DataSourceOperation, FieldTypes, RelationshipTypes, } = require("../../../constants");
|
|
29
|
-
const { breakExternalTableId, isSQL } = require("../../../integrations/utils");
|
|
30
|
-
const { processObjectSync } = require("@budibase/string-templates");
|
|
31
|
-
const { cloneDeep } = require("lodash/fp");
|
|
32
|
-
const CouchDB = require("../../../db");
|
|
33
|
-
const { processFormulas } = require("../../../utilities/rowProcessor/utils");
|
|
34
36
|
function buildFilters(id, filters, table) {
|
|
35
37
|
const primary = table.primary;
|
|
36
38
|
// if passed in array need to copy for shifting etc
|
|
37
|
-
let idCopy = cloneDeep(id);
|
|
39
|
+
let idCopy = fp_1.cloneDeep(id);
|
|
38
40
|
if (filters) {
|
|
39
41
|
// need to map over the filters and make sure the _id field isn't present
|
|
40
42
|
for (let filter of Object.values(filters)) {
|
|
@@ -77,10 +79,10 @@ var External;
|
|
|
77
79
|
*/
|
|
78
80
|
function cleanupConfig(config, table) {
|
|
79
81
|
const primaryOptions = [
|
|
80
|
-
FieldTypes.STRING,
|
|
81
|
-
FieldTypes.LONGFORM,
|
|
82
|
-
FieldTypes.OPTIONS,
|
|
83
|
-
FieldTypes.NUMBER,
|
|
82
|
+
constants_1.FieldTypes.STRING,
|
|
83
|
+
constants_1.FieldTypes.LONGFORM,
|
|
84
|
+
constants_1.FieldTypes.OPTIONS,
|
|
85
|
+
constants_1.FieldTypes.NUMBER,
|
|
84
86
|
];
|
|
85
87
|
// filter out fields which cannot be keys
|
|
86
88
|
const fieldNames = Object.entries(table.schema)
|
|
@@ -133,7 +135,7 @@ var External;
|
|
|
133
135
|
if (!tableId) {
|
|
134
136
|
return {};
|
|
135
137
|
}
|
|
136
|
-
const { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
138
|
+
const { datasourceId, tableName } = utils_3.breakExternalTableId(tableId);
|
|
137
139
|
return {
|
|
138
140
|
datasourceId,
|
|
139
141
|
entityId: tableName,
|
|
@@ -153,11 +155,11 @@ var External;
|
|
|
153
155
|
thisRow._id = generateIdForRow(row, table);
|
|
154
156
|
thisRow.tableId = table._id;
|
|
155
157
|
thisRow._rev = "rev";
|
|
156
|
-
return thisRow;
|
|
158
|
+
return utils_4.processFormulas(table, thisRow);
|
|
157
159
|
}
|
|
158
160
|
function fixArrayTypes(row, table) {
|
|
159
161
|
for (let [fieldName, schema] of Object.entries(table.schema)) {
|
|
160
|
-
if (schema.type === FieldTypes.ARRAY &&
|
|
162
|
+
if (schema.type === constants_1.FieldTypes.ARRAY &&
|
|
161
163
|
typeof row[fieldName] === "string") {
|
|
162
164
|
try {
|
|
163
165
|
row[fieldName] = JSON.parse(row[fieldName]);
|
|
@@ -174,9 +176,8 @@ var External;
|
|
|
174
176
|
return (field.relationshipType && field.relationshipType.split("-")[0] === "one");
|
|
175
177
|
}
|
|
176
178
|
class ExternalRequest {
|
|
177
|
-
constructor(
|
|
179
|
+
constructor(operation, tableId, datasource) {
|
|
178
180
|
this.tables = {};
|
|
179
|
-
this.appId = appId;
|
|
180
181
|
this.operation = operation;
|
|
181
182
|
this.tableId = tableId;
|
|
182
183
|
this.datasource = datasource;
|
|
@@ -188,8 +189,10 @@ var External;
|
|
|
188
189
|
if (!tableId) {
|
|
189
190
|
throw "Table ID is unknown, cannot find table";
|
|
190
191
|
}
|
|
191
|
-
const { tableName } = breakExternalTableId(tableId);
|
|
192
|
-
|
|
192
|
+
const { tableName } = utils_3.breakExternalTableId(tableId);
|
|
193
|
+
if (tableName) {
|
|
194
|
+
return this.tables[tableName];
|
|
195
|
+
}
|
|
193
196
|
}
|
|
194
197
|
inputProcessing(row, table) {
|
|
195
198
|
if (!row) {
|
|
@@ -204,7 +207,7 @@ var External;
|
|
|
204
207
|
if (row[key] == null ||
|
|
205
208
|
newRow[key] ||
|
|
206
209
|
field.autocolumn ||
|
|
207
|
-
field.type === FieldTypes.FORMULA) {
|
|
210
|
+
field.type === constants_1.FieldTypes.FORMULA) {
|
|
208
211
|
continue;
|
|
209
212
|
}
|
|
210
213
|
// if its an empty string then it means return the column to null (if possible)
|
|
@@ -213,17 +216,17 @@ var External;
|
|
|
213
216
|
continue;
|
|
214
217
|
}
|
|
215
218
|
// parse floats/numbers
|
|
216
|
-
if (field.type === FieldTypes.NUMBER && !isNaN(parseFloat(row[key]))) {
|
|
219
|
+
if (field.type === constants_1.FieldTypes.NUMBER && !isNaN(parseFloat(row[key]))) {
|
|
217
220
|
newRow[key] = parseFloat(row[key]);
|
|
218
221
|
}
|
|
219
222
|
// if its not a link then just copy it over
|
|
220
|
-
if (field.type !== FieldTypes.LINK) {
|
|
223
|
+
if (field.type !== constants_1.FieldTypes.LINK) {
|
|
221
224
|
newRow[key] = row[key];
|
|
222
225
|
continue;
|
|
223
226
|
}
|
|
224
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
227
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field === null || field === void 0 ? void 0 : field.tableId);
|
|
225
228
|
// table has to exist for many to many
|
|
226
|
-
if (!this.tables[linkTableName]) {
|
|
229
|
+
if (!linkTableName || !this.tables[linkTableName]) {
|
|
227
230
|
continue;
|
|
228
231
|
}
|
|
229
232
|
const linkTable = this.tables[linkTableName];
|
|
@@ -275,14 +278,24 @@ var External;
|
|
|
275
278
|
* This iterates through the returned rows and works out what elements of the rows
|
|
276
279
|
* actually match up to another row (based on primary keys) - this is pretty specific
|
|
277
280
|
* to SQL and the way that SQL relationships are returned based on joins.
|
|
281
|
+
* This is complicated, but the idea is that when a SQL query returns all the relations
|
|
282
|
+
* will be separate rows, with all of the data in each row. We have to decipher what comes
|
|
283
|
+
* from where (which tables) and how to convert that into budibase columns.
|
|
278
284
|
*/
|
|
279
|
-
updateRelationshipColumns(row, rows, relationships) {
|
|
285
|
+
updateRelationshipColumns(table, row, rows, relationships) {
|
|
280
286
|
const columns = {};
|
|
281
287
|
for (let relationship of relationships) {
|
|
282
288
|
const linkedTable = this.tables[relationship.tableName];
|
|
283
289
|
if (!linkedTable) {
|
|
284
290
|
continue;
|
|
285
291
|
}
|
|
292
|
+
const fromColumn = `${table.name}.${relationship.from}`;
|
|
293
|
+
const toColumn = `${linkedTable.name}.${relationship.to}`;
|
|
294
|
+
// this is important when working with multiple relationships
|
|
295
|
+
// between the same tables, don't want to overlap/multiply the relations
|
|
296
|
+
if (!relationship.through && row[fromColumn] !== row[toColumn]) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
286
299
|
let linked = basicProcessing(row, linkedTable);
|
|
287
300
|
if (!linked._id) {
|
|
288
301
|
continue;
|
|
@@ -320,7 +333,7 @@ var External;
|
|
|
320
333
|
row._id = rowId;
|
|
321
334
|
// this is a relationship of some sort
|
|
322
335
|
if (finalRows[rowId]) {
|
|
323
|
-
finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
|
|
336
|
+
finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
|
|
324
337
|
continue;
|
|
325
338
|
}
|
|
326
339
|
const thisRow = fixArrayTypes(basicProcessing(row, table), table);
|
|
@@ -329,9 +342,9 @@ var External;
|
|
|
329
342
|
}
|
|
330
343
|
finalRows[thisRow._id] = thisRow;
|
|
331
344
|
// do this at end once its been added to the final rows
|
|
332
|
-
finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
|
|
345
|
+
finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
|
|
333
346
|
}
|
|
334
|
-
return processFormulas(table, Object.values(finalRows));
|
|
347
|
+
return utils_4.processFormulas(table, Object.values(finalRows));
|
|
335
348
|
}
|
|
336
349
|
/**
|
|
337
350
|
* Gets the list of relationship JSON structures based on the columns in the table,
|
|
@@ -341,12 +354,12 @@ var External;
|
|
|
341
354
|
buildRelationships(table) {
|
|
342
355
|
const relationships = [];
|
|
343
356
|
for (let [fieldName, field] of Object.entries(table.schema)) {
|
|
344
|
-
if (field.type !== FieldTypes.LINK) {
|
|
357
|
+
if (field.type !== constants_1.FieldTypes.LINK) {
|
|
345
358
|
continue;
|
|
346
359
|
}
|
|
347
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
360
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
|
|
348
361
|
// no table to link to, this is not a valid relationships
|
|
349
|
-
if (!this.tables[linkTableName]) {
|
|
362
|
+
if (!linkTableName || !this.tables[linkTableName]) {
|
|
350
363
|
continue;
|
|
351
364
|
}
|
|
352
365
|
const linkTable = this.tables[linkTableName];
|
|
@@ -362,7 +375,7 @@ var External;
|
|
|
362
375
|
column: fieldName,
|
|
363
376
|
};
|
|
364
377
|
if (field.through) {
|
|
365
|
-
const { tableName: throughTableName } = breakExternalTableId(field.through);
|
|
378
|
+
const { tableName: throughTableName } = utils_3.breakExternalTableId(field.through);
|
|
366
379
|
definition.through = throughTableName;
|
|
367
380
|
// don't support composite keys for relationships
|
|
368
381
|
definition.from = field.throughTo || table.primary[0];
|
|
@@ -381,21 +394,24 @@ var External;
|
|
|
381
394
|
lookupRelations(tableId, row) {
|
|
382
395
|
return __awaiter(this, void 0, void 0, function* () {
|
|
383
396
|
const related = {};
|
|
384
|
-
const { tableName } = breakExternalTableId(tableId);
|
|
397
|
+
const { tableName } = utils_3.breakExternalTableId(tableId);
|
|
398
|
+
if (!tableName) {
|
|
399
|
+
return related;
|
|
400
|
+
}
|
|
385
401
|
const table = this.tables[tableName];
|
|
386
402
|
// @ts-ignore
|
|
387
403
|
const primaryKey = table.primary[0];
|
|
388
404
|
// make a new request to get the row with all its relationships
|
|
389
405
|
// we need this to work out if any relationships need removed
|
|
390
406
|
for (let field of Object.values(table.schema)) {
|
|
391
|
-
if (field.type !== FieldTypes.LINK ||
|
|
407
|
+
if (field.type !== constants_1.FieldTypes.LINK ||
|
|
392
408
|
!field.fieldName ||
|
|
393
409
|
isOneSide(field)) {
|
|
394
410
|
continue;
|
|
395
411
|
}
|
|
396
|
-
const isMany = field.relationshipType === RelationshipTypes.MANY_TO_MANY;
|
|
412
|
+
const isMany = field.relationshipType === constants_1.RelationshipTypes.MANY_TO_MANY;
|
|
397
413
|
const tableId = isMany ? field.through : field.tableId;
|
|
398
|
-
const { tableName: relatedTableName } = breakExternalTableId(tableId);
|
|
414
|
+
const { tableName: relatedTableName } = utils_3.breakExternalTableId(tableId);
|
|
399
415
|
// @ts-ignore
|
|
400
416
|
const linkPrimaryKey = this.tables[relatedTableName].primary[0];
|
|
401
417
|
const manyKey = field.throughTo || primaryKey;
|
|
@@ -404,8 +420,8 @@ var External;
|
|
|
404
420
|
if (!lookupField || !row[lookupField]) {
|
|
405
421
|
continue;
|
|
406
422
|
}
|
|
407
|
-
const response = yield getDatasourceAndQuery(
|
|
408
|
-
endpoint: getEndpoint(tableId, DataSourceOperation.READ),
|
|
423
|
+
const response = yield utils_2.getDatasourceAndQuery({
|
|
424
|
+
endpoint: getEndpoint(tableId, constants_1.DataSourceOperation.READ),
|
|
409
425
|
filters: {
|
|
410
426
|
equal: {
|
|
411
427
|
[fieldName]: row[lookupField],
|
|
@@ -431,26 +447,27 @@ var External;
|
|
|
431
447
|
* all and then re-create, as theres no chance of losing data (e.g. delete succeed, but write fail).
|
|
432
448
|
*/
|
|
433
449
|
handleManyRelationships(mainTableId, row, relationships) {
|
|
434
|
-
var _a;
|
|
435
450
|
return __awaiter(this, void 0, void 0, function* () {
|
|
436
|
-
const { appId } = this;
|
|
437
451
|
// if we're creating (in a through table) need to wipe the existing ones first
|
|
438
452
|
const promises = [];
|
|
439
453
|
const related = yield this.lookupRelations(mainTableId, row);
|
|
440
454
|
for (let relationship of relationships) {
|
|
441
455
|
const { key, tableId, isUpdate, id } = relationship, rest = __rest(relationship, ["key", "tableId", "isUpdate", "id"]);
|
|
442
|
-
const body = processObjectSync(rest, row);
|
|
456
|
+
const body = string_templates_1.processObjectSync(rest, row, {});
|
|
443
457
|
const linkTable = this.getTable(tableId);
|
|
444
458
|
// @ts-ignore
|
|
445
|
-
const linkPrimary = linkTable.primary[0];
|
|
446
|
-
|
|
459
|
+
const linkPrimary = linkTable === null || linkTable === void 0 ? void 0 : linkTable.primary[0];
|
|
460
|
+
if (!linkTable || !linkPrimary) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
const rows = related[key].rows || [];
|
|
447
464
|
const found = rows.find((row) => row[linkPrimary] === relationship.id ||
|
|
448
|
-
row[linkPrimary] === body[linkPrimary]);
|
|
465
|
+
row[linkPrimary] === (body === null || body === void 0 ? void 0 : body[linkPrimary]));
|
|
449
466
|
const operation = isUpdate
|
|
450
|
-
? DataSourceOperation.UPDATE
|
|
451
|
-
: DataSourceOperation.CREATE;
|
|
467
|
+
? constants_1.DataSourceOperation.UPDATE
|
|
468
|
+
: constants_1.DataSourceOperation.CREATE;
|
|
452
469
|
if (!found) {
|
|
453
|
-
promises.push(getDatasourceAndQuery(
|
|
470
|
+
promises.push(utils_2.getDatasourceAndQuery({
|
|
454
471
|
endpoint: getEndpoint(tableId, operation),
|
|
455
472
|
// if we're doing many relationships then we're writing, only one response
|
|
456
473
|
body,
|
|
@@ -466,7 +483,8 @@ var External;
|
|
|
466
483
|
for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {
|
|
467
484
|
const table = this.getTable(tableId);
|
|
468
485
|
// if its not the foreign key skip it, nothing to do
|
|
469
|
-
if (table
|
|
486
|
+
if (!table ||
|
|
487
|
+
(table.primary && table.primary.indexOf(colName) !== -1)) {
|
|
470
488
|
continue;
|
|
471
489
|
}
|
|
472
490
|
for (let row of rows) {
|
|
@@ -474,10 +492,10 @@ var External;
|
|
|
474
492
|
// safety check, if there are no filters on deletion bad things happen
|
|
475
493
|
if (Object.keys(filters).length !== 0) {
|
|
476
494
|
const op = isMany
|
|
477
|
-
? DataSourceOperation.DELETE
|
|
478
|
-
: DataSourceOperation.UPDATE;
|
|
495
|
+
? constants_1.DataSourceOperation.DELETE
|
|
496
|
+
: constants_1.DataSourceOperation.UPDATE;
|
|
479
497
|
const body = isMany ? null : { [colName]: null };
|
|
480
|
-
promises.push(getDatasourceAndQuery(
|
|
498
|
+
promises.push(utils_2.getDatasourceAndQuery({
|
|
481
499
|
endpoint: getEndpoint(tableId, op),
|
|
482
500
|
body,
|
|
483
501
|
filters,
|
|
@@ -498,31 +516,36 @@ var External;
|
|
|
498
516
|
buildFields(table, includeRelations = datasource_1.IncludeRelationships.INCLUDE) {
|
|
499
517
|
function extractRealFields(table, existing = []) {
|
|
500
518
|
return Object.entries(table.schema)
|
|
501
|
-
.filter(column => column[1].type !== FieldTypes.LINK &&
|
|
502
|
-
column[1].type !== FieldTypes.FORMULA &&
|
|
519
|
+
.filter(column => column[1].type !== constants_1.FieldTypes.LINK &&
|
|
520
|
+
column[1].type !== constants_1.FieldTypes.FORMULA &&
|
|
503
521
|
!existing.find((field) => field === column[0]))
|
|
504
522
|
.map(column => `${table.name}.${column[0]}`);
|
|
505
523
|
}
|
|
506
524
|
let fields = extractRealFields(table);
|
|
507
525
|
for (let field of Object.values(table.schema)) {
|
|
508
|
-
if (field.type !== FieldTypes.LINK || !includeRelations) {
|
|
526
|
+
if (field.type !== constants_1.FieldTypes.LINK || !includeRelations) {
|
|
509
527
|
continue;
|
|
510
528
|
}
|
|
511
|
-
const { tableName: linkTableName } = breakExternalTableId(field.tableId);
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
529
|
+
const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
|
|
530
|
+
if (linkTableName) {
|
|
531
|
+
const linkTable = this.tables[linkTableName];
|
|
532
|
+
if (linkTable) {
|
|
533
|
+
const linkedFields = extractRealFields(linkTable, fields);
|
|
534
|
+
fields = fields.concat(linkedFields);
|
|
535
|
+
}
|
|
516
536
|
}
|
|
517
537
|
}
|
|
518
538
|
return fields;
|
|
519
539
|
}
|
|
520
540
|
run(config) {
|
|
521
541
|
return __awaiter(this, void 0, void 0, function* () {
|
|
522
|
-
const {
|
|
523
|
-
let { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
542
|
+
const { operation, tableId } = this;
|
|
543
|
+
let { datasourceId, tableName } = utils_3.breakExternalTableId(tableId);
|
|
544
|
+
if (!tableName) {
|
|
545
|
+
throw "Unable to run without a table name";
|
|
546
|
+
}
|
|
524
547
|
if (!this.datasource) {
|
|
525
|
-
const db =
|
|
548
|
+
const db = context_1.getAppDB();
|
|
526
549
|
this.datasource = yield db.get(datasourceId);
|
|
527
550
|
if (!this.datasource || !this.datasource.entities) {
|
|
528
551
|
throw "No tables found, fetch tables before query.";
|
|
@@ -530,7 +553,7 @@ var External;
|
|
|
530
553
|
this.tables = this.datasource.entities;
|
|
531
554
|
}
|
|
532
555
|
const table = this.tables[tableName];
|
|
533
|
-
let isSql = isSQL(this.datasource);
|
|
556
|
+
let isSql = utils_3.isSQL(this.datasource);
|
|
534
557
|
if (!table) {
|
|
535
558
|
throw `Unable to process query, table "${tableName}" not defined.`;
|
|
536
559
|
}
|
|
@@ -541,7 +564,7 @@ var External;
|
|
|
541
564
|
// clean up row on ingress using schema
|
|
542
565
|
const processed = this.inputProcessing(row, table);
|
|
543
566
|
row = processed.row;
|
|
544
|
-
if (operation === DataSourceOperation.DELETE &&
|
|
567
|
+
if (operation === constants_1.DataSourceOperation.DELETE &&
|
|
545
568
|
(filters == null || Object.keys(filters).length === 0)) {
|
|
546
569
|
throw "Deletion must be filtered";
|
|
547
570
|
}
|
|
@@ -569,15 +592,15 @@ var External;
|
|
|
569
592
|
},
|
|
570
593
|
};
|
|
571
594
|
// can't really use response right now
|
|
572
|
-
const response = yield getDatasourceAndQuery(
|
|
595
|
+
const response = yield utils_2.getDatasourceAndQuery(json);
|
|
573
596
|
// handle many to many relationships now if we know the ID (could be auto increment)
|
|
574
|
-
if (operation !== DataSourceOperation.READ &&
|
|
597
|
+
if (operation !== constants_1.DataSourceOperation.READ &&
|
|
575
598
|
processed.manyRelationships) {
|
|
576
599
|
yield this.handleManyRelationships(table._id || "", response[0], processed.manyRelationships);
|
|
577
600
|
}
|
|
578
601
|
const output = this.outputProcessing(response, table, relationships);
|
|
579
602
|
// if reading it'll just be an array of rows, return whole thing
|
|
580
|
-
return operation === DataSourceOperation.READ && Array.isArray(response)
|
|
603
|
+
return operation === constants_1.DataSourceOperation.READ && Array.isArray(response)
|
|
581
604
|
? output
|
|
582
605
|
: { row: output[0], table };
|
|
583
606
|
});
|
|
@@ -22,8 +22,8 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
22
22
|
const { DataSourceOperation, SortDirection, FieldTypes, NoEmptyFilterStrings, } = require("../../../constants");
|
|
23
23
|
const { breakExternalTableId, breakRowIdField, } = require("../../../integrations/utils");
|
|
24
24
|
const ExternalRequest = require("./ExternalRequest");
|
|
25
|
-
const
|
|
26
|
-
function handleRequest(
|
|
25
|
+
const { getAppDB } = require("@budibase/backend-core/context");
|
|
26
|
+
function handleRequest(operation, tableId, opts = {}) {
|
|
27
27
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
28
|
// make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
|
|
29
29
|
if (opts && opts.filters) {
|
|
@@ -38,27 +38,25 @@ function handleRequest(appId, operation, tableId, opts = {}) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
return new ExternalRequest(
|
|
41
|
+
return new ExternalRequest(operation, tableId, opts.datasource).run(opts);
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
exports.handleRequest = handleRequest;
|
|
45
45
|
exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
46
|
-
const appId = ctx.appId;
|
|
47
46
|
const inputs = ctx.request.body;
|
|
48
47
|
const tableId = ctx.params.tableId;
|
|
49
48
|
const id = breakRowIdField(inputs._id);
|
|
50
49
|
// don't save the ID to db
|
|
51
50
|
delete inputs._id;
|
|
52
|
-
return handleRequest(
|
|
51
|
+
return handleRequest(DataSourceOperation.UPDATE, tableId, {
|
|
53
52
|
id,
|
|
54
53
|
row: inputs,
|
|
55
54
|
});
|
|
56
55
|
});
|
|
57
56
|
exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
58
|
-
const appId = ctx.appId;
|
|
59
57
|
const inputs = ctx.request.body;
|
|
60
58
|
const tableId = ctx.params.tableId;
|
|
61
|
-
return handleRequest(
|
|
59
|
+
return handleRequest(DataSourceOperation.CREATE, tableId, {
|
|
62
60
|
row: inputs,
|
|
63
61
|
});
|
|
64
62
|
});
|
|
@@ -70,35 +68,31 @@ exports.fetchView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
70
68
|
return exports.fetch(ctx);
|
|
71
69
|
});
|
|
72
70
|
exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
73
|
-
const appId = ctx.appId;
|
|
74
71
|
const tableId = ctx.params.tableId;
|
|
75
|
-
return handleRequest(
|
|
72
|
+
return handleRequest(DataSourceOperation.READ, tableId);
|
|
76
73
|
});
|
|
77
74
|
exports.find = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
78
|
-
const appId = ctx.appId;
|
|
79
75
|
const id = ctx.params.rowId;
|
|
80
76
|
const tableId = ctx.params.tableId;
|
|
81
|
-
const response = yield handleRequest(
|
|
77
|
+
const response = yield handleRequest(DataSourceOperation.READ, tableId, {
|
|
82
78
|
id,
|
|
83
79
|
});
|
|
84
80
|
return response ? response[0] : response;
|
|
85
81
|
});
|
|
86
82
|
exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
87
|
-
const appId = ctx.appId;
|
|
88
83
|
const tableId = ctx.params.tableId;
|
|
89
84
|
const id = ctx.request.body._id;
|
|
90
|
-
const { row } = yield handleRequest(
|
|
85
|
+
const { row } = yield handleRequest(DataSourceOperation.DELETE, tableId, {
|
|
91
86
|
id,
|
|
92
87
|
});
|
|
93
88
|
return { response: { ok: true }, row };
|
|
94
89
|
});
|
|
95
90
|
exports.bulkDestroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
96
|
-
const appId = ctx.appId;
|
|
97
91
|
const { rows } = ctx.request.body;
|
|
98
92
|
const tableId = ctx.params.tableId;
|
|
99
93
|
let promises = [];
|
|
100
94
|
for (let row of rows) {
|
|
101
|
-
promises.push(handleRequest(
|
|
95
|
+
promises.push(handleRequest(DataSourceOperation.DELETE, tableId, {
|
|
102
96
|
id: breakRowIdField(row._id),
|
|
103
97
|
}));
|
|
104
98
|
}
|
|
@@ -106,7 +100,6 @@ exports.bulkDestroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
106
100
|
return { response: { ok: true }, rows: responses.map(resp => resp.row) };
|
|
107
101
|
});
|
|
108
102
|
exports.search = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
109
|
-
const appId = ctx.appId;
|
|
110
103
|
const tableId = ctx.params.tableId;
|
|
111
104
|
const _a = ctx.request.body, { paginate, query } = _a, params = __rest(_a, ["paginate", "query"]);
|
|
112
105
|
let { bookmark, limit } = params;
|
|
@@ -135,14 +128,14 @@ exports.search = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
135
128
|
[params.sort]: direction,
|
|
136
129
|
};
|
|
137
130
|
}
|
|
138
|
-
const rows = yield handleRequest(
|
|
131
|
+
const rows = yield handleRequest(DataSourceOperation.READ, tableId, {
|
|
139
132
|
filters: query,
|
|
140
133
|
sort,
|
|
141
134
|
paginate: paginateObj,
|
|
142
135
|
});
|
|
143
136
|
let hasNextPage = false;
|
|
144
137
|
if (paginate && rows.length === limit) {
|
|
145
|
-
const nextRows = yield handleRequest(
|
|
138
|
+
const nextRows = yield handleRequest(DataSourceOperation.READ, tableId, {
|
|
146
139
|
filters: query,
|
|
147
140
|
sort,
|
|
148
141
|
paginate: {
|
|
@@ -160,17 +153,16 @@ exports.validate = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
160
153
|
return { valid: true };
|
|
161
154
|
});
|
|
162
155
|
exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
163
|
-
const appId = ctx.appId;
|
|
164
156
|
const id = ctx.params.rowId;
|
|
165
157
|
const tableId = ctx.params.tableId;
|
|
166
158
|
const { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
167
|
-
const db =
|
|
159
|
+
const db = getAppDB();
|
|
168
160
|
const datasource = yield db.get(datasourceId);
|
|
169
161
|
if (!datasource || !datasource.entities) {
|
|
170
162
|
ctx.throw(400, "Datasource has not been configured for plus API.");
|
|
171
163
|
}
|
|
172
164
|
const tables = datasource.entities;
|
|
173
|
-
const response = yield handleRequest(
|
|
165
|
+
const response = yield handleRequest(DataSourceOperation.READ, tableId, {
|
|
174
166
|
id,
|
|
175
167
|
datasource,
|
|
176
168
|
});
|
|
@@ -189,7 +181,7 @@ exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function*
|
|
|
189
181
|
const linkedTable = tables[breakExternalTableId(linkedTableId).tableName];
|
|
190
182
|
// don't support composite keys right now
|
|
191
183
|
const linkedIds = links.map(link => breakRowIdField(link._id)[0]);
|
|
192
|
-
row[fieldName] = yield handleRequest(
|
|
184
|
+
row[fieldName] = yield handleRequest(DataSourceOperation.READ, linkedTableId, {
|
|
193
185
|
tables,
|
|
194
186
|
filters: {
|
|
195
187
|
oneOf: {
|