@budibase/server 1.0.95 → 1.0.98-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 (241) hide show
  1. package/builder/assets/{index.7c8961b4.css → index.0b7cf958.css} +1 -1
  2. package/builder/assets/index.55c226d0.js +1292 -0
  3. package/builder/assets/{vendor.a7c6ad0a.js → vendor.8e34a169.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +274 -273
  6. package/coverage/coverage-final.json +18 -18
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/dev.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/migrations.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +2 -2
  26. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +20 -20
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +47 -35
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +6 -6
  35. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +4 -4
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  51. package/coverage/lcov-report/api/index.html +15 -15
  52. package/coverage/lcov-report/api/index.js.html +15 -27
  53. package/coverage/lcov-report/api/routes/analytics.js.html +3 -3
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +3 -6
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  82. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  85. package/coverage/lcov-report/automations/actions.js.html +1 -1
  86. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  87. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  88. package/coverage/lcov-report/automations/index.html +1 -1
  89. package/coverage/lcov-report/automations/index.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/index.html +1 -1
  99. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  116. package/coverage/lcov-report/automations/triggers.js.html +3 -3
  117. package/coverage/lcov-report/automations/utils.js.html +1 -1
  118. package/coverage/lcov-report/constants/index.html +1 -1
  119. package/coverage/lcov-report/constants/index.js.html +1 -1
  120. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  121. package/coverage/lcov-report/constants/screens.js.html +1 -1
  122. package/coverage/lcov-report/db/client.js.html +1 -1
  123. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  124. package/coverage/lcov-report/db/index.html +1 -1
  125. package/coverage/lcov-report/db/index.js.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  128. package/coverage/lcov-report/db/linkedRows/index.js.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -7
  130. package/coverage/lcov-report/db/newid.js.html +2 -2
  131. package/coverage/lcov-report/db/utils.js.html +4 -4
  132. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  133. package/coverage/lcov-report/events/index.html +1 -1
  134. package/coverage/lcov-report/events/index.js.html +1 -1
  135. package/coverage/lcov-report/events/utils.js.html +1 -1
  136. package/coverage/lcov-report/index.html +25 -25
  137. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  138. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  139. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  140. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  141. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  142. package/coverage/lcov-report/middleware/currentapp.js.html +15 -12
  143. package/coverage/lcov-report/middleware/index.html +11 -11
  144. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  145. package/coverage/lcov-report/middleware/publicApi.js.html +3 -3
  146. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  147. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  149. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  150. package/coverage/lcov-report/threads/automation.js.html +1 -1
  151. package/coverage/lcov-report/threads/index.html +1 -1
  152. package/coverage/lcov-report/threads/index.js.html +1 -1
  153. package/coverage/lcov-report/threads/query.js.html +1 -1
  154. package/coverage/lcov-report/threads/utils.js.html +1 -1
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  157. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  158. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  159. package/coverage/lcov-report/utilities/global.js.html +1 -1
  160. package/coverage/lcov-report/utilities/index.html +1 -1
  161. package/coverage/lcov-report/utilities/index.js.html +1 -1
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  163. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +24 -24
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +8 -8
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  170. package/coverage/lcov-report/utilities/security.js.html +1 -1
  171. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  174. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  176. package/coverage/lcov-report/utilities/users.js.html +1 -1
  177. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  178. package/coverage/lcov.info +415 -416
  179. package/dist/api/controllers/auth.js +1 -1
  180. package/dist/api/controllers/public/rows.js +2 -2
  181. package/dist/api/controllers/query/import/index.js +2 -1
  182. package/dist/api/controllers/query/import/sources/base/index.js +12 -1
  183. package/dist/api/controllers/query/import/sources/curl.js +2 -2
  184. package/dist/api/controllers/query/import/sources/openapi3.js +174 -0
  185. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  186. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  187. package/dist/api/controllers/row/internal.js +2 -1
  188. package/dist/api/controllers/static/index.js +2 -15
  189. package/dist/api/controllers/table/external.js +3 -3
  190. package/dist/api/index.js +3 -6
  191. package/dist/api/routes/analytics.js +2 -2
  192. package/dist/api/routes/static.js +1 -2
  193. package/dist/db/views/staticViews.js +2 -0
  194. package/dist/definitions/datasource.js +1 -0
  195. package/dist/integrations/base/sql.js +16 -9
  196. package/dist/integrations/dynamodb.js +3 -1
  197. package/dist/integrations/firebase.js +192 -0
  198. package/dist/integrations/index.js +3 -0
  199. package/dist/integrations/rest.js +2 -1
  200. package/dist/middleware/currentapp.js +7 -6
  201. package/dist/middleware/publicApi.js +2 -2
  202. package/dist/package.json +7 -8
  203. package/dist/tests/utilities/TestConfiguration.js +1 -1
  204. package/dist/tsconfig.tsbuildinfo +1 -1
  205. package/package.json +8 -9
  206. package/scripts/dev/manage.js +2 -1
  207. package/src/api/controllers/auth.js +1 -1
  208. package/src/api/controllers/public/rows.ts +2 -4
  209. package/src/api/controllers/query/import/index.ts +2 -1
  210. package/src/api/controllers/query/import/sources/base/index.ts +12 -2
  211. package/src/api/controllers/query/import/sources/curl.ts +2 -2
  212. package/src/api/controllers/query/import/sources/openapi3.ts +205 -0
  213. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  214. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  215. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  216. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  217. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  218. package/src/api/controllers/query/import/tests/index.spec.js +43 -0
  219. package/src/api/controllers/row/internal.js +5 -1
  220. package/src/api/controllers/static/index.js +2 -18
  221. package/src/api/controllers/table/external.js +3 -3
  222. package/src/api/index.js +3 -7
  223. package/src/api/routes/analytics.js +2 -2
  224. package/src/api/routes/static.js +1 -2
  225. package/src/api/routes/tests/misc.spec.js +2 -2
  226. package/src/db/views/staticViews.js +2 -0
  227. package/src/definitions/datasource.ts +1 -0
  228. package/src/definitions/openapi.ts +472 -472
  229. package/src/integrations/base/sql.ts +14 -9
  230. package/src/integrations/dynamodb.ts +3 -1
  231. package/src/integrations/firebase.ts +205 -0
  232. package/src/integrations/index.ts +3 -0
  233. package/src/integrations/rest.ts +2 -1
  234. package/src/integrations/tests/sql.spec.js +51 -0
  235. package/src/middleware/currentapp.js +7 -6
  236. package/src/middleware/publicApi.js +2 -2
  237. package/src/middleware/tests/authorized.spec.js +1 -3
  238. package/src/middleware/tests/currentapp.spec.js +4 -4
  239. package/src/tests/utilities/TestConfiguration.js +1 -1
  240. package/.eslintrc +0 -13
  241. package/builder/assets/index.3544c466.js +0 -1291
@@ -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
  }
