@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.
Files changed (189) hide show
  1. package/__mocks__/mysql2/promise.ts +17 -0
  2. package/builder/assets/{index.d0476387.js → index.b37e0ebb.js} +84 -84
  3. package/builder/assets/{vendor.6b00a24f.js → vendor.a7c6ad0a.js} +1 -1
  4. package/builder/index.html +2 -2
  5. package/coverage/clover.xml +2 -2
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/index.html +1 -1
  17. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  50. package/coverage/lcov-report/api/index.html +1 -1
  51. package/coverage/lcov-report/api/index.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  81. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  84. package/coverage/lcov-report/automations/actions.js.html +1 -1
  85. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  86. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  87. package/coverage/lcov-report/automations/index.html +1 -1
  88. package/coverage/lcov-report/automations/index.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/index.html +1 -1
  98. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  115. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  116. package/coverage/lcov-report/automations/utils.js.html +1 -1
  117. package/coverage/lcov-report/constants/index.html +1 -1
  118. package/coverage/lcov-report/constants/index.js.html +1 -1
  119. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  120. package/coverage/lcov-report/constants/screens.js.html +1 -1
  121. package/coverage/lcov-report/db/client.js.html +1 -1
  122. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  123. package/coverage/lcov-report/db/index.html +1 -1
  124. package/coverage/lcov-report/db/index.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  128. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  129. package/coverage/lcov-report/db/newid.js.html +1 -1
  130. package/coverage/lcov-report/db/utils.js.html +1 -1
  131. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  132. package/coverage/lcov-report/events/index.html +1 -1
  133. package/coverage/lcov-report/events/index.js.html +1 -1
  134. package/coverage/lcov-report/events/utils.js.html +1 -1
  135. package/coverage/lcov-report/index.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  137. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  138. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  139. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  140. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  141. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  142. package/coverage/lcov-report/middleware/index.html +1 -1
  143. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  144. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  145. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  146. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  147. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  148. package/coverage/lcov-report/threads/automation.js.html +1 -1
  149. package/coverage/lcov-report/threads/index.html +1 -1
  150. package/coverage/lcov-report/threads/index.js.html +1 -1
  151. package/coverage/lcov-report/threads/query.js.html +1 -1
  152. package/coverage/lcov-report/threads/utils.js.html +1 -1
  153. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  154. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  155. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  156. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  157. package/coverage/lcov-report/utilities/global.js.html +1 -1
  158. package/coverage/lcov-report/utilities/index.html +1 -1
  159. package/coverage/lcov-report/utilities/index.js.html +1 -1
  160. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  161. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  163. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  164. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  167. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  168. package/coverage/lcov-report/utilities/security.js.html +1 -1
  169. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  170. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  174. package/coverage/lcov-report/utilities/users.js.html +1 -1
  175. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  176. package/dist/api/routes/public/index.js +33 -0
  177. package/dist/environment.js +1 -0
  178. package/dist/integrations/mysql.js +71 -56
  179. package/dist/integrations/utils.js +1 -1
  180. package/dist/package.json +7 -7
  181. package/dist/tsconfig.tsbuildinfo +1 -1
  182. package/package.json +8 -8
  183. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  184. package/src/api/routes/public/index.ts +36 -0
  185. package/src/environment.js +1 -0
  186. package/src/integrations/mysql.ts +79 -70
  187. package/src/integrations/tests/mysql.spec.js +4 -4
  188. package/src/integrations/utils.ts +1 -1
  189. 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.79-alpha.8",
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.79-alpha.8",
78
- "@budibase/client": "^1.0.79-alpha.8",
79
- "@budibase/string-templates": "^1.0.79-alpha.8",
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": "71629374930c0cd4c471696054dadcea093f8eb5"
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,
@@ -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/mysqljs/mysql",
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 readonly client: any
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.client = mysql.createConnection(config)
95
+ this.config = config
96
96
  }
97
97
 
98
98
  getBindingIdentifier(): string {
99
99
  return "?"
100
100
  }
101
101
 
102
- internalQuery(
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
- const client = this.client
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
- client.connect()
116
+ await this.connect()
111
117
  }
112
- return client.query(
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.client.connect()
133
-
134
- // get the tables first
135
- const tablesResp = await this.internalQuery(
136
- { sql: "SHOW TABLES;" },
137
- false
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
- for (let column of descResp) {
152
- const columnName = column.Field
153
- if (column.Key === "PRI" && primaryKeys.indexOf(column.Key) === -1) {
154
- primaryKeys.push(columnName)
155
- }
156
- const constraints = {
157
- presence: column.Null !== "YES",
158
- }
159
- const isAuto: boolean =
160
- typeof column.Extra === "string" &&
161
- (column.Extra === "auto_increment" ||
162
- column.Extra.toLowerCase().includes("generated"))
163
- schema[columnName] = {
164
- name: columnName,
165
- autocolumn: isAuto,
166
- type: convertSqlType(column.Type),
167
- constraints,
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
- if (!tables[tableName]) {
171
- tables[tableName] = {
172
- _id: buildExternalTableId(datasourceId, tableName),
173
- primary: primaryKeys,
174
- name: tableName,
175
- schema,
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.client.connect()
207
- const queryFn = (query: any) => this.internalQuery(query, false)
208
- const output = await this.queryWithReturning(json, queryFn)
209
- this.client.end()
210
- return output
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, {}, expect.any(Function))
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, {}, expect.any(Function))
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, {}, expect.any(Function))
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, {}, expect.any(Function))
46
+ expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
47
47
  })
48
48
 
49
49
  describe("no rows returned", () => {
@@ -40,7 +40,7 @@ const SQL_TYPE_MAP = {
40
40
  export enum SqlClients {
41
41
  MS_SQL = "mssql",
42
42
  POSTGRES = "pg",
43
- MY_SQL = "mysql",
43
+ MY_SQL = "mysql2",
44
44
  ORACLE = "oracledb",
45
45
  }
46
46
 
@@ -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
- })