@budibase/server 1.0.27-alpha.13 → 1.0.27-alpha.17

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 (191) hide show
  1. package/builder/assets/{index.176f00e0.css → index.39e01193.css} +1 -1
  2. package/builder/assets/{index.5776ef20.js → index.4ba89e2d.js} +232 -232
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +155 -152
  5. package/coverage/coverage-final.json +4 -4
  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/hosting.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +1 -1
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.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 +7 -4
  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/utils.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  48. package/coverage/lcov-report/api/index.html +1 -1
  49. package/coverage/lcov-report/api/index.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/index.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  80. package/coverage/lcov-report/automations/actions.js.html +1 -1
  81. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  82. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  83. package/coverage/lcov-report/automations/index.html +1 -1
  84. package/coverage/lcov-report/automations/index.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/index.html +1 -1
  94. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  112. package/coverage/lcov-report/automations/utils.js.html +1 -1
  113. package/coverage/lcov-report/constants/index.html +1 -1
  114. package/coverage/lcov-report/constants/index.js.html +1 -1
  115. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  116. package/coverage/lcov-report/constants/screens.js.html +1 -1
  117. package/coverage/lcov-report/db/client.js.html +1 -1
  118. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  119. package/coverage/lcov-report/db/index.html +1 -1
  120. package/coverage/lcov-report/db/index.js.html +1 -1
  121. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  122. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  123. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  125. package/coverage/lcov-report/db/newid.js.html +1 -1
  126. package/coverage/lcov-report/db/utils.js.html +1 -1
  127. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  128. package/coverage/lcov-report/events/index.html +1 -1
  129. package/coverage/lcov-report/events/index.js.html +1 -1
  130. package/coverage/lcov-report/events/utils.js.html +1 -1
  131. package/coverage/lcov-report/index.html +16 -16
  132. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  133. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  134. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  135. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  136. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  137. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  138. package/coverage/lcov-report/middleware/index.html +1 -1
  139. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  140. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  141. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  142. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  143. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  144. package/coverage/lcov-report/threads/automation.js.html +1 -1
  145. package/coverage/lcov-report/threads/index.html +28 -28
  146. package/coverage/lcov-report/threads/index.js.html +1 -1
  147. package/coverage/lcov-report/threads/query.js.html +181 -13
  148. package/coverage/lcov-report/threads/utils.js.html +11 -161
  149. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  150. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  151. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  152. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  153. package/coverage/lcov-report/utilities/global.js.html +1 -1
  154. package/coverage/lcov-report/utilities/index.html +4 -4
  155. package/coverage/lcov-report/utilities/index.js.html +9 -9
  156. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  157. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  158. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  159. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  160. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  161. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  162. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  163. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  164. package/coverage/lcov-report/utilities/security.js.html +1 -1
  165. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  166. package/coverage/lcov-report/utilities/users.js.html +1 -1
  167. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  168. package/coverage/lcov.info +291 -284
  169. package/dist/api/controllers/query/index.js +3 -2
  170. package/dist/environment.js +1 -0
  171. package/dist/integrations/dynamodb.js +19 -0
  172. package/dist/integrations/rest.js +68 -19
  173. package/dist/integrations/s3.js +17 -8
  174. package/dist/integrations/utils.js +40 -37
  175. package/dist/package.json +4 -4
  176. package/dist/threads/query.js +52 -3
  177. package/dist/threads/utils.js +0 -44
  178. package/dist/tsconfig.tsbuildinfo +1 -1
  179. package/dist/utilities/index.js +1 -1
  180. package/package.json +5 -5
  181. package/src/api/controllers/query/index.js +3 -2
  182. package/src/definitions/datasource.ts +15 -0
  183. package/src/environment.js +1 -0
  184. package/src/integrations/dynamodb.ts +18 -0
  185. package/src/integrations/rest.ts +97 -17
  186. package/src/integrations/s3.ts +18 -7
  187. package/src/integrations/tests/rest.spec.js +287 -24
  188. package/src/integrations/utils.ts +8 -7
  189. package/src/threads/query.js +59 -3
  190. package/src/threads/utils.js +0 -50
  191. package/src/utilities/index.js +1 -1
