@budibase/server 2.3.19 → 2.3.21-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__/aws-sdk.ts +1 -1
- package/__mocks__/node-fetch.ts +3 -0
- package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
- package/builder/assets/{index.a3f8cb92.js → index.90fba548.js} +439 -426
- package/builder/assets/index.b24b9dea.css +6 -0
- package/builder/assets/listScreenPreview.599c0aae.png +0 -0
- package/builder/index.html +2 -2
- package/dist/api/controllers/automation.js +11 -2
- package/dist/api/controllers/cloud.js +2 -2
- package/dist/api/controllers/query/index.js +2 -0
- package/dist/api/controllers/row/ExternalRequest.js +50 -23
- package/dist/api/controllers/row/external.js +12 -1
- package/dist/api/controllers/row/internalSearch.js +6 -450
- package/dist/api/controllers/row/utils.js +1 -3
- package/dist/api/controllers/table/external.js +8 -8
- package/dist/api/index.js +1 -21
- package/dist/api/routes/automation.js +1 -1
- package/dist/api/routes/public/applications.js +7 -7
- package/dist/api/routes/public/queries.js +2 -2
- package/dist/api/routes/public/rows.js +5 -5
- package/dist/api/routes/public/tables.js +5 -5
- package/dist/api/routes/public/users.js +5 -5
- package/dist/app.js +9 -1
- package/dist/constants/index.js +4 -24
- package/dist/db/defaultData/datasource_bb_default.js +6 -5
- package/dist/db/index.js +25 -2
- package/dist/db/linkedRows/LinkController.js +9 -8
- package/dist/db/utils.js +2 -5
- package/dist/db/views/staticViews.js +2 -1
- package/dist/ddApm.js +11 -0
- package/dist/elasticApm.js +14 -0
- package/dist/integrations/base/sql.js +6 -3
- package/dist/integrations/googlesheets.js +17 -20
- package/dist/middleware/authorized.js +5 -3
- package/dist/middleware/builder.js +6 -3
- package/dist/migrations/functions/backfill/global/configs.js +10 -4
- package/dist/migrations/tests/helpers.js +1 -1
- package/dist/migrations/tests/structures.js +1 -1
- package/dist/package.json +14 -9
- package/dist/sdk/app/backups/constants.js +2 -1
- package/dist/sdk/app/backups/exports.js +20 -7
- package/dist/sdk/app/datasources/datasources.js +3 -0
- package/dist/sdk/app/rows/attachments.js +1 -1
- package/dist/startup.js +3 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/redis.js +2 -0
- package/dist/utilities/retry.js +30 -0
- package/jest-testcontainers-config.js +8 -0
- package/jest.config.ts +35 -22
- package/package.json +15 -10
- package/scripts/load/create-many-apps.js +24 -0
- package/scripts/load/create-many-rows.js +30 -0
- package/scripts/load/utils.js +66 -0
- package/scripts/test.sh +12 -0
- package/specs/{generate.js → generate.ts} +7 -9
- package/specs/openapi.json +30 -30
- package/specs/openapi.yaml +27 -27
- package/specs/{parameters.js → parameters.ts} +6 -6
- package/specs/resources/{application.js → application.ts} +4 -4
- package/specs/resources/{index.js → index.ts} +8 -8
- package/specs/resources/{misc.js → misc.ts} +3 -3
- package/specs/resources/{query.js → query.ts} +4 -4
- package/specs/resources/{row.js → row.ts} +3 -4
- package/specs/resources/{table.js → table.ts} +5 -5
- package/specs/resources/{user.js → user.ts} +3 -3
- package/specs/resources/utils/Resource.ts +39 -0
- package/specs/resources/utils/{index.js → index.ts} +1 -1
- package/specs/{security.js → security.ts} +1 -1
- package/src/api/controllers/automation.ts +13 -2
- package/src/api/controllers/cloud.ts +2 -2
- package/src/api/controllers/query/import/tests/index.spec.js +1 -1
- package/src/api/controllers/query/index.ts +2 -0
- package/src/api/controllers/row/ExternalRequest.ts +98 -27
- package/src/api/controllers/row/external.ts +13 -1
- package/src/api/controllers/row/internalSearch.ts +11 -524
- package/src/api/controllers/row/utils.ts +1 -2
- package/src/api/controllers/table/external.ts +3 -2
- package/src/api/index.ts +3 -22
- package/src/api/routes/automation.ts +1 -1
- package/src/api/routes/public/applications.ts +7 -8
- package/src/api/routes/public/queries.ts +2 -2
- package/src/api/routes/public/rows.ts +5 -5
- package/src/api/routes/public/tables.ts +5 -5
- package/src/api/routes/public/tests/{compare.spec.js → compare.spec.ts} +45 -26
- package/src/api/routes/public/tests/users.spec.js +1 -1
- package/src/api/routes/public/tests/utils.ts +25 -8
- package/src/api/routes/public/users.ts +5 -5
- package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
- package/src/api/routes/tests/analytics.spec.js +4 -1
- package/src/api/routes/tests/apikeys.spec.js +1 -1
- package/src/api/routes/tests/application.spec.ts +20 -6
- package/src/api/routes/tests/auth.spec.js +2 -2
- package/src/api/routes/tests/automation.spec.js +6 -2
- package/src/api/routes/tests/backup.spec.ts +4 -14
- package/src/api/routes/tests/cloud.spec.ts +20 -31
- package/src/api/routes/tests/component.spec.js +1 -1
- package/src/api/routes/tests/datasource.spec.ts +20 -3
- package/src/api/routes/tests/dev.spec.js +1 -1
- package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
- package/src/api/routes/tests/integration.spec.js +1 -1
- package/src/api/routes/tests/layout.spec.js +1 -1
- package/src/api/routes/tests/metadata.spec.js +1 -1
- package/src/api/routes/tests/misc.spec.js +1 -1
- package/src/api/routes/tests/permissions.spec.js +4 -1
- package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +22 -1
- package/src/api/routes/tests/role.spec.js +6 -1
- package/src/api/routes/tests/routing.spec.js +1 -1
- package/src/api/routes/tests/row.spec.js +11 -3
- package/src/api/routes/tests/screen.spec.js +1 -1
- package/src/api/routes/tests/static.spec.js +2 -13
- package/src/api/routes/tests/table.spec.js +1 -1
- package/src/api/routes/tests/templates.spec.js +1 -1
- package/src/api/routes/tests/user.spec.js +11 -12
- package/src/api/routes/tests/utilities/TestFunctions.ts +25 -3
- package/src/api/routes/tests/utilities/index.ts +5 -3
- package/src/api/routes/tests/view.spec.js +4 -1
- package/src/api/routes/tests/webhook.spec.js +11 -2
- package/src/app.ts +12 -1
- package/src/automations/tests/automation.spec.js +4 -4
- package/src/automations/tests/bash.spec.js +1 -1
- package/src/automations/tests/discord.spec.js +1 -1
- package/src/automations/tests/executeQuery.spec.js +2 -3
- package/src/automations/tests/executeScript.spec.js +1 -1
- package/src/automations/tests/outgoingWebhook.spec.js +1 -1
- package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
- package/src/automations/tests/serverLog.spec.js +1 -1
- package/src/automations/tests/updateRow.spec.js +1 -1
- package/src/automations/tests/zapier.spec.js +1 -1
- package/src/constants/index.ts +1 -23
- package/src/db/defaultData/datasource_bb_default.ts +6 -10
- package/src/db/index.ts +2 -2
- package/src/db/linkedRows/LinkController.ts +2 -1
- package/src/db/tests/linkController.spec.js +4 -1
- package/src/db/tests/linkTests.spec.js +1 -1
- package/src/db/utils.ts +0 -4
- package/src/db/views/staticViews.ts +3 -3
- package/src/ddApm.ts +7 -0
- package/src/definitions/openapi.ts +449 -63
- package/src/elasticApm.ts +10 -0
- package/src/integration-test/postgres.spec.ts +1032 -0
- package/src/integrations/base/sql.ts +11 -5
- package/src/integrations/googlesheets.ts +21 -22
- package/src/integrations/oracle.ts +1 -1
- package/src/integrations/tests/couchdb.spec.ts +0 -2
- package/src/integrations/tests/googlesheets.spec.ts +122 -0
- package/src/middleware/authorized.ts +6 -4
- package/src/middleware/builder.ts +8 -3
- package/src/migrations/functions/backfill/global/configs.ts +15 -9
- package/src/migrations/functions/tests/appUrls.spec.js +1 -1
- package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
- package/src/migrations/functions/tests/userEmailViewCasing.spec.js +4 -5
- package/src/migrations/tests/helpers.ts +2 -2
- package/src/migrations/tests/index.spec.ts +13 -20
- package/src/migrations/tests/structures.ts +1 -0
- package/src/sdk/app/backups/constants.ts +1 -0
- package/src/sdk/app/backups/exports.ts +32 -10
- package/src/sdk/app/datasources/datasources.ts +3 -0
- package/src/sdk/app/rows/attachments.ts +1 -1
- package/src/startup.ts +4 -1
- package/src/tests/jestEnv.ts +9 -11
- package/src/tests/jestSetup.ts +9 -7
- package/src/tests/logging.ts +34 -0
- package/src/tests/utilities/TestConfiguration.ts +187 -101
- package/src/tests/utilities/structures.ts +16 -4
- package/src/utilities/redis.ts +2 -0
- package/src/utilities/retry.ts +18 -0
- package/tsconfig.build.json +1 -0
- package/builder/assets/index.4488f38d.css +0 -6
- package/coverage/clover.xml +0 -11774
- package/coverage/coverage-final.json +0 -284
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -1031
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov-report/src/api/controllers/analytics.ts.html +0 -190
- package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +0 -247
- package/coverage/lcov-report/src/api/controllers/application.ts.html +0 -1987
- package/coverage/lcov-report/src/api/controllers/auth.ts.html +0 -301
- package/coverage/lcov-report/src/api/controllers/automation.ts.html +0 -940
- package/coverage/lcov-report/src/api/controllers/backup.ts.html +0 -148
- package/coverage/lcov-report/src/api/controllers/cloud.ts.html +0 -442
- package/coverage/lcov-report/src/api/controllers/component.ts.html +0 -259
- package/coverage/lcov-report/src/api/controllers/datasource.ts.html +0 -1135
- package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +0 -262
- package/coverage/lcov-report/src/api/controllers/deploy/index.html +0 -131
- package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +0 -694
- package/coverage/lcov-report/src/api/controllers/dev.ts.html +0 -472
- package/coverage/lcov-report/src/api/controllers/index.html +0 -431
- package/coverage/lcov-report/src/api/controllers/integration.ts.html +0 -124
- package/coverage/lcov-report/src/api/controllers/layout.ts.html +0 -226
- package/coverage/lcov-report/src/api/controllers/metadata.ts.html +0 -211
- package/coverage/lcov-report/src/api/controllers/migrations.ts.html +0 -127
- package/coverage/lcov-report/src/api/controllers/permission.ts.html +0 -619
- package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +0 -130
- package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +0 -310
- package/coverage/lcov-report/src/api/controllers/plugin/index.html +0 -206
- package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +0 -499
- package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +0 -253
- package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +0 -97
- package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +0 -121
- package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +0 -136
- package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +0 -385
- package/coverage/lcov-report/src/api/controllers/public/index.html +0 -191
- package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +0 -181
- package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +0 -191
- package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +0 -124
- package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +0 -202
- package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +0 -178
- package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +0 -163
- package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +0 -181
- package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +0 -145
- package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +0 -328
- package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +0 -253
- package/coverage/lcov-report/src/api/controllers/public/users.ts.html +0 -325
- package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +0 -220
- package/coverage/lcov-report/src/api/controllers/query/import/index.html +0 -116
- package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +0 -373
- package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +0 -131
- package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +0 -379
- package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +0 -157
- package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +0 -403
- package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +0 -146
- package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +0 -586
- package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +0 -712
- package/coverage/lcov-report/src/api/controllers/query/index.html +0 -131
- package/coverage/lcov-report/src/api/controllers/query/index.ts.html +0 -1000
- package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +0 -235
- package/coverage/lcov-report/src/api/controllers/role.ts.html +0 -397
- package/coverage/lcov-report/src/api/controllers/routing.ts.html +0 -370
- package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +0 -2305
- package/coverage/lcov-report/src/api/controllers/row/external.ts.html +0 -931
- package/coverage/lcov-report/src/api/controllers/row/index.html +0 -206
- package/coverage/lcov-report/src/api/controllers/row/index.ts.html +0 -541
- package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +0 -1609
- package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +0 -1678
- package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +0 -595
- package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +0 -556
- package/coverage/lcov-report/src/api/controllers/screen.ts.html +0 -463
- package/coverage/lcov-report/src/api/controllers/script.ts.html +0 -121
- package/coverage/lcov-report/src/api/controllers/static/index.html +0 -116
- package/coverage/lcov-report/src/api/controllers/static/index.ts.html +0 -679
- package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +0 -649
- package/coverage/lcov-report/src/api/controllers/table/external.ts.html +0 -1153
- package/coverage/lcov-report/src/api/controllers/table/index.html +0 -176
- package/coverage/lcov-report/src/api/controllers/table/index.ts.html +0 -514
- package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +0 -658
- package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +0 -1273
- package/coverage/lcov-report/src/api/controllers/templates.ts.html +0 -214
- package/coverage/lcov-report/src/api/controllers/user.ts.html +0 -634
- package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +0 -214
- package/coverage/lcov-report/src/api/controllers/view/index.html +0 -161
- package/coverage/lcov-report/src/api/controllers/view/index.ts.html +0 -661
- package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +0 -580
- package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +0 -694
- package/coverage/lcov-report/src/api/controllers/webhook.ts.html +0 -385
- package/coverage/lcov-report/src/api/index.html +0 -116
- package/coverage/lcov-report/src/api/index.ts.html +0 -352
- package/coverage/lcov-report/src/api/routes/analytics.ts.html +0 -112
- package/coverage/lcov-report/src/api/routes/apikeys.ts.html +0 -121
- package/coverage/lcov-report/src/api/routes/application.ts.html +0 -256
- package/coverage/lcov-report/src/api/routes/auth.ts.html +0 -109
- package/coverage/lcov-report/src/api/routes/automation.ts.html +0 -346
- package/coverage/lcov-report/src/api/routes/backup.ts.html +0 -127
- package/coverage/lcov-report/src/api/routes/cloud.ts.html +0 -139
- package/coverage/lcov-report/src/api/routes/component.ts.html +0 -127
- package/coverage/lcov-report/src/api/routes/datasource.ts.html +0 -265
- package/coverage/lcov-report/src/api/routes/deploy.ts.html +0 -145
- package/coverage/lcov-report/src/api/routes/dev.ts.html +0 -199
- package/coverage/lcov-report/src/api/routes/index.html +0 -551
- package/coverage/lcov-report/src/api/routes/index.ts.html +0 -298
- package/coverage/lcov-report/src/api/routes/integration.ts.html +0 -133
- package/coverage/lcov-report/src/api/routes/layout.ts.html +0 -133
- package/coverage/lcov-report/src/api/routes/metadata.ts.html +0 -199
- package/coverage/lcov-report/src/api/routes/migrations.ts.html +0 -127
- package/coverage/lcov-report/src/api/routes/permission.ts.html +0 -208
- package/coverage/lcov-report/src/api/routes/plugin.ts.html +0 -151
- package/coverage/lcov-report/src/api/routes/public/applications.ts.html +0 -673
- package/coverage/lcov-report/src/api/routes/public/index.html +0 -191
- package/coverage/lcov-report/src/api/routes/public/index.ts.html +0 -493
- package/coverage/lcov-report/src/api/routes/public/middleware/index.html +0 -116
- package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +0 -340
- package/coverage/lcov-report/src/api/routes/public/queries.ts.html +0 -313
- package/coverage/lcov-report/src/api/routes/public/rows.ts.html +0 -598
- package/coverage/lcov-report/src/api/routes/public/tables.ts.html +0 -586
- package/coverage/lcov-report/src/api/routes/public/tests/index.html +0 -116
- package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +0 -169
- package/coverage/lcov-report/src/api/routes/public/users.ts.html +0 -511
- package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +0 -238
- package/coverage/lcov-report/src/api/routes/public/utils/index.html +0 -116
- package/coverage/lcov-report/src/api/routes/query.ts.html +0 -268
- package/coverage/lcov-report/src/api/routes/role.ts.html +0 -157
- package/coverage/lcov-report/src/api/routes/routing.ts.html +0 -127
- package/coverage/lcov-report/src/api/routes/row.ts.html +0 -883
- package/coverage/lcov-report/src/api/routes/screen.ts.html +0 -154
- package/coverage/lcov-report/src/api/routes/script.ts.html +0 -115
- package/coverage/lcov-report/src/api/routes/static.ts.html +0 -280
- package/coverage/lcov-report/src/api/routes/table.ts.html +0 -595
- package/coverage/lcov-report/src/api/routes/templates.ts.html +0 -133
- package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +0 -550
- package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +0 -131
- package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +0 -367
- package/coverage/lcov-report/src/api/routes/user.ts.html +0 -238
- package/coverage/lcov-report/src/api/routes/utils/index.html +0 -116
- package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +0 -805
- package/coverage/lcov-report/src/api/routes/view.ts.html +0 -187
- package/coverage/lcov-report/src/api/routes/webhook.ts.html +0 -166
- package/coverage/lcov-report/src/app.ts.html +0 -424
- package/coverage/lcov-report/src/automations/actions.ts.html +0 -316
- package/coverage/lcov-report/src/automations/automationUtils.ts.html +0 -562
- package/coverage/lcov-report/src/automations/bullboard.ts.html +0 -199
- package/coverage/lcov-report/src/automations/index.html +0 -191
- package/coverage/lcov-report/src/automations/index.ts.html +0 -163
- package/coverage/lcov-report/src/automations/logging/index.html +0 -116
- package/coverage/lcov-report/src/automations/logging/index.ts.html +0 -199
- package/coverage/lcov-report/src/automations/steps/bash.ts.html +0 -319
- package/coverage/lcov-report/src/automations/steps/createRow.ts.html +0 -382
- package/coverage/lcov-report/src/automations/steps/delay.ts.html +0 -217
- package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +0 -349
- package/coverage/lcov-report/src/automations/steps/discord.ts.html +0 -397
- package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +0 -370
- package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +0 -325
- package/coverage/lcov-report/src/automations/steps/filter.ts.html +0 -394
- package/coverage/lcov-report/src/automations/steps/index.html +0 -371
- package/coverage/lcov-report/src/automations/steps/integromat.ts.html +0 -409
- package/coverage/lcov-report/src/automations/steps/loop.ts.html +0 -241
- package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +0 -499
- package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +0 -664
- package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +0 -355
- package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +0 -256
- package/coverage/lcov-report/src/automations/steps/slack.ts.html +0 -340
- package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +0 -439
- package/coverage/lcov-report/src/automations/steps/utils.ts.html +0 -223
- package/coverage/lcov-report/src/automations/steps/zapier.ts.html +0 -403
- package/coverage/lcov-report/src/automations/tests/utilities/index.html +0 -116
- package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +0 -265
- package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +0 -196
- package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +0 -193
- package/coverage/lcov-report/src/automations/triggerInfo/index.html +0 -206
- package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +0 -130
- package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +0 -196
- package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +0 -220
- package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +0 -220
- package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +0 -208
- package/coverage/lcov-report/src/automations/triggers.ts.html +0 -553
- package/coverage/lcov-report/src/automations/utils.ts.html +0 -886
- package/coverage/lcov-report/src/constants/index.html +0 -146
- package/coverage/lcov-report/src/constants/index.ts.html +0 -697
- package/coverage/lcov-report/src/constants/layouts.ts.html +0 -526
- package/coverage/lcov-report/src/constants/screens.ts.html +0 -229
- package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +0 -2059
- package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +0 -541
- package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +0 -427
- package/coverage/lcov-report/src/db/defaultData/index.html +0 -176
- package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +0 -403
- package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +0 -559
- package/coverage/lcov-report/src/db/dynamoClient.ts.html +0 -526
- package/coverage/lcov-report/src/db/inMemoryView.ts.html +0 -250
- package/coverage/lcov-report/src/db/index.html +0 -176
- package/coverage/lcov-report/src/db/index.ts.html +0 -133
- package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +0 -1417
- package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +0 -265
- package/coverage/lcov-report/src/db/linkedRows/index.html +0 -161
- package/coverage/lcov-report/src/db/linkedRows/index.ts.html +0 -736
- package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +0 -460
- package/coverage/lcov-report/src/db/newid.ts.html +0 -100
- package/coverage/lcov-report/src/db/utils.ts.html +0 -913
- package/coverage/lcov-report/src/definitions/automations.ts.html +0 -184
- package/coverage/lcov-report/src/definitions/index.html +0 -116
- package/coverage/lcov-report/src/environment.ts.html +0 -472
- package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +0 -259
- package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +0 -172
- package/coverage/lcov-report/src/events/index.html +0 -161
- package/coverage/lcov-report/src/events/index.ts.html +0 -100
- package/coverage/lcov-report/src/events/utils.ts.html +0 -319
- package/coverage/lcov-report/src/index.html +0 -191
- package/coverage/lcov-report/src/index.ts.html +0 -133
- package/coverage/lcov-report/src/integrations/airtable.ts.html +0 -529
- package/coverage/lcov-report/src/integrations/arangodb.ts.html +0 -415
- package/coverage/lcov-report/src/integrations/base/index.html +0 -161
- package/coverage/lcov-report/src/integrations/base/query.ts.html +0 -139
- package/coverage/lcov-report/src/integrations/base/sql.ts.html +0 -2017
- package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +0 -691
- package/coverage/lcov-report/src/integrations/base/utils.ts.html +0 -121
- package/coverage/lcov-report/src/integrations/couchdb.ts.html +0 -484
- package/coverage/lcov-report/src/integrations/dynamodb.ts.html +0 -745
- package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +0 -646
- package/coverage/lcov-report/src/integrations/firebase.ts.html +0 -646
- package/coverage/lcov-report/src/integrations/googlesheets.ts.html +0 -1315
- package/coverage/lcov-report/src/integrations/index.html +0 -371
- package/coverage/lcov-report/src/integrations/index.ts.html +0 -460
- package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +0 -1012
- package/coverage/lcov-report/src/integrations/mongodb.ts.html +0 -1999
- package/coverage/lcov-report/src/integrations/mysql.ts.html +0 -979
- package/coverage/lcov-report/src/integrations/oracle.ts.html +0 -1387
- package/coverage/lcov-report/src/integrations/postgres.ts.html +0 -1087
- package/coverage/lcov-report/src/integrations/queries/index.html +0 -116
- package/coverage/lcov-report/src/integrations/queries/sql.ts.html +0 -328
- package/coverage/lcov-report/src/integrations/redis.ts.html +0 -550
- package/coverage/lcov-report/src/integrations/rest.ts.html +0 -1372
- package/coverage/lcov-report/src/integrations/s3.ts.html +0 -862
- package/coverage/lcov-report/src/integrations/snowflake.ts.html +0 -376
- package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +0 -85
- package/coverage/lcov-report/src/integrations/tests/index.html +0 -116
- package/coverage/lcov-report/src/integrations/utils.ts.html +0 -1036
- package/coverage/lcov-report/src/middleware/appInfo.ts.html +0 -145
- package/coverage/lcov-report/src/middleware/authorized.ts.html +0 -472
- package/coverage/lcov-report/src/middleware/builder.ts.html +0 -361
- package/coverage/lcov-report/src/middleware/currentapp.ts.html +0 -508
- package/coverage/lcov-report/src/middleware/index.html +0 -236
- package/coverage/lcov-report/src/middleware/joi-validator.ts.html +0 -205
- package/coverage/lcov-report/src/middleware/publicApi.ts.html +0 -148
- package/coverage/lcov-report/src/middleware/resourceId.ts.html +0 -283
- package/coverage/lcov-report/src/middleware/selfhost.ts.html +0 -121
- package/coverage/lcov-report/src/middleware/utils.ts.html +0 -112
- package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +0 -166
- package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +0 -163
- package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +0 -151
- package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +0 -206
- package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +0 -172
- package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +0 -226
- package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +0 -151
- package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +0 -151
- package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +0 -166
- package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +0 -532
- package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +0 -286
- package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +0 -146
- package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +0 -265
- package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +0 -232
- package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +0 -724
- package/coverage/lcov-report/src/migrations/functions/backfill/index.html +0 -161
- package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +0 -106
- package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +0 -235
- package/coverage/lcov-report/src/migrations/functions/index.html +0 -161
- package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +0 -130
- package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +0 -520
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +0 -161
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +0 -94
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +0 -127
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +0 -115
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +0 -169
- package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +0 -124
- package/coverage/lcov-report/src/migrations/index.html +0 -116
- package/coverage/lcov-report/src/migrations/index.ts.html +0 -430
- package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +0 -205
- package/coverage/lcov-report/src/migrations/tests/index.html +0 -131
- package/coverage/lcov-report/src/migrations/tests/structures.ts.html +0 -283
- package/coverage/lcov-report/src/sdk/app/applications/index.html +0 -146
- package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +0 -106
- package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +0 -268
- package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +0 -136
- package/coverage/lcov-report/src/sdk/app/automations/index.html +0 -131
- package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +0 -100
- package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +0 -214
- package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +0 -91
- package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +0 -604
- package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +0 -640
- package/coverage/lcov-report/src/sdk/app/backups/index.html +0 -176
- package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +0 -112
- package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +0 -292
- package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +0 -562
- package/coverage/lcov-report/src/sdk/app/datasources/index.html +0 -131
- package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +0 -100
- package/coverage/lcov-report/src/sdk/app/queries/index.html +0 -131
- package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +0 -100
- package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +0 -235
- package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +0 -265
- package/coverage/lcov-report/src/sdk/app/rows/index.html +0 -146
- package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +0 -106
- package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +0 -139
- package/coverage/lcov-report/src/sdk/app/tables/index.html +0 -116
- package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +0 -274
- package/coverage/lcov-report/src/sdk/index.html +0 -116
- package/coverage/lcov-report/src/sdk/index.ts.html +0 -151
- package/coverage/lcov-report/src/sdk/users/index.html +0 -131
- package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -100
- package/coverage/lcov-report/src/sdk/users/utils.ts.html +0 -277
- package/coverage/lcov-report/src/sdk/utils/index.html +0 -116
- package/coverage/lcov-report/src/sdk/utils/index.ts.html +0 -133
- package/coverage/lcov-report/src/startup.ts.html +0 -484
- package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +0 -2032
- package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +0 -127
- package/coverage/lcov-report/src/tests/utilities/index.html +0 -161
- package/coverage/lcov-report/src/tests/utilities/index.ts.html +0 -118
- package/coverage/lcov-report/src/tests/utilities/structures.ts.html +0 -856
- package/coverage/lcov-report/src/threads/automation.ts.html +0 -1555
- package/coverage/lcov-report/src/threads/index.html +0 -161
- package/coverage/lcov-report/src/threads/index.ts.html +0 -418
- package/coverage/lcov-report/src/threads/query.ts.html +0 -1000
- package/coverage/lcov-report/src/threads/utils.ts.html +0 -373
- package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +0 -94
- package/coverage/lcov-report/src/utilities/centralPath.ts.html +0 -151
- package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +0 -343
- package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +0 -547
- package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +0 -601
- package/coverage/lcov-report/src/utilities/fileSystem/index.html +0 -206
- package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +0 -100
- package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +0 -277
- package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +0 -142
- package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +0 -193
- package/coverage/lcov-report/src/utilities/global.ts.html +0 -499
- package/coverage/lcov-report/src/utilities/index.html +0 -251
- package/coverage/lcov-report/src/utilities/index.ts.html +0 -487
- package/coverage/lcov-report/src/utilities/redis.ts.html +0 -343
- package/coverage/lcov-report/src/utilities/routing/index.html +0 -116
- package/coverage/lcov-report/src/utilities/routing/index.ts.html +0 -181
- package/coverage/lcov-report/src/utilities/rowProcessor/index.html +0 -146
- package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +0 -922
- package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +0 -373
- package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +0 -373
- package/coverage/lcov-report/src/utilities/schema.ts.html +0 -508
- package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +0 -169
- package/coverage/lcov-report/src/utilities/security.ts.html +0 -280
- package/coverage/lcov-report/src/utilities/usageQuota/index.html +0 -131
- package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +0 -325
- package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +0 -139
- package/coverage/lcov-report/src/utilities/users.ts.html +0 -232
- package/coverage/lcov-report/src/utilities/workerRequests.ts.html +0 -646
- package/coverage/lcov-report/src/watch.ts.html +0 -196
- package/coverage/lcov-report/src/websocket.ts.html +0 -163
- package/coverage/lcov.info +0 -21777
- package/dist/api/routes/public/tests/utils.js +0 -33
- package/dist/integrations/base/utils.js +0 -16
- package/specs/resources/utils/Resource.js +0 -26
- package/src/integrations/base/utils.ts +0 -12
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
SearchFilters,
|
|
7
7
|
SortDirection,
|
|
8
8
|
} from "@budibase/types"
|
|
9
|
+
import { db as dbCore } from "@budibase/backend-core"
|
|
9
10
|
import { QueryOptions } from "../../definitions/datasource"
|
|
10
11
|
import { isIsoDateString, SqlClient } from "../utils"
|
|
11
12
|
import SqlTableQueryBuilder from "./sqlTable"
|
|
12
13
|
import environment from "../../environment"
|
|
13
|
-
import { removeKeyNumbering } from "./utils"
|
|
14
14
|
|
|
15
15
|
const envLimit = environment.SQL_MAX_ROWS
|
|
16
16
|
? parseInt(environment.SQL_MAX_ROWS)
|
|
@@ -90,10 +90,15 @@ function parseFilters(filters: SearchFilters | undefined): SearchFilters {
|
|
|
90
90
|
function generateSelectStatement(
|
|
91
91
|
json: QueryJson,
|
|
92
92
|
knex: Knex
|
|
93
|
-
): (string | Knex.Raw)[] {
|
|
93
|
+
): (string | Knex.Raw)[] | "*" {
|
|
94
94
|
const { resource, meta } = json
|
|
95
|
+
|
|
96
|
+
if (!resource) {
|
|
97
|
+
return "*"
|
|
98
|
+
}
|
|
99
|
+
|
|
95
100
|
const schema = meta?.table?.schema
|
|
96
|
-
return resource
|
|
101
|
+
return resource.fields.map(field => {
|
|
97
102
|
const fieldNames = field.split(/\./g)
|
|
98
103
|
const tableName = fieldNames[0]
|
|
99
104
|
const columnName = fieldNames[1]
|
|
@@ -131,7 +136,7 @@ class InternalBuilder {
|
|
|
131
136
|
fn: (key: string, value: any) => void
|
|
132
137
|
) {
|
|
133
138
|
for (let [key, value] of Object.entries(structure)) {
|
|
134
|
-
const updatedKey = removeKeyNumbering(key)
|
|
139
|
+
const updatedKey = dbCore.removeKeyNumbering(key)
|
|
135
140
|
const isRelationshipField = updatedKey.includes(".")
|
|
136
141
|
if (!opts.relationship && !isRelationshipField) {
|
|
137
142
|
fn(`${opts.tableName}.${updatedKey}`, value)
|
|
@@ -405,6 +410,7 @@ class InternalBuilder {
|
|
|
405
410
|
delete parsedBody[key]
|
|
406
411
|
}
|
|
407
412
|
}
|
|
413
|
+
|
|
408
414
|
// mysql can't use returning
|
|
409
415
|
if (opts.disableReturning) {
|
|
410
416
|
return query.insert(parsedBody)
|
|
@@ -509,7 +515,7 @@ class InternalBuilder {
|
|
|
509
515
|
if (opts.disableReturning) {
|
|
510
516
|
return query.delete()
|
|
511
517
|
} else {
|
|
512
|
-
return query.delete().returning(
|
|
518
|
+
return query.delete().returning(generateSelectStatement(json, knex))
|
|
513
519
|
}
|
|
514
520
|
}
|
|
515
521
|
}
|
|
@@ -11,9 +11,8 @@ import { OAuth2Client } from "google-auth-library"
|
|
|
11
11
|
import { buildExternalTableId } from "./utils"
|
|
12
12
|
import { DataSourceOperation, FieldTypes } from "../constants"
|
|
13
13
|
import { GoogleSpreadsheet } from "google-spreadsheet"
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
16
|
-
const fetch = require("node-fetch")
|
|
14
|
+
import fetch from "node-fetch"
|
|
15
|
+
import { configs, HTTPError } from "@budibase/backend-core"
|
|
17
16
|
|
|
18
17
|
interface GoogleSheetsConfig {
|
|
19
18
|
spreadsheetId: string
|
|
@@ -112,7 +111,7 @@ const SCHEMA: Integration = {
|
|
|
112
111
|
|
|
113
112
|
class GoogleSheetsIntegration implements DatasourcePlus {
|
|
114
113
|
private readonly config: GoogleSheetsConfig
|
|
115
|
-
private client:
|
|
114
|
+
private client: GoogleSpreadsheet
|
|
116
115
|
public tables: Record<string, Table> = {}
|
|
117
116
|
public schemaErrors: Record<string, string> = {}
|
|
118
117
|
|
|
@@ -173,16 +172,9 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
173
172
|
async connect() {
|
|
174
173
|
try {
|
|
175
174
|
// Initialise oAuth client
|
|
176
|
-
|
|
177
|
-
let googleConfig = await dbCore.getScopedConfig(db, {
|
|
178
|
-
type: constants.Config.GOOGLE,
|
|
179
|
-
})
|
|
180
|
-
|
|
175
|
+
let googleConfig = await configs.getGoogleDatasourceConfig()
|
|
181
176
|
if (!googleConfig) {
|
|
182
|
-
|
|
183
|
-
clientID: env.GOOGLE_CLIENT_ID,
|
|
184
|
-
clientSecret: env.GOOGLE_CLIENT_SECRET,
|
|
185
|
-
}
|
|
177
|
+
throw new HTTPError("Google config not found", 400)
|
|
186
178
|
}
|
|
187
179
|
|
|
188
180
|
const oauthClient = new OAuth2Client({
|
|
@@ -211,7 +203,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
211
203
|
|
|
212
204
|
async buildSchema(datasourceId: string) {
|
|
213
205
|
await this.connect()
|
|
214
|
-
const sheets =
|
|
206
|
+
const sheets = this.client.sheetsByIndex
|
|
215
207
|
const tables: Record<string, Table> = {}
|
|
216
208
|
for (let sheet of sheets) {
|
|
217
209
|
// must fetch rows to determine schema
|
|
@@ -294,7 +286,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
294
286
|
async updateTable(table?: any) {
|
|
295
287
|
try {
|
|
296
288
|
await this.connect()
|
|
297
|
-
const sheet =
|
|
289
|
+
const sheet = this.client.sheetsByTitle[table.name]
|
|
298
290
|
await sheet.loadHeaderRow()
|
|
299
291
|
|
|
300
292
|
if (table._rename) {
|
|
@@ -308,10 +300,17 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
308
300
|
}
|
|
309
301
|
await sheet.setHeaderRow(headers)
|
|
310
302
|
} else {
|
|
311
|
-
|
|
303
|
+
const updatedHeaderValues = [...sheet.headerValues]
|
|
304
|
+
|
|
305
|
+
const newField = Object.keys(table.schema).find(
|
|
312
306
|
key => !sheet.headerValues.includes(key)
|
|
313
307
|
)
|
|
314
|
-
|
|
308
|
+
|
|
309
|
+
if (newField) {
|
|
310
|
+
updatedHeaderValues.push(newField)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
await sheet.setHeaderRow(updatedHeaderValues)
|
|
315
314
|
}
|
|
316
315
|
} catch (err) {
|
|
317
316
|
console.error("Error updating table in google sheets", err)
|
|
@@ -322,7 +321,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
322
321
|
async deleteTable(sheet: any) {
|
|
323
322
|
try {
|
|
324
323
|
await this.connect()
|
|
325
|
-
const sheetToDelete =
|
|
324
|
+
const sheetToDelete = this.client.sheetsByTitle[sheet]
|
|
326
325
|
return await sheetToDelete.delete()
|
|
327
326
|
} catch (err) {
|
|
328
327
|
console.error("Error deleting table in google sheets", err)
|
|
@@ -333,7 +332,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
333
332
|
async create(query: { sheet: string; row: any }) {
|
|
334
333
|
try {
|
|
335
334
|
await this.connect()
|
|
336
|
-
const sheet =
|
|
335
|
+
const sheet = this.client.sheetsByTitle[query.sheet]
|
|
337
336
|
const rowToInsert =
|
|
338
337
|
typeof query.row === "string" ? JSON.parse(query.row) : query.row
|
|
339
338
|
const row = await sheet.addRow(rowToInsert)
|
|
@@ -349,7 +348,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
349
348
|
async read(query: { sheet: string }) {
|
|
350
349
|
try {
|
|
351
350
|
await this.connect()
|
|
352
|
-
const sheet =
|
|
351
|
+
const sheet = this.client.sheetsByTitle[query.sheet]
|
|
353
352
|
const rows = await sheet.getRows()
|
|
354
353
|
const headerValues = sheet.headerValues
|
|
355
354
|
const response = []
|
|
@@ -368,7 +367,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
368
367
|
async update(query: { sheet: string; rowIndex: number; row: any }) {
|
|
369
368
|
try {
|
|
370
369
|
await this.connect()
|
|
371
|
-
const sheet =
|
|
370
|
+
const sheet = this.client.sheetsByTitle[query.sheet]
|
|
372
371
|
const rows = await sheet.getRows()
|
|
373
372
|
const row = rows[query.rowIndex]
|
|
374
373
|
if (row) {
|
|
@@ -392,7 +391,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
392
391
|
|
|
393
392
|
async delete(query: { sheet: string; rowIndex: number }) {
|
|
394
393
|
await this.connect()
|
|
395
|
-
const sheet =
|
|
394
|
+
const sheet = this.client.sheetsByTitle[query.sheet]
|
|
396
395
|
const rows = await sheet.getRows()
|
|
397
396
|
const row = rows[query.rowIndex]
|
|
398
397
|
if (row) {
|
|
@@ -247,7 +247,7 @@ class OracleIntegration extends Sql implements DatasourcePlus {
|
|
|
247
247
|
)
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
-
private internalConvertType(column: OracleColumn): { type:
|
|
250
|
+
private internalConvertType(column: OracleColumn): { type: FieldTypes } {
|
|
251
251
|
if (this.isBooleanType(column)) {
|
|
252
252
|
return { type: FieldTypes.BOOLEAN }
|
|
253
253
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { GoogleSpreadsheetWorksheet } from "google-spreadsheet"
|
|
2
|
+
|
|
3
|
+
jest.mock("google-auth-library")
|
|
4
|
+
const { OAuth2Client } = require("google-auth-library")
|
|
5
|
+
|
|
6
|
+
const setCredentialsMock = jest.fn()
|
|
7
|
+
const getAccessTokenMock = jest.fn()
|
|
8
|
+
|
|
9
|
+
OAuth2Client.mockImplementation(() => {
|
|
10
|
+
return {
|
|
11
|
+
setCredentials: setCredentialsMock,
|
|
12
|
+
getAccessToken: getAccessTokenMock,
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
jest.mock("google-spreadsheet")
|
|
17
|
+
const { GoogleSpreadsheet } = require("google-spreadsheet")
|
|
18
|
+
|
|
19
|
+
const sheetsByTitle: { [title: string]: GoogleSpreadsheetWorksheet } = {}
|
|
20
|
+
|
|
21
|
+
GoogleSpreadsheet.mockImplementation(() => {
|
|
22
|
+
return {
|
|
23
|
+
useOAuth2Client: jest.fn(),
|
|
24
|
+
loadInfo: jest.fn(),
|
|
25
|
+
sheetsByTitle,
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
import { structures } from "@budibase/backend-core/tests"
|
|
30
|
+
import TestConfiguration from "../../tests/utilities/TestConfiguration"
|
|
31
|
+
import GoogleSheetsIntegration from "../googlesheets"
|
|
32
|
+
import { FieldType, Table, TableSchema } from "../../../../types/src/documents"
|
|
33
|
+
|
|
34
|
+
describe("Google Sheets Integration", () => {
|
|
35
|
+
let integration: any,
|
|
36
|
+
config = new TestConfiguration()
|
|
37
|
+
|
|
38
|
+
beforeEach(async () => {
|
|
39
|
+
integration = new GoogleSheetsIntegration.integration({
|
|
40
|
+
spreadsheetId: "randomId",
|
|
41
|
+
auth: {
|
|
42
|
+
appId: "appId",
|
|
43
|
+
accessToken: "accessToken",
|
|
44
|
+
refreshToken: "refreshToken",
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
await config.init()
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
function createBasicTable(name: string, columns: string[]): Table {
|
|
51
|
+
return {
|
|
52
|
+
name,
|
|
53
|
+
schema: {
|
|
54
|
+
...columns.reduce((p, c) => {
|
|
55
|
+
p[c] = {
|
|
56
|
+
name: c,
|
|
57
|
+
type: FieldType.STRING,
|
|
58
|
+
constraints: {
|
|
59
|
+
type: "string",
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
return p
|
|
63
|
+
}, {} as TableSchema),
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function createSheet({
|
|
69
|
+
headerValues,
|
|
70
|
+
}: {
|
|
71
|
+
headerValues: string[]
|
|
72
|
+
}): GoogleSpreadsheetWorksheet {
|
|
73
|
+
return {
|
|
74
|
+
// to ignore the unmapped fields
|
|
75
|
+
...({} as any),
|
|
76
|
+
loadHeaderRow: jest.fn(),
|
|
77
|
+
headerValues,
|
|
78
|
+
setHeaderRow: jest.fn(),
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
describe("update table", () => {
|
|
83
|
+
test("adding a new field will be adding a new header row", async () => {
|
|
84
|
+
await config.doInContext(structures.uuid(), async () => {
|
|
85
|
+
const tableColumns = ["name", "description", "new field"]
|
|
86
|
+
const table = createBasicTable(structures.uuid(), tableColumns)
|
|
87
|
+
|
|
88
|
+
const sheet = createSheet({ headerValues: ["name", "description"] })
|
|
89
|
+
sheetsByTitle[table.name] = sheet
|
|
90
|
+
await integration.updateTable(table)
|
|
91
|
+
|
|
92
|
+
expect(sheet.loadHeaderRow).toBeCalledTimes(1)
|
|
93
|
+
expect(sheet.setHeaderRow).toBeCalledTimes(1)
|
|
94
|
+
expect(sheet.setHeaderRow).toBeCalledWith(tableColumns)
|
|
95
|
+
})
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
test("removing an existing field will not remove the data from the spreadsheet", async () => {
|
|
99
|
+
await config.doInContext(structures.uuid(), async () => {
|
|
100
|
+
const tableColumns = ["name"]
|
|
101
|
+
const table = createBasicTable(structures.uuid(), tableColumns)
|
|
102
|
+
|
|
103
|
+
const sheet = createSheet({
|
|
104
|
+
headerValues: ["name", "description", "location"],
|
|
105
|
+
})
|
|
106
|
+
sheetsByTitle[table.name] = sheet
|
|
107
|
+
await integration.updateTable(table)
|
|
108
|
+
|
|
109
|
+
expect(sheet.loadHeaderRow).toBeCalledTimes(1)
|
|
110
|
+
expect(sheet.setHeaderRow).toBeCalledTimes(1)
|
|
111
|
+
expect(sheet.setHeaderRow).toBeCalledWith([
|
|
112
|
+
"name",
|
|
113
|
+
"description",
|
|
114
|
+
"location",
|
|
115
|
+
])
|
|
116
|
+
|
|
117
|
+
// No undefineds are sent
|
|
118
|
+
expect((sheet.setHeaderRow as any).mock.calls[0][0]).toHaveLength(3)
|
|
119
|
+
})
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
})
|
|
@@ -79,10 +79,6 @@ export default (
|
|
|
79
79
|
return ctx.throw(403, "No user info found")
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
// check general builder stuff, this middleware is a good way
|
|
83
|
-
// to find API endpoints which are builder focused
|
|
84
|
-
await builderMiddleware(ctx, permType)
|
|
85
|
-
|
|
86
82
|
// get the resource roles
|
|
87
83
|
let resourceRoles: any = []
|
|
88
84
|
let otherLevelRoles: any = []
|
|
@@ -112,6 +108,12 @@ export default (
|
|
|
112
108
|
return ctx.throw(403, "Session not authenticated")
|
|
113
109
|
}
|
|
114
110
|
|
|
111
|
+
// check general builder stuff, this middleware is a good way
|
|
112
|
+
// to find API endpoints which are builder focused
|
|
113
|
+
if (permType === permissions.PermissionType.BUILDER) {
|
|
114
|
+
await builderMiddleware(ctx)
|
|
115
|
+
}
|
|
116
|
+
|
|
115
117
|
try {
|
|
116
118
|
// check authorized
|
|
117
119
|
await checkAuthorized(ctx, resourceRoles, permType, permLevel)
|
|
@@ -64,13 +64,18 @@ async function updateAppUpdatedAt(ctx: BBContext) {
|
|
|
64
64
|
})
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export default async function builder(ctx: BBContext
|
|
67
|
+
export default async function builder(ctx: BBContext) {
|
|
68
68
|
const appId = ctx.appId
|
|
69
69
|
// this only functions within an app context
|
|
70
70
|
if (!appId) {
|
|
71
71
|
return
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
|
|
74
|
+
// check authenticated
|
|
75
|
+
if (!ctx.isAuthenticated) {
|
|
76
|
+
return ctx.throw(403, "Session not authenticated")
|
|
77
|
+
}
|
|
78
|
+
|
|
74
79
|
const referer = ctx.headers["referer"]
|
|
75
80
|
|
|
76
81
|
const overviewPath = "/builder/portal/overview/"
|
|
@@ -82,7 +87,7 @@ export default async function builder(ctx: BBContext, permType: string) {
|
|
|
82
87
|
const hasAppId = !referer ? false : referer.includes(appId)
|
|
83
88
|
const editingApp = referer ? hasAppId : false
|
|
84
89
|
// check this is a builder call and editing
|
|
85
|
-
if (!
|
|
90
|
+
if (!editingApp) {
|
|
86
91
|
return
|
|
87
92
|
}
|
|
88
93
|
// check locks
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
events,
|
|
3
|
+
DocumentType,
|
|
4
|
+
SEPARATOR,
|
|
5
|
+
UNICODE_MAX,
|
|
6
|
+
} from "@budibase/backend-core"
|
|
2
7
|
import {
|
|
3
8
|
Config,
|
|
4
9
|
isSMTPConfig,
|
|
@@ -9,15 +14,16 @@ import {
|
|
|
9
14
|
} from "@budibase/types"
|
|
10
15
|
import env from "./../../../../environment"
|
|
11
16
|
|
|
17
|
+
export const getConfigParams = () => {
|
|
18
|
+
return {
|
|
19
|
+
include_docs: true,
|
|
20
|
+
startkey: `${DocumentType.CONFIG}${SEPARATOR}`,
|
|
21
|
+
endkey: `${DocumentType.CONFIG}${SEPARATOR}${UNICODE_MAX}`,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
12
25
|
const getConfigs = async (globalDb: any): Promise<Config[]> => {
|
|
13
|
-
const response = await globalDb.allDocs(
|
|
14
|
-
dbUtils.getConfigParams(
|
|
15
|
-
{},
|
|
16
|
-
{
|
|
17
|
-
include_docs: true,
|
|
18
|
-
}
|
|
19
|
-
)
|
|
20
|
-
)
|
|
26
|
+
const response = await globalDb.allDocs(getConfigParams())
|
|
21
27
|
return response.rows.map((row: any) => row.doc)
|
|
22
28
|
}
|
|
23
29
|
|
|
@@ -8,9 +8,8 @@ jest.mock("@budibase/backend-core", () => {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
})
|
|
11
|
-
const {
|
|
11
|
+
const { context, db: dbCore } = require("@budibase/backend-core")
|
|
12
12
|
const TestConfig = require("../../../tests/utilities/TestConfiguration")
|
|
13
|
-
const { TENANT_ID } = require("../../../tests/utilities/structures")
|
|
14
13
|
|
|
15
14
|
// mock email view creation
|
|
16
15
|
|
|
@@ -19,15 +18,15 @@ const migration = require("../userEmailViewCasing")
|
|
|
19
18
|
describe("run", () => {
|
|
20
19
|
let config = new TestConfig(false)
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
beforeAll(async () => {
|
|
23
22
|
await config.init()
|
|
24
23
|
})
|
|
25
24
|
|
|
26
25
|
afterAll(config.end)
|
|
27
26
|
|
|
28
27
|
it("runs successfully", async () => {
|
|
29
|
-
await
|
|
30
|
-
const globalDb =
|
|
28
|
+
await config.doInTenant(async () => {
|
|
29
|
+
const globalDb = context.getGlobalDB()
|
|
31
30
|
await migration.run(globalDb)
|
|
32
31
|
expect(dbCore.createNewUserEmailView).toHaveBeenCalledTimes(1)
|
|
33
32
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Mimic configs test configuration from worker, creation configs directly in database
|
|
2
2
|
|
|
3
3
|
import * as structures from "./structures"
|
|
4
|
-
import {
|
|
4
|
+
import { configs } from "@budibase/backend-core"
|
|
5
5
|
import { Config } from "@budibase/types"
|
|
6
6
|
|
|
7
7
|
export const saveSettingsConfig = async (globalDb: any) => {
|
|
@@ -25,7 +25,7 @@ export const saveSmtpConfig = async (globalDb: any) => {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
const saveConfig = async (config: Config, globalDb: any) => {
|
|
28
|
-
config._id =
|
|
28
|
+
config._id = configs.generateConfigID(config.type)
|
|
29
29
|
|
|
30
30
|
let response
|
|
31
31
|
try {
|
|
@@ -10,8 +10,9 @@ import * as structures from "../../tests/utilities/structures"
|
|
|
10
10
|
import { MIGRATIONS } from "../"
|
|
11
11
|
import * as helpers from "./helpers"
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
const timestamp =
|
|
13
|
+
import tk from "timekeeper"
|
|
14
|
+
const timestamp = new Date().toISOString()
|
|
15
|
+
tk.freeze(timestamp)
|
|
15
16
|
|
|
16
17
|
const clearMigrations = async () => {
|
|
17
18
|
const dbs = [context.getDevAppDB(), context.getProdAppDB()]
|
|
@@ -92,24 +93,16 @@ describe("migrations", () => {
|
|
|
92
93
|
await clearMigrations()
|
|
93
94
|
const appId = config.prodAppId
|
|
94
95
|
const roles = { [appId]: "role_12345" }
|
|
95
|
-
await config.createUser(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
undefined,
|
|
106
|
-
undefined,
|
|
107
|
-
undefined,
|
|
108
|
-
undefined,
|
|
109
|
-
false,
|
|
110
|
-
false,
|
|
111
|
-
roles
|
|
112
|
-
) // non admin non builder
|
|
96
|
+
await config.createUser({
|
|
97
|
+
builder: false,
|
|
98
|
+
admin: true,
|
|
99
|
+
roles,
|
|
100
|
+
}) // admin only
|
|
101
|
+
await config.createUser({
|
|
102
|
+
builder: false,
|
|
103
|
+
admin: false,
|
|
104
|
+
roles,
|
|
105
|
+
}) // non admin non builder
|
|
113
106
|
await config.createTable()
|
|
114
107
|
await config.createRow()
|
|
115
108
|
await config.createRow()
|
|
@@ -7,10 +7,15 @@ import {
|
|
|
7
7
|
TABLE_ROW_PREFIX,
|
|
8
8
|
USER_METDATA_PREFIX,
|
|
9
9
|
} from "../../../db/utils"
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
DB_EXPORT_FILE,
|
|
12
|
+
GLOBAL_DB_EXPORT_FILE,
|
|
13
|
+
STATIC_APP_FILES,
|
|
14
|
+
} from "./constants"
|
|
11
15
|
import fs from "fs"
|
|
12
16
|
import { join } from "path"
|
|
13
17
|
import env from "../../../environment"
|
|
18
|
+
|
|
14
19
|
const uuid = require("uuid/v4")
|
|
15
20
|
const tar = require("tar")
|
|
16
21
|
const MemoryStream = require("memorystream")
|
|
@@ -45,12 +50,18 @@ function tarFilesToTmp(tmpDir: string, files: string[]) {
|
|
|
45
50
|
* @return {*} either a readable stream or a string
|
|
46
51
|
*/
|
|
47
52
|
export async function exportDB(dbName: string, opts: ExportOpts = {}) {
|
|
53
|
+
const exportOpts = {
|
|
54
|
+
filter: opts?.filter,
|
|
55
|
+
batch_size: 1000,
|
|
56
|
+
batch_limit: 5,
|
|
57
|
+
style: "main_only",
|
|
58
|
+
}
|
|
48
59
|
return dbCore.doWithDB(dbName, async (db: any) => {
|
|
49
60
|
// Write the dump to file if required
|
|
50
61
|
if (opts?.exportPath) {
|
|
51
62
|
const path = opts?.exportPath
|
|
52
63
|
const writeStream = fs.createWriteStream(path)
|
|
53
|
-
await db.dump(writeStream,
|
|
64
|
+
await db.dump(writeStream, exportOpts)
|
|
54
65
|
return path
|
|
55
66
|
} else {
|
|
56
67
|
// Stringify the dump in memory if required
|
|
@@ -59,7 +70,7 @@ export async function exportDB(dbName: string, opts: ExportOpts = {}) {
|
|
|
59
70
|
memStream.on("data", (chunk: any) => {
|
|
60
71
|
appString += chunk.toString()
|
|
61
72
|
})
|
|
62
|
-
await db.dump(memStream,
|
|
73
|
+
await db.dump(memStream, exportOpts)
|
|
63
74
|
return appString
|
|
64
75
|
}
|
|
65
76
|
})
|
|
@@ -85,14 +96,25 @@ export async function exportApp(appId: string, config?: ExportOpts) {
|
|
|
85
96
|
const prodAppId = dbCore.getProdAppID(appId)
|
|
86
97
|
const appPath = `${prodAppId}/`
|
|
87
98
|
// export bucket contents
|
|
88
|
-
let tmpPath
|
|
99
|
+
let tmpPath = createTempFolder(uuid())
|
|
89
100
|
if (!env.isTest()) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
// write just the static files
|
|
102
|
+
if (config?.excludeRows) {
|
|
103
|
+
for (let path of STATIC_APP_FILES) {
|
|
104
|
+
const contents = await objectStore.retrieve(
|
|
105
|
+
ObjectStoreBuckets.APPS,
|
|
106
|
+
join(appPath, path)
|
|
107
|
+
)
|
|
108
|
+
fs.writeFileSync(join(tmpPath, path), contents)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// get all of the files
|
|
112
|
+
else {
|
|
113
|
+
tmpPath = await objectStore.retrieveDirectory(
|
|
114
|
+
ObjectStoreBuckets.APPS,
|
|
115
|
+
appPath
|
|
116
|
+
)
|
|
117
|
+
}
|
|
96
118
|
}
|
|
97
119
|
const downloadedPath = join(tmpPath, appPath)
|
|
98
120
|
if (fs.existsSync(downloadedPath)) {
|
|
@@ -88,6 +88,9 @@ export async function removeSecrets(datasources: Datasource[]) {
|
|
|
88
88
|
const definitions = await getDefinitions()
|
|
89
89
|
for (let datasource of datasources) {
|
|
90
90
|
const schema = definitions[datasource.source]
|
|
91
|
+
if (!schema) {
|
|
92
|
+
continue
|
|
93
|
+
}
|
|
91
94
|
if (datasource.config) {
|
|
92
95
|
// strip secrets from response, so they don't show in the network request
|
|
93
96
|
if (datasource.config.auth) {
|
|
@@ -13,13 +13,13 @@ function generateAttachmentFindParams(
|
|
|
13
13
|
) {
|
|
14
14
|
const params: CouchFindOptions = {
|
|
15
15
|
selector: {
|
|
16
|
+
$or: attachmentCols.map(col => ({ [col]: { $exists: true } })),
|
|
16
17
|
_id: {
|
|
17
18
|
$regex: `^${DocumentType.ROW}${SEPARATOR}${tableId}`,
|
|
18
19
|
},
|
|
19
20
|
},
|
|
20
21
|
limit: FIND_LIMIT,
|
|
21
22
|
}
|
|
22
|
-
attachmentCols.forEach(col => (params.selector[col] = { $exists: true }))
|
|
23
23
|
if (bookmark) {
|
|
24
24
|
params.bookmark = bookmark
|
|
25
25
|
}
|
package/src/startup.ts
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
generateApiKey,
|
|
6
6
|
getChecklist,
|
|
7
7
|
} from "./utilities/workerRequests"
|
|
8
|
-
import { installation, tenancy, logging } from "@budibase/backend-core"
|
|
8
|
+
import { installation, tenancy, logging, events } from "@budibase/backend-core"
|
|
9
9
|
import fs from "fs"
|
|
10
10
|
import { watch } from "./watch"
|
|
11
11
|
import * as automations from "./automations"
|
|
@@ -124,6 +124,9 @@ export async function startup(app?: any, server?: any) {
|
|
|
124
124
|
// get the references to the queue promises, don't await as
|
|
125
125
|
// they will never end, unless the processing stops
|
|
126
126
|
let queuePromises = []
|
|
127
|
+
// configure events to use the pro audit log write
|
|
128
|
+
// can't integrate directly into backend-core due to cyclic issues
|
|
129
|
+
queuePromises.push(events.processors.init(pro.sdk.auditLogs.write))
|
|
127
130
|
queuePromises.push(automations.init())
|
|
128
131
|
queuePromises.push(initPro())
|
|
129
132
|
if (app) {
|