@budibase/server 1.0.79-alpha.8 → 1.0.80-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mocks__/mysql2/promise.ts +17 -0
- package/builder/assets/{index.d0476387.js → index.b37e0ebb.js} +84 -84
- package/builder/assets/{vendor.6b00a24f.js → vendor.a7c6ad0a.js} +1 -1
- package/builder/index.html +2 -2
- package/coverage/clover.xml +2 -2
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/application.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/index.js.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 +1 -1
- package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- 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/table/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/utils.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/application.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/index.js.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/row.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/static.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/createRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/deleteRow.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/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/automations/utils.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/client.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 +1 -1
- 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/authorized.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/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.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/index.js.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/bcrypt.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/index.js.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/dist/api/routes/public/index.js +33 -0
- package/dist/environment.js +1 -0
- package/dist/integrations/mysql.js +71 -56
- package/dist/integrations/utils.js +1 -1
- package/dist/package.json +7 -7
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/routes/public/index.ts +36 -0
- package/src/environment.js +1 -0
- package/src/integrations/mysql.ts +79 -70
- package/src/integrations/tests/mysql.spec.js +4 -4
- package/src/integrations/utils.ts +1 -1
- package/scripts/proxy/generateProxyConfig.js +0 -70
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.80-alpha.0",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -21,9 +21,6 @@
|
|
|
21
21
|
"dev:stack:down": "node scripts/dev/manage.js down",
|
|
22
22
|
"dev:stack:nuke": "node scripts/dev/manage.js nuke",
|
|
23
23
|
"dev:builder": "yarn run dev:stack:up && nodemon",
|
|
24
|
-
"generate:proxy:compose": "node scripts/proxy/generateProxyConfig compose",
|
|
25
|
-
"generate:proxy:preprod": "node scripts/proxy/generateProxyConfig preprod",
|
|
26
|
-
"generate:proxy:prod": "node scripts/proxy/generateProxyConfig prod",
|
|
27
24
|
"format": "prettier --config ../../.prettierrc.json 'src/**/*.ts' --write",
|
|
28
25
|
"specs": "node specs/generate.js && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
|
|
29
26
|
"lint": "eslint --fix src/",
|
|
@@ -74,9 +71,9 @@
|
|
|
74
71
|
"license": "GPL-3.0",
|
|
75
72
|
"dependencies": {
|
|
76
73
|
"@apidevtools/swagger-parser": "^10.0.3",
|
|
77
|
-
"@budibase/backend-core": "^1.0.
|
|
78
|
-
"@budibase/client": "^1.0.
|
|
79
|
-
"@budibase/string-templates": "^1.0.
|
|
74
|
+
"@budibase/backend-core": "^1.0.80-alpha.0",
|
|
75
|
+
"@budibase/client": "^1.0.80-alpha.0",
|
|
76
|
+
"@budibase/string-templates": "^1.0.80-alpha.0",
|
|
80
77
|
"@bull-board/api": "^3.7.0",
|
|
81
78
|
"@bull-board/koa": "^3.7.0",
|
|
82
79
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -111,6 +108,7 @@
|
|
|
111
108
|
"koa-send": "5.0.0",
|
|
112
109
|
"koa-session": "5.12.0",
|
|
113
110
|
"koa-static": "5.0.0",
|
|
111
|
+
"koa2-ratelimit": "^1.1.0",
|
|
114
112
|
"lodash": "4.17.21",
|
|
115
113
|
"memorystream": "^0.3.1",
|
|
116
114
|
"mongodb": "3.6.3",
|
|
@@ -126,6 +124,7 @@
|
|
|
126
124
|
"pouchdb-all-dbs": "1.0.2",
|
|
127
125
|
"pouchdb-find": "^7.2.2",
|
|
128
126
|
"pouchdb-replication-stream": "1.2.9",
|
|
127
|
+
"redis": "4",
|
|
129
128
|
"server-destroy": "1.0.1",
|
|
130
129
|
"svelte": "^3.38.2",
|
|
131
130
|
"swagger-parser": "^10.0.3",
|
|
@@ -151,6 +150,7 @@
|
|
|
151
150
|
"@types/koa-router": "^7.4.2",
|
|
152
151
|
"@types/node": "^15.12.4",
|
|
153
152
|
"@types/oracledb": "^5.2.1",
|
|
153
|
+
"@types/redis": "^4.0.11",
|
|
154
154
|
"@typescript-eslint/parser": "4.28.0",
|
|
155
155
|
"apidoc": "^0.50.2",
|
|
156
156
|
"babel-jest": "^27.0.2",
|
|
@@ -175,5 +175,5 @@
|
|
|
175
175
|
"optionalDependencies": {
|
|
176
176
|
"oracledb": "^5.3.0"
|
|
177
177
|
},
|
|
178
|
-
"gitHead": "
|
|
178
|
+
"gitHead": "d328728978edf01385904c8cfa3a53294e112647"
|
|
179
179
|
}
|
|
@@ -58,7 +58,7 @@ module External {
|
|
|
58
58
|
) {
|
|
59
59
|
const primary = table.primary
|
|
60
60
|
// if passed in array need to copy for shifting etc
|
|
61
|
-
let idCopy = cloneDeep(id)
|
|
61
|
+
let idCopy: undefined | string | any[] = cloneDeep(id)
|
|
62
62
|
if (filters) {
|
|
63
63
|
// need to map over the filters and make sure the _id field isn't present
|
|
64
64
|
for (let filter of Object.values(filters)) {
|
|
@@ -8,18 +8,54 @@ import authorized from "../../../middleware/authorized"
|
|
|
8
8
|
import { paramResource, paramSubResource } from "../../../middleware/resourceId"
|
|
9
9
|
import { CtxFn } from "./utils/Endpoint"
|
|
10
10
|
import mapperMiddleware from "./middleware/mapper"
|
|
11
|
+
import env from "../../../environment"
|
|
12
|
+
// below imports don't have declaration files
|
|
11
13
|
const Router = require("@koa/router")
|
|
14
|
+
const { RateLimit, Stores } = require("koa2-ratelimit")
|
|
12
15
|
const {
|
|
13
16
|
PermissionLevels,
|
|
14
17
|
PermissionTypes,
|
|
15
18
|
} = require("@budibase/backend-core/permissions")
|
|
19
|
+
const { getRedisOptions } = require("@budibase/backend-core/redis").utils
|
|
16
20
|
|
|
17
21
|
const PREFIX = "/api/public/v1"
|
|
22
|
+
// allow a lot more requests when in test
|
|
23
|
+
const DEFAULT_API_REQ_LIMIT_PER_SEC = env.isTest() ? 100 : 10
|
|
24
|
+
|
|
25
|
+
function getApiLimitPerSecond(): number {
|
|
26
|
+
if (!env.API_REQ_LIMIT_PER_SEC) {
|
|
27
|
+
return DEFAULT_API_REQ_LIMIT_PER_SEC
|
|
28
|
+
}
|
|
29
|
+
return parseInt(env.API_REQ_LIMIT_PER_SEC)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (!env.isTest()) {
|
|
33
|
+
const REDIS_OPTS = getRedisOptions()
|
|
34
|
+
RateLimit.defaultOptions({
|
|
35
|
+
store: new Stores.Redis({
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
socket: {
|
|
38
|
+
host: REDIS_OPTS.host,
|
|
39
|
+
port: REDIS_OPTS.port,
|
|
40
|
+
},
|
|
41
|
+
password: REDIS_OPTS.opts.password,
|
|
42
|
+
database: 1,
|
|
43
|
+
}),
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
// rate limiting, allows for 2 requests per second
|
|
47
|
+
const limiter = RateLimit.middleware({
|
|
48
|
+
interval: { sec: 1 },
|
|
49
|
+
// per ip, per interval
|
|
50
|
+
max: getApiLimitPerSecond(),
|
|
51
|
+
})
|
|
18
52
|
|
|
19
53
|
const publicRouter = new Router({
|
|
20
54
|
prefix: PREFIX,
|
|
21
55
|
})
|
|
22
56
|
|
|
57
|
+
publicRouter.use(limiter)
|
|
58
|
+
|
|
23
59
|
function addMiddleware(
|
|
24
60
|
endpoints: any,
|
|
25
61
|
middleware: CtxFn,
|
package/src/environment.js
CHANGED
|
@@ -45,6 +45,7 @@ module.exports = {
|
|
|
45
45
|
INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
|
|
46
46
|
MULTI_TENANCY: process.env.MULTI_TENANCY,
|
|
47
47
|
HTTP_MIGRATIONS: process.env.HTTP_MIGRATIONS,
|
|
48
|
+
API_REQ_LIMIT_PER_SEC: process.env.API_REQ_LIMIT_PER_SEC,
|
|
48
49
|
// environment
|
|
49
50
|
NODE_ENV: process.env.NODE_ENV,
|
|
50
51
|
JEST_WORKER_ID: process.env.JEST_WORKER_ID,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
import { DatasourcePlus } from "./base/datasourcePlus"
|
|
17
17
|
|
|
18
18
|
module MySQLModule {
|
|
19
|
-
const mysql = require("mysql2")
|
|
19
|
+
const mysql = require("mysql2/promise")
|
|
20
20
|
const Sql = require("./base/sql")
|
|
21
21
|
|
|
22
22
|
interface MySQLConfig {
|
|
@@ -29,7 +29,7 @@ module MySQLModule {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const SCHEMA: Integration = {
|
|
32
|
-
docs: "https://github.com/
|
|
32
|
+
docs: "https://github.com/sidorares/node-mysql2",
|
|
33
33
|
plus: true,
|
|
34
34
|
friendlyName: "MySQL",
|
|
35
35
|
description:
|
|
@@ -82,7 +82,7 @@ module MySQLModule {
|
|
|
82
82
|
|
|
83
83
|
class MySQLIntegration extends Sql implements DatasourcePlus {
|
|
84
84
|
private config: MySQLConfig
|
|
85
|
-
private
|
|
85
|
+
private client: any
|
|
86
86
|
public tables: Record<string, Table> = {}
|
|
87
87
|
public schemaErrors: Record<string, string> = {}
|
|
88
88
|
|
|
@@ -92,92 +92,99 @@ module MySQLModule {
|
|
|
92
92
|
if (config.ssl && Object.keys(config.ssl).length === 0) {
|
|
93
93
|
delete config.ssl
|
|
94
94
|
}
|
|
95
|
-
this.
|
|
95
|
+
this.config = config
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
getBindingIdentifier(): string {
|
|
99
99
|
return "?"
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
async connect() {
|
|
103
|
+
this.client = await mysql.createConnection(this.config)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async disconnect() {
|
|
107
|
+
await this.client.end()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async internalQuery(
|
|
103
111
|
query: SqlQuery,
|
|
104
112
|
connect: boolean = true
|
|
105
113
|
): Promise<any[] | any> {
|
|
106
|
-
|
|
107
|
-
// Node MySQL is callback based, so we must wrap our call in a promise
|
|
108
|
-
return new Promise((resolve, reject) => {
|
|
114
|
+
try {
|
|
109
115
|
if (connect) {
|
|
110
|
-
|
|
116
|
+
await this.connect()
|
|
111
117
|
}
|
|
112
|
-
|
|
118
|
+
// Node MySQL is callback based, so we must wrap our call in a promise
|
|
119
|
+
const response = await this.client.query(
|
|
113
120
|
query.sql,
|
|
114
|
-
query.bindings ||
|
|
115
|
-
(error: any, results: object[]) => {
|
|
116
|
-
if (error) {
|
|
117
|
-
reject(error)
|
|
118
|
-
} else {
|
|
119
|
-
resolve(results)
|
|
120
|
-
}
|
|
121
|
-
if (connect) {
|
|
122
|
-
client.end()
|
|
123
|
-
}
|
|
124
|
-
}
|
|
121
|
+
query.bindings || []
|
|
125
122
|
)
|
|
126
|
-
|
|
123
|
+
return response[0]
|
|
124
|
+
} finally {
|
|
125
|
+
if (connect) {
|
|
126
|
+
await this.disconnect()
|
|
127
|
+
}
|
|
128
|
+
}
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
async buildSchema(datasourceId: string, entities: Record<string, Table>) {
|
|
130
132
|
const tables: { [key: string]: Table } = {}
|
|
131
133
|
const database = this.config.database
|
|
132
|
-
this.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
)
|
|
139
|
-
const tableNames = tablesResp.map(
|
|
140
|
-
(obj: any) =>
|
|
141
|
-
obj[`Tables_in_${database}`] ||
|
|
142
|
-
obj[`Tables_in_${database.toLowerCase()}`]
|
|
143
|
-
)
|
|
144
|
-
for (let tableName of tableNames) {
|
|
145
|
-
const primaryKeys = []
|
|
146
|
-
const schema: TableSchema = {}
|
|
147
|
-
const descResp = await this.internalQuery(
|
|
148
|
-
{ sql: `DESCRIBE \`${tableName}\`;` },
|
|
134
|
+
await this.connect()
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
// get the tables first
|
|
138
|
+
const tablesResp = await this.internalQuery(
|
|
139
|
+
{ sql: "SHOW TABLES;" },
|
|
149
140
|
false
|
|
150
141
|
)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
142
|
+
const tableNames = tablesResp.map(
|
|
143
|
+
(obj: any) =>
|
|
144
|
+
obj[`Tables_in_${database}`] ||
|
|
145
|
+
obj[`Tables_in_${database.toLowerCase()}`]
|
|
146
|
+
)
|
|
147
|
+
for (let tableName of tableNames) {
|
|
148
|
+
const primaryKeys = []
|
|
149
|
+
const schema: TableSchema = {}
|
|
150
|
+
const descResp = await this.internalQuery(
|
|
151
|
+
{ sql: `DESCRIBE \`${tableName}\`;` },
|
|
152
|
+
false
|
|
153
|
+
)
|
|
154
|
+
for (let column of descResp) {
|
|
155
|
+
const columnName = column.Field
|
|
156
|
+
if (
|
|
157
|
+
column.Key === "PRI" &&
|
|
158
|
+
primaryKeys.indexOf(column.Key) === -1
|
|
159
|
+
) {
|
|
160
|
+
primaryKeys.push(columnName)
|
|
161
|
+
}
|
|
162
|
+
const constraints = {
|
|
163
|
+
presence: column.Null !== "YES",
|
|
164
|
+
}
|
|
165
|
+
const isAuto: boolean =
|
|
166
|
+
typeof column.Extra === "string" &&
|
|
167
|
+
(column.Extra === "auto_increment" ||
|
|
168
|
+
column.Extra.toLowerCase().includes("generated"))
|
|
169
|
+
schema[columnName] = {
|
|
170
|
+
name: columnName,
|
|
171
|
+
autocolumn: isAuto,
|
|
172
|
+
type: convertSqlType(column.Type),
|
|
173
|
+
constraints,
|
|
174
|
+
}
|
|
168
175
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
+
if (!tables[tableName]) {
|
|
177
|
+
tables[tableName] = {
|
|
178
|
+
_id: buildExternalTableId(datasourceId, tableName),
|
|
179
|
+
primary: primaryKeys,
|
|
180
|
+
name: tableName,
|
|
181
|
+
schema,
|
|
182
|
+
}
|
|
176
183
|
}
|
|
177
184
|
}
|
|
185
|
+
} finally {
|
|
186
|
+
await this.disconnect()
|
|
178
187
|
}
|
|
179
|
-
|
|
180
|
-
this.client.end()
|
|
181
188
|
const final = finaliseExternalTables(tables, entities)
|
|
182
189
|
this.tables = final.tables
|
|
183
190
|
this.schemaErrors = final.errors
|
|
@@ -203,11 +210,13 @@ module MySQLModule {
|
|
|
203
210
|
}
|
|
204
211
|
|
|
205
212
|
async query(json: QueryJson) {
|
|
206
|
-
this.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
await this.connect()
|
|
214
|
+
try {
|
|
215
|
+
const queryFn = (query: any) => this.internalQuery(query, false)
|
|
216
|
+
return await this.queryWithReturning(json, queryFn)
|
|
217
|
+
} finally {
|
|
218
|
+
await this.disconnect()
|
|
219
|
+
}
|
|
211
220
|
}
|
|
212
221
|
}
|
|
213
222
|
|
|
@@ -19,7 +19,7 @@ describe("MySQL Integration", () => {
|
|
|
19
19
|
await config.integration.create({
|
|
20
20
|
sql
|
|
21
21
|
})
|
|
22
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
22
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
23
23
|
})
|
|
24
24
|
|
|
25
25
|
it("calls the read method with the correct params", async () => {
|
|
@@ -27,7 +27,7 @@ describe("MySQL Integration", () => {
|
|
|
27
27
|
await config.integration.read({
|
|
28
28
|
sql
|
|
29
29
|
})
|
|
30
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
30
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
31
31
|
})
|
|
32
32
|
|
|
33
33
|
it("calls the update method with the correct params", async () => {
|
|
@@ -35,7 +35,7 @@ describe("MySQL Integration", () => {
|
|
|
35
35
|
await config.integration.update({
|
|
36
36
|
sql
|
|
37
37
|
})
|
|
38
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
38
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
39
39
|
})
|
|
40
40
|
|
|
41
41
|
it("calls the delete method with the correct params", async () => {
|
|
@@ -43,7 +43,7 @@ describe("MySQL Integration", () => {
|
|
|
43
43
|
await config.integration.delete({
|
|
44
44
|
sql
|
|
45
45
|
})
|
|
46
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
46
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
47
47
|
})
|
|
48
48
|
|
|
49
49
|
describe("no rows returned", () => {
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
const path = require("path")
|
|
3
|
-
const fs = require("fs")
|
|
4
|
-
const { processStringSync } = require("@budibase/string-templates")
|
|
5
|
-
|
|
6
|
-
const Configs = {
|
|
7
|
-
prod: {
|
|
8
|
-
k8s: true,
|
|
9
|
-
apps: "app-service.budibase.svc.cluster.local",
|
|
10
|
-
worker: "worker-service.budibase.svc.cluster.local",
|
|
11
|
-
minio: "minio-service.budibase.svc.cluster.local",
|
|
12
|
-
couchdb: "budibase-prod-svc-couchdb",
|
|
13
|
-
},
|
|
14
|
-
preprod: {
|
|
15
|
-
k8s: true,
|
|
16
|
-
apps: "app-service.budibase.svc.cluster.local",
|
|
17
|
-
worker: "worker-service.budibase.svc.cluster.local",
|
|
18
|
-
minio: "minio-service.budibase.svc.cluster.local",
|
|
19
|
-
couchdb: "budibase-preprod-svc-couchdb",
|
|
20
|
-
},
|
|
21
|
-
compose: {
|
|
22
|
-
compose: true,
|
|
23
|
-
apps: "app-service",
|
|
24
|
-
worker: "worker-service",
|
|
25
|
-
minio: "minio-service",
|
|
26
|
-
couchdb: "couchdb-service",
|
|
27
|
-
watchtower: "watchtower-service",
|
|
28
|
-
},
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const Commands = {
|
|
32
|
-
Prod: "prod",
|
|
33
|
-
Preprod: "preprod",
|
|
34
|
-
Compose: "compose",
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function init(managementCommand) {
|
|
38
|
-
const config = Configs[managementCommand]
|
|
39
|
-
const hostingPath = path.join(process.cwd(), "..", "..", "hosting")
|
|
40
|
-
const nginxHbsPath = path.join(hostingPath, "nginx.prod.conf.hbs")
|
|
41
|
-
const nginxOutputPath = path.join(
|
|
42
|
-
hostingPath,
|
|
43
|
-
"proxy",
|
|
44
|
-
".generated-nginx.prod.conf"
|
|
45
|
-
)
|
|
46
|
-
const contents = fs.readFileSync(nginxHbsPath, "utf8")
|
|
47
|
-
fs.writeFileSync(nginxOutputPath, processStringSync(contents, config))
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const managementCommand = process.argv.slice(2)[0]
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
!managementCommand ||
|
|
54
|
-
!Object.values(Commands).some(command => managementCommand === command)
|
|
55
|
-
) {
|
|
56
|
-
throw new Error(
|
|
57
|
-
"You must supply either a 'compose', 'preprod' or 'prod' commmand to generate an NGINX config."
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
init(managementCommand)
|
|
62
|
-
.then(() => {
|
|
63
|
-
console.log("Done! 🎉")
|
|
64
|
-
})
|
|
65
|
-
.catch(err => {
|
|
66
|
-
console.error(
|
|
67
|
-
"Something went wrong while creating the nginx configuration",
|
|
68
|
-
err.message
|
|
69
|
-
)
|
|
70
|
-
})
|