@budibase/server 0.9.188 → 0.9.190-alpha.10

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 (314) hide show
  1. package/Dockerfile +7 -1
  2. package/__mocks__/mssql.ts +1 -1
  3. package/__mocks__/oracledb.ts +31 -0
  4. package/__mocks__/pg.ts +3 -0
  5. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  6. package/builder/assets/index.2bd3b345.js +1316 -0
  7. package/builder/assets/index.4fb3f887.css +1 -0
  8. package/builder/assets/oracle.66592424.png +0 -0
  9. package/builder/assets/vendor.470042a4.js +152 -0
  10. package/builder/assets/vendor.5e1fe644.css +1 -0
  11. package/builder/index.html +4 -4
  12. package/coverage/clover.xml +1608 -1191
  13. package/coverage/coverage-final.json +97 -93
  14. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  15. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  16. package/coverage/lcov-report/api/controllers/application.js.html +113 -80
  17. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  18. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  19. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  22. package/coverage/lcov-report/api/controllers/datasource.js.html +245 -41
  23. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  24. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  25. package/coverage/lcov-report/api/controllers/index.html +98 -98
  26. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  29. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  30. package/coverage/lcov-report/api/controllers/query.js.html +79 -229
  31. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  32. package/coverage/lcov-report/api/controllers/routing.js.html +29 -29
  33. package/coverage/lcov-report/api/controllers/row/external.js.html +17 -8
  34. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  35. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  37. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  38. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  39. package/coverage/lcov-report/api/controllers/screen.js.html +3 -3
  40. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  41. package/coverage/lcov-report/api/controllers/table/external.js.html +1001 -0
  42. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  43. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  44. package/coverage/lcov-report/api/controllers/table/internal.js.html +533 -0
  45. package/coverage/lcov-report/api/controllers/table/utils.js.html +175 -52
  46. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  48. package/coverage/lcov-report/api/controllers/view/exporters.js.html +19 -4
  49. package/coverage/lcov-report/api/controllers/view/index.html +22 -22
  50. package/coverage/lcov-report/api/controllers/view/index.js.html +52 -13
  51. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  52. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  53. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  54. package/coverage/lcov-report/api/index.html +1 -1
  55. package/coverage/lcov-report/api/index.js.html +5 -5
  56. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/index.html +4 -4
  69. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  75. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/row.js.html +536 -2
  78. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  81. package/coverage/lcov-report/api/routes/table.js.html +464 -2
  82. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  86. package/coverage/lcov-report/automations/actions.js.html +2 -2
  87. package/coverage/lcov-report/automations/automationUtils.js.html +4 -4
  88. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  89. package/coverage/lcov-report/automations/index.html +35 -50
  90. package/coverage/lcov-report/automations/index.js.html +2 -2
  91. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  96. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  98. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/index.html +14 -14
  100. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  102. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  108. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  118. package/coverage/lcov-report/automations/utils.js.html +46 -16
  119. package/coverage/lcov-report/constants/index.html +5 -5
  120. package/coverage/lcov-report/constants/index.js.html +87 -21
  121. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  122. package/coverage/lcov-report/constants/screens.js.html +2 -2
  123. package/coverage/lcov-report/db/client.js.html +2 -2
  124. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  125. package/coverage/lcov-report/db/index.html +2 -2
  126. package/coverage/lcov-report/db/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  128. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  130. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  131. package/coverage/lcov-report/db/newid.js.html +4 -4
  132. package/coverage/lcov-report/db/utils.js.html +75 -75
  133. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  134. package/coverage/lcov-report/events/index.html +6 -6
  135. package/coverage/lcov-report/events/index.js.html +1 -1
  136. package/coverage/lcov-report/events/utils.js.html +5 -5
  137. package/coverage/lcov-report/index.html +106 -91
  138. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  139. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  140. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  141. package/coverage/lcov-report/middleware/authorized.js.html +19 -16
  142. package/coverage/lcov-report/middleware/builder.js.html +22 -13
  143. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  144. package/coverage/lcov-report/middleware/index.html +23 -23
  145. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  146. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  147. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  149. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  150. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +90 -33
  151. package/coverage/lcov-report/threads/index.html +141 -0
  152. package/coverage/lcov-report/threads/index.js.html +278 -0
  153. package/coverage/lcov-report/threads/query.js.html +278 -0
  154. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  155. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  156. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  157. package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
  158. package/coverage/lcov-report/utilities/global.js.html +38 -23
  159. package/coverage/lcov-report/utilities/index.html +48 -48
  160. package/coverage/lcov-report/utilities/index.js.html +49 -16
  161. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +31 -10
  162. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  163. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.js.html +2 -2
  165. package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
  166. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  167. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  168. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  169. package/coverage/lcov-report/utilities/security.js.html +3 -3
  170. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  171. package/coverage/lcov-report/utilities/users.js.html +1 -1
  172. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  173. package/coverage/lcov.info +2687 -1942
  174. package/dist/api/controllers/application.js +16 -6
  175. package/dist/api/controllers/auth.js +3 -3
  176. package/dist/api/controllers/datasource.js +67 -16
  177. package/dist/api/controllers/deploy/index.js +2 -0
  178. package/dist/api/controllers/dev.js +4 -1
  179. package/dist/api/controllers/query.js +32 -62
  180. package/dist/api/controllers/row/ExternalRequest.js +83 -36
  181. package/dist/api/controllers/row/external.js +3 -1
  182. package/dist/api/controllers/row/utils.js +6 -12
  183. package/dist/api/controllers/table/external.js +249 -0
  184. package/dist/api/controllers/table/index.js +49 -123
  185. package/dist/api/controllers/table/internal.js +146 -0
  186. package/dist/api/controllers/table/utils.js +62 -28
  187. package/dist/api/controllers/user.js +123 -11
  188. package/dist/api/controllers/view/exporters.js +4 -0
  189. package/dist/api/controllers/view/index.js +14 -2
  190. package/dist/api/routes/query.js +1 -1
  191. package/dist/api/routes/row.js +178 -0
  192. package/dist/api/routes/table.js +150 -1
  193. package/dist/api/routes/user.js +2 -1
  194. package/dist/app.js +2 -11
  195. package/dist/automations/bullboard.js +37 -10
  196. package/dist/automations/triggers.js +7 -3
  197. package/dist/automations/utils.js +11 -2
  198. package/dist/constants/index.js +19 -0
  199. package/dist/definitions/datasource.js +17 -1
  200. package/dist/environment.js +13 -0
  201. package/dist/integrations/base/IntegrationBase.js +2 -0
  202. package/dist/integrations/base/datasourcePlus.js +2 -0
  203. package/dist/integrations/base/sql.js +350 -177
  204. package/dist/integrations/base/sqlTable.js +143 -0
  205. package/dist/integrations/base/utils.js +30 -0
  206. package/dist/integrations/index.js +6 -0
  207. package/dist/integrations/microsoftSqlServer.js +117 -9
  208. package/dist/integrations/mysql.js +16 -85
  209. package/dist/integrations/oracle.js +367 -0
  210. package/dist/integrations/postgres.js +35 -28
  211. package/dist/integrations/utils.js +71 -9
  212. package/dist/middleware/authorized.js +2 -1
  213. package/dist/middleware/builder.js +4 -1
  214. package/dist/package.json +18 -9
  215. package/dist/tests/utilities/TestConfiguration.js +2 -1
  216. package/dist/{automations/thread.js → threads/automation.js} +26 -8
  217. package/dist/threads/index.js +64 -0
  218. package/dist/threads/query.js +64 -0
  219. package/dist/tsconfig.tsbuildinfo +1 -1
  220. package/dist/utilities/csvParser.js +46 -5
  221. package/dist/utilities/global.js +6 -2
  222. package/dist/utilities/index.js +11 -0
  223. package/dist/utilities/queue/inMemoryQueue.js +8 -0
  224. package/dist/utilities/scriptRunner.js +4 -1
  225. package/package.json +19 -10
  226. package/scripts/dev/manage.js +1 -0
  227. package/scripts/docs/README.md +31 -0
  228. package/scripts/docs/generate.js +74 -0
  229. package/scripts/docs/toSwagger.js +320 -0
  230. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  231. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  232. package/scripts/integrations/mssql/data/setup.sql +54 -0
  233. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  234. package/scripts/integrations/mssql/reset.sh +3 -0
  235. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  236. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  237. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  238. package/scripts/integrations/oracle/oracle.md +90 -0
  239. package/scripts/integrations/postgres/docker-compose.yml +3 -3
  240. package/scripts/likeCypress.ts +33 -0
  241. package/src/api/controllers/application.js +18 -7
  242. package/src/api/controllers/auth.js +3 -0
  243. package/src/api/controllers/datasource.js +84 -16
  244. package/src/api/controllers/deploy/index.js +2 -0
  245. package/src/api/controllers/dev.js +4 -1
  246. package/src/api/controllers/query.js +35 -85
  247. package/src/api/controllers/row/ExternalRequest.ts +99 -38
  248. package/src/api/controllers/row/external.js +4 -1
  249. package/src/api/controllers/row/utils.js +8 -11
  250. package/src/api/controllers/table/external.js +307 -0
  251. package/src/api/controllers/table/index.js +47 -137
  252. package/src/api/controllers/table/internal.js +151 -0
  253. package/src/api/controllers/table/utils.js +74 -33
  254. package/src/api/controllers/user.js +132 -13
  255. package/src/api/controllers/view/exporters.js +5 -0
  256. package/src/api/controllers/view/index.js +15 -2
  257. package/src/api/routes/query.js +1 -0
  258. package/src/api/routes/row.js +178 -0
  259. package/src/api/routes/table.js +154 -0
  260. package/src/api/routes/tests/application.spec.js +0 -2
  261. package/src/api/routes/tests/datasource.spec.js +2 -2
  262. package/src/api/routes/tests/misc.spec.js +5 -1
  263. package/src/api/routes/tests/query.spec.js +38 -9
  264. package/src/api/routes/tests/screen.spec.js +1 -1
  265. package/src/api/routes/user.js +5 -0
  266. package/src/app.ts +2 -10
  267. package/src/automations/bullboard.js +28 -11
  268. package/src/automations/tests/automation.spec.js +3 -4
  269. package/src/automations/triggers.js +7 -3
  270. package/src/automations/utils.js +12 -2
  271. package/src/constants/index.js +22 -0
  272. package/src/definitions/common.ts +7 -1
  273. package/src/definitions/datasource.ts +21 -3
  274. package/src/environment.js +15 -0
  275. package/src/integrations/airtable.ts +2 -1
  276. package/src/integrations/arangodb.ts +2 -1
  277. package/src/integrations/base/IntegrationBase.ts +6 -0
  278. package/src/integrations/base/datasourcePlus.ts +9 -0
  279. package/src/integrations/base/sql.ts +375 -218
  280. package/src/integrations/base/sqlTable.ts +180 -0
  281. package/src/integrations/base/utils.ts +22 -0
  282. package/src/integrations/couchdb.ts +2 -1
  283. package/src/integrations/dynamodb.ts +2 -1
  284. package/src/integrations/elasticsearch.ts +2 -1
  285. package/src/integrations/index.ts +7 -0
  286. package/src/integrations/microsoftSqlServer.ts +145 -13
  287. package/src/integrations/mongodb.ts +2 -1
  288. package/src/integrations/mysql.ts +23 -95
  289. package/src/integrations/oracle.ts +464 -0
  290. package/src/integrations/postgres.ts +45 -35
  291. package/src/integrations/rest.ts +2 -1
  292. package/src/integrations/s3.ts +2 -1
  293. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  294. package/src/integrations/tests/oracle.spec.js +94 -0
  295. package/src/integrations/tests/postgres.spec.js +4 -0
  296. package/src/integrations/utils.ts +78 -8
  297. package/src/middleware/authorized.js +2 -1
  298. package/src/middleware/builder.js +4 -1
  299. package/src/tests/utilities/TestConfiguration.js +2 -1
  300. package/src/{automations/thread.js → threads/automation.js} +27 -8
  301. package/src/threads/index.js +66 -0
  302. package/src/threads/query.js +66 -0
  303. package/src/utilities/csvParser.js +48 -5
  304. package/src/utilities/global.js +7 -2
  305. package/src/utilities/index.js +11 -0
  306. package/src/utilities/queue/inMemoryQueue.js +7 -0
  307. package/src/utilities/scriptRunner.js +4 -1
  308. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  309. package/src/utilities/tests/csvParser.spec.js +3 -0
  310. package/tsconfig.json +1 -1
  311. package/builder/assets/index.550fdba7.js +0 -201
  312. package/builder/assets/index.7469e1e4.css +0 -29
  313. package/builder/assets/vendor.278a305c.js +0 -9
  314. package/builder/assets/vendor.d75d5eb7.css +0 -1