@@ -85,7 +85,11 @@ exports.patch = async ctx => {
85
85
  const isUserTable = tableId === InternalTables.USER_METADATA
86
86
  let oldRow
87
87
  try {
88
- oldRow = await db.get(inputs._id)
88
+ let dbTable = await db.get(tableId)
89
+ oldRow = await outputProcessing(
90
+ dbTable,
91
+ await findRow(ctx, tableId, inputs._id)
92
+ )
89
93
  } catch (err) {
90
94
  if (isUserTable) {
91
95
  // don't include the rev, it'll be the global rev
@@ -5,7 +5,6 @@ const { resolve, join } = require("../../../utilities/centralPath")
5
5
  const uuid = require("uuid")
6
6
  const { ObjectStoreBuckets } = require("../../../constants")
7
7
  const { processString } = require("@budibase/string-templates")
8
- const { getAllApps } = require("@budibase/backend-core/db")
9
8
  const {
10
9
  loadHandlebarsFile,
11
10
  NODE_MODULES_PATH,
@@ -16,7 +15,7 @@ const { clientLibraryPath } = require("../../../utilities")
16
15
  const { upload } = require("../../../utilities/fileSystem")
17
16
  const { attachmentsRelativeURL } = require("../../../utilities")
18
17
  const { DocumentTypes } = require("../../../db/utils")
19
- const { getAppDB, updateAppId } = require("@budibase/backend-core/context")
18
+ const { getAppDB, getAppId } = require("@budibase/backend-core/context")
20
19
  const AWS = require("aws-sdk")
21
20
  const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1"
22
21
 
@@ -39,21 +38,6 @@ async function prepareUpload({ s3Key, bucket, metadata, file }) {
39
38
  }
40
39
  }
41
40
 
42
- async function getAppIdFromUrl(ctx) {
43
- // the "appId" component of the URL can be the id or the custom url
44
- let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`
45
-
46
- // search prod apps for a url that matches, exclude dev where id is always used
47
- const apps = await getAllApps({ dev: false })
48
- const app = apps.filter(
49
- a => a.url && a.url.toLowerCase() === possibleAppUrl
50
- )[0]
51
-
52
- const appId = app && app.appId ? app.appId : ctx.params.appId
53
- updateAppId(appId)
54
- return appId
55
- }
56
-
57
41
  exports.serveBuilder = async function (ctx) {
58
42
  let builderPath = resolve(TOP_LEVEL_PATH, "builder")
59
43
  await send(ctx, ctx.file, { root: builderPath })
@@ -81,10 +65,10 @@ exports.uploadFile = async function (ctx) {
81
65
  }
82
66
 
83
67
  exports.serveApp = async function (ctx) {
84
- let appId = await getAppIdFromUrl(ctx)
85
68
  const App = require("./templates/BudibaseApp.svelte").default
86
69
  const db = getAppDB({ skip_setup: true })
87
70
  const appInfo = await db.get(DocumentTypes.APP_METADATA)
71
+ let appId = getAppId()
88
72
 
89
73
  const { head, html, css } = App.render({
90
74
  title: appInfo.name,
@@ -118,8 +118,8 @@ function generateManyLinkSchema(datasource, column, table, relatedTable) {
118
118
  },
119
119
  }
120
120
  column.through = junctionTable._id
121
- column.throughFrom = primary
122
- column.throughTo = relatedPrimary
121
+ column.throughFrom = relatedPrimary
122
+ column.throughTo = primary
123
123
  column.fieldName = relatedPrimary
124
124
  return junctionTable
125
125
  }
@@ -146,7 +146,7 @@ function generateRelatedSchema(linkColumn, table, relatedTable, columnName) {
146
146
  // is many to many
147
147
  else {
148
148
  // don't need to copy through, already got it
149
- relatedSchema.fieldName = linkColumn.throughFrom
149
+ relatedSchema.fieldName = linkColumn.throughTo
150
150
  relatedSchema.throughTo = linkColumn.throughFrom
151
151
  relatedSchema.throughFrom = linkColumn.throughTo
152
152
  }
package/src/api/index.js CHANGED
@@ -3,7 +3,6 @@ const {
3
3
  buildAuthMiddleware,
4
4
  auditLog,
5
5
  buildTenancyMiddleware,
6
- buildAppTenancyMiddleware,
7
6
  } = require("@budibase/backend-core/auth")
8
7
  const currentApp = require("../middleware/currentapp")
9
8
  const compress = require("koa-compress")
@@ -14,6 +13,9 @@ const env = require("../environment")
14
13
 
15
14
  const router = new Router()
16
15
 
16
+ router.get("/health", ctx => (ctx.status = 200))
17
+ router.get("/version", ctx => (ctx.body = pkg.version))
18
+
17
19
  router
18
20
  .use(
19
21
  compress({
@@ -34,8 +36,6 @@ router
34
36
  }
35
37
  await next()
36
38
  })
37
- .use("/health", ctx => (ctx.status = 200))
38
- .use("/version", ctx => (ctx.body = pkg.version))
39
39
  // re-direct before any middlewares occur
40
40
  .redirect("/", "/builder")
41
41
  .use(
@@ -52,8 +52,6 @@ router
52
52
  })
53
53
  )
54
54
  .use(currentApp)
55
- // this middleware will try to use the app ID to determine the tenancy
56
- .use(buildAppTenancyMiddleware())
57
55
  .use(auditLog)
58
56
 
59
57
  // error handling middleware
@@ -74,8 +72,6 @@ router.use(async (ctx, next) => {
74
72
  }
75
73
  })
76
74
 
77
- router.get("/health", ctx => (ctx.status = 200))
78
-
79
75
  // authenticated routes
80
76
  for (let route of mainRoutes) {
81
77
  router.use(route.routes())
@@ -4,7 +4,7 @@ const controller = require("../controllers/analytics")
4
4
  const router = Router()
5
5
 
6
6
  router
7
- .get("/api/analytics", controller.isEnabled)
8
- .post("/api/analytics/ping", controller.endUserPing)
7
+ .get("/api/bbtel", controller.isEnabled)
8
+ .post("/api/bbtel/ping", controller.endUserPing)
9
9
 
10
10
  module.exports = router
@@ -44,8 +44,7 @@ router
44
44
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
45
45
  controller.uploadFile
46
46
  )
47
- // TODO: this likely needs to be secured in some way
48
- .get("/:appId/:path*", controller.serveApp)
47
+ .get("/app/:appUrl/:path*", controller.serveApp)
49
48
  .post(
50
49
  "/api/attachments/:datasourceId/url",
51
50
  authorized(PermissionTypes.TABLE, PermissionLevels.READ),
@@ -11,10 +11,10 @@ describe("run misc tests", () => {
11
11
  await config.init()
12
12
  })
13
13
 
14
- describe("/analytics", () => {
14
+ describe("/bbtel", () => {
15
15
  it("check if analytics enabled", async () => {
16
16
  const res = await request
17
- .get(`/api/analytics`)
17
+ .get(`/api/bbtel`)
18
18
  .set(config.defaultHeaders())
19
19
  .expect("Content-Type", /json/)
20
20
  .expect(200)
@@ -33,6 +33,7 @@ exports.createLinkView = async () => {
33
33
  if (doc.type === "link") {
34
34
  let doc1 = doc.doc1
35
35
  let doc2 = doc.doc2
36
+ // eslint-disable-next-line no-undef
36
37
  emit([doc1.tableId, doc1.rowId], {
37
38
  id: doc2.rowId,
38
39
  thisId: doc1.rowId,
@@ -40,6 +41,7 @@ exports.createLinkView = async () => {
40
41
  })
41
42
  // if linking to same table can't emit twice
42
43
  if (doc1.tableId !== doc2.tableId) {
44
+ // eslint-disable-next-line no-undef
43
45
  emit([doc2.tableId, doc2.rowId], {
44
46
  id: doc1.rowId,
45
47
  thisId: doc2.rowId,
@@ -48,6 +48,7 @@ export enum SourceNames {
48
48
  REST = "REST",
49
49
  ORACLE = "ORACLE",
50
50
  GOOGLE_SHEETS = "GOOGLE_SHEETS",
51
+ FIREBASE = "FIREBASE",
51
52
  }
52
53
 
53
54
  export enum IncludeRelationships {