@budibase/server 1.0.89 → 1.0.91-alpha.1

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 (201) hide show
  1. package/builder/assets/{index.7f34af34.js → index.5d5e1d1d.js} +2 -2
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +270 -242
  4. package/coverage/coverage-final.json +9 -8
  5. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +1 -1
  16. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/index.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/validation.js.html +2 -2
  24. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/external.js.html +44 -8
  27. package/coverage/lcov-report/api/controllers/row/index.html +17 -17
  28. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +34 -7
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.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/bulkFormula.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  44. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  49. package/coverage/lcov-report/api/index.html +1 -1
  50. package/coverage/lcov-report/api/index.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/dev.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/migrations.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  80. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  83. package/coverage/lcov-report/automations/actions.js.html +1 -1
  84. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  85. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  86. package/coverage/lcov-report/automations/index.html +1 -1
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/index.html +1 -1
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  115. package/coverage/lcov-report/automations/utils.js.html +1 -1
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +1 -1
  118. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  119. package/coverage/lcov-report/constants/screens.js.html +1 -1
  120. package/coverage/lcov-report/db/client.js.html +1 -1
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +1 -1
  123. package/coverage/lcov-report/db/index.js.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  128. package/coverage/lcov-report/db/newid.js.html +2 -2
  129. package/coverage/lcov-report/db/utils.js.html +2 -2
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +1 -1
  133. package/coverage/lcov-report/events/utils.js.html +1 -1
  134. package/coverage/lcov-report/index.html +24 -24
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  139. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  140. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  141. package/coverage/lcov-report/middleware/index.html +24 -9
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  143. package/coverage/lcov-report/middleware/publicApi.js.html +143 -0
  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 +7 -7
  155. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  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/coverage/lcov.info +423 -378
  177. package/dist/api/controllers/query/import/index.js +2 -1
  178. package/dist/api/controllers/query/import/sources/base/index.js +8 -1
  179. package/dist/api/controllers/query/import/sources/openapi3.js +174 -0
  180. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  181. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  182. package/dist/api/controllers/row/external.js +11 -2
  183. package/dist/api/controllers/row/internal.js +9 -1
  184. package/dist/api/routes/public/index.js +6 -0
  185. package/dist/middleware/publicApi.js +24 -0
  186. package/dist/package.json +4 -4
  187. package/dist/tsconfig.tsbuildinfo +1 -1
  188. package/package.json +5 -5
  189. package/src/api/controllers/query/import/index.ts +2 -1
  190. package/src/api/controllers/query/import/sources/base/index.ts +8 -2
  191. package/src/api/controllers/query/import/sources/openapi3.ts +205 -0
  192. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  193. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  194. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  195. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  196. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  197. package/src/api/controllers/query/import/tests/index.spec.js +43 -0
  198. package/src/api/controllers/row/external.js +14 -2
  199. package/src/api/controllers/row/internal.js +10 -1
  200. package/src/api/routes/public/index.ts +7 -0
  201. package/src/middleware/publicApi.js +21 -0
