@budibase/server 1.0.49-alpha.9 → 1.0.49
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 +5 -4
- package/__mocks__/mssql.ts +3 -3
- package/__mocks__/node-fetch.ts +1 -2
- package/__mocks__/pg.ts +5 -3
- package/builder/assets/{index.ad5370ae.js → index.2c37968e.js} +246 -249
- package/builder/assets/index.39e01193.css +1 -0
- package/builder/assets/{vendor.d526bfe8.js → vendor.f9faf6ab.js} +12 -12
- package/builder/index.html +3 -3
- package/coverage/clover.xml +2827 -3117
- package/coverage/coverage-final.json +101 -106
- 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 +152 -257
- package/coverage/lcov-report/api/controllers/auth.js.html +13 -22
- package/coverage/lcov-report/api/controllers/automation.js.html +69 -39
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +11 -8
- package/coverage/lcov-report/api/controllers/component.js.html +16 -13
- package/coverage/lcov-report/api/controllers/datasource.js.html +51 -81
- package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
- package/coverage/lcov-report/{utilities/usageQuota/usageQuoteReset.js.html → api/controllers/hosting.js.html} +48 -36
- package/coverage/lcov-report/api/controllers/index.html +76 -76
- 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 +21 -6
- 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 +35 -38
- 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 +10 -7
- package/coverage/lcov-report/api/controllers/row/external.js.html +141 -48
- package/coverage/lcov-report/api/controllers/row/index.html +40 -55
- package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
- package/coverage/lcov-report/api/controllers/row/internal.js.html +226 -118
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +34 -52
- package/coverage/lcov-report/api/controllers/row/utils.js.html +62 -47
- package/coverage/lcov-report/api/controllers/screen.js.html +21 -15
- package/coverage/lcov-report/api/controllers/script.js.html +4 -4
- package/coverage/lcov-report/api/controllers/table/external.js.html +34 -25
- package/coverage/lcov-report/api/controllers/table/index.html +43 -58
- package/coverage/lcov-report/api/controllers/table/index.js.html +82 -58
- package/coverage/lcov-report/api/controllers/table/internal.js.html +66 -81
- package/coverage/lcov-report/api/controllers/table/utils.js.html +110 -218
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +50 -47
- 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 +33 -27
- package/coverage/lcov-report/api/controllers/view/utils.js.html +20 -35
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
- package/coverage/lcov-report/api/controllers/webhook.js.html +28 -34
- 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/{migrations.js.html → hosting.js.html} +14 -17
- 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/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 +2 -17
- 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 +10 -7
- 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 +22 -13
- package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +20 -11
- 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 +55 -61
- package/coverage/lcov-report/automations/utils.js.html +42 -54
- package/coverage/lcov-report/constants/index.html +5 -5
- package/coverage/lcov-report/constants/index.js.html +26 -53
- 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 +37 -25
- package/coverage/lcov-report/db/linkedRows/index.html +27 -27
- package/coverage/lcov-report/db/linkedRows/index.js.html +96 -51
- 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 +120 -135
- 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 +65 -173
- package/coverage/lcov-report/middleware/builder.js.html +10 -10
- package/coverage/lcov-report/middleware/currentapp.js.html +83 -95
- 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 +53 -281
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/threads/automation.js.html +24 -30
- 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 +24 -39
- 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 +49 -58
- package/coverage/lcov-report/utilities/index.html +37 -37
- package/coverage/lcov-report/utilities/index.js.html +73 -43
- 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 +103 -97
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +27 -75
- 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/users.js.html +9 -9
- package/coverage/lcov-report/utilities/workerRequests.js.html +112 -43
- package/coverage/lcov.info +4431 -5013
- package/dist/api/controllers/application.js +60 -90
- package/dist/api/controllers/auth.js +5 -8
- package/dist/api/controllers/automation.js +19 -14
- package/dist/api/controllers/cloud.js +3 -2
- package/dist/api/controllers/component.js +4 -3
- package/dist/api/controllers/datasource.js +10 -20
- package/dist/api/controllers/deploy/Deployment.js +6 -3
- package/dist/api/controllers/deploy/index.js +13 -12
- package/dist/api/controllers/dev.js +5 -5
- package/dist/api/controllers/hosting.js +30 -0
- package/dist/api/controllers/layout.js +3 -3
- package/dist/api/controllers/metadata.js +4 -4
- package/dist/api/controllers/permission.js +4 -4
- package/dist/api/controllers/query/import/index.js +6 -4
- package/dist/api/controllers/query/index.js +10 -11
- package/dist/api/controllers/role.js +5 -5
- package/dist/api/controllers/routing.js +6 -5
- package/dist/api/controllers/row/ExternalRequest.js +67 -90
- package/dist/api/controllers/row/external.js +22 -14
- package/dist/api/controllers/row/internal.js +93 -55
- package/dist/api/controllers/row/internalSearch.js +17 -23
- package/dist/api/controllers/row/utils.js +14 -13
- package/dist/api/controllers/screen.js +7 -5
- package/dist/api/controllers/static/index.js +12 -61
- package/dist/api/controllers/table/external.js +10 -7
- package/dist/api/controllers/table/index.js +13 -16
- package/dist/api/controllers/table/internal.js +16 -22
- package/dist/api/controllers/table/utils.js +35 -62
- package/dist/api/controllers/user.js +20 -18
- package/dist/api/controllers/view/index.js +10 -8
- package/dist/api/controllers/view/utils.js +4 -9
- package/dist/api/controllers/webhook.js +8 -10
- package/dist/api/routes/hosting.js +11 -0
- package/dist/api/routes/index.js +2 -2
- package/dist/api/routes/static.js +1 -2
- package/dist/api/routes/tests/utilities/TestFunctions.js +17 -37
- package/dist/app.js +5 -35
- package/dist/automations/automationUtils.js +3 -2
- package/dist/automations/steps/createRow.js +5 -3
- package/dist/automations/steps/deleteRow.js +4 -1
- package/dist/automations/steps/updateRow.js +1 -1
- package/dist/automations/triggers.js +25 -27
- package/dist/automations/utils.js +5 -10
- package/dist/constants/index.js +0 -7
- package/dist/db/linkedRows/LinkController.js +7 -3
- package/dist/db/linkedRows/index.js +27 -16
- package/dist/db/linkedRows/linkUtils.js +6 -6
- package/dist/db/views/staticViews.js +10 -9
- package/dist/definitions/datasource.js +0 -1
- package/dist/environment.js +1 -4
- package/dist/integrations/base/sql.js +14 -56
- package/dist/integrations/index.js +0 -3
- package/dist/integrations/utils.js +9 -60
- package/dist/middleware/authorized.js +30 -57
- package/dist/middleware/builder.js +2 -2
- package/dist/middleware/currentapp.js +37 -41
- package/dist/middleware/usageQuota.js +15 -82
- package/dist/package.json +5 -8
- package/dist/tests/utilities/TestConfiguration.js +50 -80
- package/dist/threads/automation.js +11 -13
- package/dist/threads/query.js +11 -15
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +3 -4
- package/dist/utilities/global.js +12 -15
- package/dist/utilities/index.js +17 -7
- package/dist/utilities/routing/index.js +5 -5
- package/dist/utilities/rowProcessor/index.js +17 -23
- package/dist/utilities/rowProcessor/utils.js +4 -14
- package/dist/utilities/{usageQuota/index.js → usageQuota.js} +31 -45
- package/dist/utilities/users.js +3 -3
- package/dist/utilities/workerRequests.js +24 -4
- package/nodemon.json +1 -1
- package/package.json +6 -9
- package/scripts/integrations/postgres/init.sql +6 -11
- package/scripts/likeCypress.ts +1 -1
- package/src/api/controllers/application.js +50 -85
- package/src/api/controllers/auth.js +5 -8
- package/src/api/controllers/automation.js +23 -13
- package/src/api/controllers/cloud.js +3 -2
- package/src/api/controllers/component.js +4 -3
- package/src/api/controllers/datasource.js +11 -21
- package/src/api/controllers/deploy/Deployment.js +7 -3
- package/src/api/controllers/deploy/index.js +13 -20
- package/src/api/controllers/dev.js +5 -5
- package/src/api/controllers/hosting.js +22 -0
- package/src/api/controllers/layout.js +3 -3
- package/src/api/controllers/metadata.js +9 -4
- package/src/api/controllers/permission.js +4 -4
- package/src/api/controllers/query/import/index.ts +6 -4
- package/src/api/controllers/query/import/tests/index.spec.js +1 -2
- package/src/api/controllers/query/index.js +10 -11
- package/src/api/controllers/role.js +5 -5
- package/src/api/controllers/routing.js +6 -5
- package/src/api/controllers/row/ExternalRequest.ts +43 -67
- package/src/api/controllers/row/external.js +58 -27
- package/src/api/controllers/row/internal.js +90 -54
- package/src/api/controllers/row/internalSearch.js +17 -23
- package/src/api/controllers/row/utils.js +18 -13
- package/src/api/controllers/screen.js +7 -5
- package/src/api/controllers/static/index.js +12 -65
- package/src/api/controllers/table/external.js +10 -7
- package/src/api/controllers/table/index.js +28 -20
- package/src/api/controllers/table/internal.js +19 -24
- package/src/api/controllers/table/utils.js +42 -78
- package/src/api/controllers/user.js +20 -19
- package/src/api/controllers/view/index.js +10 -8
- package/src/api/controllers/view/utils.js +4 -9
- package/src/api/controllers/webhook.js +8 -10
- package/src/api/routes/hosting.js +13 -0
- package/src/api/routes/index.js +2 -2
- package/src/api/routes/static.js +0 -5
- package/src/api/routes/tests/application.spec.js +2 -2
- package/src/api/routes/tests/auth.spec.js +2 -1
- package/src/api/routes/tests/automation.spec.js +0 -1
- package/src/api/routes/tests/hosting.spec.js +36 -0
- package/src/api/routes/tests/misc.spec.js +1 -0
- package/src/api/routes/tests/routing.spec.js +12 -21
- package/src/api/routes/tests/row.spec.js +4 -7
- package/src/api/routes/tests/utilities/TestFunctions.js +17 -39
- package/src/app.ts +5 -18
- package/src/automations/automationUtils.js +3 -2
- package/src/automations/steps/createRow.js +5 -2
- package/src/automations/steps/deleteRow.js +4 -1
- package/src/automations/steps/updateRow.js +1 -1
- package/src/automations/triggers.js +31 -33
- package/src/automations/utils.js +5 -9
- package/src/constants/index.js +0 -9
- package/src/db/linkedRows/LinkController.js +7 -3
- package/src/db/linkedRows/index.js +31 -16
- package/src/db/linkedRows/linkUtils.js +6 -6
- package/src/db/tests/linkController.spec.js +1 -0
- package/src/db/tests/linkTests.spec.js +6 -5
- package/src/db/views/staticViews.js +10 -8
- package/src/definitions/common.ts +0 -3
- package/src/definitions/datasource.ts +0 -3
- package/src/environment.js +1 -4
- package/src/integrations/base/sql.ts +21 -69
- package/src/integrations/index.ts +0 -3
- package/src/integrations/tests/sql.spec.js +0 -16
- package/src/integrations/utils.ts +12 -75
- package/src/middleware/authorized.js +30 -66
- package/src/middleware/builder.js +2 -2
- package/src/middleware/currentapp.js +46 -50
- package/src/middleware/tests/authorized.spec.js +6 -13
- package/src/middleware/tests/currentapp.spec.js +0 -6
- package/src/middleware/tests/usageQuota.spec.js +24 -18
- package/src/middleware/usageQuota.js +17 -93
- package/src/tests/utilities/TestConfiguration.js +55 -82
- package/src/threads/automation.js +15 -17
- package/src/threads/query.js +12 -17
- package/src/utilities/fileSystem/index.js +3 -4
- package/src/utilities/global.js +12 -15
- package/src/utilities/index.js +17 -7
- package/src/utilities/routing/index.js +5 -5
- package/src/utilities/rowProcessor/index.js +27 -25
- package/src/utilities/rowProcessor/utils.js +7 -23
- package/src/utilities/usageQuota.js +73 -0
- package/src/utilities/users.js +3 -3
- package/src/utilities/workerRequests.js +27 -4
- package/tsconfig.json +1 -2
- package/builder/assets/index.83c0944f.css +0 -1
- package/coverage/lcov-report/api/controllers/migrations.js.html +0 -119
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +0 -548
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +0 -599
- package/coverage/lcov-report/utilities/usageQuota/index.html +0 -141
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -359
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +0 -305
- package/dist/api/controllers/migrations.js +0 -21
- package/dist/api/controllers/row/staticFormula.js +0 -147
- package/dist/api/controllers/table/bulkFormula.js +0 -159
- package/dist/api/routes/migrations.js +0 -9
- package/dist/integrations/googlesheets.js +0 -340
- package/dist/migrations/functions/appUrls.js +0 -46
- package/dist/migrations/functions/quotas1.js +0 -50
- package/dist/migrations/functions/usageQuotas/index.js +0 -20
- package/dist/migrations/functions/usageQuotas/syncApps.js +0 -29
- package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
- package/dist/migrations/functions/userEmailViewCasing.js +0 -24
- package/dist/migrations/index.js +0 -62
- package/dist/utilities/usageQuota/rows.js +0 -78
- package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
- package/src/api/controllers/migrations.js +0 -13
- package/src/api/controllers/row/staticFormula.js +0 -156
- package/src/api/controllers/table/bulkFormula.js +0 -173
- package/src/api/routes/migrations.js +0 -14
- package/src/api/routes/tests/static.spec.js +0 -98
- package/src/integrations/googlesheets.ts +0 -353
- package/src/migrations/functions/appUrls.ts +0 -34
- package/src/migrations/functions/quotas1.ts +0 -20
- package/src/migrations/functions/tests/appUrls.spec.js +0 -29
- package/src/migrations/functions/tests/quotas1.spec.js +0 -27
- package/src/migrations/functions/tests/userEmailViewCasing.spec.js +0 -25
- package/src/migrations/functions/usageQuotas/index.ts +0 -8
- package/src/migrations/functions/usageQuotas/syncApps.ts +0 -18
- package/src/migrations/functions/usageQuotas/syncRows.ts +0 -22
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +0 -37
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +0 -43
- package/src/migrations/functions/userEmailViewCasing.ts +0 -13
- package/src/migrations/index.ts +0 -56
- package/src/module.d.ts +0 -3
- package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
- package/src/utilities/usageQuota/index.js +0 -93
- package/src/utilities/usageQuota/rows.js +0 -75
- package/src/utilities/usageQuota/usageQuoteReset.js +0 -18
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
const CouchDB = require("../../../db")
|
|
1
2
|
const linkRows = require("../../../db/linkedRows")
|
|
2
3
|
const {
|
|
3
|
-
generateRowID,
|
|
4
4
|
getRowParams,
|
|
5
|
+
generateRowID,
|
|
5
6
|
DocumentTypes,
|
|
6
7
|
InternalTables,
|
|
7
8
|
} = require("../../../db/utils")
|
|
@@ -9,9 +10,11 @@ const userController = require("../user")
|
|
|
9
10
|
const {
|
|
10
11
|
inputProcessing,
|
|
11
12
|
outputProcessing,
|
|
13
|
+
processAutoColumn,
|
|
12
14
|
cleanupAttachments,
|
|
13
15
|
} = require("../../../utilities/rowProcessor")
|
|
14
16
|
const { FieldTypes } = require("../../../constants")
|
|
17
|
+
const { isEqual } = require("lodash")
|
|
15
18
|
const { validate, findRow } = require("./utils")
|
|
16
19
|
const { fullSearch, paginatedSearch } = require("./internalSearch")
|
|
17
20
|
const { getGlobalUsersFromMetadata } = require("../../../utilities/global")
|
|
@@ -24,8 +27,6 @@ const {
|
|
|
24
27
|
getFromMemoryDoc,
|
|
25
28
|
} = require("../view/utils")
|
|
26
29
|
const { cloneDeep } = require("lodash/fp")
|
|
27
|
-
const { getAppDB } = require("@budibase/backend-core/context")
|
|
28
|
-
const { finaliseRow, updateRelatedFormula } = require("./staticFormula")
|
|
29
30
|
|
|
30
31
|
const CALCULATION_TYPES = {
|
|
31
32
|
SUM: "sum",
|
|
@@ -33,6 +34,51 @@ const CALCULATION_TYPES = {
|
|
|
33
34
|
STATS: "stats",
|
|
34
35
|
}
|
|
35
36
|
|
|
37
|
+
async function storeResponse(ctx, db, row, oldTable, table) {
|
|
38
|
+
row.type = "row"
|
|
39
|
+
// don't worry about rev, tables handle rev/lastID updates
|
|
40
|
+
// if another row has been written since processing this will
|
|
41
|
+
// handle the auto ID clash
|
|
42
|
+
if (!isEqual(oldTable, table)) {
|
|
43
|
+
try {
|
|
44
|
+
await db.put(table)
|
|
45
|
+
} catch (err) {
|
|
46
|
+
if (err.status === 409) {
|
|
47
|
+
const updatedTable = await db.get(table._id)
|
|
48
|
+
let response = processAutoColumn(null, updatedTable, row, {
|
|
49
|
+
reprocessing: true,
|
|
50
|
+
})
|
|
51
|
+
await db.put(response.table)
|
|
52
|
+
row = response.row
|
|
53
|
+
} else {
|
|
54
|
+
throw err
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const response = await db.put(row)
|
|
59
|
+
row._rev = response.rev
|
|
60
|
+
// process the row before return, to include relationships
|
|
61
|
+
row = await outputProcessing(ctx, table, row, { squash: false })
|
|
62
|
+
return { row, table }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// doesn't do the outputProcessing
|
|
66
|
+
async function getRawTableData(ctx, db, tableId) {
|
|
67
|
+
let rows
|
|
68
|
+
if (tableId === InternalTables.USER_METADATA) {
|
|
69
|
+
await userController.fetchMetadata(ctx)
|
|
70
|
+
rows = ctx.body
|
|
71
|
+
} else {
|
|
72
|
+
const response = await db.allDocs(
|
|
73
|
+
getRowParams(tableId, null, {
|
|
74
|
+
include_docs: true,
|
|
75
|
+
})
|
|
76
|
+
)
|
|
77
|
+
rows = response.rows.map(row => row.doc)
|
|
78
|
+
}
|
|
79
|
+
return rows
|
|
80
|
+
}
|
|
81
|
+
|
|
36
82
|
async function getView(db, viewName) {
|
|
37
83
|
let mainGetter = env.SELF_HOSTED ? getFromDesignDoc : getFromMemoryDoc
|
|
38
84
|
let secondaryGetter = env.SELF_HOSTED ? getFromMemoryDoc : getFromDesignDoc
|
|
@@ -59,24 +105,9 @@ async function getView(db, viewName) {
|
|
|
59
105
|
return viewInfo
|
|
60
106
|
}
|
|
61
107
|
|
|
62
|
-
async function getRawTableData(ctx, db, tableId) {
|
|
63
|
-
let rows
|
|
64
|
-
if (tableId === InternalTables.USER_METADATA) {
|
|
65
|
-
await userController.fetchMetadata(ctx)
|
|
66
|
-
rows = ctx.body
|
|
67
|
-
} else {
|
|
68
|
-
const response = await db.allDocs(
|
|
69
|
-
getRowParams(tableId, null, {
|
|
70
|
-
include_docs: true,
|
|
71
|
-
})
|
|
72
|
-
)
|
|
73
|
-
rows = response.rows.map(row => row.doc)
|
|
74
|
-
}
|
|
75
|
-
return rows
|
|
76
|
-
}
|
|
77
|
-
|
|
78
108
|
exports.patch = async ctx => {
|
|
79
|
-
const
|
|
109
|
+
const appId = ctx.appId
|
|
110
|
+
const db = new CouchDB(appId)
|
|
80
111
|
const inputs = ctx.request.body
|
|
81
112
|
const tableId = inputs.tableId
|
|
82
113
|
const isUserTable = tableId === InternalTables.USER_METADATA
|
|
@@ -115,13 +146,14 @@ exports.patch = async ctx => {
|
|
|
115
146
|
|
|
116
147
|
// returned row is cleaned and prepared for writing to DB
|
|
117
148
|
row = await linkRows.updateLinks({
|
|
149
|
+
appId,
|
|
118
150
|
eventType: linkRows.EventType.ROW_UPDATE,
|
|
119
151
|
row,
|
|
120
152
|
tableId: row.tableId,
|
|
121
153
|
table,
|
|
122
154
|
})
|
|
123
155
|
// check if any attachments removed
|
|
124
|
-
await cleanupAttachments(table, { oldRow, row })
|
|
156
|
+
await cleanupAttachments(appId, table, { oldRow, row })
|
|
125
157
|
|
|
126
158
|
if (isUserTable) {
|
|
127
159
|
// the row has been updated, need to put it into the ctx
|
|
@@ -130,14 +162,12 @@ exports.patch = async ctx => {
|
|
|
130
162
|
return { row: ctx.body, table }
|
|
131
163
|
}
|
|
132
164
|
|
|
133
|
-
return
|
|
134
|
-
oldTable: dbTable,
|
|
135
|
-
updateFormula: true,
|
|
136
|
-
})
|
|
165
|
+
return storeResponse(ctx, db, row, dbTable, table)
|
|
137
166
|
}
|
|
138
167
|
|
|
139
168
|
exports.save = async function (ctx) {
|
|
140
|
-
const
|
|
169
|
+
const appId = ctx.appId
|
|
170
|
+
const db = new CouchDB(appId)
|
|
141
171
|
let inputs = ctx.request.body
|
|
142
172
|
inputs.tableId = ctx.params.tableId
|
|
143
173
|
|
|
@@ -159,19 +189,18 @@ exports.save = async function (ctx) {
|
|
|
159
189
|
|
|
160
190
|
// make sure link rows are up to date
|
|
161
191
|
row = await linkRows.updateLinks({
|
|
192
|
+
appId,
|
|
162
193
|
eventType: linkRows.EventType.ROW_SAVE,
|
|
163
194
|
row,
|
|
164
195
|
tableId: row.tableId,
|
|
165
196
|
table,
|
|
166
197
|
})
|
|
167
198
|
|
|
168
|
-
return
|
|
169
|
-
oldTable: dbTable,
|
|
170
|
-
updateFormula: true,
|
|
171
|
-
})
|
|
199
|
+
return storeResponse(ctx, db, row, dbTable, table)
|
|
172
200
|
}
|
|
173
201
|
|
|
174
202
|
exports.fetchView = async ctx => {
|
|
203
|
+
const appId = ctx.appId
|
|
175
204
|
const viewName = ctx.params.viewName
|
|
176
205
|
|
|
177
206
|
// if this is a table view being looked for just transfer to that
|
|
@@ -180,7 +209,7 @@ exports.fetchView = async ctx => {
|
|
|
180
209
|
return exports.fetch(ctx)
|
|
181
210
|
}
|
|
182
211
|
|
|
183
|
-
const db =
|
|
212
|
+
const db = new CouchDB(appId)
|
|
184
213
|
const { calculation, group, field } = ctx.query
|
|
185
214
|
const viewInfo = await getView(db, viewName)
|
|
186
215
|
let response
|
|
@@ -207,7 +236,7 @@ exports.fetchView = async ctx => {
|
|
|
207
236
|
schema: {},
|
|
208
237
|
}
|
|
209
238
|
}
|
|
210
|
-
rows = await outputProcessing(table, response.rows)
|
|
239
|
+
rows = await outputProcessing(ctx, table, response.rows)
|
|
211
240
|
}
|
|
212
241
|
|
|
213
242
|
if (calculation === CALCULATION_TYPES.STATS) {
|
|
@@ -234,24 +263,27 @@ exports.fetchView = async ctx => {
|
|
|
234
263
|
}
|
|
235
264
|
|
|
236
265
|
exports.fetch = async ctx => {
|
|
237
|
-
const
|
|
266
|
+
const appId = ctx.appId
|
|
267
|
+
const db = new CouchDB(appId)
|
|
238
268
|
|
|
239
269
|
const tableId = ctx.params.tableId
|
|
240
270
|
let table = await db.get(tableId)
|
|
241
271
|
let rows = await getRawTableData(ctx, db, tableId)
|
|
242
|
-
return outputProcessing(table, rows)
|
|
272
|
+
return outputProcessing(ctx, table, rows)
|
|
243
273
|
}
|
|
244
274
|
|
|
245
275
|
exports.find = async ctx => {
|
|
246
|
-
const
|
|
276
|
+
const appId = ctx.appId
|
|
277
|
+
const db = new CouchDB(appId)
|
|
247
278
|
const table = await db.get(ctx.params.tableId)
|
|
248
|
-
let row = await findRow(ctx, ctx.params.tableId, ctx.params.rowId)
|
|
249
|
-
row = await outputProcessing(table, row)
|
|
279
|
+
let row = await findRow(ctx, db, ctx.params.tableId, ctx.params.rowId)
|
|
280
|
+
row = await outputProcessing(ctx, table, row)
|
|
250
281
|
return row
|
|
251
282
|
}
|
|
252
283
|
|
|
253
284
|
exports.destroy = async function (ctx) {
|
|
254
|
-
const
|
|
285
|
+
const appId = ctx.appId
|
|
286
|
+
const db = new CouchDB(appId)
|
|
255
287
|
const { _id, _rev } = ctx.request.body
|
|
256
288
|
let row = await db.get(_id)
|
|
257
289
|
|
|
@@ -260,17 +292,16 @@ exports.destroy = async function (ctx) {
|
|
|
260
292
|
}
|
|
261
293
|
const table = await db.get(row.tableId)
|
|
262
294
|
// update the row to include full relationships before deleting them
|
|
263
|
-
row = await outputProcessing(table, row, { squash: false })
|
|
295
|
+
row = await outputProcessing(ctx, table, row, { squash: false })
|
|
264
296
|
// now remove the relationships
|
|
265
297
|
await linkRows.updateLinks({
|
|
298
|
+
appId,
|
|
266
299
|
eventType: linkRows.EventType.ROW_DELETE,
|
|
267
300
|
row,
|
|
268
301
|
tableId: row.tableId,
|
|
269
302
|
})
|
|
270
303
|
// remove any attachments that were on the row from object storage
|
|
271
|
-
await cleanupAttachments(table, { row })
|
|
272
|
-
// remove any static formula
|
|
273
|
-
await updateRelatedFormula(table, row)
|
|
304
|
+
await cleanupAttachments(appId, table, { row })
|
|
274
305
|
|
|
275
306
|
let response
|
|
276
307
|
if (ctx.params.tableId === InternalTables.USER_METADATA) {
|
|
@@ -286,18 +317,20 @@ exports.destroy = async function (ctx) {
|
|
|
286
317
|
}
|
|
287
318
|
|
|
288
319
|
exports.bulkDestroy = async ctx => {
|
|
289
|
-
const
|
|
320
|
+
const appId = ctx.appId
|
|
321
|
+
const db = new CouchDB(appId)
|
|
290
322
|
const tableId = ctx.params.tableId
|
|
291
323
|
const table = await db.get(tableId)
|
|
292
324
|
let { rows } = ctx.request.body
|
|
293
325
|
|
|
294
326
|
// before carrying out any updates, make sure the rows are ready to be returned
|
|
295
327
|
// they need to be the full rows (including previous relationships) for automations
|
|
296
|
-
rows = await outputProcessing(table, rows, { squash: false })
|
|
328
|
+
rows = await outputProcessing(ctx, table, rows, { squash: false })
|
|
297
329
|
|
|
298
330
|
// remove the relationships first
|
|
299
331
|
let updates = rows.map(row =>
|
|
300
332
|
linkRows.updateLinks({
|
|
333
|
+
appId,
|
|
301
334
|
eventType: linkRows.EventType.ROW_DELETE,
|
|
302
335
|
row,
|
|
303
336
|
tableId: row.tableId,
|
|
@@ -316,8 +349,7 @@ exports.bulkDestroy = async ctx => {
|
|
|
316
349
|
await db.bulkDocs(rows.map(row => ({ ...row, _deleted: true })))
|
|
317
350
|
}
|
|
318
351
|
// remove any attachments that were on the rows from object storage
|
|
319
|
-
await cleanupAttachments(table, { rows })
|
|
320
|
-
await updateRelatedFormula(table, rows)
|
|
352
|
+
await cleanupAttachments(appId, table, { rows })
|
|
321
353
|
await Promise.all(updates)
|
|
322
354
|
return { response: { ok: true }, rows }
|
|
323
355
|
}
|
|
@@ -328,27 +360,28 @@ exports.search = async ctx => {
|
|
|
328
360
|
return { rows: await exports.fetch(ctx) }
|
|
329
361
|
}
|
|
330
362
|
|
|
363
|
+
const appId = ctx.appId
|
|
331
364
|
const { tableId } = ctx.params
|
|
332
|
-
const db =
|
|
365
|
+
const db = new CouchDB(appId)
|
|
333
366
|
const { paginate, query, ...params } = ctx.request.body
|
|
334
367
|
params.version = ctx.version
|
|
335
368
|
params.tableId = tableId
|
|
336
369
|
|
|
337
370
|
let response
|
|
338
371
|
if (paginate) {
|
|
339
|
-
response = await paginatedSearch(query, params)
|
|
372
|
+
response = await paginatedSearch(appId, query, params)
|
|
340
373
|
} else {
|
|
341
|
-
response = await fullSearch(query, params)
|
|
374
|
+
response = await fullSearch(appId, query, params)
|
|
342
375
|
}
|
|
343
376
|
|
|
344
377
|
// Enrich search results with relationships
|
|
345
378
|
if (response.rows && response.rows.length) {
|
|
346
379
|
// enrich with global users if from users table
|
|
347
380
|
if (tableId === InternalTables.USER_METADATA) {
|
|
348
|
-
response.rows = await getGlobalUsersFromMetadata(response.rows)
|
|
381
|
+
response.rows = await getGlobalUsersFromMetadata(appId, response.rows)
|
|
349
382
|
}
|
|
350
383
|
const table = await db.get(tableId)
|
|
351
|
-
response.rows = await outputProcessing(table, response.rows)
|
|
384
|
+
response.rows = await outputProcessing(ctx, table, response.rows)
|
|
352
385
|
}
|
|
353
386
|
|
|
354
387
|
return response
|
|
@@ -356,22 +389,25 @@ exports.search = async ctx => {
|
|
|
356
389
|
|
|
357
390
|
exports.validate = async ctx => {
|
|
358
391
|
return validate({
|
|
392
|
+
appId: ctx.appId,
|
|
359
393
|
tableId: ctx.params.tableId,
|
|
360
394
|
row: ctx.request.body,
|
|
361
395
|
})
|
|
362
396
|
}
|
|
363
397
|
|
|
364
398
|
exports.fetchEnrichedRow = async ctx => {
|
|
365
|
-
const
|
|
399
|
+
const appId = ctx.appId
|
|
400
|
+
const db = new CouchDB(appId)
|
|
366
401
|
const tableId = ctx.params.tableId
|
|
367
402
|
const rowId = ctx.params.rowId
|
|
368
403
|
// need table to work out where links go in row
|
|
369
404
|
let [table, row] = await Promise.all([
|
|
370
405
|
db.get(tableId),
|
|
371
|
-
findRow(ctx, tableId, rowId),
|
|
406
|
+
findRow(ctx, db, tableId, rowId),
|
|
372
407
|
])
|
|
373
408
|
// get the link docs
|
|
374
409
|
const linkVals = await linkRows.getLinkDocuments({
|
|
410
|
+
appId,
|
|
375
411
|
tableId,
|
|
376
412
|
rowId,
|
|
377
413
|
})
|
|
@@ -398,7 +434,7 @@ exports.fetchEnrichedRow = async ctx => {
|
|
|
398
434
|
for (let [tableId, rows] of Object.entries(groups)) {
|
|
399
435
|
// need to include the IDs in these rows for any links they may have
|
|
400
436
|
linkedRows = linkedRows.concat(
|
|
401
|
-
await outputProcessing(tables[tableId], rows)
|
|
437
|
+
await outputProcessing(ctx, tables[tableId], rows)
|
|
402
438
|
)
|
|
403
439
|
}
|
|
404
440
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
const { SearchIndexes } = require("../../../db/utils")
|
|
2
2
|
const fetch = require("node-fetch")
|
|
3
3
|
const { getCouchUrl } = require("@budibase/backend-core/db")
|
|
4
|
-
const { getAppId } = require("@budibase/backend-core/context")
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* Class to build lucene query URLs.
|
|
8
7
|
* Optionally takes a base lucene query object.
|
|
9
8
|
*/
|
|
10
9
|
class QueryBuilder {
|
|
11
|
-
constructor(base) {
|
|
10
|
+
constructor(appId, base) {
|
|
11
|
+
this.appId = appId
|
|
12
12
|
this.query = {
|
|
13
13
|
string: {},
|
|
14
14
|
fuzzy: {},
|
|
@@ -37,30 +37,22 @@ class QueryBuilder {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
setLimit(limit) {
|
|
40
|
-
|
|
41
|
-
this.limit = limit
|
|
42
|
-
}
|
|
40
|
+
this.limit = limit
|
|
43
41
|
return this
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
setSort(sort) {
|
|
47
|
-
|
|
48
|
-
this.sort = sort
|
|
49
|
-
}
|
|
45
|
+
this.sort = sort
|
|
50
46
|
return this
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
setSortOrder(sortOrder) {
|
|
54
|
-
|
|
55
|
-
this.sortOrder = sortOrder
|
|
56
|
-
}
|
|
50
|
+
this.sortOrder = sortOrder
|
|
57
51
|
return this
|
|
58
52
|
}
|
|
59
53
|
|
|
60
54
|
setSortType(sortType) {
|
|
61
|
-
|
|
62
|
-
this.sortType = sortType
|
|
63
|
-
}
|
|
55
|
+
this.sortType = sortType
|
|
64
56
|
return this
|
|
65
57
|
}
|
|
66
58
|
|
|
@@ -241,8 +233,7 @@ class QueryBuilder {
|
|
|
241
233
|
}
|
|
242
234
|
|
|
243
235
|
async run() {
|
|
244
|
-
const
|
|
245
|
-
const url = `${getCouchUrl()}/${appId}/_design/database/_search/${
|
|
236
|
+
const url = `${getCouchUrl()}/${this.appId}/_design/database/_search/${
|
|
246
237
|
SearchIndexes.ROWS
|
|
247
238
|
}`
|
|
248
239
|
const body = this.buildSearchBody()
|
|
@@ -279,6 +270,7 @@ const runQuery = async (url, body) => {
|
|
|
279
270
|
* Gets round the fixed limit of 200 results from a query by fetching as many
|
|
280
271
|
* pages as required and concatenating the results. This recursively operates
|
|
281
272
|
* until enough results have been found.
|
|
273
|
+
* @param appId {string} The app ID to search
|
|
282
274
|
* @param query {object} The JSON query structure
|
|
283
275
|
* @param params {object} The search params including:
|
|
284
276
|
* tableId {string} The table ID to search
|
|
@@ -291,7 +283,7 @@ const runQuery = async (url, body) => {
|
|
|
291
283
|
* rows {array|null} Current results in the recursive search
|
|
292
284
|
* @returns {Promise<*[]|*>}
|
|
293
285
|
*/
|
|
294
|
-
const recursiveSearch = async (query, params) => {
|
|
286
|
+
const recursiveSearch = async (appId, query, params) => {
|
|
295
287
|
const bookmark = params.bookmark
|
|
296
288
|
const rows = params.rows || []
|
|
297
289
|
if (rows.length >= params.limit) {
|
|
@@ -301,7 +293,7 @@ const recursiveSearch = async (query, params) => {
|
|
|
301
293
|
if (rows.length > params.limit - 200) {
|
|
302
294
|
pageSize = params.limit - rows.length
|
|
303
295
|
}
|
|
304
|
-
const page = await new QueryBuilder(query)
|
|
296
|
+
const page = await new QueryBuilder(appId, query)
|
|
305
297
|
.setVersion(params.version)
|
|
306
298
|
.setTable(params.tableId)
|
|
307
299
|
.setBookmark(bookmark)
|
|
@@ -321,13 +313,14 @@ const recursiveSearch = async (query, params) => {
|
|
|
321
313
|
bookmark: page.bookmark,
|
|
322
314
|
rows: [...rows, ...page.rows],
|
|
323
315
|
}
|
|
324
|
-
return await recursiveSearch(query, newParams)
|
|
316
|
+
return await recursiveSearch(appId, query, newParams)
|
|
325
317
|
}
|
|
326
318
|
|
|
327
319
|
/**
|
|
328
320
|
* Performs a paginated search. A bookmark will be returned to allow the next
|
|
329
321
|
* page to be fetched. There is a max limit off 200 results per page in a
|
|
330
322
|
* paginated search.
|
|
323
|
+
* @param appId {string} The app ID to search
|
|
331
324
|
* @param query {object} The JSON query structure
|
|
332
325
|
* @param params {object} The search params including:
|
|
333
326
|
* tableId {string} The table ID to search
|
|
@@ -339,13 +332,13 @@ const recursiveSearch = async (query, params) => {
|
|
|
339
332
|
* bookmark {string} The bookmark to resume from
|
|
340
333
|
* @returns {Promise<{hasNextPage: boolean, rows: *[]}>}
|
|
341
334
|
*/
|
|
342
|
-
exports.paginatedSearch = async (query, params) => {
|
|
335
|
+
exports.paginatedSearch = async (appId, query, params) => {
|
|
343
336
|
let limit = params.limit
|
|
344
337
|
if (limit == null || isNaN(limit) || limit < 0) {
|
|
345
338
|
limit = 50
|
|
346
339
|
}
|
|
347
340
|
limit = Math.min(limit, 200)
|
|
348
|
-
const search = new QueryBuilder(query)
|
|
341
|
+
const search = new QueryBuilder(appId, query)
|
|
349
342
|
.setVersion(params.version)
|
|
350
343
|
.setTable(params.tableId)
|
|
351
344
|
.setSort(params.sort)
|
|
@@ -374,6 +367,7 @@ exports.paginatedSearch = async (query, params) => {
|
|
|
374
367
|
* desired amount of results. There is a limit of 1000 results to avoid
|
|
375
368
|
* heavy performance hits, and to avoid client components breaking from
|
|
376
369
|
* handling too much data.
|
|
370
|
+
* @param appId {string} The app ID to search
|
|
377
371
|
* @param query {object} The JSON query structure
|
|
378
372
|
* @param params {object} The search params including:
|
|
379
373
|
* tableId {string} The table ID to search
|
|
@@ -384,12 +378,12 @@ exports.paginatedSearch = async (query, params) => {
|
|
|
384
378
|
* limit {number} The desired number of results
|
|
385
379
|
* @returns {Promise<{rows: *}>}
|
|
386
380
|
*/
|
|
387
|
-
exports.fullSearch = async (query, params) => {
|
|
381
|
+
exports.fullSearch = async (appId, query, params) => {
|
|
388
382
|
let limit = params.limit
|
|
389
383
|
if (limit == null || isNaN(limit) || limit < 0) {
|
|
390
384
|
limit = 1000
|
|
391
385
|
}
|
|
392
386
|
params.limit = Math.min(limit, 1000)
|
|
393
|
-
const rows = await recursiveSearch(query, params)
|
|
387
|
+
const rows = await recursiveSearch(appId, query, params)
|
|
394
388
|
return { rows }
|
|
395
389
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
const validateJs = require("validate.js")
|
|
2
2
|
const { cloneDeep } = require("lodash/fp")
|
|
3
|
+
const CouchDB = require("../../../db")
|
|
3
4
|
const { InternalTables } = require("../../../db/utils")
|
|
4
5
|
const userController = require("../user")
|
|
5
6
|
const { FieldTypes } = require("../../../constants")
|
|
6
7
|
const { processStringSync } = require("@budibase/string-templates")
|
|
7
8
|
const { makeExternalQuery } = require("../../../integrations/base/utils")
|
|
8
|
-
const { getAppDB } = require("@budibase/backend-core/context")
|
|
9
9
|
|
|
10
10
|
validateJs.extend(validateJs.validators.datetime, {
|
|
11
11
|
parse: function (value) {
|
|
@@ -17,15 +17,14 @@ validateJs.extend(validateJs.validators.datetime, {
|
|
|
17
17
|
},
|
|
18
18
|
})
|
|
19
19
|
|
|
20
|
-
exports.getDatasourceAndQuery = async json => {
|
|
20
|
+
exports.getDatasourceAndQuery = async (appId, json) => {
|
|
21
21
|
const datasourceId = json.endpoint.datasourceId
|
|
22
|
-
const db =
|
|
22
|
+
const db = new CouchDB(appId)
|
|
23
23
|
const datasource = await db.get(datasourceId)
|
|
24
24
|
return makeExternalQuery(datasource, json)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
exports.findRow = async (ctx, tableId, rowId) => {
|
|
28
|
-
const db = getAppDB()
|
|
27
|
+
exports.findRow = async (ctx, db, tableId, rowId) => {
|
|
29
28
|
let row
|
|
30
29
|
// TODO remove special user case in future
|
|
31
30
|
if (tableId === InternalTables.USER_METADATA) {
|
|
@@ -43,9 +42,9 @@ exports.findRow = async (ctx, tableId, rowId) => {
|
|
|
43
42
|
return row
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
exports.validate = async ({ tableId, row, table }) => {
|
|
45
|
+
exports.validate = async ({ appId, tableId, row, table }) => {
|
|
47
46
|
if (!table) {
|
|
48
|
-
const db =
|
|
47
|
+
const db = new CouchDB(appId)
|
|
49
48
|
table = await db.get(tableId)
|
|
50
49
|
}
|
|
51
50
|
const errors = {}
|
|
@@ -59,16 +58,22 @@ exports.validate = async ({ tableId, row, table }) => {
|
|
|
59
58
|
let res
|
|
60
59
|
|
|
61
60
|
// Validate.js doesn't seem to handle array
|
|
62
|
-
if (type === FieldTypes.ARRAY
|
|
63
|
-
|
|
61
|
+
if (type === FieldTypes.ARRAY) {
|
|
62
|
+
const hasValues =
|
|
63
|
+
Array.isArray(row[fieldName]) && row[fieldName].length > 0
|
|
64
|
+
|
|
65
|
+
// Check values are valid if values are specified
|
|
66
|
+
if (hasValues) {
|
|
64
67
|
row[fieldName].map(val => {
|
|
65
68
|
if (!constraints.inclusion.includes(val)) {
|
|
66
|
-
errors[fieldName] = "
|
|
69
|
+
errors[fieldName] = "Value not in list"
|
|
67
70
|
}
|
|
68
71
|
})
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Check for required constraint
|
|
75
|
+
if (constraints.presence === true && !hasValues) {
|
|
76
|
+
errors[fieldName] = "Required field"
|
|
72
77
|
}
|
|
73
78
|
} else if (type === FieldTypes.JSON && typeof row[fieldName] === "string") {
|
|
74
79
|
// this should only happen if there is an error
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
const CouchDB = require("../../db")
|
|
1
2
|
const { getScreenParams, generateScreenID } = require("../../db/utils")
|
|
2
3
|
const { AccessController } = require("@budibase/backend-core/roles")
|
|
3
|
-
const { getAppDB } = require("@budibase/backend-core/context")
|
|
4
4
|
|
|
5
5
|
exports.fetch = async ctx => {
|
|
6
|
-
const
|
|
6
|
+
const appId = ctx.appId
|
|
7
|
+
const db = new CouchDB(appId)
|
|
7
8
|
|
|
8
9
|
const screens = (
|
|
9
10
|
await db.allDocs(
|
|
@@ -13,14 +14,15 @@ exports.fetch = async ctx => {
|
|
|
13
14
|
)
|
|
14
15
|
).rows.map(element => element.doc)
|
|
15
16
|
|
|
16
|
-
ctx.body = await new AccessController().checkScreensAccess(
|
|
17
|
+
ctx.body = await new AccessController(appId).checkScreensAccess(
|
|
17
18
|
screens,
|
|
18
19
|
ctx.user.role._id
|
|
19
20
|
)
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
exports.save = async ctx => {
|
|
23
|
-
const
|
|
24
|
+
const appId = ctx.appId
|
|
25
|
+
const db = new CouchDB(appId)
|
|
24
26
|
let screen = ctx.request.body
|
|
25
27
|
|
|
26
28
|
if (!screen._id) {
|
|
@@ -37,7 +39,7 @@ exports.save = async ctx => {
|
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
exports.destroy = async ctx => {
|
|
40
|
-
const db =
|
|
42
|
+
const db = new CouchDB(ctx.appId)
|
|
41
43
|
await db.remove(ctx.params.screenId, ctx.params.screenRev)
|
|
42
44
|
ctx.body = {
|
|
43
45
|
message: "Screen deleted successfully",
|