@budibase/server 1.2.39-alpha.1 → 1.2.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mocks__/mongodb.ts +0 -4
- package/__mocks__/node-fetch.ts +1 -8
- package/builder/assets/{index.f1c7e247.css → index.08dd0c5e.css} +1 -1
- package/builder/assets/index.52e100f8.js +975 -0
- package/builder/index.html +2 -2
- package/coverage/clover.xml +442 -443
- package/coverage/coverage-final.json +10 -10
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +1 -1
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +25 -25
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +191 -209
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +18 -27
- package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +2 -2
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +19 -19
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +15 -15
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +37 -10
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/utils/index.html +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +1 -1
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +30 -30
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +1 -1
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
- package/coverage/lcov-report/db/newid.js.html +3 -3
- package/coverage/lcov-report/db/utils.js.html +61 -61
- package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +27 -27
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
- package/coverage/lcov-report/middleware/builder.js.html +1 -1
- package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +16 -16
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +23 -23
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +1 -1
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +7 -7
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +685 -684
- package/dist/api/controllers/row/internalSearch.js +0 -5
- package/dist/api/controllers/row/utils.js +1 -3
- package/dist/api/controllers/table/external.js +1 -1
- package/dist/api/controllers/view/utils.js +11 -2
- package/dist/automations/logging/index.js +0 -3
- package/dist/integrations/base/sql.js +4 -5
- package/dist/integrations/base/utils.js +27 -13
- package/dist/integrations/microsoftSqlServer.js +2 -5
- package/dist/integrations/mongodb.js +8 -35
- package/dist/integrations/mysql.js +2 -2
- package/dist/integrations/postgres.js +2 -5
- package/dist/package.json +7 -7
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/api/controllers/row/internalSearch.js +0 -6
- package/src/api/controllers/row/utils.js +1 -4
- package/src/api/controllers/table/external.js +1 -1
- package/src/api/controllers/view/utils.js +11 -2
- package/src/automations/logging/index.ts +0 -3
- package/src/integrations/base/sql.ts +4 -5
- package/src/integrations/base/utils.ts +18 -9
- package/src/integrations/microsoftSqlServer.ts +2 -3
- package/src/integrations/mongodb.ts +8 -35
- package/src/integrations/mysql.ts +1 -1
- package/src/integrations/postgres.ts +1 -2
- package/src/integrations/tests/mongo.spec.js +0 -218
- package/src/integrations/tests/sql.spec.js +1 -1
- package/builder/assets/index.a1c0a62f.js +0 -977
- package/dist/integrations/base/query.js +0 -27
- package/src/api/routes/tests/internalSearch.spec.js +0 -157
- package/src/integrations/base/query.ts +0 -16
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.40",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"license": "GPL-3.0",
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@apidevtools/swagger-parser": "10.0.3",
|
|
80
|
-
"@budibase/backend-core": "1.2.
|
|
81
|
-
"@budibase/client": "1.2.
|
|
82
|
-
"@budibase/pro": "1.2.39
|
|
83
|
-
"@budibase/string-templates": "1.2.
|
|
84
|
-
"@budibase/types": "1.2.
|
|
80
|
+
"@budibase/backend-core": "^1.2.40",
|
|
81
|
+
"@budibase/client": "^1.2.40",
|
|
82
|
+
"@budibase/pro": "1.2.39",
|
|
83
|
+
"@budibase/string-templates": "^1.2.40",
|
|
84
|
+
"@budibase/types": "^1.2.40",
|
|
85
85
|
"@bull-board/api": "3.7.0",
|
|
86
86
|
"@bull-board/koa": "3.9.4",
|
|
87
87
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"google-auth-library": "7.12.0",
|
|
107
107
|
"google-spreadsheet": "3.2.0",
|
|
108
108
|
"jimp": "0.16.1",
|
|
109
|
-
"joi": "17.
|
|
109
|
+
"joi": "17.2.1",
|
|
110
110
|
"js-yaml": "4.1.0",
|
|
111
111
|
"jsonschema": "1.4.0",
|
|
112
112
|
"knex": "0.95.15",
|
|
@@ -195,5 +195,5 @@
|
|
|
195
195
|
"optionalDependencies": {
|
|
196
196
|
"oracledb": "5.3.0"
|
|
197
197
|
},
|
|
198
|
-
"gitHead": "
|
|
198
|
+
"gitHead": "849aa083c79bffc75057411e422ba9df045663bb"
|
|
199
199
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
const { SearchIndexes } = require("../../../db/utils")
|
|
2
|
-
const { removeKeyNumbering } = require("./utils")
|
|
3
2
|
const fetch = require("node-fetch")
|
|
4
3
|
const { getCouchInfo } = require("@budibase/backend-core/db")
|
|
5
4
|
const { getAppId } = require("@budibase/backend-core/context")
|
|
@@ -198,8 +197,6 @@ class QueryBuilder {
|
|
|
198
197
|
|
|
199
198
|
function build(structure, queryFn) {
|
|
200
199
|
for (let [key, value] of Object.entries(structure)) {
|
|
201
|
-
// check for new format - remove numbering if needed
|
|
202
|
-
key = removeKeyNumbering(key)
|
|
203
200
|
key = builder.preprocess(key.replace(/ /g, "_"), {
|
|
204
201
|
escape: true,
|
|
205
202
|
})
|
|
@@ -313,9 +310,6 @@ class QueryBuilder {
|
|
|
313
310
|
}
|
|
314
311
|
}
|
|
315
312
|
|
|
316
|
-
// exported for unit testing
|
|
317
|
-
exports.QueryBuilder = QueryBuilder
|
|
318
|
-
|
|
319
313
|
/**
|
|
320
314
|
* Executes a lucene search query.
|
|
321
315
|
* @param url The query URL
|
|
@@ -3,9 +3,8 @@ const { cloneDeep } = require("lodash/fp")
|
|
|
3
3
|
const { InternalTables } = require("../../../db/utils")
|
|
4
4
|
const userController = require("../user")
|
|
5
5
|
const { FieldTypes } = require("../../../constants")
|
|
6
|
+
const { makeExternalQuery } = require("../../../integrations/base/utils")
|
|
6
7
|
const { getAppDB } = require("@budibase/backend-core/context")
|
|
7
|
-
const { makeExternalQuery } = require("../../../integrations/base/query")
|
|
8
|
-
const { removeKeyNumbering } = require("../../../integrations/base/utils")
|
|
9
8
|
|
|
10
9
|
validateJs.extend(validateJs.validators.datetime, {
|
|
11
10
|
parse: function (value) {
|
|
@@ -17,8 +16,6 @@ validateJs.extend(validateJs.validators.datetime, {
|
|
|
17
16
|
},
|
|
18
17
|
})
|
|
19
18
|
|
|
20
|
-
exports.removeKeyNumbering = removeKeyNumbering
|
|
21
|
-
|
|
22
19
|
exports.getDatasourceAndQuery = async json => {
|
|
23
20
|
const datasourceId = json.endpoint.datasourceId
|
|
24
21
|
const db = getAppDB()
|
|
@@ -14,7 +14,7 @@ const {
|
|
|
14
14
|
FieldTypes,
|
|
15
15
|
RelationshipTypes,
|
|
16
16
|
} = require("../../../constants")
|
|
17
|
-
const { makeExternalQuery } = require("../../../integrations/base/
|
|
17
|
+
const { makeExternalQuery } = require("../../../integrations/base/utils")
|
|
18
18
|
const { cloneDeep } = require("lodash/fp")
|
|
19
19
|
const csvParser = require("../../../utilities/csvParser")
|
|
20
20
|
const { handleRequest } = require("../row/external")
|
|
@@ -20,8 +20,17 @@ exports.getView = async viewName => {
|
|
|
20
20
|
return null
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
try {
|
|
24
|
+
const viewDoc = await db.get(generateMemoryViewID(viewName))
|
|
25
|
+
return viewDoc.view
|
|
26
|
+
} catch (err) {
|
|
27
|
+
// Return null when PouchDB doesn't found the view
|
|
28
|
+
if (err.status === 404) {
|
|
29
|
+
return null
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
throw err
|
|
33
|
+
}
|
|
25
34
|
}
|
|
26
35
|
}
|
|
27
36
|
|
|
@@ -23,9 +23,6 @@ export async function checkAppMetadata(apps: App[]) {
|
|
|
23
23
|
for (let [key, errors] of Object.entries(metadata.automationErrors)) {
|
|
24
24
|
const updated = []
|
|
25
25
|
for (let error of errors) {
|
|
26
|
-
if (!error) {
|
|
27
|
-
continue
|
|
28
|
-
}
|
|
29
26
|
const startDate = error.split(dbUtils.SEPARATOR)[2]
|
|
30
27
|
if (startDate > maxStartDate) {
|
|
31
28
|
updated.push(error)
|
|
@@ -10,7 +10,6 @@ import { QueryOptions } from "../../definitions/datasource"
|
|
|
10
10
|
import { isIsoDateString, SqlClient } from "../utils"
|
|
11
11
|
import SqlTableQueryBuilder from "./sqlTable"
|
|
12
12
|
import environment from "../../environment"
|
|
13
|
-
import { removeKeyNumbering } from "./utils"
|
|
14
13
|
|
|
15
14
|
const envLimit = environment.SQL_MAX_ROWS
|
|
16
15
|
? parseInt(environment.SQL_MAX_ROWS)
|
|
@@ -134,13 +133,12 @@ class InternalBuilder {
|
|
|
134
133
|
fn: (key: string, value: any) => void
|
|
135
134
|
) {
|
|
136
135
|
for (let [key, value] of Object.entries(structure)) {
|
|
137
|
-
const
|
|
138
|
-
const isRelationshipField = updatedKey.includes(".")
|
|
136
|
+
const isRelationshipField = key.includes(".")
|
|
139
137
|
if (!opts.relationship && !isRelationshipField) {
|
|
140
|
-
fn(`${opts.tableName}.${
|
|
138
|
+
fn(`${opts.tableName}.${key}`, value)
|
|
141
139
|
}
|
|
142
140
|
if (opts.relationship && isRelationshipField) {
|
|
143
|
-
fn(
|
|
141
|
+
fn(key, value)
|
|
144
142
|
}
|
|
145
143
|
}
|
|
146
144
|
}
|
|
@@ -584,3 +582,4 @@ class SqlQueryBuilder extends SqlTableQueryBuilder {
|
|
|
584
582
|
}
|
|
585
583
|
|
|
586
584
|
export default SqlQueryBuilder
|
|
585
|
+
module.exports = SqlQueryBuilder
|
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
import { QueryJson, Datasource } from "@budibase/types"
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
module DatasourceUtils {
|
|
4
|
+
const { integrations } = require("../index")
|
|
5
|
+
|
|
6
|
+
export async function makeExternalQuery(
|
|
7
|
+
datasource: Datasource,
|
|
8
|
+
json: QueryJson
|
|
9
|
+
) {
|
|
10
|
+
const Integration = integrations[datasource.source]
|
|
11
|
+
// query is the opinionated function
|
|
12
|
+
if (Integration.prototype.query) {
|
|
13
|
+
const integration = new Integration(datasource.config)
|
|
14
|
+
return integration.query(json)
|
|
15
|
+
} else {
|
|
16
|
+
throw "Datasource does not support query."
|
|
17
|
+
}
|
|
11
18
|
}
|
|
19
|
+
|
|
20
|
+
module.exports.makeExternalQuery = makeExternalQuery
|
|
12
21
|
}
|
|
@@ -16,10 +16,10 @@ import {
|
|
|
16
16
|
finaliseExternalTables,
|
|
17
17
|
SqlClient,
|
|
18
18
|
} from "./utils"
|
|
19
|
-
import Sql from "./base/sql"
|
|
20
19
|
|
|
21
20
|
module MSSQLModule {
|
|
22
21
|
const sqlServer = require("mssql")
|
|
22
|
+
const Sql = require("./base/sql")
|
|
23
23
|
const DEFAULT_SCHEMA = "dbo"
|
|
24
24
|
|
|
25
25
|
interface MSSQLConfig {
|
|
@@ -97,8 +97,7 @@ module MSSQLModule {
|
|
|
97
97
|
class SqlServerIntegration extends Sql implements DatasourcePlus {
|
|
98
98
|
private readonly config: MSSQLConfig
|
|
99
99
|
private index: number = 0
|
|
100
|
-
|
|
101
|
-
private client: any
|
|
100
|
+
static pool: any
|
|
102
101
|
public tables: Record<string, Table> = {}
|
|
103
102
|
public schemaErrors: Record<string, string> = {}
|
|
104
103
|
|
|
@@ -92,15 +92,12 @@ module MongoDBModule {
|
|
|
92
92
|
if (json[field] instanceof Object) {
|
|
93
93
|
json[field] = self.createObjectIds(json[field])
|
|
94
94
|
}
|
|
95
|
-
if (
|
|
96
|
-
|
|
97
|
-
typeof json[field] === "string"
|
|
98
|
-
) {
|
|
99
|
-
const id = json[field].match(
|
|
95
|
+
if (field === "_id" && typeof json[field] === "string") {
|
|
96
|
+
const id = json["_id"].match(
|
|
100
97
|
/(?<=objectid\(['"]).*(?=['"]\))/gi
|
|
101
98
|
)?.[0]
|
|
102
99
|
if (id) {
|
|
103
|
-
json[
|
|
100
|
+
json["_id"] = ObjectID.createFromHexString(id)
|
|
104
101
|
}
|
|
105
102
|
}
|
|
106
103
|
}
|
|
@@ -117,31 +114,10 @@ module MongoDBModule {
|
|
|
117
114
|
}
|
|
118
115
|
|
|
119
116
|
parseQueryParams(params: string, mode: string) {
|
|
120
|
-
let queryParams = []
|
|
121
|
-
let
|
|
122
|
-
let
|
|
123
|
-
let
|
|
124
|
-
let startIndex = 0
|
|
125
|
-
for (let c of params) {
|
|
126
|
-
if (c === '"' && i > 0 && params[i - 1] !== "\\") {
|
|
127
|
-
inQuotes = !inQuotes
|
|
128
|
-
}
|
|
129
|
-
if (c === "{" && !inQuotes) {
|
|
130
|
-
openCount++
|
|
131
|
-
if (openCount === 1) {
|
|
132
|
-
startIndex = i
|
|
133
|
-
}
|
|
134
|
-
} else if (c === "}" && !inQuotes) {
|
|
135
|
-
if (openCount === 1) {
|
|
136
|
-
queryParams.push(JSON.parse(params.substring(startIndex, i + 1)))
|
|
137
|
-
}
|
|
138
|
-
openCount--
|
|
139
|
-
}
|
|
140
|
-
i++
|
|
141
|
-
}
|
|
142
|
-
let group1 = queryParams[0] ?? {}
|
|
143
|
-
let group2 = queryParams[1] ?? {}
|
|
144
|
-
let group3 = queryParams[2] ?? {}
|
|
117
|
+
let queryParams = params.split(/(?<=}),[\n\s]*(?={)/g)
|
|
118
|
+
let group1 = queryParams[0] ? JSON.parse(queryParams[0]) : {}
|
|
119
|
+
let group2 = queryParams[1] ? JSON.parse(queryParams[1]) : {}
|
|
120
|
+
let group3 = queryParams[2] ? JSON.parse(queryParams[2]) : {}
|
|
145
121
|
if (mode === "update") {
|
|
146
122
|
return {
|
|
147
123
|
filter: group1,
|
|
@@ -200,10 +176,7 @@ module MongoDBModule {
|
|
|
200
176
|
return await collection.findOne(json)
|
|
201
177
|
}
|
|
202
178
|
case "findOneAndUpdate": {
|
|
203
|
-
|
|
204
|
-
json = this.parseQueryParams(query.json, "update")
|
|
205
|
-
}
|
|
206
|
-
let findAndUpdateJson = this.createObjectIds(json) as {
|
|
179
|
+
let findAndUpdateJson = json as {
|
|
207
180
|
filter: FilterQuery<any>
|
|
208
181
|
update: UpdateQuery<any>
|
|
209
182
|
options: FindOneAndUpdateOption<any>
|
|
@@ -17,10 +17,10 @@ import {
|
|
|
17
17
|
} from "./utils"
|
|
18
18
|
import dayjs from "dayjs"
|
|
19
19
|
const { NUMBER_REGEX } = require("../utilities")
|
|
20
|
-
import Sql from "./base/sql"
|
|
21
20
|
|
|
22
21
|
module MySQLModule {
|
|
23
22
|
const mysql = require("mysql2/promise")
|
|
23
|
+
const Sql = require("./base/sql")
|
|
24
24
|
|
|
25
25
|
interface MySQLConfig {
|
|
26
26
|
host: string
|
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
finaliseExternalTables,
|
|
15
15
|
SqlClient,
|
|
16
16
|
} from "./utils"
|
|
17
|
-
import Sql from "./base/sql"
|
|
18
17
|
|
|
19
18
|
module PostgresModule {
|
|
20
19
|
const { Client, types } = require("pg")
|
|
20
|
+
const Sql = require("./base/sql")
|
|
21
21
|
const { escapeDangerousCharacters } = require("../utilities")
|
|
22
22
|
|
|
23
23
|
// Return "date" and "timestamp" types as plain strings.
|
|
@@ -117,7 +117,6 @@ module PostgresModule {
|
|
|
117
117
|
private readonly client: any
|
|
118
118
|
private readonly config: PostgresConfig
|
|
119
119
|
private index: number = 1
|
|
120
|
-
private open: boolean
|
|
121
120
|
public tables: Record<string, Table> = {}
|
|
122
121
|
public schemaErrors: Record<string, string> = {}
|
|
123
122
|
|
|
@@ -102,222 +102,4 @@ describe("MongoDB Integration", () => {
|
|
|
102
102
|
expect(error).toBeDefined()
|
|
103
103
|
restore()
|
|
104
104
|
})
|
|
105
|
-
|
|
106
|
-
it("creates ObjectIds if the _id fields contains a match on ObjectId", async () => {
|
|
107
|
-
const query = {
|
|
108
|
-
json: {
|
|
109
|
-
filter: {
|
|
110
|
-
_id: "ObjectId('ACBD12345678ABCD12345678')",
|
|
111
|
-
name: "ObjectId('name')"
|
|
112
|
-
},
|
|
113
|
-
update: {
|
|
114
|
-
_id: "ObjectId('FFFF12345678ABCD12345678')",
|
|
115
|
-
name: "ObjectId('updatedName')",
|
|
116
|
-
},
|
|
117
|
-
options: {
|
|
118
|
-
upsert: false,
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
extra: { collection: "testCollection", actionTypes: "updateOne" },
|
|
122
|
-
}
|
|
123
|
-
await config.integration.update(query)
|
|
124
|
-
expect(config.integration.client.updateOne).toHaveBeenCalled()
|
|
125
|
-
|
|
126
|
-
const args = config.integration.client.updateOne.mock.calls[0]
|
|
127
|
-
expect(args[0]).toEqual({
|
|
128
|
-
_id: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
|
|
129
|
-
name: "ObjectId('name')",
|
|
130
|
-
})
|
|
131
|
-
expect(args[1]).toEqual({
|
|
132
|
-
_id: mongo.ObjectID.createFromHexString("FFFF12345678ABCD12345678"),
|
|
133
|
-
name: "ObjectId('updatedName')",
|
|
134
|
-
})
|
|
135
|
-
expect(args[2]).toEqual({
|
|
136
|
-
upsert: false
|
|
137
|
-
})
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
it("creates ObjectIds if the $ operator fields contains a match on ObjectId", async () => {
|
|
141
|
-
const query = {
|
|
142
|
-
json: {
|
|
143
|
-
filter: {
|
|
144
|
-
_id: {
|
|
145
|
-
$eq: "ObjectId('ACBD12345678ABCD12345678')",
|
|
146
|
-
}
|
|
147
|
-
},
|
|
148
|
-
update: {
|
|
149
|
-
$set: {
|
|
150
|
-
_id: "ObjectId('FFFF12345678ABCD12345678')",
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
options: {
|
|
154
|
-
upsert: true,
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
extra: { collection: "testCollection", actionTypes: "updateOne" },
|
|
158
|
-
}
|
|
159
|
-
await config.integration.update(query)
|
|
160
|
-
expect(config.integration.client.updateOne).toHaveBeenCalled()
|
|
161
|
-
|
|
162
|
-
const args = config.integration.client.updateOne.mock.calls[0]
|
|
163
|
-
expect(args[0]).toEqual({
|
|
164
|
-
_id: {
|
|
165
|
-
$eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
|
|
166
|
-
}
|
|
167
|
-
})
|
|
168
|
-
expect(args[1]).toEqual({
|
|
169
|
-
$set: {
|
|
170
|
-
_id: mongo.ObjectID.createFromHexString("FFFF12345678ABCD12345678"),
|
|
171
|
-
}
|
|
172
|
-
})
|
|
173
|
-
expect(args[2]).toEqual({
|
|
174
|
-
upsert: true
|
|
175
|
-
})
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
it("supports findOneAndUpdate", async () => {
|
|
179
|
-
const query = {
|
|
180
|
-
json: {
|
|
181
|
-
filter: {
|
|
182
|
-
_id: {
|
|
183
|
-
$eq: "ObjectId('ACBD12345678ABCD12345678')",
|
|
184
|
-
}
|
|
185
|
-
},
|
|
186
|
-
update: {
|
|
187
|
-
$set: {
|
|
188
|
-
name: "UPDATED",
|
|
189
|
-
age: 99
|
|
190
|
-
},
|
|
191
|
-
},
|
|
192
|
-
options: {
|
|
193
|
-
upsert: false,
|
|
194
|
-
},
|
|
195
|
-
},
|
|
196
|
-
extra: { collection: "testCollection", actionTypes: "findOneAndUpdate" },
|
|
197
|
-
}
|
|
198
|
-
await config.integration.read(query)
|
|
199
|
-
expect(config.integration.client.findOneAndUpdate).toHaveBeenCalled()
|
|
200
|
-
|
|
201
|
-
const args = config.integration.client.findOneAndUpdate.mock.calls[0]
|
|
202
|
-
expect(args[0]).toEqual({
|
|
203
|
-
_id: {
|
|
204
|
-
$eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
|
|
205
|
-
}
|
|
206
|
-
})
|
|
207
|
-
expect(args[1]).toEqual({
|
|
208
|
-
$set: {
|
|
209
|
-
name: "UPDATED",
|
|
210
|
-
age: 99
|
|
211
|
-
}
|
|
212
|
-
})
|
|
213
|
-
expect(args[2]).toEqual({
|
|
214
|
-
upsert: false
|
|
215
|
-
})
|
|
216
|
-
})
|
|
217
|
-
|
|
218
|
-
it("can parse nested objects with arrays", async () => {
|
|
219
|
-
const query = {
|
|
220
|
-
json: `{
|
|
221
|
-
"_id": {
|
|
222
|
-
"$eq": "ObjectId('ACBD12345678ABCD12345678')"
|
|
223
|
-
}
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
"$set": {
|
|
227
|
-
"value": {
|
|
228
|
-
"data": [
|
|
229
|
-
{ "cid": 1 },
|
|
230
|
-
{ "cid": 2 },
|
|
231
|
-
{ "nested": {
|
|
232
|
-
"name": "test"
|
|
233
|
-
}}
|
|
234
|
-
]
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
"upsert": true
|
|
240
|
-
}`,
|
|
241
|
-
extra: { collection: "testCollection", actionTypes: "updateOne" },
|
|
242
|
-
}
|
|
243
|
-
await config.integration.update(query)
|
|
244
|
-
expect(config.integration.client.updateOne).toHaveBeenCalled()
|
|
245
|
-
|
|
246
|
-
const args = config.integration.client.updateOne.mock.calls[0]
|
|
247
|
-
expect(args[0]).toEqual({
|
|
248
|
-
_id: {
|
|
249
|
-
$eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
|
|
250
|
-
}
|
|
251
|
-
})
|
|
252
|
-
expect(args[1]).toEqual({
|
|
253
|
-
$set: {
|
|
254
|
-
value: {
|
|
255
|
-
data: [
|
|
256
|
-
{ cid: 1 },
|
|
257
|
-
{ cid: 2 },
|
|
258
|
-
{ nested: {
|
|
259
|
-
name: "test"
|
|
260
|
-
}}
|
|
261
|
-
]
|
|
262
|
-
},
|
|
263
|
-
},
|
|
264
|
-
})
|
|
265
|
-
expect(args[2]).toEqual({
|
|
266
|
-
upsert: true
|
|
267
|
-
})
|
|
268
|
-
})
|
|
269
|
-
|
|
270
|
-
it("ignores braces within strings when parsing nested objects", async () => {
|
|
271
|
-
const query = {
|
|
272
|
-
json: `{
|
|
273
|
-
"_id": {
|
|
274
|
-
"$eq": "ObjectId('ACBD12345678ABCD12345678')"
|
|
275
|
-
}
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
"$set": {
|
|
279
|
-
"value": {
|
|
280
|
-
"data": [
|
|
281
|
-
{ "cid": 1 },
|
|
282
|
-
{ "cid": 2 },
|
|
283
|
-
{ "nested": {
|
|
284
|
-
"name": "te}st"
|
|
285
|
-
}}
|
|
286
|
-
]
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
},
|
|
290
|
-
{
|
|
291
|
-
"upsert": true,
|
|
292
|
-
"extra": "ad\\"{\\"d"
|
|
293
|
-
}`,
|
|
294
|
-
extra: { collection: "testCollection", actionTypes: "updateOne" },
|
|
295
|
-
}
|
|
296
|
-
await config.integration.update(query)
|
|
297
|
-
expect(config.integration.client.updateOne).toHaveBeenCalled()
|
|
298
|
-
|
|
299
|
-
const args = config.integration.client.updateOne.mock.calls[0]
|
|
300
|
-
expect(args[0]).toEqual({
|
|
301
|
-
_id: {
|
|
302
|
-
$eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
|
|
303
|
-
}
|
|
304
|
-
})
|
|
305
|
-
expect(args[1]).toEqual({
|
|
306
|
-
$set: {
|
|
307
|
-
value: {
|
|
308
|
-
data: [
|
|
309
|
-
{ cid: 1 },
|
|
310
|
-
{ cid: 2 },
|
|
311
|
-
{ nested: {
|
|
312
|
-
name: "te}st"
|
|
313
|
-
}}
|
|
314
|
-
]
|
|
315
|
-
},
|
|
316
|
-
},
|
|
317
|
-
})
|
|
318
|
-
expect(args[2]).toEqual({
|
|
319
|
-
upsert: true,
|
|
320
|
-
extra: "ad\"{\"d"
|
|
321
|
-
})
|
|
322
|
-
})
|
|
323
105
|
})
|