@budibase/server 2.6.19-alpha.1 → 2.6.19-alpha.10
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.b9eeb2a8.js → index.7b26bbdb.js} +356 -348
- package/builder/assets/{index.07382a47.css → index.ec1c6a1a.css} +2 -2
- package/builder/index.html +2 -2
- package/client/manifest.json +5229 -0
- package/dist/automation.js +32190 -0
- package/dist/automation.js.map +7 -0
- package/dist/index.js +44342 -13
- package/dist/index.js.map +7 -0
- package/dist/query.js +24307 -0
- package/dist/query.js.map +7 -0
- package/jest.config.ts +3 -0
- package/nodemon.json +1 -1
- package/package.json +29 -13
- package/pm2.config.js +1 -1
- package/scripts/build.js +48 -0
- package/src/api/controllers/datasource.ts +16 -0
- package/src/api/controllers/static/index.ts +3 -3
- package/src/api/routes/datasource.ts +5 -0
- package/src/api/routes/static.ts +3 -1
- package/src/api/routes/tests/datasource.spec.ts +1 -1
- package/src/automations/actions.ts +5 -0
- package/src/automations/steps/openai.ts +105 -0
- package/src/automations/tests/openai.spec.ts +86 -0
- package/src/constants/index.ts +17 -16
- package/src/db/inMemoryView.ts +3 -1
- package/src/environment.ts +2 -0
- package/src/integration-test/postgres.spec.ts +47 -4
- package/src/integrations/base/sqlTable.ts +0 -1
- package/src/integrations/googlesheets.ts +11 -3
- package/src/integrations/microsoftSqlServer.ts +18 -2
- package/src/integrations/mysql.ts +27 -11
- package/src/integrations/oracle.ts +11 -1
- package/src/integrations/postgres.ts +27 -10
- package/src/integrations/tests/googlesheets.spec.ts +41 -9
- 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/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 -319
- 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
|
@@ -63,10 +63,13 @@ const SCHEMA: Integration = {
|
|
|
63
63
|
relationships: false,
|
|
64
64
|
docs: "https://developers.google.com/sheets/api/quickstart/nodejs",
|
|
65
65
|
description:
|
|
66
|
-
"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.",
|
|
67
67
|
friendlyName: "Google Sheets",
|
|
68
68
|
type: "Spreadsheet",
|
|
69
|
-
features: [
|
|
69
|
+
features: [
|
|
70
|
+
DatasourceFeature.CONNECTION_CHECKING,
|
|
71
|
+
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
72
|
+
],
|
|
70
73
|
datasource: {
|
|
71
74
|
spreadsheetId: {
|
|
72
75
|
display: "Google Sheet URL",
|
|
@@ -145,7 +148,6 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
145
148
|
async testConnection(): Promise<ConnectionInfo> {
|
|
146
149
|
try {
|
|
147
150
|
await this.connect()
|
|
148
|
-
await this.client.loadInfo()
|
|
149
151
|
return { connected: true }
|
|
150
152
|
} catch (e: any) {
|
|
151
153
|
return {
|
|
@@ -240,6 +242,12 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
240
242
|
}
|
|
241
243
|
}
|
|
242
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
|
+
|
|
243
251
|
getTableSchema(title: string, headerValues: string[], id?: string) {
|
|
244
252
|
// base table
|
|
245
253
|
const table: Table = {
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
} from "./utils"
|
|
21
21
|
import Sql from "./base/sql"
|
|
22
22
|
import { MSSQLTablesResponse, MSSQLColumn } from "./base/types"
|
|
23
|
-
|
|
24
23
|
const sqlServer = require("mssql")
|
|
25
24
|
const DEFAULT_SCHEMA = "dbo"
|
|
26
25
|
|
|
@@ -41,7 +40,10 @@ const SCHEMA: Integration = {
|
|
|
41
40
|
"Microsoft SQL Server is a relational database management system developed by Microsoft. ",
|
|
42
41
|
friendlyName: "MS SQL Server",
|
|
43
42
|
type: "Relational",
|
|
44
|
-
features: [
|
|
43
|
+
features: [
|
|
44
|
+
DatasourceFeature.CONNECTION_CHECKING,
|
|
45
|
+
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
46
|
+
],
|
|
45
47
|
datasource: {
|
|
46
48
|
user: {
|
|
47
49
|
type: DatasourceFieldType.STRING,
|
|
@@ -284,6 +286,20 @@ class SqlServerIntegration extends Sql implements DatasourcePlus {
|
|
|
284
286
|
this.schemaErrors = final.errors
|
|
285
287
|
}
|
|
286
288
|
|
|
289
|
+
async queryTableNames() {
|
|
290
|
+
let tableInfo: MSSQLTablesResponse[] = await this.runSQL(this.TABLES_SQL)
|
|
291
|
+
const schema = this.config.schema || DEFAULT_SCHEMA
|
|
292
|
+
return tableInfo
|
|
293
|
+
.filter((record: any) => record.TABLE_SCHEMA === schema)
|
|
294
|
+
.map((record: any) => record.TABLE_NAME)
|
|
295
|
+
.filter((name: string) => this.MASTER_TABLES.indexOf(name) === -1)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
async getTableNames() {
|
|
299
|
+
await this.connect()
|
|
300
|
+
return this.queryTableNames()
|
|
301
|
+
}
|
|
302
|
+
|
|
287
303
|
async read(query: SqlQuery | string) {
|
|
288
304
|
await this.connect()
|
|
289
305
|
const response = await this.internalQuery(getSqlQuery(query))
|
|
@@ -36,7 +36,10 @@ const SCHEMA: Integration = {
|
|
|
36
36
|
type: "Relational",
|
|
37
37
|
description:
|
|
38
38
|
"MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",
|
|
39
|
-
features: [
|
|
39
|
+
features: [
|
|
40
|
+
DatasourceFeature.CONNECTION_CHECKING,
|
|
41
|
+
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
42
|
+
],
|
|
40
43
|
datasource: {
|
|
41
44
|
host: {
|
|
42
45
|
type: DatasourceFieldType.STRING,
|
|
@@ -214,20 +217,11 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
|
|
|
214
217
|
|
|
215
218
|
async buildSchema(datasourceId: string, entities: Record<string, Table>) {
|
|
216
219
|
const tables: { [key: string]: Table } = {}
|
|
217
|
-
const database = this.config.database
|
|
218
220
|
await this.connect()
|
|
219
221
|
|
|
220
222
|
try {
|
|
221
223
|
// get the tables first
|
|
222
|
-
const
|
|
223
|
-
{ sql: "SHOW TABLES;" },
|
|
224
|
-
{ connect: false }
|
|
225
|
-
)
|
|
226
|
-
const tableNames: string[] = tablesResp.map(
|
|
227
|
-
(obj: any) =>
|
|
228
|
-
obj[`Tables_in_${database}`] ||
|
|
229
|
-
obj[`Tables_in_${database.toLowerCase()}`]
|
|
230
|
-
)
|
|
224
|
+
const tableNames = await this.queryTableNames()
|
|
231
225
|
for (let tableName of tableNames) {
|
|
232
226
|
const primaryKeys = []
|
|
233
227
|
const schema: TableSchema = {}
|
|
@@ -274,6 +268,28 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
|
|
|
274
268
|
this.schemaErrors = final.errors
|
|
275
269
|
}
|
|
276
270
|
|
|
271
|
+
async queryTableNames() {
|
|
272
|
+
const database = this.config.database
|
|
273
|
+
const tablesResp: Record<string, string>[] = await this.internalQuery(
|
|
274
|
+
{ sql: "SHOW TABLES;" },
|
|
275
|
+
{ connect: false }
|
|
276
|
+
)
|
|
277
|
+
return tablesResp.map(
|
|
278
|
+
(obj: any) =>
|
|
279
|
+
obj[`Tables_in_${database}`] ||
|
|
280
|
+
obj[`Tables_in_${database.toLowerCase()}`]
|
|
281
|
+
)
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
async getTableNames() {
|
|
285
|
+
await this.connect()
|
|
286
|
+
try {
|
|
287
|
+
return this.queryTableNames()
|
|
288
|
+
} finally {
|
|
289
|
+
await this.disconnect()
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
277
293
|
async create(query: SqlQuery | string) {
|
|
278
294
|
const results = await this.internalQuery(getSqlQuery(query))
|
|
279
295
|
return results.length ? results : [{ created: true }]
|
|
@@ -50,7 +50,10 @@ const SCHEMA: Integration = {
|
|
|
50
50
|
type: "Relational",
|
|
51
51
|
description:
|
|
52
52
|
"Oracle Database is an object-relational database management system developed by Oracle Corporation",
|
|
53
|
-
features: [
|
|
53
|
+
features: [
|
|
54
|
+
DatasourceFeature.CONNECTION_CHECKING,
|
|
55
|
+
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
56
|
+
],
|
|
54
57
|
datasource: {
|
|
55
58
|
host: {
|
|
56
59
|
type: DatasourceFieldType.STRING,
|
|
@@ -323,6 +326,13 @@ class OracleIntegration extends Sql implements DatasourcePlus {
|
|
|
323
326
|
this.schemaErrors = final.errors
|
|
324
327
|
}
|
|
325
328
|
|
|
329
|
+
async getTableNames() {
|
|
330
|
+
const columnsResponse = await this.internalQuery<OracleColumnsResponse>({
|
|
331
|
+
sql: this.COLUMNS_SQL,
|
|
332
|
+
})
|
|
333
|
+
return (columnsResponse.rows || []).map(row => row.TABLE_NAME)
|
|
334
|
+
}
|
|
335
|
+
|
|
326
336
|
async testConnection() {
|
|
327
337
|
const response: ConnectionInfo = {
|
|
328
338
|
connected: false,
|
|
@@ -52,7 +52,10 @@ const SCHEMA: Integration = {
|
|
|
52
52
|
type: "Relational",
|
|
53
53
|
description:
|
|
54
54
|
"PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
|
|
55
|
-
features: [
|
|
55
|
+
features: [
|
|
56
|
+
DatasourceFeature.CONNECTION_CHECKING,
|
|
57
|
+
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
58
|
+
],
|
|
56
59
|
datasource: {
|
|
57
60
|
host: {
|
|
58
61
|
type: DatasourceFieldType.STRING,
|
|
@@ -126,14 +129,15 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
|
|
|
126
129
|
|
|
127
130
|
COLUMNS_SQL!: string
|
|
128
131
|
|
|
129
|
-
PRIMARY_KEYS_SQL = `
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
132
|
+
PRIMARY_KEYS_SQL = () => `
|
|
133
|
+
SELECT pg_namespace.nspname table_schema
|
|
134
|
+
, pg_class.relname table_name
|
|
135
|
+
, pg_attribute.attname primary_key
|
|
136
|
+
FROM pg_class
|
|
137
|
+
JOIN pg_index ON pg_class.oid = pg_index.indrelid AND pg_index.indisprimary
|
|
138
|
+
JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = ANY(pg_index.indkey)
|
|
139
|
+
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
|
|
140
|
+
WHERE pg_namespace.nspname = '${this.config.schema}';
|
|
137
141
|
`
|
|
138
142
|
|
|
139
143
|
constructor(config: PostgresConfig) {
|
|
@@ -239,7 +243,9 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
|
|
|
239
243
|
let tableKeys: { [key: string]: string[] } = {}
|
|
240
244
|
await this.openConnection()
|
|
241
245
|
try {
|
|
242
|
-
const primaryKeysResponse = await this.client.query(
|
|
246
|
+
const primaryKeysResponse = await this.client.query(
|
|
247
|
+
this.PRIMARY_KEYS_SQL()
|
|
248
|
+
)
|
|
243
249
|
for (let table of primaryKeysResponse.rows) {
|
|
244
250
|
const tableName = table.table_name
|
|
245
251
|
if (!tableKeys[tableName]) {
|
|
@@ -311,6 +317,17 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
|
|
|
311
317
|
}
|
|
312
318
|
}
|
|
313
319
|
|
|
320
|
+
async getTableNames() {
|
|
321
|
+
try {
|
|
322
|
+
await this.openConnection()
|
|
323
|
+
const columnsResponse: { rows: PostgresColumn[] } =
|
|
324
|
+
await this.client.query(this.COLUMNS_SQL)
|
|
325
|
+
return columnsResponse.rows.map(row => row.table_name)
|
|
326
|
+
} finally {
|
|
327
|
+
await this.closeConnection()
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
314
331
|
async create(query: SqlQuery | string) {
|
|
315
332
|
const response = await this.internalQuery(getSqlQuery(query))
|
|
316
333
|
return response.rows.length ? response.rows : [{ created: true }]
|
|
@@ -17,14 +17,15 @@ jest.mock("google-spreadsheet")
|
|
|
17
17
|
const { GoogleSpreadsheet } = require("google-spreadsheet")
|
|
18
18
|
|
|
19
19
|
const sheetsByTitle: { [title: string]: GoogleSpreadsheetWorksheet } = {}
|
|
20
|
+
const sheetsByIndex: GoogleSpreadsheetWorksheet[] = []
|
|
21
|
+
const mockGoogleIntegration = {
|
|
22
|
+
useOAuth2Client: jest.fn(),
|
|
23
|
+
loadInfo: jest.fn(),
|
|
24
|
+
sheetsByTitle,
|
|
25
|
+
sheetsByIndex,
|
|
26
|
+
}
|
|
20
27
|
|
|
21
|
-
GoogleSpreadsheet.mockImplementation(() =>
|
|
22
|
-
return {
|
|
23
|
-
useOAuth2Client: jest.fn(),
|
|
24
|
-
loadInfo: jest.fn(),
|
|
25
|
-
sheetsByTitle,
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
+
GoogleSpreadsheet.mockImplementation(() => mockGoogleIntegration)
|
|
28
29
|
|
|
29
30
|
import { structures } from "@budibase/backend-core/tests"
|
|
30
31
|
import TestConfiguration from "../../tests/utilities/TestConfiguration"
|
|
@@ -53,6 +54,8 @@ describe("Google Sheets Integration", () => {
|
|
|
53
54
|
},
|
|
54
55
|
})
|
|
55
56
|
await config.init()
|
|
57
|
+
|
|
58
|
+
jest.clearAllMocks()
|
|
56
59
|
})
|
|
57
60
|
|
|
58
61
|
function createBasicTable(name: string, columns: string[]): Table {
|
|
@@ -88,7 +91,7 @@ describe("Google Sheets Integration", () => {
|
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
describe("update table", () => {
|
|
91
|
-
|
|
94
|
+
it("adding a new field will be adding a new header row", async () => {
|
|
92
95
|
await config.doInContext(structures.uuid(), async () => {
|
|
93
96
|
const tableColumns = ["name", "description", "new field"]
|
|
94
97
|
const table = createBasicTable(structures.uuid(), tableColumns)
|
|
@@ -103,7 +106,7 @@ describe("Google Sheets Integration", () => {
|
|
|
103
106
|
})
|
|
104
107
|
})
|
|
105
108
|
|
|
106
|
-
|
|
109
|
+
it("removing an existing field will remove the header from the google sheet", async () => {
|
|
107
110
|
const sheet = await config.doInContext(structures.uuid(), async () => {
|
|
108
111
|
const tableColumns = ["name"]
|
|
109
112
|
const table = createBasicTable(structures.uuid(), tableColumns)
|
|
@@ -123,4 +126,33 @@ describe("Google Sheets Integration", () => {
|
|
|
123
126
|
expect((sheet.setHeaderRow as any).mock.calls[0][0]).toHaveLength(1)
|
|
124
127
|
})
|
|
125
128
|
})
|
|
129
|
+
|
|
130
|
+
describe("getTableNames", () => {
|
|
131
|
+
it("can fetch table names", async () => {
|
|
132
|
+
await config.doInContext(structures.uuid(), async () => {
|
|
133
|
+
const sheetNames: string[] = []
|
|
134
|
+
for (let i = 0; i < 5; i++) {
|
|
135
|
+
const sheet = createSheet({ headerValues: [] })
|
|
136
|
+
sheetsByIndex.push(sheet)
|
|
137
|
+
sheetNames.push(sheet.title)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const res = await integration.getTableNames()
|
|
141
|
+
|
|
142
|
+
expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
|
|
143
|
+
expect(res).toEqual(sheetNames)
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
describe("testConnection", () => {
|
|
149
|
+
it("can test successful connections", async () => {
|
|
150
|
+
await config.doInContext(structures.uuid(), async () => {
|
|
151
|
+
const res = await integration.testConnection()
|
|
152
|
+
|
|
153
|
+
expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
|
|
154
|
+
expect(res).toEqual({ connected: true })
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
})
|
|
126
158
|
})
|
|
@@ -35,7 +35,7 @@ export const getComponentLibraryManifest = async (library: string) => {
|
|
|
35
35
|
const filename = "manifest.json"
|
|
36
36
|
|
|
37
37
|
if (env.isDev() || env.isTest()) {
|
|
38
|
-
const path = join(TOP_LEVEL_PATH, "
|
|
38
|
+
const path = join(TOP_LEVEL_PATH, "packages/client", filename)
|
|
39
39
|
// always load from new so that updates are refreshed
|
|
40
40
|
delete require.cache[require.resolve(path)]
|
|
41
41
|
return require(path)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join } from "path"
|
|
1
|
+
import path, { join } from "path"
|
|
2
2
|
import { ObjectStoreBuckets } from "../../constants"
|
|
3
3
|
import fs from "fs"
|
|
4
4
|
import { objectStore } from "@budibase/backend-core"
|
|
@@ -6,6 +6,10 @@ import { resolve } from "../centralPath"
|
|
|
6
6
|
import env from "../../environment"
|
|
7
7
|
import { TOP_LEVEL_PATH } from "./filesystem"
|
|
8
8
|
|
|
9
|
+
export function devClientLibPath() {
|
|
10
|
+
return require.resolve("@budibase/client")
|
|
11
|
+
}
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* Client library paths in the object store:
|
|
11
15
|
* Previously, the entire client library package was downloaded from NPM
|
|
@@ -89,9 +93,10 @@ export async function updateClientLibrary(appId: string) {
|
|
|
89
93
|
let manifest, client
|
|
90
94
|
|
|
91
95
|
if (env.isDev()) {
|
|
96
|
+
const clientPath = devClientLibPath()
|
|
92
97
|
// Load the symlinked version in dev which is always the newest
|
|
93
|
-
manifest =
|
|
94
|
-
client =
|
|
98
|
+
manifest = join(path.dirname(path.dirname(clientPath)), "manifest.json")
|
|
99
|
+
client = clientPath
|
|
95
100
|
} else {
|
|
96
101
|
// Load the bundled version in prod
|
|
97
102
|
manifest = resolve(TOP_LEVEL_PATH, "client", "manifest.json")
|
|
@@ -4,9 +4,11 @@ import { budibaseTempDir } from "../budibaseDir"
|
|
|
4
4
|
import { join } from "path"
|
|
5
5
|
import env from "../../environment"
|
|
6
6
|
import tar from "tar"
|
|
7
|
+
import environment from "../../environment"
|
|
7
8
|
const uuid = require("uuid/v4")
|
|
8
9
|
|
|
9
|
-
export const TOP_LEVEL_PATH =
|
|
10
|
+
export const TOP_LEVEL_PATH =
|
|
11
|
+
environment.TOP_LEVEL_PATH || join(__dirname, "..", "..", "..")
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* Upon first startup of instance there may not be everything we need in tmp directory, set it up.
|
package/tsconfig.build.json
CHANGED
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
"incremental": true,
|
|
11
11
|
"types": ["node", "jest"],
|
|
12
12
|
"outDir": "dist/src",
|
|
13
|
-
"skipLibCheck": true
|
|
13
|
+
"skipLibCheck": true,
|
|
14
|
+
"baseUrl": ".",
|
|
15
|
+
"paths": {
|
|
16
|
+
"@budibase/types": ["../types/src"],
|
|
17
|
+
"@budibase/backend-core": ["../backend-core/src"],
|
|
18
|
+
"@budibase/backend-core/*": ["../backend-core/*"],
|
|
19
|
+
"@budibase/shared-core": ["../shared-core/src"],
|
|
20
|
+
"@budibase/pro": ["../pro/packages/pro/src"]
|
|
21
|
+
}
|
|
14
22
|
},
|
|
15
23
|
"include": ["src/**/*"],
|
|
16
24
|
"exclude": [
|
package/tsconfig.json
CHANGED
|
@@ -5,25 +5,12 @@
|
|
|
5
5
|
"declaration": true,
|
|
6
6
|
"sourceMap": true,
|
|
7
7
|
"baseUrl": ".",
|
|
8
|
-
"outDir": "dist"
|
|
9
|
-
"paths": {
|
|
10
|
-
"@budibase/types": ["../types/src"],
|
|
11
|
-
"@budibase/backend-core": ["../backend-core/src"],
|
|
12
|
-
"@budibase/backend-core/*": ["../backend-core/*"],
|
|
13
|
-
"@budibase/shared-core": ["../shared-core/src"],
|
|
14
|
-
"@budibase/pro": ["../pro/packages/pro/src"]
|
|
15
|
-
}
|
|
8
|
+
"outDir": "dist"
|
|
16
9
|
},
|
|
17
10
|
"ts-node": {
|
|
18
11
|
"require": ["tsconfig-paths/register"],
|
|
19
12
|
"swc": true
|
|
20
13
|
},
|
|
21
|
-
"references": [
|
|
22
|
-
{ "path": "../types" },
|
|
23
|
-
{ "path": "../backend-core" },
|
|
24
|
-
{ "path": "../shared-core" },
|
|
25
|
-
{ "path": "../../../budibase-pro/packages/pro" }
|
|
26
|
-
],
|
|
27
14
|
"include": ["src/**/*", "specs"],
|
|
28
15
|
"exclude": ["node_modules", "dist"]
|
|
29
16
|
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ping = exports.isEnabled = void 0;
|
|
13
|
-
const backend_core_1 = require("@budibase/backend-core");
|
|
14
|
-
const types_1 = require("@budibase/types");
|
|
15
|
-
const utils_1 = require("../../db/utils");
|
|
16
|
-
const backend_core_2 = require("@budibase/backend-core");
|
|
17
|
-
const isEnabled = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
-
const enabled = yield backend_core_1.events.analytics.enabled();
|
|
19
|
-
ctx.body = {
|
|
20
|
-
enabled,
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
exports.isEnabled = isEnabled;
|
|
24
|
-
const ping = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
25
|
-
const body = ctx.request.body;
|
|
26
|
-
switch (body.source) {
|
|
27
|
-
case types_1.PingSource.APP: {
|
|
28
|
-
const db = backend_core_2.context.getAppDB({ skip_setup: true });
|
|
29
|
-
const appInfo = yield db.get(utils_1.DocumentType.APP_METADATA);
|
|
30
|
-
let appId = backend_core_2.context.getAppId();
|
|
31
|
-
if ((0, utils_1.isDevAppID)(appId)) {
|
|
32
|
-
yield backend_core_1.events.serve.servedAppPreview(appInfo, body.timezone);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
yield backend_core_1.events.serve.servedApp(appInfo, body.timezone);
|
|
36
|
-
}
|
|
37
|
-
break;
|
|
38
|
-
}
|
|
39
|
-
case types_1.PingSource.BUILDER: {
|
|
40
|
-
yield backend_core_1.events.serve.servedBuilder(body.timezone);
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
ctx.status = 200;
|
|
45
|
-
});
|
|
46
|
-
exports.ping = ping;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.update = exports.fetch = void 0;
|
|
13
|
-
const backend_core_1 = require("@budibase/backend-core");
|
|
14
|
-
const KEYS_DOC = backend_core_1.db.StaticDatabases.GLOBAL.docs.apiKeys;
|
|
15
|
-
function getBuilderMainDoc() {
|
|
16
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
17
|
-
const db = backend_core_1.tenancy.getGlobalDB();
|
|
18
|
-
try {
|
|
19
|
-
return yield db.get(KEYS_DOC);
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
// doesn't exist yet, nothing to get
|
|
23
|
-
return {
|
|
24
|
-
_id: KEYS_DOC,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
function setBuilderMainDoc(doc) {
|
|
30
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
// make sure to override the ID
|
|
32
|
-
doc._id = KEYS_DOC;
|
|
33
|
-
const db = backend_core_1.tenancy.getGlobalDB();
|
|
34
|
-
return db.put(doc);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
function fetch(ctx) {
|
|
38
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
-
try {
|
|
40
|
-
const mainDoc = yield getBuilderMainDoc();
|
|
41
|
-
ctx.body = mainDoc.apiKeys ? mainDoc.apiKeys : {};
|
|
42
|
-
}
|
|
43
|
-
catch (err) {
|
|
44
|
-
/* istanbul ignore next */
|
|
45
|
-
ctx.throw(400, err);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
exports.fetch = fetch;
|
|
50
|
-
function update(ctx) {
|
|
51
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
-
const key = ctx.params.key;
|
|
53
|
-
const value = ctx.request.body.value;
|
|
54
|
-
try {
|
|
55
|
-
const mainDoc = yield getBuilderMainDoc();
|
|
56
|
-
if (mainDoc.apiKeys == null) {
|
|
57
|
-
mainDoc.apiKeys = {};
|
|
58
|
-
}
|
|
59
|
-
mainDoc.apiKeys[key] = value;
|
|
60
|
-
const resp = yield setBuilderMainDoc(mainDoc);
|
|
61
|
-
ctx.body = {
|
|
62
|
-
_id: resp.id,
|
|
63
|
-
_rev: resp.rev,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
/* istanbul ignore next */
|
|
68
|
-
ctx.throw(400, err);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
exports.update = update;
|