@@ -0,0 +1,24 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ if [ "$1" = '/opt/mssql/bin/sqlservr' ]; then
5
+ # If this is the container's first run, initialize the application database
6
+ if [ ! -f /tmp/app-initialized ]; then
7
+ # Initialize the application database asynchronously in a background process. This allows a) the SQL Server process to be the main process in the container, which allows graceful shutdown and other goodies, and b) us to only start the SQL Server process once, as opposed to starting, stopping, then starting it again.
8
+ function initialize_app_database() {
9
+ # Wait a bit for SQL Server to start. SQL Server's process doesn't provide a clever way to check if it's up or not, and it needs to be up before we can import the application database
10
+ sleep 30s
11
+
12
+ echo "RUNNING BUDIBASE SETUP"
13
+
14
+ #run the setup script to create the DB and the schema in the DB
15
+ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Passw0rd -i setup.sql
16
+
17
+ # Note that the container has been initialized so future starts won't wipe changes to the data
18
+ touch /tmp/app-initialized
19
+ }
20
+ initialize_app_database &
21
+ fi
22
+ fi
23
+
24
+ exec "$@"
@@ -0,0 +1,54 @@
1
+ USE master;
2
+
3
+ IF OBJECT_ID ('dbo.products', 'U') IS NOT NULL
4
+ DROP TABLE products;
5
+ GO
6
+ CREATE TABLE products
7
+ (
8
+ id int IDENTITY(1,1),
9
+ name varchar (20),
10
+ description varchar(30),
11
+ CONSTRAINT pk_products PRIMARY KEY NONCLUSTERED (id)
12
+ );
13
+
14
+ IF OBJECT_ID ('dbo.tasks', 'U') IS NOT NULL
15
+ DROP TABLE tasks;
16
+ GO
17
+ CREATE TABLE tasks
18
+ (
19
+ taskid int IDENTITY(1,1),
20
+ taskname varchar (20),
21
+ productid int,
22
+ CONSTRAINT pk_tasks PRIMARY KEY NONCLUSTERED (taskid),
23
+ CONSTRAINT fk_products FOREIGN KEY (productid) REFERENCES products (id),
24
+ );
25
+
26
+ IF OBJECT_ID ('dbo.people', 'U') IS NOT NULL
27
+ DROP TABLE people;
28
+ GO
29
+ CREATE TABLE people
30
+ (
31
+ name varchar(30),
32
+ age varchar(20),
33
+ CONSTRAINT pk_people PRIMARY KEY NONCLUSTERED (name, age)
34
+ );
35
+
36
+ INSERT products
37
+ (name, description)
38
+ VALUES
39
+ ('Bananas', 'Fruit thing');
40
+
41
+ INSERT products
42
+ (name, description)
43
+ VALUES
44
+ ('Meat', 'Animal thing');
45
+
46
+ INSERT tasks
47
+ (taskname, productid)
48
+ VALUES
49
+ ('Processing', 1);
50
+
51
+ INSERT people
52
+ (name, age)
53
+ VALUES
54
+ ('Bob', '30');
@@ -0,0 +1,12 @@
1
+ version: "3.8"
2
+ services:
3
+ # password: Passw0rd
4
+ # user: sa
5
+ # database: master
6
+ mssql:
7
+ image: bb/mssql
8
+ build:
9
+ context: .
10
+ dockerfile: data/Dockerfile
11
+ ports:
12
+ - "1433:1433"
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ docker-compose down
3
+ docker volume prune -f
@@ -0,0 +1,19 @@
1
+ # For more information see:
2
+ # https://container-registry.oracle.com/
3
+ # - Database > Express
4
+ version: "3.8"
5
+ services:
6
+ db:
7
+ restart: always
8
+ platform: linux/x86_64
9
+ image: container-registry.oracle.com/database/express:18.4.0-xe
10
+ environment:
11
+ ORACLE_PWD: oracle
12
+ ports:
13
+ - 1521:1521
14
+ - 5500:5500
15
+ volumes:
16
+ - oracle_data:/opt/oracle/oradata
17
+
18
+ volumes:
19
+ oracle_data:
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+
3
+ # Must be root to continue
4
+ if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
5
+
6
+ # Allow for re-runs
7
+ rm -rf /opt/oracle
8
+
9
+ echo "Installing oracle instant client"
10
+
11
+ # copy and unzip package
12
+ mkdir -p /opt/oracle
13
+ cp scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip /opt/oracle
14
+ cd /opt/oracle
15
+ unzip -qq basiclite-21.4.zip -d .
16
+ rm *.zip
17
+ mv instantclient* instantclient
18
+
19
+ # update runtime link path
20
+ sh -c "echo /opt/oracle/instantclient > /etc/ld.so.conf.d/oracle-instantclient.conf"
21
+ ldconfig /etc/ld.so.conf.d
22
+
23
+ echo "Installation complete"
@@ -0,0 +1,90 @@
1
+ # Installation
2
+
3
+ ## Database
4
+
5
+ **Important**
6
+ - Oracle database is supported only on **x86-64 architecture**
7
+ - Oracle database is **not supported on Mac ARM architecture** (either via docker or linux virtualization)
8
+
9
+ To install oracle express edition simply run `docker-compose up`
10
+
11
+ - A single instance pluggable database (PDB) will be created named `xepdb`
12
+ - The default password is configured in the compose file as `oracle`
13
+ - The `system`, `sys` and `pdbadmin` users all share this password
14
+
15
+ ## Instant Client
16
+
17
+ Before oracle can be connected to from nodejs, the oracle client must be installed.
18
+ For more information see https://www.oracle.com/database/technologies/instant-client/downloads.html
19
+
20
+ **Important**
21
+ - Oracle client is supported only on **x86-64 architecture**
22
+ - Oracle client is **not supported on Mac ARM architecture**
23
+
24
+ ### Linux
25
+ Run the provided install script for linux from the `server` root path:
26
+
27
+ ```bash
28
+ sudo /bin/bash -e scripts/integrations/oracle/instantclient/linux/x86-64/install.sh
29
+ ```
30
+ For more information see: https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html#ic_x64_inst
31
+
32
+ ### Mac
33
+ **This has not yet been tested**
34
+
35
+ See: https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html#ic_osx_inst
36
+
37
+ # Management
38
+ To connect to oracle sql command line:
39
+
40
+ ```bash
41
+ docker exec -it oracle-xe sqlplus -l system/oracle@localhost/xepdb1
42
+ ```
43
+
44
+ To create a new schema (where a user is the same as a schema in oracle) named `sales`:
45
+
46
+ ```sql
47
+ define USERNAME = sales
48
+
49
+ create user &USERNAME;
50
+
51
+ alter user &USERNAME
52
+ default tablespace users
53
+ temporary tablespace temp
54
+ quota unlimited on users;
55
+
56
+ grant create session,
57
+ create view,
58
+ create sequence,
59
+ create procedure,
60
+ create table,
61
+ create trigger,
62
+ create type,
63
+ create materialized view
64
+ to &USERNAME;
65
+ ```
66
+
67
+ To set the password for the sales schema use:
68
+
69
+ ```sql
70
+ define USERNAME = sales
71
+ define PASSWORD = sales
72
+
73
+ alter user &USERNAME identified by &PASSWORD;
74
+ ```
75
+
76
+ As before the database schema can now be connected to using:
77
+ ```bash
78
+ docker exec -it oracle-xe sqlplus -l sales/sales@localhost:1521/xepdb1
79
+ ```
80
+
81
+ ## HR Schema
82
+
83
+ The `HR` schema is populated with dummy data by default in oracle for testing purposes.
84
+ To connect to the HR schema first update the user password and unlock the account by performing
85
+ ```sql
86
+ ALTER USER hr ACCOUNT UNLOCK;
87
+ ALTER USER hr IDENTIFIED BY hr
88
+ ```
89
+ You should now be able to connect to the hr schema using the credentials hr/hr
90
+
@@ -11,7 +11,7 @@ services:
11
11
  ports:
