@budibase/server 2.6.22 → 2.6.24-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/.dockerignore +7 -6
- package/Dockerfile +16 -8
- package/builder/assets/index.50121870.js +1869 -0
- package/builder/assets/index.a86e2071.css +6 -0
- package/builder/index.html +2 -2
- package/client/manifest.json +5229 -0
- package/dist/automation.js +32576 -0
- package/dist/automation.js.map +7 -0
- package/dist/index.js +45065 -13
- package/dist/index.js.map +7 -0
- package/dist/query.js +24462 -0
- package/dist/query.js.map +7 -0
- package/jest.config.ts +6 -3
- package/nodemon.json +8 -4
- package/package.json +35 -16
- package/pm2.config.js +1 -1
- package/scripts/build.js +48 -0
- package/src/api/controllers/application.ts +21 -22
- package/src/api/controllers/automation.ts +37 -9
- package/src/api/controllers/datasource.ts +114 -49
- package/src/api/controllers/deploy/index.ts +1 -0
- package/src/api/controllers/integration.ts +3 -3
- package/src/api/controllers/plugin/index.ts +1 -1
- package/src/api/controllers/row/external.ts +39 -15
- package/src/api/controllers/row/index.ts +18 -24
- package/src/api/controllers/row/internal.ts +1 -1
- package/src/api/controllers/row/staticFormula.ts +6 -1
- package/src/api/controllers/row/utils.ts +12 -0
- package/src/api/controllers/static/index.ts +3 -3
- package/src/api/controllers/table/index.ts +3 -0
- package/src/api/controllers/table/internal.ts +2 -6
- package/src/api/controllers/table/utils.ts +32 -1
- package/src/api/controllers/view/index.ts +5 -5
- package/src/api/controllers/webhook.ts +33 -9
- package/src/api/routes/application.ts +5 -0
- package/src/api/routes/automation.ts +0 -1
- package/src/api/routes/datasource.ts +10 -0
- package/src/api/routes/static.ts +3 -1
- package/src/api/routes/tests/{automation.spec.js → automation.spec.ts} +106 -31
- package/src/api/routes/tests/datasource.spec.ts +1 -1
- package/src/api/routes/tests/view.spec.js +4 -3
- package/src/api/routes/tests/{webhook.spec.js → webhook.spec.ts} +33 -11
- package/src/app.ts +0 -1
- package/src/automations/actions.ts +8 -0
- package/src/automations/logging/index.ts +21 -0
- package/src/automations/steps/bash.ts +4 -0
- package/src/automations/steps/collect.ts +58 -0
- package/src/automations/steps/createRow.ts +4 -0
- package/src/automations/steps/delay.ts +1 -0
- package/src/automations/steps/deleteRow.ts +4 -0
- package/src/automations/steps/discord.ts +4 -0
- package/src/automations/steps/executeQuery.ts +4 -0
- package/src/automations/steps/executeScript.ts +4 -0
- package/src/automations/steps/filter.ts +1 -0
- package/src/automations/steps/loop.ts +1 -0
- package/src/automations/steps/make.ts +22 -1
- package/src/automations/steps/openai.ts +106 -0
- package/src/automations/steps/outgoingWebhook.ts +4 -0
- package/src/automations/steps/queryRows.ts +4 -0
- package/src/automations/steps/sendSmtpEmail.ts +4 -0
- package/src/automations/steps/serverLog.ts +4 -0
- package/src/automations/steps/slack.ts +4 -0
- package/src/automations/steps/updateRow.ts +4 -0
- package/src/automations/steps/zapier.ts +22 -1
- package/src/automations/tests/make.spec.ts +54 -0
- package/src/automations/tests/openai.spec.ts +86 -0
- package/src/automations/tests/zapier.spec.ts +56 -0
- package/src/automations/triggers.ts +3 -2
- package/src/constants/index.ts +17 -16
- package/src/db/dynamoClient.ts +1 -1
- package/src/db/inMemoryView.ts +1 -0
- package/src/db/linkedRows/index.ts +5 -3
- package/src/environment.ts +3 -0
- package/src/integration-test/postgres.spec.ts +47 -5
- package/src/integrations/airtable.ts +33 -4
- package/src/integrations/arangodb.ts +20 -2
- package/src/integrations/base/sqlTable.ts +0 -1
- package/src/integrations/couchdb.ts +20 -4
- package/src/integrations/dynamodb.ts +36 -5
- package/src/integrations/elasticsearch.ts +18 -1
- package/src/integrations/firebase.ts +17 -0
- package/src/integrations/googlesheets.ts +66 -5
- package/src/integrations/index.ts +12 -7
- package/src/integrations/microsoftSqlServer.ts +33 -1
- package/src/integrations/mongodb.ts +18 -0
- package/src/integrations/mysql.ts +53 -26
- package/src/integrations/oracle.ts +38 -6
- package/src/integrations/postgres.ts +47 -12
- package/src/integrations/redis.ts +35 -4
- package/src/integrations/s3.ts +21 -3
- package/src/integrations/snowflake.ts +25 -1
- package/src/integrations/tests/googlesheets.spec.ts +41 -9
- package/src/middleware/builder.ts +26 -18
- package/src/migrations/functions/backfill/app/queries.ts +1 -1
- package/src/sdk/app/automations/index.ts +2 -0
- package/src/sdk/app/automations/utils.ts +7 -0
- package/src/sdk/app/datasources/datasources.ts +7 -1
- package/src/sdk/plugins/plugins.ts +1 -1
- package/src/startup.ts +2 -0
- package/src/tests/utilities/TestConfiguration.ts +4 -2
- package/src/tests/utilities/structures.ts +42 -0
- package/src/threads/automation.ts +91 -23
- package/src/threads/index.ts +9 -3
- package/src/threads/utils.ts +2 -0
- package/src/utilities/fileSystem/app.ts +14 -4
- package/src/utilities/fileSystem/clientLibrary.ts +8 -3
- package/src/utilities/fileSystem/filesystem.ts +3 -1
- package/src/utilities/redis.ts +25 -3
- package/src/utilities/rowProcessor/index.ts +4 -1
- package/src/utilities/rowProcessor/map.ts +1 -1
- package/src/websockets/builder.ts +95 -0
- package/src/websockets/client.ts +2 -2
- package/src/websockets/grid.ts +44 -44
- package/src/websockets/index.ts +13 -6
- package/src/websockets/websocket.ts +211 -7
- package/tsconfig.build.json +9 -1
- package/tsconfig.json +1 -14
- package/builder/assets/index.86c992bf.css +0 -6
- package/builder/assets/index.c16c35ca.js +0 -1794
- package/dist/api/controllers/analytics.js +0 -46
- package/dist/api/controllers/apikeys.js +0 -72
- package/dist/api/controllers/application.js +0 -574
- package/dist/api/controllers/auth.js +0 -80
- package/dist/api/controllers/automation.js +0 -303
- package/dist/api/controllers/backup.js +0 -37
- package/dist/api/controllers/component.js +0 -59
- package/dist/api/controllers/datasource.js +0 -306
- package/dist/api/controllers/deploy/Deployment.js +0 -53
- package/dist/api/controllers/deploy/index.js +0 -198
- package/dist/api/controllers/dev.js +0 -146
- package/dist/api/controllers/integration.js +0 -28
- package/dist/api/controllers/layout.js +0 -49
- package/dist/api/controllers/metadata.js +0 -63
- package/dist/api/controllers/migrations.js +0 -29
- package/dist/api/controllers/ops.js +0 -40
- package/dist/api/controllers/permission.js +0 -162
- package/dist/api/controllers/plugin/file.js +0 -24
- package/dist/api/controllers/plugin/github.js +0 -69
- package/dist/api/controllers/plugin/index.js +0 -112
- package/dist/api/controllers/plugin/npm.js +0 -58
- package/dist/api/controllers/plugin/uploaders.js +0 -11
- package/dist/api/controllers/plugin/url.js +0 -24
- package/dist/api/controllers/plugin/utils.js +0 -27
- package/dist/api/controllers/public/applications.js +0 -146
- package/dist/api/controllers/public/mapping/applications.js +0 -29
- package/dist/api/controllers/public/mapping/index.js +0 -11
- package/dist/api/controllers/public/mapping/queries.js +0 -36
- package/dist/api/controllers/public/mapping/rows.js +0 -24
- package/dist/api/controllers/public/mapping/tables.js +0 -23
- package/dist/api/controllers/public/mapping/types.js +0 -2
- package/dist/api/controllers/public/mapping/users.js +0 -29
- package/dist/api/controllers/public/metrics.js +0 -113
- package/dist/api/controllers/public/queries.js +0 -58
- package/dist/api/controllers/public/rows.js +0 -120
- package/dist/api/controllers/public/tables.js +0 -95
- package/dist/api/controllers/public/users.js +0 -93
- package/dist/api/controllers/public/utils.js +0 -56
- package/dist/api/controllers/query/import/index.js +0 -87
- package/dist/api/controllers/query/import/sources/base/index.js +0 -75
- package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
- package/dist/api/controllers/query/import/sources/curl.js +0 -99
- package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
- package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
- package/dist/api/controllers/query/index.js +0 -299
- package/dist/api/controllers/query/validation.js +0 -53
- package/dist/api/controllers/role.js +0 -109
- package/dist/api/controllers/routing.js +0 -105
- package/dist/api/controllers/row/ExternalRequest.js +0 -683
- package/dist/api/controllers/row/external.js +0 -339
- package/dist/api/controllers/row/index.js +0 -203
- package/dist/api/controllers/row/internal.js +0 -509
- package/dist/api/controllers/row/internalSearch.js +0 -28
- package/dist/api/controllers/row/staticFormula.js +0 -165
- package/dist/api/controllers/row/utils.js +0 -183
- package/dist/api/controllers/screen.js +0 -110
- package/dist/api/controllers/script.js +0 -30
- package/dist/api/controllers/static/index.js +0 -268
- package/dist/api/controllers/table/bulkFormula.js +0 -173
- package/dist/api/controllers/table/external.js +0 -279
- package/dist/api/controllers/table/index.js +0 -179
- package/dist/api/controllers/table/internal.js +0 -197
- package/dist/api/controllers/table/utils.js +0 -379
- package/dist/api/controllers/templates.js +0 -56
- package/dist/api/controllers/user.js +0 -124
- package/dist/api/controllers/view/exporters.js +0 -46
- package/dist/api/controllers/view/index.js +0 -193
- package/dist/api/controllers/view/utils.js +0 -177
- package/dist/api/controllers/view/viewBuilder.js +0 -158
- package/dist/api/controllers/webhook.js +0 -134
- package/dist/api/index.js +0 -55
- package/dist/api/routes/analytics.js +0 -34
- package/dist/api/routes/apikeys.js +0 -37
- package/dist/api/routes/application.js +0 -48
- package/dist/api/routes/auth.js +0 -33
- package/dist/api/routes/automation.js +0 -50
- package/dist/api/routes/backup.js +0 -35
- package/dist/api/routes/component.js +0 -35
- package/dist/api/routes/datasource.js +0 -43
- package/dist/api/routes/deploy.js +0 -37
- package/dist/api/routes/dev.js +0 -49
- package/dist/api/routes/index.js +0 -75
- package/dist/api/routes/integration.js +0 -37
- package/dist/api/routes/layout.js +0 -37
- package/dist/api/routes/metadata.js +0 -40
- package/dist/api/routes/migrations.js +0 -36
- package/dist/api/routes/ops.js +0 -52
- package/dist/api/routes/permission.js +0 -44
- package/dist/api/routes/plugin.js +0 -39
- package/dist/api/routes/public/applications.js +0 -174
- package/dist/api/routes/public/index.js +0 -140
- package/dist/api/routes/public/metrics.js +0 -30
- package/dist/api/routes/public/middleware/mapper.js +0 -97
- package/dist/api/routes/public/queries.js +0 -72
- package/dist/api/routes/public/rows.js +0 -158
- package/dist/api/routes/public/tables.js +0 -152
- package/dist/api/routes/public/users.js +0 -135
- package/dist/api/routes/public/utils/Endpoint.js +0 -36
- package/dist/api/routes/query.js +0 -47
- package/dist/api/routes/role.js +0 -40
- package/dist/api/routes/routing.js +0 -39
- package/dist/api/routes/row.js +0 -239
- package/dist/api/routes/screen.js +0 -39
- package/dist/api/routes/script.js +0 -35
- package/dist/api/routes/static.js +0 -80
- package/dist/api/routes/table.js +0 -163
- package/dist/api/routes/templates.js +0 -37
- package/dist/api/routes/user.js +0 -43
- package/dist/api/routes/utils/validators.js +0 -238
- package/dist/api/routes/view.js +0 -42
- package/dist/api/routes/webhook.js +0 -43
- package/dist/app.js +0 -132
- package/dist/automations/actions.js +0 -137
- package/dist/automations/automationUtils.js +0 -173
- package/dist/automations/bullboard.js +0 -71
- package/dist/automations/index.js +0 -43
- package/dist/automations/logging/index.js +0 -53
- package/dist/automations/steps/bash.js +0 -111
- package/dist/automations/steps/createRow.js +0 -108
- package/dist/automations/steps/delay.js +0 -53
- package/dist/automations/steps/deleteRow.js +0 -96
- package/dist/automations/steps/discord.js +0 -116
- package/dist/automations/steps/executeQuery.js +0 -134
- package/dist/automations/steps/executeScript.js +0 -106
- package/dist/automations/steps/filter.js +0 -112
- package/dist/automations/steps/loop.js +0 -54
- package/dist/automations/steps/make.js +0 -120
- package/dist/automations/steps/outgoingWebhook.js +0 -166
- package/dist/automations/steps/queryRows.js +0 -220
- package/dist/automations/steps/sendSmtpEmail.js +0 -115
- package/dist/automations/steps/serverLog.js +0 -65
- package/dist/automations/steps/slack.js +0 -98
- package/dist/automations/steps/updateRow.js +0 -144
- package/dist/automations/steps/utils.js +0 -56
- package/dist/automations/steps/zapier.js +0 -117
- package/dist/automations/triggerInfo/app.js +0 -36
- package/dist/automations/triggerInfo/cron.js +0 -35
- package/dist/automations/triggerInfo/index.js +0 -40
- package/dist/automations/triggerInfo/rowDeleted.js +0 -36
- package/dist/automations/triggerInfo/rowSaved.js +0 -44
- package/dist/automations/triggerInfo/rowUpdated.js +0 -44
- package/dist/automations/triggerInfo/webhook.js +0 -40
- package/dist/automations/triggers.js +0 -181
- package/dist/automations/utils.js +0 -275
- package/dist/constants/definitions.js +0 -2
- package/dist/constants/index.js +0 -181
- package/dist/constants/layouts.js +0 -148
- package/dist/constants/screens.js +0 -51
- package/dist/db/defaultData/datasource_bb_default.js +0 -574
- package/dist/db/defaultData/employeeImport.js +0 -155
- package/dist/db/defaultData/expensesImport.js +0 -117
- package/dist/db/defaultData/inventoryImport.js +0 -109
- package/dist/db/defaultData/jobsImport.js +0 -152
- package/dist/db/dynamoClient.js +0 -124
- package/dist/db/inMemoryView.js +0 -62
- package/dist/db/index.js +0 -43
- package/dist/db/linkedRows/LinkController.js +0 -392
- package/dist/db/linkedRows/LinkDocument.js +0 -33
- package/dist/db/linkedRows/index.js +0 -206
- package/dist/db/linkedRows/linkUtils.js +0 -131
- package/dist/db/newid.js +0 -7
- package/dist/db/utils.js +0 -248
- package/dist/db/views/staticViews.js +0 -144
- package/dist/ddApm.js +0 -11
- package/dist/definitions/automations.js +0 -8
- package/dist/definitions/common.js +0 -2
- package/dist/definitions/datasource.js +0 -7
- package/dist/definitions/openapi.js +0 -6
- package/dist/environment.js +0 -109
- package/dist/events/AutomationEmitter.js +0 -53
- package/dist/events/BudibaseEmitter.js +0 -25
- package/dist/events/docUpdates/index.js +0 -17
- package/dist/events/docUpdates/processors.js +0 -18
- package/dist/events/docUpdates/syncUsers.js +0 -49
- package/dist/events/index.js +0 -11
- package/dist/events/utils.js +0 -43
- package/dist/integrations/airtable.js +0 -147
- package/dist/integrations/arangodb.js +0 -103
- package/dist/integrations/base/query.js +0 -32
- package/dist/integrations/base/sql.js +0 -600
- package/dist/integrations/base/sqlTable.js +0 -167
- package/dist/integrations/base/types.js +0 -2
- package/dist/integrations/couchdb.js +0 -125
- package/dist/integrations/dynamodb.js +0 -194
- package/dist/integrations/elasticsearch.js +0 -186
- package/dist/integrations/firebase.js +0 -174
- package/dist/integrations/googlesheets.js +0 -455
- package/dist/integrations/index.js +0 -135
- package/dist/integrations/microsoftSqlServer.js +0 -273
- package/dist/integrations/mongodb.js +0 -614
- package/dist/integrations/mysql.js +0 -256
- package/dist/integrations/oracle.js +0 -375
- package/dist/integrations/postgres.js +0 -300
- package/dist/integrations/queries/sql.js +0 -84
- package/dist/integrations/redis.js +0 -168
- package/dist/integrations/rest.js +0 -400
- package/dist/integrations/s3.js +0 -237
- package/dist/integrations/snowflake.js +0 -99
- package/dist/integrations/utils.js +0 -295
- package/dist/middleware/appInfo.js +0 -22
- package/dist/middleware/authorized.js +0 -112
- package/dist/middleware/builder.js +0 -93
- package/dist/middleware/currentapp.js +0 -103
- package/dist/middleware/joi-validator.js +0 -43
- package/dist/middleware/publicApi.js +0 -25
- package/dist/middleware/resourceId.js +0 -59
- package/dist/middleware/selfhost.js +0 -24
- package/dist/middleware/utils.js +0 -8
- package/dist/migrations/functions/appUrls.js +0 -42
- package/dist/migrations/functions/backfill/app/automations.js +0 -31
- package/dist/migrations/functions/backfill/app/datasources.js +0 -28
- package/dist/migrations/functions/backfill/app/layouts.js +0 -33
- package/dist/migrations/functions/backfill/app/queries.js +0 -50
- package/dist/migrations/functions/backfill/app/roles.js +0 -28
- package/dist/migrations/functions/backfill/app/screens.js +0 -28
- package/dist/migrations/functions/backfill/app/tables.js +0 -37
- package/dist/migrations/functions/backfill/app.js +0 -176
- package/dist/migrations/functions/backfill/global/configs.js +0 -67
- package/dist/migrations/functions/backfill/global/quotas.js +0 -60
- package/dist/migrations/functions/backfill/global/users.js +0 -50
- package/dist/migrations/functions/backfill/global.js +0 -205
- package/dist/migrations/functions/backfill/index.js +0 -32
- package/dist/migrations/functions/backfill/installation.js +0 -80
- package/dist/migrations/functions/syncQuotas.js +0 -52
- package/dist/migrations/functions/tableSettings.js +0 -130
- package/dist/migrations/functions/usageQuotas/index.js +0 -16
- package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
- package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
- package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
- package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
- package/dist/migrations/functions/userEmailViewCasing.js +0 -24
- package/dist/migrations/index.js +0 -111
- package/dist/migrations/tests/helpers.js +0 -72
- package/dist/migrations/tests/structures.js +0 -37
- package/dist/sdk/app/applications/index.js +0 -28
- package/dist/sdk/app/applications/sync.js +0 -164
- package/dist/sdk/app/applications/utils.js +0 -21
- package/dist/sdk/app/automations/index.js +0 -29
- package/dist/sdk/app/automations/webhook.js +0 -54
- package/dist/sdk/app/backups/constants.js +0 -6
- package/dist/sdk/app/backups/exports.js +0 -160
- package/dist/sdk/app/backups/imports.js +0 -170
- package/dist/sdk/app/backups/index.js +0 -29
- package/dist/sdk/app/backups/statistics.js +0 -73
- package/dist/sdk/app/datasources/datasources.js +0 -166
- package/dist/sdk/app/datasources/index.js +0 -27
- package/dist/sdk/app/queries/index.js +0 -27
- package/dist/sdk/app/queries/queries.js +0 -60
- package/dist/sdk/app/rows/attachments.js +0 -61
- package/dist/sdk/app/rows/index.js +0 -28
- package/dist/sdk/app/rows/rows.js +0 -30
- package/dist/sdk/app/tables/index.js +0 -65
- package/dist/sdk/index.js +0 -27
- package/dist/sdk/plugins/index.js +0 -27
- package/dist/sdk/plugins/plugins.js +0 -53
- package/dist/sdk/users/index.js +0 -27
- package/dist/sdk/users/utils.js +0 -94
- package/dist/sdk/utils/index.js +0 -29
- package/dist/startup.js +0 -158
- package/dist/threads/automation.js +0 -450
- package/dist/threads/definitions.js +0 -2
- package/dist/threads/index.js +0 -140
- package/dist/threads/query.js +0 -265
- package/dist/threads/utils.js +0 -120
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/utilities/appDirectoryTemplate/package.json +0 -10
- package/dist/utilities/budibaseDir.js +0 -5
- package/dist/utilities/centralPath.js +0 -27
- package/dist/utilities/csv.js +0 -33
- package/dist/utilities/fileSystem/app.js +0 -88
- package/dist/utilities/fileSystem/clientLibrary.js +0 -138
- package/dist/utilities/fileSystem/filesystem.js +0 -180
- package/dist/utilities/fileSystem/index.js +0 -21
- package/dist/utilities/fileSystem/plugin.js +0 -76
- package/dist/utilities/fileSystem/processor.js +0 -34
- package/dist/utilities/fileSystem/template.js +0 -47
- package/dist/utilities/global.js +0 -146
- package/dist/utilities/index.js +0 -143
- package/dist/utilities/redis.js +0 -117
- package/dist/utilities/retry.js +0 -30
- package/dist/utilities/routing/index.js +0 -39
- package/dist/utilities/rowProcessor/index.js +0 -282
- package/dist/utilities/rowProcessor/map.js +0 -116
- package/dist/utilities/rowProcessor/utils.js +0 -87
- package/dist/utilities/schema.js +0 -112
- package/dist/utilities/scriptRunner.js +0 -26
- package/dist/utilities/security.js +0 -57
- package/dist/utilities/statusCodes.js +0 -9
- package/dist/utilities/usageQuota/rows.js +0 -88
- package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
- package/dist/utilities/users.js +0 -57
- package/dist/utilities/workerRequests.js +0 -171
- package/dist/watch.js +0 -53
- package/dist/websockets/client.js +0 -14
- package/dist/websockets/grid.js +0 -60
- package/dist/websockets/index.js +0 -17
- package/dist/websockets/websocket.js +0 -78
- package/src/automations/tests/zapier.spec.js +0 -27
- /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
- /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
- /package/dist/{api/controllers/static/templates/preview.hbs → preview.hbs} +0 -0
package/src/environment.ts
CHANGED
|
@@ -71,6 +71,7 @@ const environment = {
|
|
|
71
71
|
BB_ADMIN_USER_EMAIL: process.env.BB_ADMIN_USER_EMAIL,
|
|
72
72
|
BB_ADMIN_USER_PASSWORD: process.env.BB_ADMIN_USER_PASSWORD,
|
|
73
73
|
PLUGINS_DIR: process.env.PLUGINS_DIR || "/plugins",
|
|
74
|
+
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
|
|
74
75
|
// flags
|
|
75
76
|
ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
|
|
76
77
|
DISABLE_THREADING: process.env.DISABLE_THREADING,
|
|
@@ -79,6 +80,7 @@ const environment = {
|
|
|
79
80
|
ENABLE_ANALYTICS: process.env.ENABLE_ANALYTICS,
|
|
80
81
|
SELF_HOSTED: process.env.SELF_HOSTED,
|
|
81
82
|
HTTP_MB_LIMIT: process.env.HTTP_MB_LIMIT,
|
|
83
|
+
FORKED_PROCESS_NAME: process.env.FORKED_PROCESS_NAME || "main",
|
|
82
84
|
// old
|
|
83
85
|
CLIENT_ID: process.env.CLIENT_ID,
|
|
84
86
|
_set(key: string, value: any) {
|
|
@@ -96,6 +98,7 @@ const environment = {
|
|
|
96
98
|
isInThread: () => {
|
|
97
99
|
return process.env.FORKED_PROCESS
|
|
98
100
|
},
|
|
101
|
+
TOP_LEVEL_PATH: process.env.TOP_LEVEL_PATH,
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
// threading can cause memory issues with node-ts in development
|
|
@@ -19,15 +19,15 @@ import _ from "lodash"
|
|
|
19
19
|
import { generator } from "@budibase/backend-core/tests"
|
|
20
20
|
import { utils } from "@budibase/backend-core"
|
|
21
21
|
import { GenericContainer } from "testcontainers"
|
|
22
|
-
import { generateRowIdField } from "../integrations/utils"
|
|
23
22
|
|
|
24
23
|
const config = setup.getConfig()!
|
|
25
24
|
|
|
26
25
|
jest.setTimeout(30000)
|
|
27
26
|
|
|
28
27
|
jest.unmock("pg")
|
|
28
|
+
jest.mock("../websockets")
|
|
29
29
|
|
|
30
|
-
describe("
|
|
30
|
+
describe("postgres integrations", () => {
|
|
31
31
|
let makeRequest: MakeRequestResponse,
|
|
32
32
|
postgresDatasource: Datasource,
|
|
33
33
|
primaryPostgresTable: Table,
|
|
@@ -53,8 +53,8 @@ describe("row api - postgres", () => {
|
|
|
53
53
|
makeRequest = generateMakeRequest(apiKey, true)
|
|
54
54
|
})
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
function pgDatasourceConfig() {
|
|
57
|
+
return {
|
|
58
58
|
datasource: {
|
|
59
59
|
type: "datasource",
|
|
60
60
|
source: SourceName.POSTGRES,
|
|
@@ -71,7 +71,11 @@ describe("row api - postgres", () => {
|
|
|
71
71
|
ca: false,
|
|
72
72
|
},
|
|
73
73
|
},
|
|
74
|
-
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
beforeEach(async () => {
|
|
78
|
+
postgresDatasource = await config.createDatasource(pgDatasourceConfig())
|
|
75
79
|
|
|
76
80
|
async function createAuxTable(prefix: string) {
|
|
77
81
|
return await config.createTable({
|
|
@@ -1025,4 +1029,42 @@ describe("row api - postgres", () => {
|
|
|
1025
1029
|
})
|
|
1026
1030
|
})
|
|
1027
1031
|
})
|
|
1032
|
+
|
|
1033
|
+
describe("POST /api/datasources/verify", () => {
|
|
1034
|
+
it("should be able to verify the connection", async () => {
|
|
1035
|
+
const config = pgDatasourceConfig()
|
|
1036
|
+
const response = await makeRequest(
|
|
1037
|
+
"post",
|
|
1038
|
+
"/api/datasources/verify",
|
|
1039
|
+
config
|
|
1040
|
+
)
|
|
1041
|
+
expect(response.status).toBe(200)
|
|
1042
|
+
expect(response.body.connected).toBe(true)
|
|
1043
|
+
})
|
|
1044
|
+
|
|
1045
|
+
it("should state an invalid datasource cannot connect", async () => {
|
|
1046
|
+
const config = pgDatasourceConfig()
|
|
1047
|
+
config.datasource.config.password = "wrongpassword"
|
|
1048
|
+
const response = await makeRequest(
|
|
1049
|
+
"post",
|
|
1050
|
+
"/api/datasources/verify",
|
|
1051
|
+
config
|
|
1052
|
+
)
|
|
1053
|
+
expect(response.status).toBe(200)
|
|
1054
|
+
expect(response.body.connected).toBe(false)
|
|
1055
|
+
expect(response.body.error).toBeDefined()
|
|
1056
|
+
})
|
|
1057
|
+
})
|
|
1058
|
+
|
|
1059
|
+
describe("POST /api/datasources/info", () => {
|
|
1060
|
+
it("should fetch information about postgres datasource", async () => {
|
|
1061
|
+
const primaryName = primaryPostgresTable.name
|
|
1062
|
+
const response = await makeRequest("post", "/api/datasources/info", {
|
|
1063
|
+
datasource: postgresDatasource,
|
|
1064
|
+
})
|
|
1065
|
+
expect(response.status).toBe(200)
|
|
1066
|
+
expect(response.body.tableNames).toBeDefined()
|
|
1067
|
+
expect(response.body.tableNames.indexOf(primaryName)).not.toBe(-1)
|
|
1068
|
+
})
|
|
1069
|
+
})
|
|
1028
1070
|
})
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
ConnectionInfo,
|
|
3
|
+
DatasourceFeature,
|
|
3
4
|
DatasourceFieldType,
|
|
4
|
-
|
|
5
|
+
Integration,
|
|
5
6
|
IntegrationBase,
|
|
7
|
+
QueryType,
|
|
6
8
|
} from "@budibase/types"
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
import Airtable from "airtable"
|
|
9
11
|
|
|
10
12
|
interface AirtableConfig {
|
|
11
13
|
apiKey: string
|
|
@@ -18,6 +20,9 @@ const SCHEMA: Integration = {
|
|
|
18
20
|
"Airtable is a spreadsheet-database hybrid, with the features of a database but applied to a spreadsheet.",
|
|
19
21
|
friendlyName: "Airtable",
|
|
20
22
|
type: "Spreadsheet",
|
|
23
|
+
features: {
|
|
24
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
25
|
+
},
|
|
21
26
|
datasource: {
|
|
22
27
|
apiKey: {
|
|
23
28
|
type: DatasourceFieldType.PASSWORD,
|
|
@@ -81,13 +86,37 @@ const SCHEMA: Integration = {
|
|
|
81
86
|
|
|
82
87
|
class AirtableIntegration implements IntegrationBase {
|
|
83
88
|
private config: AirtableConfig
|
|
84
|
-
private client
|
|
89
|
+
private client
|
|
85
90
|
|
|
86
91
|
constructor(config: AirtableConfig) {
|
|
87
92
|
this.config = config
|
|
88
93
|
this.client = new Airtable(config).base(config.base)
|
|
89
94
|
}
|
|
90
95
|
|
|
96
|
+
async testConnection(): Promise<ConnectionInfo> {
|
|
97
|
+
const mockTable = Date.now().toString()
|
|
98
|
+
try {
|
|
99
|
+
await this.client.makeRequest({
|
|
100
|
+
path: `/${mockTable}`,
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
return { connected: true }
|
|
104
|
+
} catch (e: any) {
|
|
105
|
+
if (
|
|
106
|
+
e.message ===
|
|
107
|
+
`Could not find table ${mockTable} in application ${this.config.base}`
|
|
108
|
+
) {
|
|
109
|
+
// The request managed to check the application, so the credentials are valid
|
|
110
|
+
return { connected: true }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
connected: false,
|
|
115
|
+
error: e.message as string,
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
91
120
|
async create(query: { table: any; json: any }) {
|
|
92
121
|
const { table, json } = query
|
|
93
122
|
|
|
@@ -3,9 +3,11 @@ import {
|
|
|
3
3
|
DatasourceFieldType,
|
|
4
4
|
QueryType,
|
|
5
5
|
IntegrationBase,
|
|
6
|
+
DatasourceFeature,
|
|
7
|
+
ConnectionInfo,
|
|
6
8
|
} from "@budibase/types"
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
import { Database, aql } from "arangojs"
|
|
9
11
|
|
|
10
12
|
interface ArangodbConfig {
|
|
11
13
|
url: string
|
|
@@ -21,6 +23,9 @@ const SCHEMA: Integration = {
|
|
|
21
23
|
type: "Non-relational",
|
|
22
24
|
description:
|
|
23
25
|
"ArangoDB is a scalable open-source multi-model database natively supporting graph, document and search. All supported data models & access patterns can be combined in queries allowing for maximal flexibility. ",
|
|
26
|
+
features: {
|
|
27
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
28
|
+
},
|
|
24
29
|
datasource: {
|
|
25
30
|
url: {
|
|
26
31
|
type: DatasourceFieldType.STRING,
|
|
@@ -58,7 +63,7 @@ const SCHEMA: Integration = {
|
|
|
58
63
|
|
|
59
64
|
class ArangoDBIntegration implements IntegrationBase {
|
|
60
65
|
private config: ArangodbConfig
|
|
61
|
-
private client
|
|
66
|
+
private client
|
|
62
67
|
|
|
63
68
|
constructor(config: ArangodbConfig) {
|
|
64
69
|
const newConfig = {
|
|
@@ -74,6 +79,19 @@ class ArangoDBIntegration implements IntegrationBase {
|
|
|
74
79
|
this.client = new Database(newConfig)
|
|
75
80
|
}
|
|
76
81
|
|
|
82
|
+
async testConnection() {
|
|
83
|
+
const response: ConnectionInfo = {
|
|
84
|
+
connected: false,
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
await this.client.get()
|
|
88
|
+
response.connected = true
|
|
89
|
+
} catch (e: any) {
|
|
90
|
+
response.error = e.message as string
|
|
91
|
+
}
|
|
92
|
+
return response
|
|
93
|
+
}
|
|
94
|
+
|
|
77
95
|
async read(query: { sql: any }) {
|
|
78
96
|
try {
|
|
79
97
|
const result = await this.client.query(query.sql)
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ConnectionInfo,
|
|
3
|
+
DatasourceFeature,
|
|
2
4
|
DatasourceFieldType,
|
|
3
5
|
Document,
|
|
4
6
|
Integration,
|
|
@@ -18,6 +20,9 @@ const SCHEMA: Integration = {
|
|
|
18
20
|
type: "Non-relational",
|
|
19
21
|
description:
|
|
20
22
|
"Apache CouchDB is an open-source document-oriented NoSQL database, implemented in Erlang.",
|
|
23
|
+
features: {
|
|
24
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
25
|
+
},
|
|
21
26
|
datasource: {
|
|
22
27
|
url: {
|
|
23
28
|
type: DatasourceFieldType.STRING,
|
|
@@ -61,21 +66,32 @@ const SCHEMA: Integration = {
|
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
class CouchDBIntegration implements IntegrationBase {
|
|
64
|
-
private
|
|
65
|
-
private readonly client: any
|
|
69
|
+
private readonly client: dbCore.DatabaseImpl
|
|
66
70
|
|
|
67
71
|
constructor(config: CouchDBConfig) {
|
|
68
|
-
this.config = config
|
|
69
72
|
this.client = dbCore.DatabaseWithConnection(config.database, config.url)
|
|
70
73
|
}
|
|
71
74
|
|
|
75
|
+
async testConnection() {
|
|
76
|
+
const response: ConnectionInfo = {
|
|
77
|
+
connected: false,
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const result = await this.query("exists", "validation error", {})
|
|
81
|
+
response.connected = result === true
|
|
82
|
+
} catch (e: any) {
|
|
83
|
+
response.error = e.message as string
|
|
84
|
+
}
|
|
85
|
+
return response
|
|
86
|
+
}
|
|
87
|
+
|
|
72
88
|
async query(
|
|
73
89
|
command: string,
|
|
74
90
|
errorMsg: string,
|
|
75
91
|
query: { json?: object; id?: string }
|
|
76
92
|
) {
|
|
77
93
|
try {
|
|
78
|
-
return await this.client[command](query.id || query.json)
|
|
94
|
+
return await (this.client as any)[command](query.id || query.json)
|
|
79
95
|
} catch (err) {
|
|
80
96
|
console.error(errorMsg, err)
|
|
81
97
|
throw err
|
|
@@ -3,10 +3,13 @@ import {
|
|
|
3
3
|
DatasourceFieldType,
|
|
4
4
|
QueryType,
|
|
5
5
|
IntegrationBase,
|
|
6
|
+
DatasourceFeature,
|
|
7
|
+
ConnectionInfo,
|
|
6
8
|
} from "@budibase/types"
|
|
7
9
|
|
|
8
10
|
import AWS from "aws-sdk"
|
|
9
11
|
import { AWS_REGION } from "../db/dynamoClient"
|
|
12
|
+
import { DocumentClient } from "aws-sdk/clients/dynamodb"
|
|
10
13
|
|
|
11
14
|
interface DynamoDBConfig {
|
|
12
15
|
region: string
|
|
@@ -22,6 +25,9 @@ const SCHEMA: Integration = {
|
|
|
22
25
|
"Amazon DynamoDB is a key-value and document database that delivers single-digit millisecond performance at any scale.",
|
|
23
26
|
friendlyName: "DynamoDB",
|
|
24
27
|
type: "Non-relational",
|
|
28
|
+
features: {
|
|
29
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
30
|
+
},
|
|
25
31
|
datasource: {
|
|
26
32
|
region: {
|
|
27
33
|
type: DatasourceFieldType.STRING,
|
|
@@ -128,7 +134,7 @@ const SCHEMA: Integration = {
|
|
|
128
134
|
|
|
129
135
|
class DynamoDBIntegration implements IntegrationBase {
|
|
130
136
|
private config: DynamoDBConfig
|
|
131
|
-
private client
|
|
137
|
+
private client
|
|
132
138
|
|
|
133
139
|
constructor(config: DynamoDBConfig) {
|
|
134
140
|
this.config = config
|
|
@@ -148,7 +154,23 @@ class DynamoDBIntegration implements IntegrationBase {
|
|
|
148
154
|
this.client = new AWS.DynamoDB.DocumentClient(this.config)
|
|
149
155
|
}
|
|
150
156
|
|
|
151
|
-
async
|
|
157
|
+
async testConnection() {
|
|
158
|
+
const response: ConnectionInfo = {
|
|
159
|
+
connected: false,
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const scanRes = await new AWS.DynamoDB(this.config).listTables().promise()
|
|
163
|
+
response.connected = !!scanRes.$response
|
|
164
|
+
} catch (e: any) {
|
|
165
|
+
response.error = e.message as string
|
|
166
|
+
}
|
|
167
|
+
return response
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async create(query: {
|
|
171
|
+
table: string
|
|
172
|
+
json: Omit<DocumentClient.PutItemInput, "TableName">
|
|
173
|
+
}) {
|
|
152
174
|
const params = {
|
|
153
175
|
TableName: query.table,
|
|
154
176
|
...query.json,
|
|
@@ -189,7 +211,10 @@ class DynamoDBIntegration implements IntegrationBase {
|
|
|
189
211
|
return new AWS.DynamoDB(this.config).describeTable(params).promise()
|
|
190
212
|
}
|
|
191
213
|
|
|
192
|
-
async get(query: {
|
|
214
|
+
async get(query: {
|
|
215
|
+
table: string
|
|
216
|
+
json: Omit<DocumentClient.GetItemInput, "TableName">
|
|
217
|
+
}) {
|
|
193
218
|
const params = {
|
|
194
219
|
TableName: query.table,
|
|
195
220
|
...query.json,
|
|
@@ -197,7 +222,10 @@ class DynamoDBIntegration implements IntegrationBase {
|
|
|
197
222
|
return this.client.get(params).promise()
|
|
198
223
|
}
|
|
199
224
|
|
|
200
|
-
async update(query: {
|
|
225
|
+
async update(query: {
|
|
226
|
+
table: string
|
|
227
|
+
json: Omit<DocumentClient.UpdateItemInput, "TableName">
|
|
228
|
+
}) {
|
|
201
229
|
const params = {
|
|
202
230
|
TableName: query.table,
|
|
203
231
|
...query.json,
|
|
@@ -205,7 +233,10 @@ class DynamoDBIntegration implements IntegrationBase {
|
|
|
205
233
|
return this.client.update(params).promise()
|
|
206
234
|
}
|
|
207
235
|
|
|
208
|
-
async delete(query: {
|
|
236
|
+
async delete(query: {
|
|
237
|
+
table: string
|
|
238
|
+
json: Omit<DocumentClient.DeleteItemInput, "TableName">
|
|
239
|
+
}) {
|
|
209
240
|
const params = {
|
|
210
241
|
TableName: query.table,
|
|
211
242
|
...query.json,
|
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
DatasourceFieldType,
|
|
4
4
|
QueryType,
|
|
5
5
|
IntegrationBase,
|
|
6
|
+
DatasourceFeature,
|
|
7
|
+
ConnectionInfo,
|
|
6
8
|
} from "@budibase/types"
|
|
7
9
|
|
|
8
10
|
import { Client, ClientOptions } from "@elastic/elasticsearch"
|
|
@@ -20,6 +22,9 @@ const SCHEMA: Integration = {
|
|
|
20
22
|
"Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents.",
|
|
21
23
|
friendlyName: "ElasticSearch",
|
|
22
24
|
type: "Non-relational",
|
|
25
|
+
features: {
|
|
26
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
27
|
+
},
|
|
23
28
|
datasource: {
|
|
24
29
|
url: {
|
|
25
30
|
type: DatasourceFieldType.STRING,
|
|
@@ -95,7 +100,7 @@ const SCHEMA: Integration = {
|
|
|
95
100
|
|
|
96
101
|
class ElasticSearchIntegration implements IntegrationBase {
|
|
97
102
|
private config: ElasticsearchConfig
|
|
98
|
-
private client
|
|
103
|
+
private client
|
|
99
104
|
|
|
100
105
|
constructor(config: ElasticsearchConfig) {
|
|
101
106
|
this.config = config
|
|
@@ -114,6 +119,18 @@ class ElasticSearchIntegration implements IntegrationBase {
|
|
|
114
119
|
this.client = new Client(clientConfig)
|
|
115
120
|
}
|
|
116
121
|
|
|
122
|
+
async testConnection(): Promise<ConnectionInfo> {
|
|
123
|
+
try {
|
|
124
|
+
await this.client.info()
|
|
125
|
+
return { connected: true }
|
|
126
|
+
} catch (e: any) {
|
|
127
|
+
return {
|
|
128
|
+
connected: false,
|
|
129
|
+
error: e.message as string,
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
117
134
|
async create(query: { index: string; json: object }) {
|
|
118
135
|
const { index, json } = query
|
|
119
136
|
|
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
Integration,
|
|
4
4
|
QueryType,
|
|
5
5
|
IntegrationBase,
|
|
6
|
+
DatasourceFeature,
|
|
7
|
+
ConnectionInfo,
|
|
6
8
|
} from "@budibase/types"
|
|
7
9
|
import { Firestore, WhereFilterOp } from "@google-cloud/firestore"
|
|
8
10
|
|
|
@@ -18,6 +20,9 @@ const SCHEMA: Integration = {
|
|
|
18
20
|
type: "Non-relational",
|
|
19
21
|
description:
|
|
20
22
|
"Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
|
|
23
|
+
features: {
|
|
24
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
25
|
+
},
|
|
21
26
|
datasource: {
|
|
22
27
|
email: {
|
|
23
28
|
type: DatasourceFieldType.STRING,
|
|
@@ -99,6 +104,18 @@ class FirebaseIntegration implements IntegrationBase {
|
|
|
99
104
|
})
|
|
100
105
|
}
|
|
101
106
|
|
|
107
|
+
async testConnection(): Promise<ConnectionInfo> {
|
|
108
|
+
try {
|
|
109
|
+
await this.client.listCollections()
|
|
110
|
+
return { connected: true }
|
|
111
|
+
} catch (e: any) {
|
|
112
|
+
return {
|
|
113
|
+
connected: false,
|
|
114
|
+
error: e.message as string,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
102
119
|
async create(query: { json: object; extra: { [key: string]: string } }) {
|
|
103
120
|
try {
|
|
104
121
|
const documentReference = this.client
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ConnectionInfo,
|
|
3
|
+
DatasourceFeature,
|
|
2
4
|
DatasourceFieldType,
|
|
3
5
|
DatasourcePlus,
|
|
4
6
|
FieldType,
|
|
@@ -15,7 +17,7 @@ import {
|
|
|
15
17
|
} from "@budibase/types"
|
|
16
18
|
import { OAuth2Client } from "google-auth-library"
|
|
17
19
|
import { buildExternalTableId, finaliseExternalTables } from "./utils"
|
|
18
|
-
import { GoogleSpreadsheet } from "google-spreadsheet"
|
|
20
|
+
import { GoogleSpreadsheet, GoogleSpreadsheetRow } from "google-spreadsheet"
|
|
19
21
|
import fetch from "node-fetch"
|
|
20
22
|
import { configs, HTTPError } from "@budibase/backend-core"
|
|
21
23
|
import { dataFilters } from "@budibase/shared-core"
|
|
@@ -61,9 +63,13 @@ const SCHEMA: Integration = {
|
|
|
61
63
|
relationships: false,
|
|
62
64
|
docs: "https://developers.google.com/sheets/api/quickstart/nodejs",
|
|
63
65
|
description:
|
|
64
|
-
"Create and collaborate on online spreadsheets in real-time and from any device.
|
|
66
|
+
"Create and collaborate on online spreadsheets in real-time and from any device.",
|
|
65
67
|
friendlyName: "Google Sheets",
|
|
66
68
|
type: "Spreadsheet",
|
|
69
|
+
features: {
|
|
70
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
71
|
+
[DatasourceFeature.FETCH_TABLE_NAMES]: true,
|
|
72
|
+
},
|
|
67
73
|
datasource: {
|
|
68
74
|
spreadsheetId: {
|
|
69
75
|
display: "Google Sheet URL",
|
|
@@ -139,6 +145,18 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
139
145
|
this.client = new GoogleSpreadsheet(spreadsheetId)
|
|
140
146
|
}
|
|
141
147
|
|
|
148
|
+
async testConnection(): Promise<ConnectionInfo> {
|
|
149
|
+
try {
|
|
150
|
+
await this.connect()
|
|
151
|
+
return { connected: true }
|
|
152
|
+
} catch (e: any) {
|
|
153
|
+
return {
|
|
154
|
+
connected: false,
|
|
155
|
+
error: e.message as string,
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
142
160
|
getBindingIdentifier() {
|
|
143
161
|
return ""
|
|
144
162
|
}
|
|
@@ -224,6 +242,12 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
224
242
|
}
|
|
225
243
|
}
|
|
226
244
|
|
|
245
|
+
async getTableNames(): Promise<string[]> {
|
|
246
|
+
await this.connect()
|
|
247
|
+
const sheets = this.client.sheetsByIndex
|
|
248
|
+
return sheets.map(s => s.title)
|
|
249
|
+
}
|
|
250
|
+
|
|
227
251
|
getTableSchema(title: string, headerValues: string[], id?: string) {
|
|
228
252
|
// base table
|
|
229
253
|
const table: Table = {
|
|
@@ -433,9 +457,41 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
433
457
|
}) {
|
|
434
458
|
try {
|
|
435
459
|
await this.connect()
|
|
460
|
+
const hasFilters = dataFilters.hasFilters(query.filters)
|
|
461
|
+
const limit = query.paginate?.limit || 100
|
|
462
|
+
const page: number =
|
|
463
|
+
typeof query.paginate?.page === "number"
|
|
464
|
+
? query.paginate.page
|
|
465
|
+
: parseInt(query.paginate?.page || "1")
|
|
466
|
+
const offset = (page - 1) * limit
|
|
436
467
|
const sheet = this.client.sheetsByTitle[query.sheet]
|
|
437
|
-
|
|
438
|
-
|
|
468
|
+
let rows: GoogleSpreadsheetRow[] = []
|
|
469
|
+
if (query.paginate && !hasFilters) {
|
|
470
|
+
rows = await sheet.getRows({
|
|
471
|
+
limit,
|
|
472
|
+
offset,
|
|
473
|
+
})
|
|
474
|
+
} else {
|
|
475
|
+
rows = await sheet.getRows()
|
|
476
|
+
}
|
|
477
|
+
// this is a special case - need to handle the _id, it doesn't exist
|
|
478
|
+
// we cannot edit the returned structure from google, it does not have
|
|
479
|
+
// setter functions and is immutable, easier to update the filters
|
|
480
|
+
// to look for the _rowNumber property rather than rowNumber
|
|
481
|
+
if (query.filters?.equal) {
|
|
482
|
+
const idFilterKeys = Object.keys(query.filters.equal).filter(filter =>
|
|
483
|
+
filter.includes(GOOGLE_SHEETS_PRIMARY_KEY)
|
|
484
|
+
)
|
|
485
|
+
for (let idFilterKey of idFilterKeys) {
|
|
486
|
+
const id = query.filters.equal[idFilterKey]
|
|
487
|
+
delete query.filters.equal[idFilterKey]
|
|
488
|
+
query.filters.equal[`_${GOOGLE_SHEETS_PRIMARY_KEY}`] = id
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
let filtered = dataFilters.runLuceneQuery(rows, query.filters)
|
|
492
|
+
if (hasFilters && query.paginate) {
|
|
493
|
+
filtered = filtered.slice(offset, offset + limit)
|
|
494
|
+
}
|
|
439
495
|
const headerValues = sheet.headerValues
|
|
440
496
|
let response = []
|
|
441
497
|
for (let row of filtered) {
|
|
@@ -498,7 +554,12 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
498
554
|
const row = rows[query.rowIndex]
|
|
499
555
|
if (row) {
|
|
500
556
|
await row.delete()
|
|
501
|
-
return [
|
|
557
|
+
return [
|
|
558
|
+
{
|
|
559
|
+
deleted: query.rowIndex,
|
|
560
|
+
[GOOGLE_SHEETS_PRIMARY_KEY]: query.rowIndex,
|
|
561
|
+
},
|
|
562
|
+
]
|
|
502
563
|
} else {
|
|
503
564
|
throw new Error("Row does not exist.")
|
|
504
565
|
}
|
|
@@ -20,7 +20,7 @@ import env from "../environment"
|
|
|
20
20
|
import { cloneDeep } from "lodash"
|
|
21
21
|
import sdk from "../sdk"
|
|
22
22
|
|
|
23
|
-
const DEFINITIONS:
|
|
23
|
+
const DEFINITIONS: Record<SourceName, Integration | undefined> = {
|
|
24
24
|
[SourceName.POSTGRES]: postgres.schema,
|
|
25
25
|
[SourceName.DYNAMODB]: dynamodb.schema,
|
|
26
26
|
[SourceName.MONGODB]: mongodb.schema,
|
|
@@ -36,9 +36,10 @@ const DEFINITIONS: { [key: string]: Integration } = {
|
|
|
36
36
|
[SourceName.GOOGLE_SHEETS]: googlesheets.schema,
|
|
37
37
|
[SourceName.REDIS]: redis.schema,
|
|
38
38
|
[SourceName.SNOWFLAKE]: snowflake.schema,
|
|
39
|
+
[SourceName.ORACLE]: undefined,
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
const INTEGRATIONS:
|
|
42
|
+
const INTEGRATIONS: Record<SourceName, any> = {
|
|
42
43
|
[SourceName.POSTGRES]: postgres.integration,
|
|
43
44
|
[SourceName.DYNAMODB]: dynamodb.integration,
|
|
44
45
|
[SourceName.MONGODB]: mongodb.integration,
|
|
@@ -55,6 +56,7 @@ const INTEGRATIONS: { [key: string]: any } = {
|
|
|
55
56
|
[SourceName.REDIS]: redis.integration,
|
|
56
57
|
[SourceName.FIRESTORE]: firebase.integration,
|
|
57
58
|
[SourceName.SNOWFLAKE]: snowflake.integration,
|
|
59
|
+
[SourceName.ORACLE]: undefined,
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
// optionally add oracle integration if the oracle binary can be installed
|
|
@@ -67,10 +69,13 @@ if (
|
|
|
67
69
|
INTEGRATIONS[SourceName.ORACLE] = oracle.integration
|
|
68
70
|
}
|
|
69
71
|
|
|
70
|
-
export async function getDefinition(
|
|
72
|
+
export async function getDefinition(
|
|
73
|
+
source: SourceName
|
|
74
|
+
): Promise<Integration | undefined> {
|
|
71
75
|
// check if its integrated, faster
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
const definition = DEFINITIONS[source]
|
|
77
|
+
if (definition) {
|
|
78
|
+
return definition
|
|
74
79
|
}
|
|
75
80
|
const allDefinitions = await getDefinitions()
|
|
76
81
|
return allDefinitions[source]
|
|
@@ -98,7 +103,7 @@ export async function getDefinitions() {
|
|
|
98
103
|
}
|
|
99
104
|
}
|
|
100
105
|
|
|
101
|
-
export async function getIntegration(integration:
|
|
106
|
+
export async function getIntegration(integration: SourceName) {
|
|
102
107
|
if (INTEGRATIONS[integration]) {
|
|
103
108
|
return INTEGRATIONS[integration]
|
|
104
109
|
}
|
|
@@ -107,7 +112,7 @@ export async function getIntegration(integration: string) {
|
|
|
107
112
|
for (let plugin of plugins) {
|
|
108
113
|
if (plugin.name === integration) {
|
|
109
114
|
// need to use commonJS require due to its dynamic runtime nature
|
|
110
|
-
const retrieved
|
|
115
|
+
const retrieved = await getDatasourcePlugin(plugin)
|
|
111
116
|
if (retrieved.integration) {
|
|
112
117
|
return retrieved.integration
|
|
113
118
|
} else {
|