@budibase/server 1.0.26 → 1.0.27-alpha.3

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/__mocks__/node-fetch.ts +3 -0
  2. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  3. package/builder/assets/index.2dc0d283.js +1343 -0
  4. package/builder/assets/{index.4fb3f887.css → index.5522fcd5.css} +1 -1
  5. package/builder/assets/{vendor.470042a4.js → vendor.f9faf6ab.js} +88 -88
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +736 -649
  8. package/coverage/coverage-final.json +24 -23
  9. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/automation.js.html +22 -10
  14. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  17. package/coverage/lcov-report/api/controllers/datasource.js.html +14 -14
  18. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/index.html +28 -43
  21. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.html +126 -0
  26. package/coverage/lcov-report/api/controllers/{query.js.html → query/index.js.html} +159 -27
  27. package/coverage/lcov-report/api/controllers/query/validation.js.html +203 -0
  28. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/index.html +16 -16
  32. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +7 -4
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -20
  36. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  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 +108 -9
  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 +18 -6
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  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/hosting.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.html +9 -9
  66. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/metadata.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 +11 -98
  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 +1 -1
  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 +32 -2
  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 +20 -20
  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 +5 -8
  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 +44 -11
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +22 -22
  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 +18 -18
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +15 -15
  123. package/coverage/lcov-report/db/index.js.html +3 -3
  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 +4 -4
  129. package/coverage/lcov-report/db/utils.js.html +91 -64
  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 +92 -77
  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 +2 -2
  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 +1 -1
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  143. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  146. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +19 -19
  149. package/coverage/lcov-report/threads/index.js.html +1 -1
  150. package/coverage/lcov-report/threads/query.js.html +63 -12
  151. package/coverage/lcov-report/threads/utils.js.html +1 -1
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  156. package/coverage/lcov-report/utilities/global.js.html +1 -1
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +66 -33
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +19 -19
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +46 -10
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  167. package/coverage/lcov-report/utilities/security.js.html +2 -2
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/users.js.html +1 -1
  170. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  171. package/coverage/lcov.info +1220 -1083
  172. package/dist/api/controllers/automation.js +7 -5
  173. package/dist/api/controllers/query/import/index.js +79 -0
  174. package/dist/api/controllers/query/import/sources/base/index.js +63 -0
  175. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  176. package/dist/api/controllers/query/import/sources/curl.js +90 -0
  177. package/dist/api/controllers/query/import/sources/openapi2.js +139 -0
  178. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  179. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  180. package/dist/api/controllers/{query.js → query/index.js} +42 -6
  181. package/dist/api/controllers/query/validation.js +37 -0
  182. package/dist/api/controllers/row/internalSearch.js +2 -1
  183. package/dist/api/controllers/row/utils.js +13 -6
  184. package/dist/api/controllers/user.js +37 -1
  185. package/dist/api/controllers/webhook.js +4 -0
  186. package/dist/api/routes/query.js +2 -32
  187. package/dist/api/routes/user.js +3 -1
  188. package/dist/automations/steps/outgoingWebhook.js +2 -3
  189. package/dist/automations/utils.js +10 -0
  190. package/dist/db/utils.js +8 -0
  191. package/dist/definitions/datasource.js +6 -1
  192. package/dist/integrations/rest.js +207 -117
  193. package/dist/package.json +10 -4
  194. package/dist/threads/query.js +14 -2
  195. package/dist/tsconfig.tsbuildinfo +1 -1
  196. package/dist/utilities/index.js +10 -0
  197. package/dist/utilities/rowProcessor/index.js +13 -0
  198. package/package.json +11 -5
  199. package/src/api/controllers/automation.js +8 -4
  200. package/src/api/controllers/query/import/index.ts +85 -0
  201. package/src/api/controllers/query/import/sources/base/index.ts +85 -0
  202. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  203. package/src/api/controllers/query/import/sources/curl.ts +94 -0
  204. package/src/api/controllers/query/import/sources/openapi2.ts +159 -0
  205. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +104 -0
  206. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  207. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  208. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  209. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  210. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  211. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  212. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  213. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  214. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  215. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  216. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  217. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  218. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  219. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +239 -0
  220. package/src/api/controllers/query/import/tests/index.spec.js +115 -0
  221. package/src/api/controllers/{query.js → query/index.js} +50 -6
  222. package/src/api/controllers/query/validation.js +41 -0
  223. package/src/api/controllers/row/internalSearch.js +2 -1
  224. package/src/api/controllers/row/utils.js +11 -8
  225. package/src/api/controllers/user.js +33 -0
  226. package/src/api/controllers/webhook.js +4 -0
  227. package/src/api/routes/query.js +5 -34
  228. package/src/api/routes/user.js +10 -0
  229. package/src/automations/steps/outgoingWebhook.js +2 -3
  230. package/src/automations/utils.js +11 -0
  231. package/src/db/utils.js +9 -0
  232. package/src/definitions/common.ts +2 -16
  233. package/src/definitions/datasource.ts +73 -1
  234. package/src/integrations/base/IntegrationBase.ts +4 -4
  235. package/src/integrations/oracle.ts +1 -1
  236. package/src/integrations/rest.ts +227 -137
  237. package/src/integrations/tests/rest.spec.js +167 -19
  238. package/src/threads/query.js +19 -2
  239. package/src/utilities/index.js +11 -0
  240. package/src/utilities/rowProcessor/index.js +12 -0
  241. package/builder/assets/index.8adef83f.js +0 -1316