@@ -0,0 +1,240 @@
1
+ const fs = require("fs")
2
+ const path = require("path")
3
+
4
+ const { OpenAPI3 } = require("../../openapi3")
5
+
6
+ const getData = (file, extension) => {
7
+ return fs.readFileSync(
8
+ path.join(__dirname, `./data/${file}/${file}.${extension}`),
9
+ "utf8"
10
+ )
11
+ }
12
+
13
+ describe("OpenAPI3 Import", () => {
14
+ let openapi3
15
+
16
+ beforeEach(() => {
17
+ openapi3 = new OpenAPI3()
18
+ })
19
+
20
+ it("validates unsupported data", async () => {
21
+ let data
22
+ let supported
23
+
24
+ // non json / yaml
25
+ data = "curl http://example.com"
26
+ supported = await openapi3.isSupported(data)
27
+ expect(supported).toBe(false)
28
+
29
+ // Empty
30
+ data = ""
31
+ supported = await openapi3.isSupported(data)
32
+ expect(supported).toBe(false)
33
+ })
34
+
35
+ const runTests = async (filename, test, assertions) => {
36
+ for (let extension of ["json", "yaml"]) {
37
+ await test(filename, extension, assertions)
38
+ }
39
+ }
40
+
41
+ const testImportInfo = async (file, extension) => {
42
+ await openapi3.isSupported(getData(file, extension))
43
+ const info = await openapi3.getInfo()
44
+ expect(info.name).toBe("Swagger Petstore - OpenAPI 3.0")
45
+ }
46
+
47
+ it("returns import info", async () => {
48
+ await runTests("petstore", testImportInfo)
49
+ })
50
+
51
+ describe("Returns queries", () => {
52
+ const indexQueries = queries => {
53
+ return queries.reduce((acc, query) => {
54
+ acc[query.name] = query
55
+ return acc
56
+ }, {})
57
+ }
58
+
59
+ const getQueries = async (file, extension) => {
60
+ await openapi3.isSupported(getData(file, extension))
61
+ const queries = await openapi3.getQueries()
62
+ expect(queries.length).toBe(6)
63
+ return indexQueries(queries)
64
+ }
65
+
66
+ const testVerb = async (file, extension, assertions) => {
67
+ const queries = await getQueries(file, extension)
68
+ for (let [operationId, method] of Object.entries(assertions)) {
69
+ expect(queries[operationId].queryVerb).toBe(method)
70
+ }
71
+ }
72
+
73
+ it("populates verb", async () => {
74
+ const assertions = {
75
+ createEntity: "create",
76
+ getEntities: "read",
77
+ getEntity: "read",
78
+ updateEntity: "update",
79
+ patchEntity: "patch",
80
+ deleteEntity: "delete",
81
+ }
82
+ await runTests("crud", testVerb, assertions)
83
+ })
84
+
85
+ const testPath = async (file, extension, assertions) => {
86
+ const queries = await getQueries(file, extension)
87
+ for (let [operationId, urlPath] of Object.entries(assertions)) {
88
+ expect(queries[operationId].fields.path).toBe(urlPath)
89
+ }
90
+ }
91
+
92
+ it("populates path", async () => {
93
+ const assertions = {
94
+ createEntity: "http://example.com/entities",
95
+ getEntities: "http://example.com/entities",
96
+ getEntity: "http://example.com/entities/{{entityId}}",
97
+ updateEntity: "http://example.com/entities/{{entityId}}",
98
+ patchEntity: "http://example.com/entities/{{entityId}}",
99
+ deleteEntity: "http://example.com/entities/{{entityId}}",
100
+ }
101
+ await runTests("crud", testPath, assertions)
102
+ })
103
+
104
+ const testHeaders = async (file, extension, assertions) => {
105
+ const queries = await getQueries(file, extension)
106
+ for (let [operationId, headers] of Object.entries(assertions)) {
107
+ expect(queries[operationId].fields.headers).toStrictEqual(headers)
108
+ }
109
+ }
110
+
111
+ const contentTypeHeader = {
112
+ "Content-Type": "application/json",
113
+ }
114
+
115
+ it("populates headers", async () => {
116
+ const assertions = {
117
+ createEntity: {
118
+ ...contentTypeHeader,
119
+ },
120
+ getEntities: {},
121
+ getEntity: {},
122
+ updateEntity: {
123
+ ...contentTypeHeader,
124
+ },
125
+ patchEntity: {
126
+ ...contentTypeHeader,
127
+ },
128
+ deleteEntity: {
129
+ "x-api-key": "{{x-api-key}}",
130
+ },
131
+ }
132
+
133
+ await runTests("crud", testHeaders, assertions)
134
+ })
135
+
136
+ const testQuery = async (file, extension, assertions) => {
137
+ const queries = await getQueries(file, extension)
138
+ for (let [operationId, queryString] of Object.entries(assertions)) {
139
+ expect(queries[operationId].fields.queryString).toStrictEqual(
140
+ queryString
141
+ )
142
+ }
143
+ }
144
+
145
+ it("populates query", async () => {
146
+ const assertions = {
147
+ createEntity: "",
148
+ getEntities: "page={{page}}&size={{size}}",
149
+ getEntity: "",
150
+ updateEntity: "",
151
+ patchEntity: "",
152
+ deleteEntity: "",
153
+ }
154
+ await runTests("crud", testQuery, assertions)
155
+ })
156
+
157
+ const testParameters = async (file, extension, assertions) => {
158
+ const queries = await getQueries(file, extension)
159
+ for (let [operationId, parameters] of Object.entries(assertions)) {
160
+ expect(queries[operationId].parameters).toStrictEqual(parameters)
161
+ }
162
+ }
163
+
164
+ it("populates parameters", async () => {
165
+ const assertions = {
166
+ createEntity: [],
167
+ getEntities: [
168
+ {
169
+ name: "page",
170
+ default: "",
171
+ },
172
+ {
173
+ name: "size",
174
+ default: "",
175
+ },
176
+ ],
177
+ getEntity: [
178
+ {
179
+ name: "entityId",
180
+ default: "",
181
+ },
182
+ ],
183
+ updateEntity: [
184
+ {
185
+ name: "entityId",
186
+ default: "",
187
+ },
188
+ ],
189
+ patchEntity: [
190
+ {
191
+ name: "entityId",
192
+ default: "",
193
+ },
194
+ ],
195
+ deleteEntity: [
196
+ {
197
+ name: "entityId",
198
+ default: "",
199
+ },
200
+ {
201
+ name: "x-api-key",
202
+ default: "",
203
+ },
204
+ ],
205
+ }
206
+ await runTests("crud", testParameters, assertions)
207
+ })
208
+
209
+ const testBody = async (file, extension, assertions) => {
210
+ const queries = await getQueries(file, extension)
211
+ for (let [operationId, body] of Object.entries(assertions)) {
212
+ expect(queries[operationId].fields.requestBody).toStrictEqual(
213
+ JSON.stringify(body, null, 2)
214
+ )
215
+ }
216
+ }
217
+ it("populates body", async () => {
218
+ const assertions = {
219
+ createEntity: {
220
+ name: "name",
221
+ type: "type",
222
+ },
223
+ getEntities: undefined,
224
+ getEntity: undefined,
225
+ updateEntity: {
226
+ id: 1,
227
+ name: "name",
228
+ type: "type",
229
+ },
230
+ patchEntity: {
231
+ id: 1,
232
+ name: "name",
233
+ type: "type",
234
+ },
235
+ deleteEntity: undefined,
236
+ }
237
+ await runTests("crud", testBody, assertions)
238
+ })
239
+ })
240
+ })
@@ -23,14 +23,27 @@ const oapi2CrudYaml = getData("openapi2/data/crud/crud.json")
23
23
  const oapi2PetstoreJson = getData("openapi2/data/petstore/petstore.json")