12
12
  - "5432:5432"
13
13
  volumes:
14
- #- pg_data:/var/lib/postgresql/data/
14
+ - pg_data:/var/lib/postgresql/data/
15
15
  - ./init.sql:/docker-entrypoint-initdb.d/init.sql
16
16
 
17
17
  pgadmin:
@@ -24,5 +24,5 @@ services:
24
24
  ports:
25
25
  - "5050:80"
26
26
 
27
- #volumes:
28
- # pg_data:
27
+ volumes:
28
+ pg_data:
@@ -0,0 +1,33 @@
1
+ /******************************************************
2
+ * This script just makes it easy to re-create *
3
+ * a cypress like environment for testing the backend *
4
+ ******************************************************/
5
+ const path = require("path")
6
+ const tmpdir = path.join(require("os").tmpdir(), ".budibase")
7
+
8
+ const MAIN_PORT = "10001"
9
+ const WORKER_PORT = "10002"
10
+
11
+ // @ts-ignore
12
+ process.env.PORT = MAIN_PORT
13
+ process.env.BUDIBASE_API_KEY = "6BE826CB-6B30-4AEC-8777-2E90464633DE"
14
+ process.env.NODE_ENV = "cypress"
15
+ process.env.ENABLE_ANALYTICS = "false"
16
+ process.env.JWT_SECRET = "budibase"
17
+ process.env.COUCH_URL = `leveldb://${tmpdir}/.data/`
18
+ process.env.SELF_HOSTED = "1"
19
+ process.env.WORKER_URL = `http://localhost:${WORKER_PORT}/`
20
+ process.env.MINIO_URL = `http://localhost:${MAIN_PORT}/`
21
+ process.env.MINIO_ACCESS_KEY = "budibase"
22
+ process.env.MINIO_SECRET_KEY = "budibase"
23
+ process.env.COUCH_DB_USER = "budibase"
24
+ process.env.COUCH_DB_PASSWORD = "budibase"
25
+ process.env.INTERNAL_API_KEY = "budibase"
26
+ process.env.ALLOW_DEV_AUTOMATIONS = "1"
27
+
28
+ // don't make this a variable or top level require
29
+ // it will cause environment module to be loaded prematurely
30
+ const server = require("../src/app")
31
+ process.env.PORT = WORKER_PORT
32
+ const worker = require("../../worker/src/index")
33
+ process.env.PORT = MAIN_PORT
@@ -15,14 +15,12 @@ const {
15
15
  generateAppID,
16
16
  getLayoutParams,
17
17
  getScreenParams,
18
- generateScreenID,
19
18
  generateDevAppID,
20
19
  DocumentTypes,
21
20
  AppStatus,
22
21
  } = require("../../db/utils")