@@ -38,7 +38,7 @@ exports.checkSlashesInUrl = url => {
38
38
  * @return {string} The base URL of the object store (MinIO or S3).
39
39
  */
40
40
  exports.objectStoreUrl = () => {
41
- if (env.SELF_HOSTED) {
41
+ if (env.SELF_HOSTED || env.MINIO_URL) {
42
42
  // can use a relative url for this as all goes through the proxy (this is hosted in minio)
43
43
  return OBJ_STORE_DIRECTORY;
44
44
  }
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.27-alpha.13",
4
+ "version": "1.0.27-alpha.17",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -70,9 +70,9 @@
70
70
  "license": "GPL-3.0",
71
71
  "dependencies": {
72
72
  "@apidevtools/swagger-parser": "^10.0.3",
73
- "@budibase/backend-core": "^1.0.27-alpha.13",
74
- "@budibase/client": "^1.0.27-alpha.13",
75
- "@budibase/string-templates": "^1.0.27-alpha.13",
73
+ "@budibase/backend-core": "^1.0.27-alpha.17",
74
+ "@budibase/client": "^1.0.27-alpha.17",
75
+ "@budibase/string-templates": "^1.0.27-alpha.17",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",
@@ -165,5 +165,5 @@
165
165
  "optionalDependencies": {
166
166
  "oracledb": "^5.3.0"
167
167
  },
168
- "gitHead": "e48e21ffb846288ce46883674626b79755617445"
168
+ "gitHead": "5e285f29df9a7386b953591a5a07fc720cb0e954"
169
169
  }
@@ -140,11 +140,12 @@ async function execute(ctx, opts = { rowsOnly: false }) {
140
140
 
141
141
  // call the relevant CRUD method on the integration class
142
142
  try {
143
- const { rows, extra } = await Runner.run({
143
+ const { rows, pagination, extra } = await Runner.run({
144
144
  appId: ctx.appId,
145
145
  datasource,
146
146
  queryVerb: query.queryVerb,
147
147
  fields: query.fields,
148
+ pagination: ctx.request.body.pagination,
148
149
  parameters: ctx.request.body.parameters,
149
150
  transformer: query.transformer,
150
151
  queryId: ctx.params.queryId,
@@ -152,7 +153,7 @@ async function execute(ctx, opts = { rowsOnly: false }) {
152
153
  if (opts && opts.rowsOnly) {
153
154
  ctx.body = rows
154
155
  } else {
155
- ctx.body = { data: rows, ...extra }
156
+ ctx.body = { data: rows, pagination, ...extra }
156
157
  }
157
158
  } catch (err) {
158
159
  ctx.throw(400, err)
@@ -232,6 +232,8 @@ export interface RestQueryFields {
232
232
  json: object
233
233
  method: string
234
234
  authConfigId: string
235
+ pagination: PaginationConfig | null
236
+ paginationValues: PaginationValues | null
235
237
  }
236
238
 
237
239
  export interface RestConfig {
@@ -252,6 +254,19 @@ export interface RestConfig {
252
254
  ]
253
255
  }
254
256
 
257
+ export interface PaginationConfig {
258
+ type: string
259
+ location: string
260
+ pageParam: string
261
+ sizeParam: string | null
262
+ responseParam: string | null
263
+ }
264
+
265
+ export interface PaginationValues {
266
+ page: string | number | null
267
+ limit: number | null
268
+ }
269
+
255
270
  export interface Query {
256
271
  _id?: string
257
272
  datasourceId: string
@@ -65,6 +65,7 @@ module.exports = {
65
65
  DEPLOYMENT_CREDENTIALS_URL: process.env.DEPLOYMENT_CREDENTIALS_URL,
66
66
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
67
67
  DISABLE_THREADING: process.env.DISABLE_THREADING,
68
+ QUERY_THREAD_TIMEOUT: process.env.QUERY_THREAD_TIMEOUT,
68
69
  _set(key, value) {
69
70
  process.env[key] = value
70
71
  module.exports[key] = value
@@ -80,6 +80,17 @@ module DynamoModule {
80
80
  },
81
81
  },
82
82
  },
83
+ describe: {
84
+ type: QueryTypes.FIELDS,
85
+ customisable: true,
86
+ readable: true,
87
+ fields: {
88
+ table: {
89
+ type: DatasourceFieldTypes.STRING,
90
+ required: true,
91
+ },
92
+ },
93
+ },
83
94
  get: {
84
95
  type: QueryTypes.FIELDS,
85
96
  customisable: true,
@@ -180,6 +191,13 @@ module DynamoModule {
180
191
  return response
181
192
  }
182
193
 
194
+ async describe(query: { table: string }) {
195
+ const params = {
196
+ TableName: query.table,
197
+ }
198
+ return new AWS.DynamoDB().describeTable(params).promise()
199
+ }
200
+
183
201
  async get(query: { table: string; json: object }) {
184
202
  const params = {
185
203
  TableName: query.table,
@@ -4,9 +4,11 @@ import {
4
4
  QueryTypes,
5
5
  RestConfig,
6
6
  RestQueryFields as RestQuery,
7
+ PaginationConfig,
7
8
  AuthType,
8
9
  BasicAuthConfig,
9
10
  BearerAuthConfig,
11
+ PaginationValues,
10
12
  } from "../definitions/datasource"
11
13
  import { IntegrationBase } from "./base/IntegrationBase"
12
14
 
@@ -40,6 +42,9 @@ const coreFields = {
40
42
  type: DatasourceFieldTypes.STRING,
41
43
  enum: Object.values(BodyTypes),
42
44
  },
45
+ pagination: {
46
+ type: DatasourceFieldTypes.OBJECT,
47
+ },
43
48
  }
44
49
 
45
50
  module RestModule {
@@ -115,7 +120,7 @@ module RestModule {
115
120
  this.config = config
116
121
  }
117
122
 
118
- async parseResponse(response: any) {
123
+ async parseResponse(response: any, pagination: PaginationConfig | null) {
119
124
  let data, raw, headers
120
125
  const contentType = response.headers.get("content-type") || ""
121
126
  try {
@@ -154,6 +159,13 @@ module RestModule {
154
159
  for (let [key, value] of Object.entries(headers)) {
155
160
  headers[key] = Array.isArray(value) ? value[0] : value
156
161
  }
162
+
163
+ // Check if a pagination cursor exists in the response
164
+ let nextCursor = null
165
+ if (pagination?.responseParam) {
166
+ nextCursor = data?.[pagination.responseParam]
167
+ }
168
+
157
169
  return {
158
170
  data,
159
171
  info: {
@@ -165,10 +177,40 @@ module RestModule {
165
177
  raw,
166
178
  headers,
167
179
  },
180
+ pagination: {
181
+ cursor: nextCursor,
182
+ },
168
183
  }
169
184
  }
170
185
 
171
- getUrl(path: string, queryString: string): string {
186
+ getUrl(
187
+ path: string,
188
+ queryString: string,
189
+ pagination: PaginationConfig | null,
190
+ paginationValues: PaginationValues | null
191
+ ): string {
192
+ // Add pagination params to query string if required
193
+ if (pagination?.location === "query" && paginationValues) {
194
+ const { pageParam, sizeParam } = pagination
195
+ const params = new URLSearchParams()
196
+
197
+ // Append page number or cursor param if configured
198
+ if (pageParam && paginationValues.page != null) {
199
+ params.append(pageParam, paginationValues.page)
200
+ }
201
+
202
+ // Append page size param if configured
203
+ if (sizeParam && paginationValues.limit != null) {
204
+ params.append(sizeParam, paginationValues.limit)
205
+ }
206
+
207
+ // Prepend query string with pagination params
208
+ let paginationString = params.toString()
209
+ if (paginationString) {
210
+ queryString = `${paginationString}&${queryString}`
211
+ }
212
+ }
213
+
172
214
  const main = `${path}?${queryString}`
173
215
  let complete = main
174
216
  if (this.config.url && !main.startsWith("http")) {
@@ -180,20 +222,44 @@ module RestModule {
180
222
  return complete
181
223
  }
182
224
 
183
- addBody(bodyType: string, body: string | any, input: any) {
184
- let error, object, string
225
+ addBody(
226
+ bodyType: string,
227
+ body: string | any,
228
+ input: any,
229
+ pagination: PaginationConfig | null,
230
+ paginationValues: PaginationValues | null
231
+ ) {
232
+ if (!input.headers) {
233
+ input.headers = {}
234
+ }
235
+ if (bodyType === BodyTypes.NONE) {
236
+ return input
237
+ }
238
+ let error,
239
+ object: any = {},
240
+ string = ""
185
241
  try {
186
- string = typeof body !== "string" ? JSON.stringify(body) : body
187
- object = typeof body === "object" ? body : JSON.parse(body)
242
+ if (body) {
243
+ string = typeof body !== "string" ? JSON.stringify(body) : body
244
+ object = typeof body === "object" ? body : JSON.parse(body)
245
+ }
188
246
  } catch (err) {
189
247
  error = err
190
248
  }
191
- if (!input.headers) {
192
- input.headers = {}
249
+
250
+ // Util to add pagination values to a certain body type
251
+ const addPaginationToBody = (insertFn: Function) => {
252
+ if (pagination?.location === "body") {
253
+ if (pagination?.pageParam && paginationValues?.page != null) {
254
+ insertFn(pagination.pageParam, paginationValues.page)
255
+ }
256
+ if (pagination?.sizeParam && paginationValues?.limit != null) {
257
+ insertFn(pagination.sizeParam, paginationValues.limit)
258
+ }
259
+ }
193
260
  }
261
+
194
262
  switch (bodyType) {
195
- case BodyTypes.NONE:
196
- break
197
263
  case BodyTypes.TEXT:
198
264
  // content type defaults to plaintext
199
265
  input.body = string
@@ -203,6 +269,9 @@ module RestModule {
203
269
  for (let [key, value] of Object.entries(object)) {
204
270
  params.append(key, value)
205
271
  }
272
+ addPaginationToBody((key: string, value: any) => {
273
+ params.append(key, value)
274
+ })
206
275
  input.body = params
207
276
  break
208
277
  case BodyTypes.FORM_DATA:
@@ -210,6 +279,9 @@ module RestModule {
210
279
  for (let [key, value] of Object.entries(object)) {
211
280
  form.append(key, value)
212
281
  }
282
+ addPaginationToBody((key: string, value: any) => {
283
+ form.append(key, value)
284
+ })
213
285
  input.body = form
214
286
  break
215
287
  case BodyTypes.XML:
@@ -219,13 +291,15 @@ module RestModule {
219
291
  input.body = string
220
292
  input.headers["Content-Type"] = "application/xml"
221
293
  break
222
- default:
223
294
  case BodyTypes.JSON:
224
295
  // if JSON error, throw it
225
296
  if (error) {
226
297
  throw "Invalid JSON for request body"
227
298
  }
228
- input.body = string
299
+ addPaginationToBody((key: string, value: any) => {
300
+ object[key] = value
301
+ })
302
+ input.body = JSON.stringify(object)
229
303
  input.headers["Content-Type"] = "application/json"
230
304
  break
231
305
  }
@@ -271,6 +345,8 @@ module RestModule {
271
345
  bodyType,
272
346
  requestBody,
273
347
  authConfigId,
348
+ pagination,
349
+ paginationValues,
274
350
  } = query
275
351
  const authHeaders = this.getAuthHeaders(authConfigId)
276
352
 
@@ -289,14 +365,18 @@ module RestModule {
289
365
  }
290
366
 
291
367
  let input: any = { method, headers: this.headers }
292
- if (requestBody) {
293
- input = this.addBody(bodyType, requestBody, input)
294
- }
368
+ input = this.addBody(
369
+ bodyType,
370
+ requestBody,
371
+ input,
372
+ pagination,
373
+ paginationValues
374
+ )
295
375
 
296
376
  this.startTimeMs = performance.now()
297
- const url = this.getUrl(path, queryString)
377
+ const url = this.getUrl(path, queryString, pagination, paginationValues)
298
378
  const response = await fetch(url, input)
299
- return await this.parseResponse(response)
379
+ return await this.parseResponse(response, pagination)
300
380
  }
301
381
 
302
382
  async create(opts: RestQuery) {
@@ -8,6 +8,8 @@ module S3Module {
8
8
  region: string
9
9
  accessKeyId: string
10
10
  secretAccessKey: string
11
+ s3ForcePathStyle: boolean
12
+ endpoint?: string
11
13
  }
12
14
 
13
15
  const SCHEMA: Integration = {
@@ -18,7 +20,7 @@ module S3Module {
18
20
  datasource: {
19
21
  region: {
20
22
  type: "string",
21
- required: true,
23
+ required: false,
22
24
  default: "us-east-1",
23
25
  },
24
26
  accessKeyId: {
@@ -29,6 +31,15 @@ module S3Module {
29
31
  type: "password",
30
32
  required: true,
31
33
  },
34
+ endpoint: {
35
+ type: "string",
36
+ required: false,
37
+ },
38
+ signatureVersion: {
39
+ type: "string",
40
+ required: false,
41
+ default: "v4"
42
+ },
32
43
  },
33
44
  query: {
34
45
  read: {
@@ -46,16 +57,16 @@ module S3Module {
46
57
  class S3Integration implements IntegrationBase {
47
58
  private readonly config: S3Config
48
59
  private client: any
49
- private connectionPromise: Promise<any>
50
60
 
51
61
  constructor(config: S3Config) {
52
62
  this.config = config
53
- this.connectionPromise = this.connect()
54
- this.client = new AWS.S3()
55
- }
63
+ if (this.config.endpoint) {
64
+ this.config.s3ForcePathStyle = true
65
+ } else {
66
+ delete this.config.endpoint
67
+ }
56
68
 
57
- async connect() {
58
- AWS.config.update(this.config)
69
+ this.client = new AWS.S3(this.config)
59
70
  }
60
71
 
61
72
  async read(query: { bucket: string }) {