24
24
  const oapi2PetstoreYaml = getData("openapi2/data/petstore/petstore.json")
25
25
 
26
+ // openapi3
27
+ const oapi3CrudJson = getData("openapi3/data/crud/crud.json")
28
+ const oapi3CrudYaml = getData("openapi3/data/crud/crud.json")
29
+ const oapi3PetstoreJson = getData("openapi3/data/petstore/petstore.json")
30
+ const oapi3PetstoreYaml = getData("openapi3/data/petstore/petstore.json")
31
+
26
32
  // curl
27
33
  const curl = getData("curl/data/post.txt")
28
34
 
29
35
  const datasets = {
36
+ // openapi2 (swagger)
30
37
  oapi2CrudJson,
31
38
  oapi2CrudYaml,
32
39
  oapi2PetstoreJson,
33
40
  oapi2PetstoreYaml,
41
+ // openapi3
42
+ oapi3CrudJson,
43
+ oapi3CrudYaml,
44
+ oapi3PetstoreJson,
45
+ oapi3PetstoreYaml,
46
+ // curl
34
47
  curl
35
48
  }
36
49
 
@@ -56,6 +69,7 @@ describe("Rest Importer", () => {
56
69
 
57
70
  it("gets info", async () => {
58
71
  const assertions = {
72
+ // openapi2 (swagger)
59
73
  "oapi2CrudJson" : {
60
74
  name: "CRUD",
61
75
  },
@@ -68,6 +82,20 @@ describe("Rest Importer", () => {
68
82
  "oapi2PetstoreYaml" :{
69
83
  name: "Swagger Petstore",
70
84
  },
85
+ // openapi3
86
+ "oapi3CrudJson" : {
87
+ name: "CRUD",
88
+ },
89
+ "oapi3CrudYaml" : {
90
+ name: "CRUD",
91
+ },
92
+ "oapi3PetstoreJson" : {
93
+ name: "Swagger Petstore - OpenAPI 3.0",
94
+ },
95
+ "oapi3PetstoreYaml" :{
96
+ name: "Swagger Petstore - OpenAPI 3.0",
97
+ },
98
+ // curl
71
99
  "curl": {
72
100
  name: "example.com",
73
101
  }
@@ -89,6 +117,7 @@ describe("Rest Importer", () => {
89
117
  // simple sanity assertions that the whole dataset
90
118
  // makes it through the importer
91
119
  const assertions = {
120
+ // openapi2 (swagger)
92
121
  "oapi2CrudJson" : {
93
122
  count: 6,
94
123
  },
@@ -101,6 +130,20 @@ describe("Rest Importer", () => {
101
130
  "oapi2PetstoreYaml" :{
102
131
  count: 20,
103
132
  },
133
+ // openapi3
134
+ "oapi3CrudJson" : {
135
+ count: 6,
136
+ },
137
+ "oapi3CrudYaml" :{
138
+ count: 6,
139
+ },
140
+ "oapi3PetstoreJson" : {
141
+ count: 19,
142
+ },
143
+ "oapi3PetstoreYaml" :{
144
+ count: 19,
145
+ },
146
+ // curl
104
147
  "curl": {
105
148
  count: 1
106
149
  }
@@ -10,6 +10,8 @@ const {
10
10
  } = require("../../../integrations/utils")
11
11
  const ExternalRequest = require("./ExternalRequest")
12
12
  const { getAppDB } = require("@budibase/backend-core/context")
13
+ const exporters = require("../view/exporters")
14
+ const { apiFileReturn } = require("../../../utilities/fileSystem")
13
15
 
14
16
  async function handleRequest(operation, tableId, opts = {}) {
15
17
  // make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
@@ -155,6 +157,7 @@ exports.validate = async () => {
155
157
  exports.exportRows = async ctx => {
156
158
  const { datasourceId, tableName } = breakExternalTableId(ctx.params.tableId)
157
159
  const db = getAppDB()
160
+ let format = ctx.query.format
158
161
  const datasource = await db.get(datasourceId)
159
162
  if (!datasource || !datasource.entities) {
160
163
  ctx.throw(400, "Datasource has not been configured for plus API.")
@@ -164,13 +167,22 @@ exports.exportRows = async ctx => {
164
167
  ctx.request.body = {
165
168
  query: {
166
169
  oneOf: {
167
- [table.primaryDisplay]: ctx.request.body.map(
170
+ [table.primaryDisplay]: ctx.request.body.rows.map(
168
171
  id => breakRowIdField(id)[0]
169
172
  ),
170
173
  },
171
174
  },
172
175
  }
173
- return exports.search(ctx)
176
+
177
+ let result = await exports.search(ctx)
178
+
179
+ let headers = Object.keys(result.rows[0])
180
+ const exporter = exporters[format]
181
+ const filename = `export.${format}`
182
+
183
+ // send down the file
184
+ ctx.attachment(filename)
185
+ return apiFileReturn(exporter(headers, result.rows))
174
186
  }
175
187
 
176
188
  exports.fetchEnrichedRow = async ctx => {
@@ -27,6 +27,8 @@ const {
27
27
  const { cloneDeep } = require("lodash/fp")
28
28
  const { getAppDB } = require("@budibase/backend-core/context")
29
29
  const { finaliseRow, updateRelatedFormula } = require("./staticFormula")
30
+ const exporters = require("../view/exporters")
31
+ const { apiFileReturn } = require("../../../utilities/fileSystem")
30
32
 
31
33
  const CALCULATION_TYPES = {
32
34
  SUM: "sum",
@@ -366,6 +368,7 @@ exports.exportRows = async ctx => {
366
368
  const db = getAppDB()
367
369
  const table = await db.get(ctx.params.tableId)
368
370
  const rowIds = ctx.request.body.rows
371
+ let format = ctx.query.format
369
372
  let response = (
370
373
  await db.allDocs({
371
374
  include_docs: true,
@@ -375,7 +378,13 @@ exports.exportRows = async ctx => {
375
378
 
376
379
  let rows = await outputProcessing(table, response)
377
380
 
378
- return rows
381
+ let headers = Object.keys(rows[0])
382
+ const exporter = exporters[format]
383
+ const filename = `export.${format}`
384
+
385
+ // send down the file
386
+ ctx.attachment(filename)
387
+ return apiFileReturn(exporter(headers, rows))
379
388
  }
380
389
 
381
390
  exports.fetchEnrichedRow = async ctx => {
@@ -5,6 +5,7 @@ import rowEndpoints from "./rows"
5
5
  import userEndpoints from "./users"
6
6
  import usage from "../../../middleware/usageQuota"
7
7
  import authorized from "../../../middleware/authorized"
8
+ import publicApi from "../../../middleware/publicApi"
8
9
  import { paramResource, paramSubResource } from "../../../middleware/resourceId"
9
10
  import { CtxFn } from "./utils/Endpoint"
10
11
  import mapperMiddleware from "./middleware/mapper"
@@ -101,6 +102,12 @@ function applyRoutes(
101
102
  const paramMiddleware = subResource
102
103
  ? paramSubResource(resource, subResource)
103
104
  : paramResource(resource)
105
+ const publicApiMiddleware = publicApi({
106
+ requiresAppId:
107
+ permType !== PermissionTypes.APP && permType !== PermissionTypes.USER,
108
+ })
109
+ addMiddleware(endpoints.read, publicApiMiddleware)
110
+ addMiddleware(endpoints.write, publicApiMiddleware)
104
111
  // add the parameter capture middleware
105
112
  addMiddleware(endpoints.read, paramMiddleware)
106
113
  addMiddleware(endpoints.write, paramMiddleware)
@@ -0,0 +1,21 @@
1
+ const { Headers } = require("@budibase/backend-core/constants")
2
+ const { getAppId } = require("@budibase/backend-core/utils")
3
+
4
+ module.exports = function ({ requiresAppId } = {}) {
5
+ return async (ctx, next) => {
6
+ const appId = getAppId(ctx)
7
+ if (requiresAppId && !appId) {
8
+ ctx.throw(
9
+ 400,
10
+ `Invalid app ID provided, please check the ${Headers.APP_ID} header.`
11
+ )
12
+ }
13
+ if (!ctx.headers[Headers.API_KEY]) {
14
+ ctx.throw(
15
+ 400,
16
+ `Invalid API key provided, please check the ${Headers.API_KEY} header.`
17
+ )
18
+ }
19
+ return next()
20
+ }
21
+ }