@@ -9,10 +9,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  const { processString } = require("@budibase/string-templates");
12
- const CouchDB = require("../../db");
13
- const { generateQueryID, getQueryParams, isProdAppID, } = require("../../db/utils");
14
- const { BaseQueryVerbs } = require("../../constants");
15
- const { Thread, ThreadType } = require("../../threads");
12
+ const CouchDB = require("../../../db");
13
+ const { generateQueryID, getQueryParams, isProdAppID, } = require("../../../db/utils");
14
+ const { BaseQueryVerbs } = require("../../../constants");
15
+ const { Thread, ThreadType } = require("../../../threads");
16
+ const { save: saveDatasource } = require("../datasource");
17
+ const { RestImporter } = require("./import");
16
18
  const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 });
17
19
  // simple function to append "readable" to all read queries
18
20
  function enrichQueries(input) {
@@ -34,6 +36,38 @@ exports.fetch = function (ctx) {
34
36
  ctx.body = enrichQueries(body.rows.map(row => row.doc));
35
37
  });
36
38
  };
39
+ exports.import = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
40
+ const body = ctx.request.body;
41
+ const data = body.data;
42
+ const importer = new RestImporter(data);
43
+ yield importer.init();
44
+ let datasourceId;
45
+ if (!body.datasourceId) {
46
+ // construct new datasource
47
+ const info = yield importer.getInfo();
48
+ let datasource = {
49
+ type: "datasource",
50
+ source: "REST",
51
+ config: {
52
+ url: info.url,
53
+ defaultHeaders: [],
54
+ },
55
+ name: info.name,
56
+ };
57
+ // save the datasource
58
+ const datasourceCtx = Object.assign({}, ctx);
59
+ datasourceCtx.request.body.datasource = datasource;
60
+ yield saveDatasource(datasourceCtx);
61
+ datasourceId = datasourceCtx.body.datasource._id;
62
+ }
63
+ else {
64
+ // use existing datasource
65
+ datasourceId = body.datasourceId;
66
+ }
67
+ const importResult = yield importer.importQueries(ctx.appId, datasourceId);
68
+ ctx.body = Object.assign(Object.assign({}, importResult), { datasourceId });
69
+ ctx.status = 200;
70
+ });
37
71
  exports.save = function (ctx) {
38
72
  return __awaiter(this, void 0, void 0, function* () {
39
73
  const db = new CouchDB(ctx.appId);
@@ -78,7 +112,7 @@ function enrichQueryFields(fields, parameters = {}) {
78
112
  enrichedQuery.requestBody);
79
113
  }
80
114
  catch (err) {
81
- throw { message: `JSON Invalid - error: ${err}` };
115
+ // no json found, ignore
82
116
  }
83
117
  delete enrichedQuery.customData;
84
118
  }
@@ -104,7 +138,7 @@ exports.preview = function (ctx) {
104
138
  const { fields, parameters, queryVerb, transformer } = ctx.request.body;
105
139
  const enrichedQuery = yield enrichQueryFields(fields, parameters);
106
140
  try {
107
- const { rows, keys } = yield Runner.run({
141
+ const { rows, keys, info, extra } = yield Runner.run({
108
142
  datasource,
109
143
  queryVerb,
110
144
  query: enrichedQuery,
@@ -113,6 +147,8 @@ exports.preview = function (ctx) {
113
147
  ctx.body = {
114
148
  rows,
115
149
  schemaFields: [...new Set(keys)],
150
+ info,
151
+ extra,
116
152
  };
117
153
  }
118
154
  catch (err) {
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ const joiValidator = require("../../../middleware/joi-validator");
3
+ const Joi = require("joi");
4
+ exports.queryValidation = () => {
5
+ return Joi.object({
6
+ _id: Joi.string(),
7
+ _rev: Joi.string(),
8
+ name: Joi.string().required(),
9
+ fields: Joi.object().required(),
10
+ datasourceId: Joi.string().required(),
11
+ readable: Joi.boolean(),
12
+ parameters: Joi.array().items(Joi.object({
13
+ name: Joi.string(),
14
+ default: Joi.string().allow(""),
15
+ })),
16
+ queryVerb: Joi.string().allow().required(),
17
+ extra: Joi.object().optional(),
18
+ schema: Joi.object({}).required().unknown(true),
19
+ transformer: Joi.string().optional(),
20
+ flags: Joi.object().optional(),
21
+ });
22
+ };
23
+ exports.generateQueryValidation = () => {
24
+ // prettier-ignore
25
+ return joiValidator.body(exports.queryValidation());
26
+ };
27
+ exports.generateQueryPreviewValidation = () => {
28
+ // prettier-ignore
29
+ return joiValidator.body(Joi.object({
30
+ fields: Joi.object().required(),
31
+ queryVerb: Joi.string().allow().required(),
32
+ extra: Joi.object().optional(),
33
+ datasourceId: Joi.string().required(),
34
+ transformer: Joi.string().optional(),
35
+ parameters: Joi.object({}).required().unknown(true)
36
+ }));
37
+ };
@@ -172,7 +172,8 @@ class QueryBuilder {
172
172
  }
173
173
  if (this.query.equal) {
174
174
  build(this.query.equal, (key, value) => {
175
- if (!value) {
175
+ // 0 evaluates to false, which means we would return all rows if we don't check it
176
+ if (!value && value !== 0) {
176
177
  return null;
177
178
  }
178
179
  return `${key}:${builder.preprocess(value, allPreProcessingOpts)}`;
@@ -57,24 +57,31 @@ exports.validate = ({ appId, tableId, row, table }) => __awaiter(void 0, void 0,
57
57
  const errors = {};
58
58
  for (let fieldName of Object.keys(table.schema)) {
59
59
  const constraints = cloneDeep(table.schema[fieldName].constraints);
60
+ const type = table.schema[fieldName].type;
60
61
  // special case for options, need to always allow unselected (null)
61
- if (table.schema[fieldName].type ===
62
- (FieldTypes.OPTIONS || FieldTypes.ARRAY) &&
62
+ if ((type === FieldTypes.OPTIONS || type === FieldTypes.ARRAY) &&
63
63
  constraints.inclusion) {
64
64
  constraints.inclusion.push(null);
65
65
  }
66
66
  let res;
67
67
  // Validate.js doesn't seem to handle array
68
- if (table.schema[fieldName].type === FieldTypes.ARRAY &&
69
- row[fieldName] &&
70
- row[fieldName].length) {
68
+ if (type === FieldTypes.ARRAY && row[fieldName] && row[fieldName].length) {
71
69
  row[fieldName].map(val => {
72
70
  if (!constraints.inclusion.includes(val)) {
73
71
  errors[fieldName] = "Field not in list";
74
72
  }
75
73
  });
76
74
  }
77
- else if (table.schema[fieldName].type === FieldTypes.FORMULA) {
75
+ else if (type === FieldTypes.JSON && typeof row[fieldName] === "string") {
76
+ // this should only happen if there is an error
77
+ try {
78
+ JSON.parse(row[fieldName]);
79
+ }
80
+ catch (err) {
81
+ errors[fieldName] = [`Contains invalid JSON`];
82
+ }
83
+ }
84
+ else if (type === FieldTypes.FORMULA) {
78
85
  res = validateJs.single(processStringSync(table.schema[fieldName].formula, row), constraints);
79
86
  }
80
87
  else {
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  const CouchDB = require("../../db");
12
- const { generateUserMetadataID, getUserMetadataParams, } = require("../../db/utils");
12
+ const { generateUserMetadataID, getUserMetadataParams, generateUserFlagID, } = require("../../db/utils");
13
13
  const { InternalTables } = require("../../db/utils");
14
14
  const { getGlobalUsers, getRawGlobalUser } = require("../../utilities/global");
15
15
  const { getFullUser } = require("../../utilities/users");
@@ -189,3 +189,39 @@ exports.findMetadata = function (ctx) {
189
189
  ctx.body = yield getFullUser(ctx, ctx.params.id);
190
190
  });
191
191
  };
192
+ exports.setFlag = function (ctx) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ const userId = ctx.user._id;
195
+ const { flag, value } = ctx.request.body;
196
+ if (!flag) {
197
+ ctx.throw(400, "Must supply a 'flag' field in request body.");
198
+ }
199
+ const flagDocId = generateUserFlagID(userId);
200
+ const db = new CouchDB(ctx.appId);
201
+ let doc;
202
+ try {
203
+ doc = yield db.get(flagDocId);
204
+ }
205
+ catch (err) {
206
+ doc = { _id: flagDocId };
207
+ }
208
+ doc[flag] = value || true;
209
+ yield db.put(doc);
210
+ ctx.body = { message: "Flag set successfully" };
211
+ });
212
+ };
213
+ exports.getFlags = function (ctx) {
214
+ return __awaiter(this, void 0, void 0, function* () {
215
+ const userId = ctx.user._id;
216
+ const docId = generateUserFlagID(userId);
217
+ const db = new CouchDB(ctx.appId);
218
+ let doc;
219
+ try {
220
+ doc = yield db.get(docId);
221
+ }
222
+ catch (err) {
223
+ doc = { _id: docId };
224
+ }
225
+ ctx.body = doc;
226
+ });
227
+ };
@@ -65,6 +65,10 @@ exports.buildSchema = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
65
65
  let automation = yield db.get(webhook.action.target);
66
66
  const autoOutputs = automation.definition.trigger.schema.outputs;
67
67
  let properties = webhook.bodySchema.properties;
68
+ // reset webhook outputs
69
+ autoOutputs.properties = {
70
+ body: autoOutputs.properties.body,
71
+ };
68
72
  for (let prop of Object.keys(properties)) {
69
73
  autoOutputs.properties[prop] = {
70
74
  type: properties[prop].type,
@@ -2,44 +2,14 @@
2
2
  const Router = require("@koa/router");
3
3
  const queryController = require("../controllers/query");
4
4
  const authorized = require("../../middleware/authorized");
5
- const Joi = require("joi");
6
5
  const { PermissionLevels, PermissionTypes, BUILDER, } = require("@budibase/auth/permissions");
7
- const joiValidator = require("../../middleware/joi-validator");
8
6
  const { bodyResource, bodySubResource, paramResource, } = require("../../middleware/resourceId");
7
+ const { generateQueryPreviewValidation, generateQueryValidation, } = require("../controllers/query/validation");
9
8
  const router = Router();
10
- function generateQueryValidation() {
11
- // prettier-ignore
12
- return joiValidator.body(Joi.object({
13
- _id: Joi.string(),
14
- _rev: Joi.string(),
15
- name: Joi.string().required(),
16
- fields: Joi.object().required(),
17
- datasourceId: Joi.string().required(),
18
- readable: Joi.boolean(),
19
- parameters: Joi.array().items(Joi.object({
20
- name: Joi.string(),
21
- default: Joi.string().allow(""),
22
- })),
23
- queryVerb: Joi.string().allow().required(),
24
- extra: Joi.object().optional(),
25
- schema: Joi.object({}).required().unknown(true),
26
- transformer: Joi.string().optional(),
27
- }));
28
- }
29
- function generateQueryPreviewValidation() {
30
- // prettier-ignore
31
- return joiValidator.body(Joi.object({
32
- fields: Joi.object().required(),
33
- queryVerb: Joi.string().allow().required(),
34
- extra: Joi.object().optional(),
35
- datasourceId: Joi.string().required(),
36
- transformer: Joi.string().optional(),
37
- parameters: Joi.object({}).required().unknown(true)
38
- }));
39
- }
40
9
  router
41
10
  .get("/api/queries", authorized(BUILDER), queryController.fetch)
42
11
  .post("/api/queries", bodySubResource("datasourceId", "_id"), authorized(BUILDER), generateQueryValidation(), queryController.save)
12
+ .post("/api/queries/import", authorized(BUILDER), queryController.import)
43
13
  .post("/api/queries/preview", bodyResource("datasourceId"), authorized(BUILDER), generateQueryPreviewValidation(), queryController.preview)
44
14
  .get("/api/queries/:queryId", paramResource("queryId"), authorized(PermissionTypes.QUERY, PermissionLevels.READ), queryController.find)
45
15
  .post("/api/queries/:queryId", paramResource("queryId"), authorized(PermissionTypes.QUERY, PermissionLevels.WRITE), queryController.execute)
@@ -10,5 +10,7 @@ router
10
10
  .put("/api/users/metadata", authorized(PermissionTypes.USER, PermissionLevels.WRITE), controller.updateMetadata)
11
11
  .post("/api/users/metadata/self", authorized(PermissionTypes.USER, PermissionLevels.WRITE), controller.updateSelfMetadata)
12
12
  .delete("/api/users/metadata/:id", authorized(PermissionTypes.USER, PermissionLevels.WRITE), controller.destroyMetadata)
13
- .post("/api/users/metadata/sync/:id", authorized(PermissionTypes.USER, PermissionLevels.WRITE), controller.syncUser);
13
+ .post("/api/users/metadata/sync/:id", authorized(PermissionTypes.USER, PermissionLevels.WRITE), controller.syncUser)
14
+ .post("/api/users/flags", authorized(PermissionTypes.USER, PermissionLevels.WRITE), controller.setFlag)
15
+ .get("/api/users/flags", authorized(PermissionTypes.USER, PermissionLevels.READ), controller.getFlags);
14
16
  module.exports = router;
@@ -20,11 +20,10 @@ const RequestType = {
20
20
  };
21
21
  const BODY_REQUESTS = [RequestType.POST, RequestType.PUT, RequestType.PATCH];
22
22
  /**
23
- * Note, there is some functionality in this that is not currently exposed as it
24
- * is complex and maybe better to be opinionated here.
25
- * GET/DELETE requests cannot handle body elements so they will not be sent if configured.
23
+ * NOTE: this functionality is deprecated - it no longer should be used.
26
24
  */
27
25
  exports.definition = {
26
+ deprecated: true,
28
27
  name: "Outgoing webhook",
29
28
  tagline: "Send a {{inputs.requestMethod}} request",
30
29
  icon: "Send",
@@ -17,6 +17,7 @@ const newid = require("../db/newid");
17
17
  const { updateEntityMetadata } = require("../utilities");
18
18
  const { MetadataTypes } = require("../constants");
19
19
  const { getDeployedAppID } = require("@budibase/auth/db");
20
+ const { cloneDeep } = require("lodash/fp");
20
21
  const WH_STEP_ID = definitions.WEBHOOK.stepId;
21
22
  const CRON_STEP_ID = definitions.CRON.stepId;
22
23
  const Runner = new Thread(ThreadType.AUTOMATION);
@@ -43,6 +44,15 @@ exports.updateTestHistory = (appId, automation, history) => __awaiter(void 0, vo
43
44
  return metadata;
44
45
  });
45
46
  });
47
+ exports.removeDeprecated = definitions => {
48
+ const base = cloneDeep(definitions);
49
+ for (let key of Object.keys(base)) {
50
+ if (base[key].deprecated) {
51
+ delete base[key];
52
+ }
53
+ }
54
+ return base;
55
+ };
46
56
  // end the repetition and the job itself
47
57
  exports.disableAllCrons = (appId) => __awaiter(void 0, void 0, void 0, function* () {
48
58
  const promises = [];
package/dist/db/utils.js CHANGED
@@ -28,6 +28,7 @@ const DocumentTypes = {
28
28
  DEPLOYMENTS: "deployments",
29
29
  METADATA: "metadata",
30
30
  MEM_VIEW: "view",
31
+ USER_FLAG: "flag",
31
32
  };
32
33
  const ViewNames = {
33
34
  LINK: "by_link",
@@ -271,6 +272,13 @@ exports.getQueryParams = (datasourceId = null, otherProps = {}) => {
271
272
  }
272
273
  return getDocParams(DocumentTypes.QUERY, `${datasourceId}${SEPARATOR}`, otherProps);
273
274
  };
275
+ /**
276
+ * Generates a new flag document ID.
277
+ * @returns {string} The ID of the flag document that was generated.
278
+ */
279
+ exports.generateUserFlagID = userId => {
280
+ return `${DocumentTypes.USER_FLAG}${SEPARATOR}${userId}`;
281
+ };
274
282
  exports.generateMetadataID = (type, entityId) => {
275
283
  return `${DocumentTypes.METADATA}${SEPARATOR}${type}${SEPARATOR}${entityId}`;
276
284
  };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FilterTypes = exports.IncludeRelationships = exports.SourceNames = exports.DatasourceFieldTypes = exports.QueryTypes = exports.SortDirection = exports.Operation = void 0;
3
+ exports.AuthType = exports.FilterTypes = exports.IncludeRelationships = exports.SourceNames = exports.DatasourceFieldTypes = exports.QueryTypes = exports.SortDirection = exports.Operation = void 0;
4
4
  var Operation;
5
5
  (function (Operation) {
6
6
  Operation["CREATE"] = "CREATE";
@@ -66,3 +66,8 @@ var FilterTypes;
66
66
  FilterTypes["NOT_EMPTY"] = "notEmpty";
67
67
  FilterTypes["ONE_OF"] = "oneOf";
68
68
  })(FilterTypes = exports.FilterTypes || (exports.FilterTypes = {}));
69
+ var AuthType;
70
+ (function (AuthType) {
71
+ AuthType["BASIC"] = "basic";
72
+ AuthType["BEARER"] = "bearer";
73
+ })(AuthType = exports.AuthType || (exports.AuthType = {}));