@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.
- package/builder/assets/{index.7f34af34.js → index.5d5e1d1d.js} +2 -2
- package/builder/index.html +1 -1
- package/coverage/clover.xml +270 -242
- package/coverage/coverage-final.json +9 -8
- 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 +2 -2
- 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 +44 -8
- package/coverage/lcov-report/api/controllers/row/index.html +17 -17
- package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +34 -7
- 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 +4 -4
- 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 +2 -2
- package/coverage/lcov-report/db/utils.js.html +2 -2
- 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 +24 -24
- 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 +24 -9
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/publicApi.js.html +143 -0
- 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 +7 -7
- package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
- 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/coverage/lcov.info +423 -378
- package/dist/api/controllers/query/import/index.js +2 -1
- package/dist/api/controllers/query/import/sources/base/index.js +8 -1
- package/dist/api/controllers/query/import/sources/openapi3.js +174 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/dist/api/controllers/row/external.js +11 -2
- package/dist/api/controllers/row/internal.js +9 -1
- package/dist/api/routes/public/index.js +6 -0
- package/dist/middleware/publicApi.js +24 -0
- package/dist/package.json +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/api/controllers/query/import/index.ts +2 -1
- package/src/api/controllers/query/import/sources/base/index.ts +8 -2
- package/src/api/controllers/query/import/sources/openapi3.ts +205 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
- package/src/api/controllers/query/import/tests/index.spec.js +43 -0
- package/src/api/controllers/row/external.js +14 -2
- package/src/api/controllers/row/internal.js +10 -1
- package/src/api/routes/public/index.ts +7 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
+
}
|