@budibase/server 1.1.22-alpha.2 → 1.1.24
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/builder/assets/{index.b92b1be9.css → index.05b4ef33.css} +2 -2
- package/builder/assets/index.723c86d8.js +979 -0
- package/builder/assets/{vendor.b0c43a06.js → vendor.7f11b0ca.js} +1 -1
- package/builder/index.html +3 -3
- package/coverage/clover.xml +149 -158
- package/coverage/coverage-final.json +1 -1
- 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 +18 -18
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +49 -94
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
- 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 +1 -1
- 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 +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- 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 +1 -1
- 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 +1 -1
- package/coverage/lcov-report/db/utils.js.html +1 -1
- 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 +18 -18
- 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/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +1 -1
- package/coverage/lcov-report/threads/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 +1 -1
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +288 -307
- package/dist/api/controllers/row/internalSearch.js +16 -30
- package/dist/integrations/base/sql.js +14 -43
- package/dist/package.json +8 -8
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +5 -7
- package/package.json +9 -9
- package/src/api/controllers/row/internalSearch.js +20 -35
- package/src/definitions/datasource.ts +0 -3
- package/src/integrations/base/sql.ts +13 -44
- package/src/integrations/tests/sql.spec.js +4 -50
- package/src/utilities/fileSystem/index.js +6 -12
- package/builder/assets/index.e41e4c66.js +0 -979
|
@@ -99,21 +99,18 @@ exports.apiFileReturn = contents => {
|
|
|
99
99
|
return fs.createReadStream(path);
|
|
100
100
|
};
|
|
101
101
|
exports.defineFilter = excludeRows => {
|
|
102
|
+
const ids = [USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX];
|
|
102
103
|
if (excludeRows) {
|
|
103
|
-
|
|
104
|
-
doc._id.includes(LINK_USER_METADATA_PREFIX) ||
|
|
105
|
-
doc._id.includes(TABLE_ROW_PREFIX));
|
|
106
|
-
}
|
|
107
|
-
else if (!excludeRows) {
|
|
108
|
-
return doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
|
|
109
|
-
doc._id.includes(LINK_USER_METADATA_PREFIX));
|
|
104
|
+
ids.push(TABLE_ROW_PREFIX);
|
|
110
105
|
}
|
|
106
|
+
return doc => !ids.map(key => doc._id.includes(key)).reduce((prev, curr) => prev || curr);
|
|
111
107
|
};
|
|
112
108
|
/**
|
|
113
109
|
* Local utility to back up the database state for an app, excluding global user
|
|
114
110
|
* data or user relationships.
|
|
115
111
|
* @param {string} appId The app to backup
|
|
116
112
|
* @param {object} config Config to send to export DB
|
|
113
|
+
* @param {boolean} includeRows Flag to state whether the export should include data.
|
|
117
114
|
* @returns {*} either a string or a stream of the backup
|
|
118
115
|
*/
|
|
119
116
|
const backupAppData = (appId, config, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -131,6 +128,7 @@ exports.performBackup = (appId, backupName) => __awaiter(void 0, void 0, void 0,
|
|
|
131
128
|
/**
|
|
132
129
|
* Streams a backup of the database state for an app
|
|
133
130
|
* @param {string} appId The ID of the app which is to be backed up.
|
|
131
|
+
* @param {boolean} includeRows Flag to state whether the export should include data.
|
|
134
132
|
* @returns {*} a readable stream of the backup which is written in real time
|
|
135
133
|
*/
|
|
136
134
|
exports.streamBackup = (appId, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.24",
|
|
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.1.
|
|
81
|
-
"@budibase/client": "^1.1.
|
|
82
|
-
"@budibase/pro": "1.1.
|
|
83
|
-
"@budibase/string-templates": "^1.1.
|
|
84
|
-
"@budibase/types": "^1.1.
|
|
80
|
+
"@budibase/backend-core": "^1.1.24",
|
|
81
|
+
"@budibase/client": "^1.1.24",
|
|
82
|
+
"@budibase/pro": "1.1.23",
|
|
83
|
+
"@budibase/string-templates": "^1.1.24",
|
|
84
|
+
"@budibase/types": "^1.1.24",
|
|
85
85
|
"@bull-board/api": "3.7.0",
|
|
86
86
|
"@bull-board/koa": "3.9.4",
|
|
87
87
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"koa-send": "5.0.0",
|
|
119
119
|
"koa-session": "5.12.0",
|
|
120
120
|
"koa-static": "5.0.0",
|
|
121
|
-
"koa2-ratelimit": "1.1.
|
|
121
|
+
"koa2-ratelimit": "1.1.0",
|
|
122
122
|
"lodash": "4.17.21",
|
|
123
123
|
"memorystream": "0.3.1",
|
|
124
124
|
"mongodb": "3.6.3",
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
"redis": "4",
|
|
138
138
|
"server-destroy": "1.0.1",
|
|
139
139
|
"snowflake-promise": "^4.5.0",
|
|
140
|
-
"svelte": "3.
|
|
140
|
+
"svelte": "3.44.1",
|
|
141
141
|
"swagger-parser": "10.0.3",
|
|
142
142
|
"to-json-schema": "0.2.5",
|
|
143
143
|
"uuid": "3.3.2",
|
|
@@ -195,5 +195,5 @@
|
|
|
195
195
|
"optionalDependencies": {
|
|
196
196
|
"oracledb": "5.3.0"
|
|
197
197
|
},
|
|
198
|
-
"gitHead": "
|
|
198
|
+
"gitHead": "3ef86c5df9276a23c5db4ec0b8780733228de982"
|
|
199
199
|
}
|
|
@@ -19,7 +19,6 @@ class QueryBuilder {
|
|
|
19
19
|
empty: {},
|
|
20
20
|
notEmpty: {},
|
|
21
21
|
oneOf: {},
|
|
22
|
-
contains: {},
|
|
23
22
|
...base,
|
|
24
23
|
}
|
|
25
24
|
this.limit = 50
|
|
@@ -120,11 +119,6 @@ class QueryBuilder {
|
|
|
120
119
|
return this
|
|
121
120
|
}
|
|
122
121
|
|
|
123
|
-
addContains(key, value) {
|
|
124
|
-
this.query.contains[key] = value
|
|
125
|
-
return this
|
|
126
|
-
}
|
|
127
|
-
|
|
128
122
|
/**
|
|
129
123
|
* Preprocesses a value before going into a lucene search.
|
|
130
124
|
* Transforms strings to lowercase and wraps strings and bools in quotes.
|
|
@@ -170,31 +164,6 @@ class QueryBuilder {
|
|
|
170
164
|
return `${key}:${builder.preprocess(value, allPreProcessingOpts)}`
|
|
171
165
|
}
|
|
172
166
|
|
|
173
|
-
const contains = (key, value) => {
|
|
174
|
-
if (!value && value !== 0) {
|
|
175
|
-
return null
|
|
176
|
-
}
|
|
177
|
-
return `${key}:${builder.preprocess(value, { escape: true })}`
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const oneOf = (key, value) => {
|
|
181
|
-
if (!Array.isArray(value)) {
|
|
182
|
-
if (typeof value === "string") {
|
|
183
|
-
value = value.split(",")
|
|
184
|
-
} else {
|
|
185
|
-
return ""
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
let orStatement = `${builder.preprocess(value[0], allPreProcessingOpts)}`
|
|
189
|
-
for (let i = 1; i < value.length; i++) {
|
|
190
|
-
orStatement += ` OR ${builder.preprocess(
|
|
191
|
-
value[i],
|
|
192
|
-
allPreProcessingOpts
|
|
193
|
-
)}`
|
|
194
|
-
}
|
|
195
|
-
return `${key}:(${orStatement})`
|
|
196
|
-
}
|
|
197
|
-
|
|
198
167
|
function build(structure, queryFn) {
|
|
199
168
|
for (let [key, value] of Object.entries(structure)) {
|
|
200
169
|
key = builder.preprocess(key.replace(/ /g, "_"), {
|
|
@@ -270,10 +239,26 @@ class QueryBuilder {
|
|
|
270
239
|
build(this.query.notEmpty, key => `${key}:["" TO *]`)
|
|
271
240
|
}
|
|
272
241
|
if (this.query.oneOf) {
|
|
273
|
-
build(this.query.oneOf,
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
242
|
+
build(this.query.oneOf, (key, value) => {
|
|
243
|
+
if (!Array.isArray(value)) {
|
|
244
|
+
if (typeof value === "string") {
|
|
245
|
+
value = value.split(",")
|
|
246
|
+
} else {
|
|
247
|
+
return ""
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
let orStatement = `${builder.preprocess(
|
|
251
|
+
value[0],
|
|
252
|
+
allPreProcessingOpts
|
|
253
|
+
)}`
|
|
254
|
+
for (let i = 1; i < value.length; i++) {
|
|
255
|
+
orStatement += ` OR ${builder.preprocess(
|
|
256
|
+
value[i],
|
|
257
|
+
allPreProcessingOpts
|
|
258
|
+
)}`
|
|
259
|
+
}
|
|
260
|
+
return `${key}:(${orStatement})`
|
|
261
|
+
})
|
|
277
262
|
}
|
|
278
263
|
// make sure table ID is always added as an AND
|
|
279
264
|
if (tableId) {
|
|
@@ -142,21 +142,6 @@ class InternalBuilder {
|
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
-
|
|
146
|
-
const like = (key: string, value: any) => {
|
|
147
|
-
const fnc = allOr ? "orWhere" : "where"
|
|
148
|
-
// postgres supports ilike, nothing else does
|
|
149
|
-
if (this.client === SqlClients.POSTGRES) {
|
|
150
|
-
query = query[fnc](key, "ilike", `%${value}%`)
|
|
151
|
-
} else {
|
|
152
|
-
const rawFnc = `${fnc}Raw`
|
|
153
|
-
// @ts-ignore
|
|
154
|
-
query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
|
|
155
|
-
`%${value}%`,
|
|
156
|
-
])
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
145
|
if (!filters) {
|
|
161
146
|
return query
|
|
162
147
|
}
|
|
@@ -183,7 +168,19 @@ class InternalBuilder {
|
|
|
183
168
|
})
|
|
184
169
|
}
|
|
185
170
|
if (filters.fuzzy) {
|
|
186
|
-
iterate(filters.fuzzy,
|
|
171
|
+
iterate(filters.fuzzy, (key, value) => {
|
|
172
|
+
const fnc = allOr ? "orWhere" : "where"
|
|
173
|
+
// postgres supports ilike, nothing else does
|
|
174
|
+
if (this.client === SqlClients.POSTGRES) {
|
|
175
|
+
query = query[fnc](key, "ilike", `%${value}%`)
|
|
176
|
+
} else {
|
|
177
|
+
const rawFnc = `${fnc}Raw`
|
|
178
|
+
// @ts-ignore
|
|
179
|
+
query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
|
|
180
|
+
`%${value}%`,
|
|
181
|
+
])
|
|
182
|
+
}
|
|
183
|
+
})
|
|
187
184
|
}
|
|
188
185
|
if (filters.range) {
|
|
189
186
|
iterate(filters.range, (key, value) => {
|
|
@@ -226,34 +223,6 @@ class InternalBuilder {
|
|
|
226
223
|
query = query[fnc](key)
|
|
227
224
|
})
|
|
228
225
|
}
|
|
229
|
-
if (filters.contains) {
|
|
230
|
-
const fnc = allOr ? "orWhere" : "where"
|
|
231
|
-
const rawFnc = `${fnc}Raw`
|
|
232
|
-
if (this.client === SqlClients.POSTGRES) {
|
|
233
|
-
iterate(filters.contains, (key: string, value: any) => {
|
|
234
|
-
const fieldNames = key.split(/\./g)
|
|
235
|
-
const tableName = fieldNames[0]
|
|
236
|
-
const columnName = fieldNames[1]
|
|
237
|
-
if (typeof value === "string") {
|
|
238
|
-
value = `"${value}"`
|
|
239
|
-
}
|
|
240
|
-
// @ts-ignore
|
|
241
|
-
query = query[rawFnc](
|
|
242
|
-
`"${tableName}"."${columnName}"::jsonb @> '[${value}]'`
|
|
243
|
-
)
|
|
244
|
-
})
|
|
245
|
-
} else if (this.client === SqlClients.MY_SQL) {
|
|
246
|
-
iterate(filters.contains, (key: string, value: any) => {
|
|
247
|
-
if (typeof value === "string") {
|
|
248
|
-
value = `"${value}"`
|
|
249
|
-
}
|
|
250
|
-
// @ts-ignore
|
|
251
|
-
query = query[rawFnc](`JSON_CONTAINS(${key}, '${value}')`)
|
|
252
|
-
})
|
|
253
|
-
} else {
|
|
254
|
-
iterate(filters.contains, like)
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
226
|
return query
|
|
258
227
|
}
|
|
259
228
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
const Sql = require("../base/sql")
|
|
2
|
-
const { SqlClients } = require("../utils")
|
|
3
2
|
|
|
4
3
|
const TABLE_NAME = "test"
|
|
5
4
|
|
|
@@ -47,7 +46,7 @@ function generateDeleteJson(table = TABLE_NAME, filters = {}) {
|
|
|
47
46
|
|
|
48
47
|
describe("SQL query builder", () => {
|
|
49
48
|
const limit = 500
|
|
50
|
-
const client =
|
|
49
|
+
const client = "pg"
|
|
51
50
|
let sql
|
|
52
51
|
|
|
53
52
|
beforeEach(() => {
|
|
@@ -174,15 +173,15 @@ describe("SQL query builder", () => {
|
|
|
174
173
|
})
|
|
175
174
|
|
|
176
175
|
it("should work with MS-SQL", () => {
|
|
177
|
-
const query = new Sql(
|
|
176
|
+
const query = new Sql("mssql", 10)._query(generateReadJson())
|
|
178
177
|
expect(query).toEqual({
|
|
179
178
|
bindings: [10],
|
|
180
179
|
sql: `select * from (select top (@p0) * from [${TABLE_NAME}]) as [${TABLE_NAME}]`
|
|
181
180
|
})
|
|
182
181
|
})
|
|
183
182
|
|
|
184
|
-
it("should work with
|
|
185
|
-
const query = new Sql(
|
|
183
|
+
it("should work with mySQL", () => {
|
|
184
|
+
const query = new Sql("mysql", 10)._query(generateReadJson())
|
|
186
185
|
expect(query).toEqual({
|
|
187
186
|
bindings: [10],
|
|
188
187
|
sql: `select * from (select * from \`${TABLE_NAME}\` limit ?) as \`${TABLE_NAME}\``
|
|
@@ -239,49 +238,4 @@ describe("SQL query builder", () => {
|
|
|
239
238
|
sql: `select * from (select * from "${TABLE_NAME}" where "${TABLE_NAME}"."property" > $1 limit $2) as "${TABLE_NAME}"`
|
|
240
239
|
})
|
|
241
240
|
})
|
|
242
|
-
|
|
243
|
-
it("should use like expression for MS-SQL when filter is contains", () => {
|
|
244
|
-
const query = new Sql(SqlClients.MS_SQL, 10)._query(generateReadJson({
|
|
245
|
-
filters: {
|
|
246
|
-
contains: {
|
|
247
|
-
age: 20,
|
|
248
|
-
name: "John"
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}))
|
|
252
|
-
expect(query).toEqual({
|
|
253
|
-
bindings: [10, "%20%", "%John%"],
|
|
254
|
-
sql: `select * from (select top (@p0) * from [${TABLE_NAME}] where LOWER(${TABLE_NAME}.age) LIKE @p1 and LOWER(${TABLE_NAME}.name) LIKE @p2) as [${TABLE_NAME}]`
|
|
255
|
-
})
|
|
256
|
-
})
|
|
257
|
-
|
|
258
|
-
it("should use JSON_CONTAINS expression for MySQL when filter is contains", () => {
|
|
259
|
-
const query = new Sql(SqlClients.MY_SQL, 10)._query(generateReadJson({
|
|
260
|
-
filters: {
|
|
261
|
-
contains: {
|
|
262
|
-
age: 20,
|
|
263
|
-
name: "John"
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}))
|
|
267
|
-
expect(query).toEqual({
|
|
268
|
-
bindings: [10],
|
|
269
|
-
sql: `select * from (select * from \`${TABLE_NAME}\` where JSON_CONTAINS(${TABLE_NAME}.age, '20') and JSON_CONTAINS(${TABLE_NAME}.name, '"John"') limit ?) as \`${TABLE_NAME}\``
|
|
270
|
-
})
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
it("should use jsonb operator expression for PostgreSQL when filter is contains", () => {
|
|
274
|
-
const query = new Sql(SqlClients.POSTGRES, 10)._query(generateReadJson({
|
|
275
|
-
filters: {
|
|
276
|
-
contains: {
|
|
277
|
-
age: 20,
|
|
278
|
-
name: "John"
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}))
|
|
282
|
-
expect(query).toEqual({
|
|
283
|
-
bindings: [10],
|
|
284
|
-
sql: `select * from (select * from \"${TABLE_NAME}\" where \"${TABLE_NAME}\".\"age\"::jsonb @> '[20]' and \"${TABLE_NAME}\".\"name\"::jsonb @> '["John"]' limit $1) as \"${TABLE_NAME}\"`
|
|
285
|
-
})
|
|
286
|
-
})
|
|
287
241
|
})
|
|
@@ -111,20 +111,12 @@ exports.apiFileReturn = contents => {
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
exports.defineFilter = excludeRows => {
|
|
114
|
+
const ids = [USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX]
|
|
114
115
|
if (excludeRows) {
|
|
115
|
-
|
|
116
|
-
!(
|
|
117
|
-
doc._id.includes(USER_METDATA_PREFIX) ||
|
|
118
|
-
doc._id.includes(LINK_USER_METADATA_PREFIX) ||
|
|
119
|
-
doc._id.includes(TABLE_ROW_PREFIX)
|
|
120
|
-
)
|
|
121
|
-
} else if (!excludeRows) {
|
|
122
|
-
return doc =>
|
|
123
|
-
!(
|
|
124
|
-
doc._id.includes(USER_METDATA_PREFIX) ||
|
|
125
|
-
doc._id.includes(LINK_USER_METADATA_PREFIX)
|
|
126
|
-
)
|
|
116
|
+
ids.push(TABLE_ROW_PREFIX)
|
|
127
117
|
}
|
|
118
|
+
return doc =>
|
|
119
|
+
!ids.map(key => doc._id.includes(key)).reduce((prev, curr) => prev || curr)
|
|
128
120
|
}
|
|
129
121
|
|
|
130
122
|
/**
|
|
@@ -132,6 +124,7 @@ exports.defineFilter = excludeRows => {
|
|
|
132
124
|
* data or user relationships.
|
|
133
125
|
* @param {string} appId The app to backup
|
|
134
126
|
* @param {object} config Config to send to export DB
|
|
127
|
+
* @param {boolean} includeRows Flag to state whether the export should include data.
|
|
135
128
|
* @returns {*} either a string or a stream of the backup
|
|
136
129
|
*/
|
|
137
130
|
const backupAppData = async (appId, config, includeRows) => {
|
|
@@ -154,6 +147,7 @@ exports.performBackup = async (appId, backupName) => {
|
|
|
154
147
|
/**
|
|
155
148
|
* Streams a backup of the database state for an app
|
|
156
149
|
* @param {string} appId The ID of the app which is to be backed up.
|
|
150
|
+
* @param {boolean} includeRows Flag to state whether the export should include data.
|
|
157
151
|
* @returns {*} a readable stream of the backup which is written in real time
|
|
158
152
|
*/
|
|
159
153
|
exports.streamBackup = async (appId, includeRows) => {
|