23
22
  const { BUILTIN_ROLE_IDS, AccessController } = require("@budibase/auth/roles")
24
23
  const { BASE_LAYOUTS } = require("../../constants/layouts")
25
- const { createHomeScreen } = require("../../constants/screens")
26
24
  const { cloneDeep } = require("lodash/fp")
27
25
  const { processObject } = require("@budibase/string-templates")
28
26
  const {
@@ -44,6 +42,9 @@ const {
44
42
  revertClientLibrary,
45
43
  } = require("../../utilities/fileSystem/clientLibrary")
46
44
  const { getTenantId, isMultiTenant } = require("@budibase/auth/tenancy")
45
+ const { syncGlobalUsers } = require("./user")
46
+ const { app: appCache } = require("@budibase/auth/cache")
47
+ const { cleanupAutomations } = require("../../automations/utils")
47
48
 
48
49
  const URL_REGEX_SLASH = /\/|\\/g
49
50
 
@@ -253,6 +254,7 @@ exports.create = async ctx => {
253
254
  await createApp(appId)
254
255
  }
255
256
 
257
+ await appCache.invalidateAppMetadata(appId, newApplication)
256
258
  ctx.status = 200
257
259
  ctx.body = newApplication
258
260
  }
@@ -316,8 +318,12 @@ exports.delete = async ctx => {
316
318
  if (!env.isTest() && !ctx.query.unpublish) {
317
319
  await deleteApp(ctx.params.appId)
318
320
  }
321
+ if (ctx.query && ctx.query.unpublish) {
322
+ await cleanupAutomations(ctx.params.appId)
323
+ }
319
324
  // make sure the app/role doesn't stick around after the app has been deleted
320
325
  await removeAppFromUserRoles(ctx, ctx.params.appId)
326
+ await appCache.invalidateAppMetadata(ctx.params.appId)
321
327
 
322
328
  ctx.status = 200
323
329
  ctx.body = result
@@ -328,6 +334,8 @@ exports.sync = async (ctx, next) => {
328
334
  if (!isDevAppID(appId)) {
329
335
  ctx.throw(400, "This action cannot be performed for production apps")
330
336
  }
337
+
338
+ // replicate prod to dev
331
339
  const prodAppId = getDeployedAppID(appId)
332
340
 
333
341
  try {
@@ -357,6 +365,10 @@ exports.sync = async (ctx, next) => {
357
365
  } catch (err) {
358
366
  error = err
359
367
  }
368
+
369
+ // sync the users
370
+ await syncGlobalUsers(appId)
371
+
360
372
  if (error) {
361
373
  ctx.throw(400, error)
362
374
  } else {
@@ -380,7 +392,10 @@ const updateAppPackage = async (ctx, appPackage, appId) => {
380
392
  // Redis, shouldn't ever store it
381
393
  delete newAppPackage.lockedBy
382
394
 
383
- return await db.put(newAppPackage)
395
+ const response = await db.put(newAppPackage)
396
+ // remove any cached metadata, so that it will be updated
397
+ await appCache.invalidateAppMetadata(appId)
398
+ return response
384
399
  }
385
400
 
386
401
  const createEmptyAppPackage = async (ctx, app) => {
@@ -392,9 +407,5 @@ const createEmptyAppPackage = async (ctx, app) => {
392
407
  screensAndLayouts.push(await processObject(cloned, app))
393
408
  }
394
409
 
395
- const homeScreen = createHomeScreen(app)
396
- homeScreen._id = generateScreenID()
397
- screensAndLayouts.push(homeScreen)
398
-
399
410
  await db.bulkDocs(screensAndLayouts)
400
411
  }
@@ -14,6 +14,8 @@ exports.fetchSelf = async ctx => {
14
14
  }
15
15
 
16
16
  const user = await getFullUser(ctx, userId)
17
+ // this shouldn't be returned by the app self
18
+ delete user.roles
17
19
 
18
20
  if (appId) {
19
21
  const db = new CouchDB(appId)
@@ -36,6 +38,7 @@ exports.fetchSelf = async ctx => {
36
38
  // user has a role of some sort, return them
37
39
  else if (err.status === 404) {
38
40
  const metadata = {
41
+ ...user,
39
42
  _id: userId,
40
43
  }
41
44
  const dbResp = await db.put(metadata)
@@ -7,8 +7,9 @@ const {
7
7
  BudibaseInternalDB,
8
8
  getTableParams,
9
9
  } = require("../../db/utils")
10
+ const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
10
11
  const { integrations } = require("../../integrations")
11
- const { makeExternalQuery } = require("./row/utils")
12
+ const { getDatasourceAndQuery } = require("./row/utils")
12
13
 
13
14
  exports.fetch = async function (ctx) {
14
15
  const database = new CouchDB(ctx.appId)
@@ -43,13 +44,17 @@ exports.buildSchemaFromDb = async function (ctx) {
43
44
  const db = new CouchDB(ctx.appId)
44
45
  const datasource = await db.get(ctx.params.datasourceId)
45
46
 
46
- const tables = await buildSchemaHelper(datasource)
47
+ const { tables, error } = await buildSchemaHelper(datasource)
47
48
  datasource.entities = tables
48
49
 
49
- const response = await db.put(datasource)
50
- datasource._rev = response.rev
50
+ const dbResp = await db.put(datasource)
51
+ datasource._rev = dbResp.rev
51
52
 
52
- ctx.body = datasource
53
+ const response = { datasource }
54
+ if (error) {
55
+ response.error = error
56
+ }
57
+ ctx.body = response
53
58
  }
54
59
 
55
60
  exports.update = async function (ctx) {
@@ -71,7 +76,7 @@ exports.update = async function (ctx) {
71
76
 
72
77
  ctx.status = 200
73
78
  ctx.message = "Datasource saved successfully."
74
- ctx.body = datasource
79
+ ctx.body = { datasource }
75
80
  }
76
81
 
77
82
  exports.save = async function (ctx) {
@@ -85,13 +90,15 @@ exports.save = async function (ctx) {
85
90
  ...ctx.request.body.datasource,
86
91
  }
87
92
 
93
+ let schemaError = null
88
94
  if (fetchSchema) {
89
- let tables = await buildSchemaHelper(datasource)
95
+ const { tables, error } = await buildSchemaHelper(datasource)
96
+ schemaError = error
90
97
  datasource.entities = tables
91
98
  }
92
99
 
93
- const response = await db.put(datasource)
94
- datasource._rev = response.rev
100
+ const dbResp = await db.put(datasource)
101
+ datasource._rev = dbResp.rev
95
102
 
96
103
  // Drain connection pools when configuration is changed
97
104
  if (datasource.source) {
@@ -101,17 +108,27 @@ exports.save = async function (ctx) {
101
108
  }
102
109
  }
103
110
 
104
- ctx.status = 200
105
- ctx.message = "Datasource saved successfully."
106
- ctx.body = datasource
111
+ const response = { datasource }
112
+ if (schemaError) {
113
+ response.error = schemaError
114
+ }
115
+ ctx.body = response
107
116
  }
108
117
 
109
118
  exports.destroy = async function (ctx) {
110
119
  const db = new CouchDB(ctx.appId)
111
120
 
112
121
  // Delete all queries for the datasource
113
- const rows = await db.allDocs(getQueryParams(ctx.params.datasourceId, null))
114
- await db.bulkDocs(rows.rows.map(row => ({ ...row.doc, _deleted: true })))
122
+ const queries = await db.allDocs(
123
+ getQueryParams(ctx.params.datasourceId, null)
124
+ )
125
+ await db.bulkDocs(
126
+ queries.rows.map(row => ({
127
+ _id: row.id,
128
+ _rev: row.value.rev,
129
+ _deleted: true,
130
+ }))
131
+ )
115
132
 
116
133
  // delete the datasource
117
134
  await db.remove(ctx.params.datasourceId, ctx.params.revId)
@@ -129,12 +146,29 @@ exports.find = async function (ctx) {
129
146
  exports.query = async function (ctx) {
130
147
  const queryJson = ctx.request.body
131
148
  try {
132
- ctx.body = await makeExternalQuery(ctx.appId, queryJson)
149
+ ctx.body = await getDatasourceAndQuery(ctx.appId, queryJson)
133
150
  } catch (err) {
134
151
  ctx.throw(400, err)
135
152
  }
136
153
  }
137
154
 
155
+ function getErrorTables(errors, errorType) {
156
+ return Object.entries(errors)
157
+ .filter(entry => entry[1] === errorType)
158
+ .map(([name]) => name)
159
+ }
160
+
161
+ function updateError(error, newError, tables) {
162
+ if (!error) {
163
+ error = ""
164
+ }
165
+ if (error.length > 0) {
166
+ error += "\n"
167
+ }
168
+ error += `${newError} ${tables.join(", ")}`
169
+ return error
170
+ }
171
+
138
172
  const buildSchemaHelper = async datasource => {
139
173
  const Connector = integrations[datasource.source]
140
174
 
@@ -143,5 +177,39 @@ const buildSchemaHelper = async datasource => {
143
177
  await connector.buildSchema(datasource._id, datasource.entities)
144
178
  datasource.entities = connector.tables
145
179
 
146
- return connector.tables
180
+ // make sure they all have a display name selected
181
+ for (let entity of Object.values(datasource.entities)) {
182
+ if (entity.primaryDisplay) {
183
+ continue
184
+ }
185
+ const notAutoColumn = Object.values(entity.schema).find(
186
+ schema => !schema.autocolumn
187
+ )
188
+ if (notAutoColumn) {
189
+ entity.primaryDisplay = notAutoColumn.name
190
+ }
191
+ }
192
+
193
+ const errors = connector.schemaErrors
194
+ let error = null
195
+ if (errors && Object.keys(errors).length > 0) {
196
+ const noKey = getErrorTables(errors, BuildSchemaErrors.NO_KEY)
197
+ const invalidCol = getErrorTables(errors, BuildSchemaErrors.INVALID_COLUMN)
198
+ if (noKey.length) {
199
+ error = updateError(
200
+ error,
201
+ "No primary key constraint found for the following:",
202
+ noKey
203
+ )
204
+ }
205
+ if (invalidCol.length) {
206
+ const invalidCols = Object.values(InvalidColumns).join(", ")
207
+ error = updateError(
208
+ error,
209
+ `Cannot use columns ${invalidCols} found in following:`,
210
+ invalidCol
211
+ )
212
+ }
213
+ }
214
+ return { tables: connector.tables, error }
147
215
  }
@@ -6,6 +6,7 @@ const {
6
6
  disableAllCrons,
7
7
  enableCronTrigger,
8
8
  } = require("../../../automations/utils")
9
+ const { app: appCache } = require("@budibase/auth/cache")
9
10
 
10
11
  // the max time we can wait for an invalidation to complete before considering it failed
11
12
  const MAX_PENDING_TIME_MS = 30 * 60000
@@ -103,6 +104,7 @@ async function deployApp(deployment) {
103
104
  appDoc.appId = productionAppId
104
105
  appDoc.instance._id = productionAppId
105
106
  await db.put(appDoc)
107
+ await appCache.invalidateAppMetadata(productionAppId)
106
108
  console.log("New app doc written successfully.")
107
109
  await initDeployedApp(productionAppId)
108
110
  console.log("Deployed app initialised, setting deployment to successful")
@@ -6,6 +6,7 @@ const { request } = require("../../utilities/workerRequests")
6
6
  const { clearLock } = require("../../utilities/redis")
7
7
  const { Replication } = require("@budibase/auth").db
8
8
  const { DocumentTypes } = require("../../db/utils")
9
+ const { app: appCache } = require("@budibase/auth/cache")
9
10
 
10
11
  async function redirect(ctx, method, path = "global") {
11
12
  const { devPath } = ctx.params
@@ -24,7 +25,8 @@ async function redirect(ctx, method, path = "global") {
24
25
  )
25
26
  )
26
27
  if (response.status !== 200) {
27
- ctx.throw(response.status, response.statusText)
28
+ const err = await response.text()
29
+ ctx.throw(400, err)
28
30
  }
29
31
  const cookie = response.headers.get("set-cookie")
30
32
  if (cookie) {
@@ -106,6 +108,7 @@ exports.revert = async ctx => {
106
108
  appDoc.appId = appId
107
109
  appDoc.instance._id = appId
108
110
  await db.put(appDoc)
111
+ await appCache.invalidateAppMetadata(appId)
109
112
  ctx.body = {
110
113
  message: "Reverted changes successfully.",
111
114
  }