@budibase/server 2.6.19-alpha.3 → 2.6.19-alpha.30
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.71388c79.js → index.3dd3d237.js} +435 -428
- package/builder/assets/{index.07382a47.css → index.8469b14c.css} +2 -2
- package/builder/index.html +2 -2
- package/client/manifest.json +5229 -0
- package/dist/automation.js +32392 -0
- package/dist/automation.js.map +7 -0
- package/dist/index.js +44698 -13
- package/dist/index.js.map +7 -0
- package/dist/query.js +24363 -0
- package/dist/query.js.map +7 -0
- package/jest.config.ts +3 -0
- package/nodemon.json +1 -1
- package/package.json +31 -13
- 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 +20 -0
- package/src/api/controllers/row/index.ts +15 -22
- package/src/api/controllers/row/internal.ts +1 -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 +5 -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/{webhook.spec.js → webhook.spec.ts} +33 -11
- package/src/app.ts +0 -1
- package/src/automations/actions.ts +8 -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 +4 -0
- 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 +4 -0
- package/src/automations/tests/openai.spec.ts +86 -0
- package/src/automations/triggers.ts +3 -2
- package/src/constants/index.ts +17 -16
- package/src/db/inMemoryView.ts +1 -0
- package/src/environment.ts +2 -0
- package/src/integration-test/postgres.spec.ts +47 -4
- package/src/integrations/airtable.ts +3 -1
- package/src/integrations/arangodb.ts +3 -1
- package/src/integrations/base/sqlTable.ts +0 -1
- package/src/integrations/couchdb.ts +3 -1
- package/src/integrations/dynamodb.ts +3 -1
- package/src/integrations/elasticsearch.ts +3 -1
- package/src/integrations/firebase.ts +3 -1
- package/src/integrations/googlesheets.ts +11 -3
- package/src/integrations/microsoftSqlServer.ts +18 -2
- package/src/integrations/mongodb.ts +3 -1
- package/src/integrations/mysql.ts +27 -11
- package/src/integrations/oracle.ts +11 -1
- package/src/integrations/postgres.ts +15 -1
- package/src/integrations/redis.ts +3 -1
- package/src/integrations/s3.ts +3 -1
- package/src/integrations/snowflake.ts +3 -1
- package/src/integrations/tests/googlesheets.spec.ts +41 -9
- package/src/middleware/builder.ts +4 -5
- package/src/sdk/app/automations/index.ts +2 -0
- package/src/sdk/app/automations/utils.ts +7 -0
- 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 +39 -0
- package/src/utilities/fileSystem/app.ts +1 -1
- package/src/utilities/fileSystem/clientLibrary.ts +8 -3
- package/src/utilities/fileSystem/filesystem.ts +3 -1
- package/src/utilities/redis.ts +19 -2
- package/src/websockets/builder.ts +69 -0
- package/src/websockets/grid.ts +25 -7
- package/src/websockets/index.ts +5 -2
- package/src/websockets/websocket.ts +20 -4
- package/tsconfig.build.json +9 -1
- package/tsconfig.json +1 -14
- 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 -337
- 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 -44
- 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 -134
- package/dist/automations/steps/outgoingWebhook.js +0 -166
- package/dist/automations/steps/queryRows.js +0 -216
- 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 -130
- 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 -173
- package/dist/integrations/arangodb.js +0 -119
- 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 -140
- package/dist/integrations/dynamodb.js +0 -210
- package/dist/integrations/elasticsearch.js +0 -201
- package/dist/integrations/firebase.js +0 -189
- package/dist/integrations/googlesheets.js +0 -484
- package/dist/integrations/index.js +0 -138
- package/dist/integrations/microsoftSqlServer.js +0 -289
- package/dist/integrations/mongodb.js +0 -630
- package/dist/integrations/mysql.js +0 -272
- package/dist/integrations/oracle.js +0 -404
- package/dist/integrations/postgres.js +0 -320
- package/dist/integrations/queries/sql.js +0 -84
- package/dist/integrations/redis.js +0 -187
- package/dist/integrations/rest.js +0 -400
- package/dist/integrations/s3.js +0 -256
- package/dist/integrations/snowflake.js +0 -114
- 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 -49
- 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 -173
- 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 -87
- 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 -149
- 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/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/jest.config.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Config } from "@jest/types"
|
|
2
2
|
|
|
3
3
|
import * as fs from "fs"
|
|
4
|
+
import { join } from "path"
|
|
4
5
|
const preset = require("ts-jest/jest-preset")
|
|
5
6
|
|
|
6
7
|
const baseConfig: Config.InitialProjectOptions = {
|
|
@@ -49,4 +50,6 @@ const config: Config.InitialOptions = {
|
|
|
49
50
|
coverageReporters: ["lcov", "json", "clover"],
|
|
50
51
|
}
|
|
51
52
|
|
|
53
|
+
process.env.TOP_LEVEL_PATH = join(__dirname, "..", "..")
|
|
54
|
+
|
|
52
55
|
export default config
|
package/nodemon.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "2.6.19-alpha.
|
|
4
|
+
"version": "2.6.19-alpha.30",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -10,22 +10,23 @@
|
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"prebuild": "rimraf dist/",
|
|
13
|
-
"build": "
|
|
13
|
+
"build": "node ./scripts/build.js",
|
|
14
|
+
"check:types": "tsc -p tsconfig.build.json --noEmit",
|
|
15
|
+
"postbuild": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
|
|
14
16
|
"build:dev": "yarn prebuild && tsc --build --watch --preserveWatchOutput",
|
|
15
17
|
"debug": "yarn build && node --expose-gc --inspect=9222 dist/index.js",
|
|
16
|
-
"postbuild": "copyfiles -u 1 src/**/*.svelte dist/ && copyfiles -u 1 src/**/*.hbs dist/ && copyfiles -u 1 src/**/*.json dist/",
|
|
17
18
|
"test": "bash scripts/test.sh",
|
|
18
19
|
"test:memory": "jest --maxWorkers=2 --logHeapUsage --forceExit",
|
|
19
20
|
"test:watch": "jest --watch",
|
|
20
|
-
"predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
|
|
21
|
-
"build:docker": "yarn
|
|
21
|
+
"predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client && yarn build --configuration=production",
|
|
22
|
+
"build:docker": "yarn predocker && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION",
|
|
22
23
|
"build:docs": "node ./scripts/docs/generate.js open",
|
|
23
24
|
"run:docker": "node dist/index.js",
|
|
24
25
|
"run:docker:cluster": "pm2-runtime start pm2.config.js",
|
|
25
26
|
"dev:stack:up": "node scripts/dev/manage.js up",
|
|
26
27
|
"dev:stack:down": "node scripts/dev/manage.js down",
|
|
27
28
|
"dev:stack:nuke": "node scripts/dev/manage.js nuke",
|
|
28
|
-
"dev:builder": "yarn run dev:stack:up && nodemon",
|
|
29
|
+
"dev:builder": "yarn run dev:stack:up && rimraf dist/ && nodemon",
|
|
29
30
|
"dev:built": "yarn run dev:stack:up && yarn run run:docker",
|
|
30
31
|
"specs": "ts-node specs/generate.ts && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
|
|
31
32
|
"initialise": "node scripts/initialise.js",
|
|
@@ -45,12 +46,12 @@
|
|
|
45
46
|
"license": "GPL-3.0",
|
|
46
47
|
"dependencies": {
|
|
47
48
|
"@apidevtools/swagger-parser": "10.0.3",
|
|
48
|
-
"@budibase/backend-core": "2.6.19-alpha.
|
|
49
|
-
"@budibase/client": "2.6.19-alpha.
|
|
50
|
-
"@budibase/pro": "2.6.19-alpha.
|
|
51
|
-
"@budibase/shared-core": "2.6.19-alpha.
|
|
52
|
-
"@budibase/string-templates": "2.6.19-alpha.
|
|
53
|
-
"@budibase/types": "2.6.19-alpha.
|
|
49
|
+
"@budibase/backend-core": "2.6.19-alpha.30",
|
|
50
|
+
"@budibase/client": "2.6.19-alpha.30",
|
|
51
|
+
"@budibase/pro": "2.6.19-alpha.30",
|
|
52
|
+
"@budibase/shared-core": "2.6.19-alpha.30",
|
|
53
|
+
"@budibase/string-templates": "2.6.19-alpha.30",
|
|
54
|
+
"@budibase/types": "2.6.19-alpha.30",
|
|
54
55
|
"@bull-board/api": "3.7.0",
|
|
55
56
|
"@bull-board/koa": "3.9.4",
|
|
56
57
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -58,6 +59,7 @@
|
|
|
58
59
|
"@koa/router": "8.0.8",
|
|
59
60
|
"@sendgrid/mail": "7.1.1",
|
|
60
61
|
"@sentry/node": "6.17.7",
|
|
62
|
+
"@socket.io/redis-adapter": "^8.2.1",
|
|
61
63
|
"airtable": "0.10.1",
|
|
62
64
|
"arangojs": "7.2.0",
|
|
63
65
|
"aws-sdk": "2.1030.0",
|
|
@@ -99,6 +101,7 @@
|
|
|
99
101
|
"mysql2": "2.3.3",
|
|
100
102
|
"node-fetch": "2.6.7",
|
|
101
103
|
"open": "8.4.0",
|
|
104
|
+
"openai": "^3.2.1",
|
|
102
105
|
"pg": "8.10.0",
|
|
103
106
|
"posthog-node": "1.3.0",
|
|
104
107
|
"pouchdb": "7.3.0",
|
|
@@ -177,5 +180,20 @@
|
|
|
177
180
|
"optionalDependencies": {
|
|
178
181
|
"oracledb": "5.3.0"
|
|
179
182
|
},
|
|
180
|
-
"
|
|
183
|
+
"nx": {
|
|
184
|
+
"targets": {
|
|
185
|
+
"test": {
|
|
186
|
+
"dependsOn": [
|
|
187
|
+
{
|
|
188
|
+
"projects": [
|
|
189
|
+
"@budibase/string-templates",
|
|
190
|
+
"@budibase/shared-core"
|
|
191
|
+
],
|
|
192
|
+
"target": "build"
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
"gitHead": "c62ae2d9ea7f29de54c4cb6ef9a8f22e82eb8460"
|
|
181
199
|
}
|
package/pm2.config.js
CHANGED
package/scripts/build.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/node
|
|
2
|
+
const { join } = require("path")
|
|
3
|
+
const fs = require("fs")
|
|
4
|
+
const coreBuild = require("../../../scripts/build")
|
|
5
|
+
|
|
6
|
+
const dir = join(__dirname, "..")
|
|
7
|
+
const entryPath = join(dir, "src")
|
|
8
|
+
const outfilePath = join(dir, "dist")
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The reasoning for this is that now our built version is simple
|
|
12
|
+
* dist/index.js - any kind of threaded approach in Node.js requires
|
|
13
|
+
* a runner file to work from - I played around with a lot of
|
|
14
|
+
* different methods, but we really want to be able to use forks.
|
|
15
|
+
*
|
|
16
|
+
* Rather than trying to rewrite so that forks run the whole system,
|
|
17
|
+
* I instead went down a path of building the individual threads so
|
|
18
|
+
* that we have runner files for each of them e.g. dist/automations.js
|
|
19
|
+
* and dist/query.js - these can be ran totally independently and then
|
|
20
|
+
* the parent process can pass down data for processing to them.
|
|
21
|
+
*
|
|
22
|
+
* The ignoring is simply to remove the files which really don't need
|
|
23
|
+
* to be built - they could be built and it wouldn't cause any issues,
|
|
24
|
+
* but this just means if any further threads are added in future
|
|
25
|
+
* they will naturally work (rather than including, which would mean
|
|
26
|
+
* adjustments to the build files).
|
|
27
|
+
*/
|
|
28
|
+
const ignoredFiles = ["definitions", "index", "utils"]
|
|
29
|
+
const threadNames = fs
|
|
30
|
+
.readdirSync(join(dir, "src", "threads"))
|
|
31
|
+
.filter(path => !ignoredFiles.find(file => path.includes(file)))
|
|
32
|
+
.map(path => path.replace(".ts", ""))
|
|
33
|
+
const files = [
|
|
34
|
+
{
|
|
35
|
+
entry: join(entryPath, "index.ts"),
|
|
36
|
+
out: join(outfilePath, "index.js"),
|
|
37
|
+
},
|
|
38
|
+
]
|
|
39
|
+
for (let name of threadNames) {
|
|
40
|
+
files.push({
|
|
41
|
+
entry: join(entryPath, "threads", `${name}.ts`),
|
|
42
|
+
out: join(outfilePath, `${name}.js`),
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
for (let file of files) {
|
|
47
|
+
coreBuild(file.entry, file.out)
|
|
48
|
+
}
|
|
@@ -26,10 +26,13 @@ import {
|
|
|
26
26
|
env as envCore,
|
|
27
27
|
} from "@budibase/backend-core"
|
|
28
28
|
import { USERS_TABLE_SCHEMA } from "../../constants"
|
|
29
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
DEFAULT_BB_DATASOURCE_ID,
|
|
31
|
+
buildDefaultDocs,
|
|
32
|
+
} from "../../db/defaultData/datasource_bb_default"
|
|
30
33
|
import { removeAppFromUserRoles } from "../../utilities/workerRequests"
|
|
31
34
|
import { stringToReadStream, isQsTrue } from "../../utilities"
|
|
32
|
-
import { getLocksById } from "../../utilities/redis"
|
|
35
|
+
import { getLocksById, doesUserHaveLock } from "../../utilities/redis"
|
|
33
36
|
import {
|
|
34
37
|
updateClientLibrary,
|
|
35
38
|
backupClientLibrary,
|
|
@@ -111,11 +114,7 @@ function checkAppName(
|
|
|
111
114
|
}
|
|
112
115
|
}
|
|
113
116
|
|
|
114
|
-
async function createInstance(
|
|
115
|
-
appId: string,
|
|
116
|
-
template: any,
|
|
117
|
-
includeSampleData: boolean
|
|
118
|
-
) {
|
|
117
|
+
async function createInstance(appId: string, template: any) {
|
|
119
118
|
const db = context.getAppDB()
|
|
120
119
|
await db.put({
|
|
121
120
|
_id: "_design/database",
|
|
@@ -142,21 +141,25 @@ async function createInstance(
|
|
|
142
141
|
} else {
|
|
143
142
|
// create the users table
|
|
144
143
|
await db.put(USERS_TABLE_SCHEMA)
|
|
145
|
-
|
|
146
|
-
if (includeSampleData) {
|
|
147
|
-
// create ootb stock db
|
|
148
|
-
await addDefaultTables(db)
|
|
149
|
-
}
|
|
150
144
|
}
|
|
151
145
|
|
|
152
146
|
return { _id: appId }
|
|
153
147
|
}
|
|
154
148
|
|
|
155
|
-
async
|
|
156
|
-
const
|
|
149
|
+
export const addSampleData = async (ctx: UserCtx) => {
|
|
150
|
+
const db = context.getAppDB()
|
|
157
151
|
|
|
158
|
-
|
|
159
|
-
|
|
152
|
+
try {
|
|
153
|
+
// Check if default datasource exists before creating it
|
|
154
|
+
await sdk.datasources.get(DEFAULT_BB_DATASOURCE_ID)
|
|
155
|
+
} catch (err: any) {
|
|
156
|
+
const defaultDbDocs = buildDefaultDocs()
|
|
157
|
+
|
|
158
|
+
// add in the default db data docs - tables, datasource, rows and links
|
|
159
|
+
await db.bulkDocs([...defaultDbDocs])
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
ctx.status = 200
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
export async function fetch(ctx: UserCtx) {
|
|
@@ -227,6 +230,7 @@ export async function fetchAppPackage(ctx: UserCtx) {
|
|
|
227
230
|
screens,
|
|
228
231
|
layouts,
|
|
229
232
|
clientLibPath,
|
|
233
|
+
hasLock: await doesUserHaveLock(application.appId, ctx.user),
|
|
230
234
|
}
|
|
231
235
|
}
|
|
232
236
|
|
|
@@ -247,16 +251,11 @@ async function performAppCreate(ctx: UserCtx) {
|
|
|
247
251
|
if (ctx.request.files && ctx.request.files.templateFile) {
|
|
248
252
|
instanceConfig.file = ctx.request.files.templateFile
|
|
249
253
|
}
|
|
250
|
-
const includeSampleData = isQsTrue(ctx.request.body.sampleData)
|
|
251
254
|
const tenantId = tenancy.isMultiTenant() ? tenancy.getTenantId() : null
|
|
252
255
|
const appId = generateDevAppID(generateAppID(tenantId))
|
|
253
256
|
|
|
254
257
|
return await context.doInAppContext(appId, async () => {
|
|
255
|
-
const instance = await createInstance(
|
|
256
|
-
appId,
|
|
257
|
-
instanceConfig,
|
|
258
|
-
includeSampleData
|
|
259
|
-
)
|
|
258
|
+
const instance = await createInstance(appId, instanceConfig)
|
|
260
259
|
const db = context.getAppDB()
|
|
261
260
|
|
|
262
261
|
let newApplication: App = {
|
|
@@ -14,9 +14,16 @@ import { deleteEntityMetadata } from "../../utilities"
|
|
|
14
14
|
import { MetadataTypes } from "../../constants"
|
|
15
15
|
import { setTestFlag, clearTestFlag } from "../../utilities/redis"
|
|
16
16
|
import { context, cache, events } from "@budibase/backend-core"
|
|
17
|
-
import { automations } from "@budibase/pro"
|
|
18
|
-
import {
|
|
17
|
+
import { automations, features } from "@budibase/pro"
|
|
18
|
+
import {
|
|
19
|
+
Automation,
|
|
20
|
+
AutomationActionStepId,
|
|
21
|
+
AutomationResults,
|
|
22
|
+
BBContext,
|
|
23
|
+
} from "@budibase/types"
|
|
19
24
|
import { getActionDefinitions as actionDefs } from "../../automations/actions"
|
|
25
|
+
import sdk from "../../sdk"
|
|
26
|
+
import { db as dbCore } from "@budibase/backend-core"
|
|
20
27
|
|
|
21
28
|
async function getActionDefinitions() {
|
|
22
29
|
return removeDeprecated(await actionDefs())
|
|
@@ -257,13 +264,34 @@ export async function getDefinitionList(ctx: BBContext) {
|
|
|
257
264
|
export async function trigger(ctx: BBContext) {
|
|
258
265
|
const db = context.getAppDB()
|
|
259
266
|
let automation = await db.get(ctx.params.id)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
+
|
|
268
|
+
let hasCollectStep = sdk.automations.utils.checkForCollectStep(automation)
|
|
269
|
+
if (hasCollectStep && (await features.isSyncAutomationsEnabled())) {
|
|
270
|
+
const response: AutomationResults = await triggers.externalTrigger(
|
|
271
|
+
automation,
|
|
272
|
+
{
|
|
273
|
+
fields: ctx.request.body.fields,
|
|
274
|
+
timeout: ctx.request.body.timeout * 1000 || 120000,
|
|
275
|
+
},
|
|
276
|
+
{ getResponses: true }
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
let collectedValue = response.steps.find(
|
|
280
|
+
step => step.stepId === AutomationActionStepId.COLLECT
|
|
281
|
+
)
|
|
282
|
+
ctx.body = collectedValue?.outputs
|
|
283
|
+
} else {
|
|
284
|
+
if (ctx.appId && !dbCore.isProdAppID(ctx.appId)) {
|
|
285
|
+
ctx.throw(400, "Only apps in production support this endpoint")
|
|
286
|
+
}
|
|
287
|
+
await triggers.externalTrigger(automation, {
|
|
288
|
+
...ctx.request.body,
|
|
289
|
+
appId: ctx.appId,
|
|
290
|
+
})
|
|
291
|
+
ctx.body = {
|
|
292
|
+
message: `Automation ${automation._id} has been triggered.`,
|
|
293
|
+
automation,
|
|
294
|
+
}
|
|
267
295
|
}
|
|
268
296
|
}
|
|
269
297
|
|
|
@@ -21,10 +21,12 @@ import {
|
|
|
21
21
|
CreateDatasourceRequest,
|
|
22
22
|
VerifyDatasourceRequest,
|
|
23
23
|
VerifyDatasourceResponse,
|
|
24
|
+
FetchDatasourceInfoResponse,
|
|
24
25
|
IntegrationBase,
|
|
25
26
|
DatasourcePlus,
|
|
26
27
|
} from "@budibase/types"
|
|
27
28
|
import sdk from "../../sdk"
|
|
29
|
+
import { builderSocket } from "../../websockets"
|
|
28
30
|
|
|
29
31
|
function getErrorTables(errors: any, errorType: string) {
|
|
30
32
|
return Object.entries(errors)
|
|
@@ -153,6 +155,21 @@ export async function verify(
|
|
|
153
155
|
}
|
|
154
156
|
}
|
|
155
157
|
|
|
158
|
+
export async function information(
|
|
159
|
+
ctx: UserCtx<void, FetchDatasourceInfoResponse>
|
|
160
|
+
) {
|
|
161
|
+
const datasourceId = ctx.params.datasourceId
|
|
162
|
+
const datasource = await sdk.datasources.get(datasourceId, { enriched: true })
|
|
163
|
+
const connector = (await getConnector(datasource)) as DatasourcePlus
|
|
164
|
+
if (!connector.getTableNames) {
|
|
165
|
+
ctx.throw(400, "Table name fetching not supported by datasource")
|
|
166
|
+
}
|
|
167
|
+
const tableNames = await connector.getTableNames()
|
|
168
|
+
ctx.body = {
|
|
169
|
+
tableNames,
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
156
173
|
export async function buildSchemaFromDb(ctx: UserCtx) {
|
|
157
174
|
const db = context.getAppDB()
|
|
158
175
|
const datasource = await sdk.datasources.get(ctx.params.datasourceId)
|
|
@@ -280,6 +297,7 @@ export async function update(ctx: UserCtx<any, UpdateDatasourceResponse>) {
|
|
|
280
297
|
ctx.body = {
|
|
281
298
|
datasource: await sdk.datasources.removeSecretSingle(datasource),
|
|
282
299
|
}
|
|
300
|
+
builderSocket.emitDatasourceUpdate(ctx, datasource)
|
|
283
301
|
}
|
|
284
302
|
|
|
285
303
|
export async function save(
|
|
@@ -322,6 +340,7 @@ export async function save(
|
|
|
322
340
|
response.error = schemaError
|
|
323
341
|
}
|
|
324
342
|
ctx.body = response
|
|
343
|
+
builderSocket.emitDatasourceUpdate(ctx, datasource)
|
|
325
344
|
}
|
|
326
345
|
|
|
327
346
|
async function destroyInternalTablesBySourceId(datasourceId: string) {
|
|
@@ -381,6 +400,7 @@ export async function destroy(ctx: UserCtx) {
|
|
|
381
400
|
|
|
382
401
|
ctx.message = `Datasource deleted.`
|
|
383
402
|
ctx.status = 200
|
|
403
|
+
builderSocket.emitDatasourceDeletion(ctx, datasourceId)
|
|
384
404
|
}
|
|
385
405
|
|
|
386
406
|
export async function find(ctx: UserCtx) {
|
|
@@ -4,6 +4,7 @@ import * as external from "./external"
|
|
|
4
4
|
import { isExternalTable } from "../../../integrations/utils"
|
|
5
5
|
import { Ctx } from "@budibase/types"
|
|
6
6
|
import * as utils from "./utils"
|
|
7
|
+
import { gridSocket } from "../../../websockets"
|
|
7
8
|
|
|
8
9
|
function pickApi(tableId: any) {
|
|
9
10
|
if (isExternalTable(tableId)) {
|
|
@@ -12,21 +13,9 @@ function pickApi(tableId: any) {
|
|
|
12
13
|
return internal
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
function getTableId(ctx: any) {
|
|
16
|
-
if (ctx.request.body && ctx.request.body.tableId) {
|
|
17
|
-
return ctx.request.body.tableId
|
|
18
|
-
}
|
|
19
|
-
if (ctx.params && ctx.params.tableId) {
|
|
20
|
-
return ctx.params.tableId
|
|
21
|
-
}
|
|
22
|
-
if (ctx.params && ctx.params.viewName) {
|
|
23
|
-
return ctx.params.viewName
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
16
|
export async function patch(ctx: any): Promise<any> {
|
|
28
17
|
const appId = ctx.appId
|
|
29
|
-
const tableId = getTableId(ctx)
|
|
18
|
+
const tableId = utils.getTableId(ctx)
|
|
30
19
|
const body = ctx.request.body
|
|
31
20
|
// if it doesn't have an _id then its save
|
|
32
21
|
if (body && !body._id) {
|
|
@@ -47,6 +36,7 @@ export async function patch(ctx: any): Promise<any> {
|
|
|
47
36
|
ctx.eventEmitter.emitRow(`row:update`, appId, row, table)
|
|
48
37
|
ctx.message = `${table.name} updated successfully.`
|
|
49
38
|
ctx.body = row
|
|
39
|
+
gridSocket?.emitRowUpdate(ctx, row)
|
|
50
40
|
} catch (err) {
|
|
51
41
|
ctx.throw(400, err)
|
|
52
42
|
}
|
|
@@ -54,7 +44,7 @@ export async function patch(ctx: any): Promise<any> {
|
|
|
54
44
|
|
|
55
45
|
export const save = async (ctx: any) => {
|
|
56
46
|
const appId = ctx.appId
|
|
57
|
-
const tableId = getTableId(ctx)
|
|
47
|
+
const tableId = utils.getTableId(ctx)
|
|
58
48
|
const body = ctx.request.body
|
|
59
49
|
// if it has an ID already then its a patch
|
|
60
50
|
if (body && body._id) {
|
|
@@ -69,23 +59,24 @@ export const save = async (ctx: any) => {
|
|
|
69
59
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:save`, appId, row, table)
|
|
70
60
|
ctx.message = `${table.name} saved successfully`
|
|
71
61
|
ctx.body = row
|
|
62
|
+
gridSocket?.emitRowUpdate(ctx, row)
|
|
72
63
|
}
|
|
73
64
|
export async function fetchView(ctx: any) {
|
|
74
|
-
const tableId = getTableId(ctx)
|
|
65
|
+
const tableId = utils.getTableId(ctx)
|
|
75
66
|
ctx.body = await quotas.addQuery(() => pickApi(tableId).fetchView(ctx), {
|
|
76
67
|
datasourceId: tableId,
|
|
77
68
|
})
|
|
78
69
|
}
|
|
79
70
|
|
|
80
71
|
export async function fetch(ctx: any) {
|
|
81
|
-
const tableId = getTableId(ctx)
|
|
72
|
+
const tableId = utils.getTableId(ctx)
|
|
82
73
|
ctx.body = await quotas.addQuery(() => pickApi(tableId).fetch(ctx), {
|
|
83
74
|
datasourceId: tableId,
|
|
84
75
|
})
|
|
85
76
|
}
|
|
86
77
|
|
|
87
78
|
export async function find(ctx: any) {
|
|
88
|
-
const tableId = getTableId(ctx)
|
|
79
|
+
const tableId = utils.getTableId(ctx)
|
|
89
80
|
ctx.body = await quotas.addQuery(() => pickApi(tableId).find(ctx), {
|
|
90
81
|
datasourceId: tableId,
|
|
91
82
|
})
|
|
@@ -94,7 +85,7 @@ export async function find(ctx: any) {
|
|
|
94
85
|
export async function destroy(ctx: any) {
|
|
95
86
|
const appId = ctx.appId
|
|
96
87
|
const inputs = ctx.request.body
|
|
97
|
-
const tableId = getTableId(ctx)
|
|
88
|
+
const tableId = utils.getTableId(ctx)
|
|
98
89
|
let response, row
|
|
99
90
|
if (inputs.rows) {
|
|
100
91
|
let { rows } = await quotas.addQuery(
|
|
@@ -107,6 +98,7 @@ export async function destroy(ctx: any) {
|
|
|
107
98
|
response = rows
|
|
108
99
|
for (let row of rows) {
|
|
109
100
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
|
|
101
|
+
gridSocket?.emitRowDeletion(ctx, row._id)
|
|
110
102
|
}
|
|
111
103
|
} else {
|
|
112
104
|
let resp = await quotas.addQuery(() => pickApi(tableId).destroy(ctx), {
|
|
@@ -116,6 +108,7 @@ export async function destroy(ctx: any) {
|
|
|
116
108
|
response = resp.response
|
|
117
109
|
row = resp.row
|
|
118
110
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
|
|
111
|
+
gridSocket?.emitRowDeletion(ctx, row._id)
|
|
119
112
|
}
|
|
120
113
|
ctx.status = 200
|
|
121
114
|
// for automations include the row that was deleted
|
|
@@ -124,7 +117,7 @@ export async function destroy(ctx: any) {
|
|
|
124
117
|
}
|
|
125
118
|
|
|
126
119
|
export async function search(ctx: any) {
|
|
127
|
-
const tableId = getTableId(ctx)
|
|
120
|
+
const tableId = utils.getTableId(ctx)
|
|
128
121
|
ctx.status = 200
|
|
129
122
|
ctx.body = await quotas.addQuery(() => pickApi(tableId).search(ctx), {
|
|
130
123
|
datasourceId: tableId,
|
|
@@ -132,7 +125,7 @@ export async function search(ctx: any) {
|
|
|
132
125
|
}
|
|
133
126
|
|
|
134
127
|
export async function validate(ctx: Ctx) {
|
|
135
|
-
const tableId = getTableId(ctx)
|
|
128
|
+
const tableId = utils.getTableId(ctx)
|
|
136
129
|
// external tables are hard to validate currently
|
|
137
130
|
if (isExternalTable(tableId)) {
|
|
138
131
|
ctx.body = { valid: true }
|
|
@@ -145,7 +138,7 @@ export async function validate(ctx: Ctx) {
|
|
|
145
138
|
}
|
|
146
139
|
|
|
147
140
|
export async function fetchEnrichedRow(ctx: any) {
|
|
148
|
-
const tableId = getTableId(ctx)
|
|
141
|
+
const tableId = utils.getTableId(ctx)
|
|
149
142
|
ctx.body = await quotas.addQuery(
|
|
150
143
|
() => pickApi(tableId).fetchEnrichedRow(ctx),
|
|
151
144
|
{
|
|
@@ -155,7 +148,7 @@ export async function fetchEnrichedRow(ctx: any) {
|
|
|
155
148
|
}
|
|
156
149
|
|
|
157
150
|
export const exportRows = async (ctx: any) => {
|
|
158
|
-
const tableId = getTableId(ctx)
|
|
151
|
+
const tableId = utils.getTableId(ctx)
|
|
159
152
|
ctx.body = await quotas.addQuery(() => pickApi(tableId).exportRows(ctx), {
|
|
160
153
|
datasourceId: tableId,
|
|
161
154
|
})
|
|
@@ -415,7 +415,7 @@ export async function exportRows(ctx: UserCtx) {
|
|
|
415
415
|
|
|
416
416
|
result = await outputProcessing(table, response)
|
|
417
417
|
} else if (query) {
|
|
418
|
-
let searchResponse = await
|
|
418
|
+
let searchResponse = await search(ctx)
|
|
419
419
|
result = searchResponse.rows
|
|
420
420
|
}
|
|
421
421
|
|
|
@@ -154,3 +154,15 @@ export function cleanExportRows(
|
|
|
154
154
|
|
|
155
155
|
return cleanRows
|
|
156
156
|
}
|
|
157
|
+
|
|
158
|
+
export function getTableId(ctx: any) {
|
|
159
|
+
if (ctx.request.body && ctx.request.body.tableId) {
|
|
160
|
+
return ctx.request.body.tableId
|
|
161
|
+
}
|
|
162
|
+
if (ctx.params && ctx.params.tableId) {
|
|
163
|
+
return ctx.params.tableId
|
|
164
|
+
}
|
|
165
|
+
if (ctx.params && ctx.params.viewName) {
|
|
166
|
+
return ctx.params.viewName
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -134,7 +134,7 @@ export const serveApp = async function (ctx: any) {
|
|
|
134
134
|
? objectStore.getGlobalFileUrl("settings", "logoUrl")
|
|
135
135
|
: "",
|
|
136
136
|
})
|
|
137
|
-
const appHbs = loadHandlebarsFile(`${__dirname}/
|
|
137
|
+
const appHbs = loadHandlebarsFile(`${__dirname}/app.hbs`)
|
|
138
138
|
ctx.body = await processString(appHbs, {
|
|
139
139
|
head,
|
|
140
140
|
body: html,
|
|
@@ -161,7 +161,7 @@ export const serveApp = async function (ctx: any) {
|
|
|
161
161
|
: "",
|
|
162
162
|
})
|
|
163
163
|
|
|
164
|
-
const appHbs = loadHandlebarsFile(`${__dirname}/
|
|
164
|
+
const appHbs = loadHandlebarsFile(`${__dirname}/app.hbs`)
|
|
165
165
|
ctx.body = await processString(appHbs, {
|
|
166
166
|
head,
|
|
167
167
|
body: html,
|
|
@@ -177,7 +177,7 @@ export const serveBuilderPreview = async function (ctx: any) {
|
|
|
177
177
|
|
|
178
178
|
if (!env.isJest()) {
|
|
179
179
|
let appId = context.getAppId()
|
|
180
|
-
const previewHbs = loadHandlebarsFile(`${__dirname}/
|
|
180
|
+
const previewHbs = loadHandlebarsFile(`${__dirname}/preview.hbs`)
|
|
181
181
|
ctx.body = await processString(previewHbs, {
|
|
182
182
|
clientLibPath: objectStore.clientLibraryUrl(appId!, appInfo.version),
|
|
183
183
|
})
|
|
@@ -11,6 +11,7 @@ import { context, events } from "@budibase/backend-core"
|
|
|
11
11
|
import { Table, UserCtx } from "@budibase/types"
|
|
12
12
|
import sdk from "../../../sdk"
|
|
13
13
|
import { jsonFromCsvString } from "../../../utilities/csv"
|
|
14
|
+
import { builderSocket } from "../../../websockets"
|
|
14
15
|
|
|
15
16
|
function pickApi({ tableId, table }: { tableId?: string; table?: Table }) {
|
|
16
17
|
if (table && !tableId) {
|
|
@@ -77,6 +78,7 @@ export async function save(ctx: UserCtx) {
|
|
|
77
78
|
ctx.eventEmitter &&
|
|
78
79
|
ctx.eventEmitter.emitTable(`table:save`, appId, savedTable)
|
|
79
80
|
ctx.body = savedTable
|
|
81
|
+
builderSocket.emitTableUpdate(ctx, savedTable)
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
export async function destroy(ctx: UserCtx) {
|
|
@@ -89,6 +91,7 @@ export async function destroy(ctx: UserCtx) {
|
|
|
89
91
|
ctx.status = 200
|
|
90
92
|
ctx.table = deletedTable
|
|
91
93
|
ctx.body = { message: `Table ${tableId} deleted.` }
|
|
94
|
+
builderSocket.emitTableDeletion(ctx, tableId)
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
export async function bulkImport(ctx: UserCtx) {
|
|
@@ -186,11 +186,7 @@ export async function destroy(ctx: any) {
|
|
|
186
186
|
export async function bulkImport(ctx: any) {
|
|
187
187
|
const db = context.getAppDB()
|
|
188
188
|
const table = await sdk.tables.getTable(ctx.params.tableId)
|
|
189
|
-
const { rows } = ctx.request.body
|
|
190
|
-
await handleDataImport(ctx.user, table, rows)
|
|
191
|
-
|
|
192
|
-
// Ensure auto id and other table updates are persisted
|
|
193
|
-
await db.put(table)
|
|
194
|
-
|
|
189
|
+
const { rows, identifierFields } = ctx.request.body
|
|
190
|
+
await handleDataImport(ctx.user, table, rows, identifierFields)
|
|
195
191
|
return table
|
|
196
192
|
}
|
|
@@ -149,7 +149,12 @@ export function importToRows(
|
|
|
149
149
|
return finalData
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
export async function handleDataImport(
|
|
152
|
+
export async function handleDataImport(
|
|
153
|
+
user: any,
|
|
154
|
+
table: any,
|
|
155
|
+
rows: any,
|
|
156
|
+
identifierFields: Array<string> = []
|
|
157
|
+
) {
|
|
153
158
|
const schema: unknown = table.schema
|
|
154
159
|
|
|
155
160
|
if (!rows || !isRows(rows) || !isSchema(schema)) {
|
|
@@ -161,6 +166,32 @@ export async function handleDataImport(user: any, table: any, rows: any) {
|
|
|
161
166
|
|
|
162
167
|
let finalData: any = importToRows(data, table, user)
|
|
163
168
|
|
|
169
|
+
//Set IDs of finalData to match existing row if an update is expected
|
|
170
|
+
if (identifierFields.length > 0) {
|
|
171
|
+
const allDocs = await db.allDocs(
|
|
172
|
+
getRowParams(table._id, null, {
|
|
173
|
+
include_docs: true,
|
|
174
|
+
})
|
|
175
|
+
)
|
|
176
|
+
allDocs.rows
|
|
177
|
+
.map(existingRow => existingRow.doc)
|
|
178
|
+
.forEach((doc: any) => {
|
|
179
|
+
finalData.forEach((finalItem: any) => {
|
|
180
|
+
let match = true
|
|
181
|
+
for (const field of identifierFields) {
|
|
182
|
+
if (finalItem[field] !== doc[field]) {
|
|
183
|
+
match = false
|
|
184
|
+
break
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (match) {
|
|
188
|
+
finalItem._id = doc._id
|
|
189
|
+
finalItem._rev = doc._rev
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
})
|
|
193
|
+
}
|
|
194
|
+
|
|
164
195
|
await quotas.addRows(finalData.length, () => db.bulkDocs(finalData), {
|
|
165
196
|
tableId: table._id,
|
|
166
197
|
})
|