@budibase/backend-core 2.9.39-alpha.8 → 2.9.39

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 (481) hide show
  1. package/dist/jest.config.js +25 -0
  2. package/dist/jest.config.js.map +1 -0
  3. package/dist/package.json +5 -5
  4. package/dist/src/accounts/accounts.js +75 -92
  5. package/dist/src/accounts/accounts.js.map +1 -7
  6. package/dist/src/accounts/api.js +85 -71
  7. package/dist/src/accounts/api.js.map +1 -7
  8. package/dist/src/accounts/index.js +16 -21
  9. package/dist/src/accounts/index.js.map +1 -7
  10. package/dist/src/auth/auth.js +178 -197
  11. package/dist/src/auth/auth.js.map +1 -7
  12. package/dist/src/auth/index.js +16 -21
  13. package/dist/src/auth/index.js.map +1 -7
  14. package/dist/src/blacklist/blacklist.js +69 -81
  15. package/dist/src/blacklist/blacklist.js.map +1 -7
  16. package/dist/src/blacklist/index.js +16 -21
  17. package/dist/src/blacklist/index.js.map +1 -7
  18. package/dist/src/cache/appMetadata.js +88 -78
  19. package/dist/src/cache/appMetadata.js.map +1 -7
  20. package/dist/src/cache/base/index.js +110 -92
  21. package/dist/src/cache/base/index.js.map +1 -7
  22. package/dist/src/cache/generic.js +26 -64
  23. package/dist/src/cache/generic.js.map +1 -7
  24. package/dist/src/cache/index.js +32 -48
  25. package/dist/src/cache/index.js.map +1 -7
  26. package/dist/src/cache/user.js +115 -91
  27. package/dist/src/cache/user.js.map +1 -7
  28. package/dist/src/cache/writethrough.js +144 -129
  29. package/dist/src/cache/writethrough.js.map +1 -7
  30. package/dist/src/configs/configs.js +265 -215
  31. package/dist/src/configs/configs.js.map +1 -7
  32. package/dist/src/configs/index.js +16 -21
  33. package/dist/src/configs/index.js.map +1 -7
  34. package/dist/src/constants/db.js +64 -104
  35. package/dist/src/constants/db.js.map +1 -7
  36. package/dist/src/constants/index.js +17 -23
  37. package/dist/src/constants/index.js.map +1 -7
  38. package/dist/src/constants/misc.js +53 -91
  39. package/dist/src/constants/misc.js.map +1 -7
  40. package/dist/src/context/Context.js +11 -33
  41. package/dist/src/context/Context.js.map +1 -7
  42. package/dist/src/context/identity.js +60 -75
  43. package/dist/src/context/identity.js.map +1 -7
  44. package/dist/src/context/index.js +31 -42
  45. package/dist/src/context/index.js.map +1 -7
  46. package/dist/src/context/mainContext.js +275 -264
  47. package/dist/src/context/mainContext.js.map +1 -7
  48. package/dist/src/context/types.js +2 -16
  49. package/dist/src/context/types.js.map +1 -7
  50. package/dist/src/db/Replication.js +81 -85
  51. package/dist/src/db/Replication.js.map +1 -7
  52. package/dist/src/db/constants.js +11 -37
  53. package/dist/src/db/constants.js.map +1 -7
  54. package/dist/src/db/couch/DatabaseImpl.js +236 -212
  55. package/dist/src/db/couch/DatabaseImpl.js.map +1 -7
  56. package/dist/src/db/couch/connections.js +81 -96
  57. package/dist/src/db/couch/connections.js.map +1 -7
  58. package/dist/src/db/couch/index.js +25 -42
  59. package/dist/src/db/couch/index.js.map +1 -7
  60. package/dist/src/db/couch/pouchDB.js +93 -103
  61. package/dist/src/db/couch/pouchDB.js.map +1 -7
  62. package/dist/src/db/couch/pouchDump.js +1 -1
  63. package/dist/src/db/couch/pouchDump.js.map +1 -7
  64. package/dist/src/db/couch/utils.js +49 -70
  65. package/dist/src/db/couch/utils.js.map +1 -7
  66. package/dist/src/db/db.js +49 -63
  67. package/dist/src/db/db.js.map +1 -7
  68. package/dist/src/db/errors.js +17 -38
  69. package/dist/src/db/errors.js.map +1 -7
  70. package/dist/src/db/index.js +45 -61
  71. package/dist/src/db/index.js.map +1 -7
  72. package/dist/src/db/lucene.js +655 -582
  73. package/dist/src/db/lucene.js.map +1 -7
  74. package/dist/src/db/searchIndexes/index.js +16 -21
  75. package/dist/src/db/searchIndexes/index.js.map +1 -7
  76. package/dist/src/db/searchIndexes/searchIndexes.js +72 -77
  77. package/dist/src/db/searchIndexes/searchIndexes.js.map +1 -7
  78. package/dist/src/db/utils.js +199 -184
  79. package/dist/src/db/utils.js.map +1 -7
  80. package/dist/src/db/views.js +187 -191
  81. package/dist/src/db/views.js.map +1 -7
  82. package/dist/src/docIds/conversions.js +48 -69
  83. package/dist/src/docIds/conversions.js.map +1 -7
  84. package/dist/src/docIds/ids.js +87 -76
  85. package/dist/src/docIds/ids.js.map +1 -7
  86. package/dist/src/docIds/index.js +17 -23
  87. package/dist/src/docIds/index.js.map +1 -7
  88. package/dist/src/docIds/newid.js +6 -29
  89. package/dist/src/docIds/newid.js.map +1 -7
  90. package/dist/src/docIds/params.js +111 -109
  91. package/dist/src/docIds/params.js.map +1 -7
  92. package/dist/src/docUpdates/index.js +29 -54
  93. package/dist/src/docUpdates/index.js.map +1 -7
  94. package/dist/src/environment.js +81 -152
  95. package/dist/src/environment.js.map +1 -7
  96. package/dist/src/errors/errors.js +77 -106
  97. package/dist/src/errors/errors.js.map +1 -7
  98. package/dist/src/errors/index.js +16 -21
  99. package/dist/src/errors/index.js.map +1 -7
  100. package/dist/src/events/analytics.js +38 -38
  101. package/dist/src/events/analytics.js.map +1 -7
  102. package/dist/src/events/asyncEvents/index.js +17 -23
  103. package/dist/src/events/asyncEvents/index.js.map +1 -7
  104. package/dist/src/events/asyncEvents/publisher.js +24 -36
  105. package/dist/src/events/asyncEvents/publisher.js.map +1 -7
  106. package/dist/src/events/asyncEvents/queue.js +21 -37
  107. package/dist/src/events/asyncEvents/queue.js.map +1 -7
  108. package/dist/src/events/backfill.js +170 -163
  109. package/dist/src/events/backfill.js.map +1 -7
  110. package/dist/src/events/documentId.js +23 -46
  111. package/dist/src/events/documentId.js.map +1 -7
  112. package/dist/src/events/events.js +68 -58
  113. package/dist/src/events/events.js.map +1 -7
  114. package/dist/src/events/identification.js +279 -254
  115. package/dist/src/events/identification.js.map +1 -7
  116. package/dist/src/events/index.js +42 -57
  117. package/dist/src/events/index.js.map +1 -7
  118. package/dist/src/events/processors/AnalyticsProcessor.js +81 -64
  119. package/dist/src/events/processors/AnalyticsProcessor.js.map +1 -7
  120. package/dist/src/events/processors/AuditLogsProcessor.js +79 -90
  121. package/dist/src/events/processors/AuditLogsProcessor.js.map +1 -7
  122. package/dist/src/events/processors/LoggingProcessor.js +39 -50
  123. package/dist/src/events/processors/LoggingProcessor.js.map +1 -7
  124. package/dist/src/events/processors/Processors.js +44 -49
  125. package/dist/src/events/processors/Processors.js.map +1 -7
  126. package/dist/src/events/processors/async/DocumentUpdateProcessor.js +37 -46
  127. package/dist/src/events/processors/async/DocumentUpdateProcessor.js.map +1 -7
  128. package/dist/src/events/processors/index.js +18 -52
  129. package/dist/src/events/processors/index.js.map +1 -7
  130. package/dist/src/events/processors/posthog/PosthogProcessor.js +126 -113
  131. package/dist/src/events/processors/posthog/PosthogProcessor.js.map +1 -7
  132. package/dist/src/events/processors/posthog/index.js +6 -34
  133. package/dist/src/events/processors/posthog/index.js.map +1 -7
  134. package/dist/src/events/processors/posthog/rateLimiting.js +104 -90
  135. package/dist/src/events/processors/posthog/rateLimiting.js.map +1 -7
  136. package/dist/src/events/processors/types.js +2 -28
  137. package/dist/src/events/processors/types.js.map +1 -7
  138. package/dist/src/events/publishers/account.js +37 -43
  139. package/dist/src/events/publishers/account.js.map +1 -7
  140. package/dist/src/events/publishers/app.js +139 -131
  141. package/dist/src/events/publishers/app.js.map +1 -7
  142. package/dist/src/events/publishers/auditLog.js +29 -37
  143. package/dist/src/events/publishers/auditLog.js.map +1 -7
  144. package/dist/src/events/publishers/auth.js +71 -71
  145. package/dist/src/events/publishers/auth.js.map +1 -7
  146. package/dist/src/events/publishers/automation.js +108 -102
  147. package/dist/src/events/publishers/automation.js.map +1 -7
  148. package/dist/src/events/publishers/backfill.js +75 -82
  149. package/dist/src/events/publishers/backfill.js.map +1 -7
  150. package/dist/src/events/publishers/backup.js +36 -44
  151. package/dist/src/events/publishers/backup.js.map +1 -7
  152. package/dist/src/events/publishers/datasource.js +46 -51
  153. package/dist/src/events/publishers/datasource.js.map +1 -7
  154. package/dist/src/events/publishers/email.js +25 -33
  155. package/dist/src/events/publishers/email.js.map +1 -7
  156. package/dist/src/events/publishers/environmentVariable.js +38 -47
  157. package/dist/src/events/publishers/environmentVariable.js.map +1 -7
  158. package/dist/src/events/publishers/group.js +97 -95
  159. package/dist/src/events/publishers/group.js.map +1 -7
  160. package/dist/src/events/publishers/index.js +53 -106
  161. package/dist/src/events/publishers/index.js.map +1 -7
  162. package/dist/src/events/publishers/installation.js +45 -49
  163. package/dist/src/events/publishers/installation.js.map +1 -7
  164. package/dist/src/events/publishers/layout.js +29 -37
  165. package/dist/src/events/publishers/layout.js.map +1 -7
  166. package/dist/src/events/publishers/license.js +67 -68
  167. package/dist/src/events/publishers/license.js.map +1 -7
  168. package/dist/src/events/publishers/org.js +44 -45
  169. package/dist/src/events/publishers/org.js.map +1 -7
  170. package/dist/src/events/publishers/plugin.js +49 -55
  171. package/dist/src/events/publishers/plugin.js.map +1 -7
  172. package/dist/src/events/publishers/query.js +70 -81
  173. package/dist/src/events/publishers/query.js.map +1 -7
  174. package/dist/src/events/publishers/role.js +61 -63
  175. package/dist/src/events/publishers/role.js.map +1 -7
  176. package/dist/src/events/publishers/rows.js +28 -39
  177. package/dist/src/events/publishers/rows.js.map +1 -7
  178. package/dist/src/events/publishers/screen.js +41 -47
  179. package/dist/src/events/publishers/screen.js.map +1 -7
  180. package/dist/src/events/publishers/serve.js +41 -47
  181. package/dist/src/events/publishers/serve.js.map +1 -7
  182. package/dist/src/events/publishers/table.js +69 -71
  183. package/dist/src/events/publishers/table.js.map +1 -7
  184. package/dist/src/events/publishers/user.js +184 -173
  185. package/dist/src/events/publishers/user.js.map +1 -7
  186. package/dist/src/events/publishers/view.js +98 -89
  187. package/dist/src/events/publishers/view.js.map +1 -7
  188. package/dist/src/features/index.js +88 -93
  189. package/dist/src/features/index.js.map +1 -7
  190. package/dist/src/features/installation.js +16 -38
  191. package/dist/src/features/installation.js.map +1 -7
  192. package/dist/src/helpers.js +11 -28
  193. package/dist/src/helpers.js.map +1 -7
  194. package/dist/src/index.js +77 -148
  195. package/dist/src/index.js.map +1 -7
  196. package/dist/src/installation.js +127 -128
  197. package/dist/src/installation.js.map +1 -7
  198. package/dist/src/logging/alerts.js +14 -39
  199. package/dist/src/logging/alerts.js.map +1 -7
  200. package/dist/src/logging/correlation/correlation.js +11 -35
  201. package/dist/src/logging/correlation/correlation.js.map +1 -7
  202. package/dist/src/logging/correlation/index.js +16 -21
  203. package/dist/src/logging/correlation/index.js.map +1 -7
  204. package/dist/src/logging/correlation/middleware.js +13 -33
  205. package/dist/src/logging/correlation/middleware.js.map +1 -7
  206. package/dist/src/logging/index.js +32 -45
  207. package/dist/src/logging/index.js.map +1 -7
  208. package/dist/src/logging/pino/logger.js +206 -185
  209. package/dist/src/logging/pino/logger.js.map +1 -7
  210. package/dist/src/logging/pino/middleware.js +38 -68
  211. package/dist/src/logging/pino/middleware.js.map +1 -7
  212. package/dist/src/logging/system.js +86 -95
  213. package/dist/src/logging/system.js.map +1 -7
  214. package/dist/src/middleware/adminOnly.js +16 -28
  215. package/dist/src/middleware/adminOnly.js.map +1 -7
  216. package/dist/src/middleware/auditLog.js +13 -24
  217. package/dist/src/middleware/auditLog.js.map +1 -7
  218. package/dist/src/middleware/authenticated.js +191 -165
  219. package/dist/src/middleware/authenticated.js.map +1 -7
  220. package/dist/src/middleware/builderOnly.js +29 -44
  221. package/dist/src/middleware/builderOnly.js.map +1 -7
  222. package/dist/src/middleware/builderOrAdmin.js +29 -44
  223. package/dist/src/middleware/builderOrAdmin.js.map +1 -7
  224. package/dist/src/middleware/csrf.js +75 -54
  225. package/dist/src/middleware/csrf.js.map +1 -7
  226. package/dist/src/middleware/errorHandling.js +60 -58
  227. package/dist/src/middleware/errorHandling.js.map +1 -7
  228. package/dist/src/middleware/index.js +61 -91
  229. package/dist/src/middleware/index.js.map +1 -7
  230. package/dist/src/middleware/internalApi.js +27 -36
  231. package/dist/src/middleware/internalApi.js.map +1 -7
  232. package/dist/src/middleware/joi-validator.js +39 -65
  233. package/dist/src/middleware/joi-validator.js.map +1 -7
  234. package/dist/src/middleware/matchers.js +36 -55
  235. package/dist/src/middleware/matchers.js.map +1 -7
  236. package/dist/src/middleware/passport/datasource/google.js +88 -96
  237. package/dist/src/middleware/passport/datasource/google.js.map +1 -7
  238. package/dist/src/middleware/passport/local.js +74 -66
  239. package/dist/src/middleware/passport/local.js.map +1 -7
  240. package/dist/src/middleware/passport/sso/google.js +81 -84
  241. package/dist/src/middleware/passport/sso/google.js.map +1 -7
  242. package/dist/src/middleware/passport/sso/oidc.js +140 -124
  243. package/dist/src/middleware/passport/sso/oidc.js.map +1 -7
  244. package/dist/src/middleware/passport/sso/sso.js +157 -141
  245. package/dist/src/middleware/passport/sso/sso.js.map +1 -7
  246. package/dist/src/middleware/passport/utils.js +60 -56
  247. package/dist/src/middleware/passport/utils.js.map +1 -7
  248. package/dist/src/middleware/querystringToBody.js +26 -42
  249. package/dist/src/middleware/querystringToBody.js.map +1 -7
  250. package/dist/src/middleware/tenancy.js +33 -42
  251. package/dist/src/middleware/tenancy.js.map +1 -7
  252. package/dist/src/migrations/definitions.js +37 -61
  253. package/dist/src/migrations/definitions.js.map +1 -7
  254. package/dist/src/migrations/index.js +17 -23
  255. package/dist/src/migrations/index.js.map +1 -7
  256. package/dist/src/migrations/migrations.js +182 -162
  257. package/dist/src/migrations/migrations.js.map +1 -7
  258. package/dist/src/objectStore/buckets/app.js +65 -57
  259. package/dist/src/objectStore/buckets/app.js.map +1 -7
  260. package/dist/src/objectStore/buckets/global.js +50 -55
  261. package/dist/src/objectStore/buckets/global.js.map +1 -7
  262. package/dist/src/objectStore/buckets/index.js +18 -25
  263. package/dist/src/objectStore/buckets/index.js.map +1 -7
  264. package/dist/src/objectStore/buckets/plugins.js +76 -82
  265. package/dist/src/objectStore/buckets/plugins.js.map +1 -7
  266. package/dist/src/objectStore/cloudfront.js +27 -61
  267. package/dist/src/objectStore/cloudfront.js.map +1 -7
  268. package/dist/src/objectStore/index.js +18 -25
  269. package/dist/src/objectStore/index.js.map +1 -7
  270. package/dist/src/objectStore/objectStore.js +351 -341
  271. package/dist/src/objectStore/objectStore.js.map +1 -7
  272. package/dist/src/objectStore/utils.js +26 -52
  273. package/dist/src/objectStore/utils.js.map +1 -7
  274. package/dist/src/platform/index.js +30 -42
  275. package/dist/src/platform/index.js.map +1 -7
  276. package/dist/src/platform/platformDb.js +7 -30
  277. package/dist/src/platform/platformDb.js.map +1 -7
  278. package/dist/src/platform/tenants.js +126 -110
  279. package/dist/src/platform/tenants.js.map +1 -7
  280. package/dist/src/platform/users.js +84 -92
  281. package/dist/src/platform/users.js.map +1 -7
  282. package/dist/src/plugin/index.js +16 -21
  283. package/dist/src/plugin/index.js.map +1 -7
  284. package/dist/src/plugin/utils.js +129 -137
  285. package/dist/src/plugin/utils.js.map +1 -7
  286. package/dist/src/queue/constants.js +10 -34
  287. package/dist/src/queue/constants.js.map +1 -7
  288. package/dist/src/queue/inMemoryQueue.js +137 -131
  289. package/dist/src/queue/inMemoryQueue.js.map +1 -7
  290. package/dist/src/queue/index.js +17 -23
  291. package/dist/src/queue/index.js.map +1 -7
  292. package/dist/src/queue/listeners.js +170 -161
  293. package/dist/src/queue/listeners.js.map +1 -7
  294. package/dist/src/queue/queue.js +83 -76
  295. package/dist/src/queue/queue.js.map +1 -7
  296. package/dist/src/redis/index.js +34 -45
  297. package/dist/src/redis/index.js.map +1 -7
  298. package/dist/src/redis/init.js +125 -115
  299. package/dist/src/redis/init.js.map +1 -7
  300. package/dist/src/redis/redis.js +302 -244
  301. package/dist/src/redis/redis.js.map +1 -7
  302. package/dist/src/redis/redlockImpl.js +152 -135
  303. package/dist/src/redis/redlockImpl.js.map +1 -7
  304. package/dist/src/redis/utils.js +115 -128
  305. package/dist/src/redis/utils.js.map +1 -7
  306. package/dist/src/security/encryption.js +141 -162
  307. package/dist/src/security/encryption.js.map +1 -7
  308. package/dist/src/security/permissions.js +132 -170
  309. package/dist/src/security/permissions.js.map +1 -7
  310. package/dist/src/security/roles.js +319 -298
  311. package/dist/src/security/roles.js.map +1 -7
  312. package/dist/src/security/sessions.js +106 -120
  313. package/dist/src/security/sessions.js.map +1 -7
  314. package/dist/src/tenancy/db.js +7 -30
  315. package/dist/src/tenancy/db.js.map +1 -7
  316. package/dist/src/tenancy/index.js +17 -23
  317. package/dist/src/tenancy/index.js.map +1 -7
  318. package/dist/src/tenancy/tenancy.js +101 -114
  319. package/dist/src/tenancy/tenancy.js.map +1 -7
  320. package/dist/src/timers/index.js +16 -21
  321. package/dist/src/timers/index.js.map +1 -7
  322. package/dist/src/timers/timers.js +18 -43
  323. package/dist/src/timers/timers.js.map +1 -7
  324. package/dist/src/users/db.js +403 -357
  325. package/dist/src/users/db.js.map +1 -7
  326. package/dist/src/users/events.js +150 -133
  327. package/dist/src/users/events.js.map +1 -7
  328. package/dist/src/users/index.js +21 -34
  329. package/dist/src/users/index.js.map +1 -7
  330. package/dist/src/users/lookup.js +104 -102
  331. package/dist/src/users/lookup.js.map +1 -7
  332. package/dist/src/users/users.js +244 -240
  333. package/dist/src/users/users.js.map +1 -7
  334. package/dist/src/users/utils.js +87 -90
  335. package/dist/src/users/utils.js.map +1 -7
  336. package/dist/src/utils/hashing.js +42 -48
  337. package/dist/src/utils/hashing.js.map +1 -7
  338. package/dist/src/utils/index.js +18 -25
  339. package/dist/src/utils/index.js.map +1 -7
  340. package/dist/src/utils/stringUtils.js +6 -30
  341. package/dist/src/utils/stringUtils.js.map +1 -7
  342. package/dist/src/utils/utils.js +212 -172
  343. package/dist/src/utils/utils.js.map +1 -7
  344. package/dist/tests/core/logging.js +21 -45
  345. package/dist/tests/core/logging.js.map +1 -7
  346. package/dist/tests/core/utilities/index.js +34 -51
  347. package/dist/tests/core/utilities/index.js.map +1 -7
  348. package/dist/tests/core/utilities/jestUtils.js +16 -45
  349. package/dist/tests/core/utilities/jestUtils.js.map +1 -7
  350. package/dist/tests/core/utilities/mocks/alerts.js +27 -38
  351. package/dist/tests/core/utilities/mocks/alerts.js.map +1 -7
  352. package/dist/tests/core/utilities/mocks/date.js +5 -31
  353. package/dist/tests/core/utilities/mocks/date.js.map +1 -7
  354. package/dist/tests/core/utilities/mocks/events.js +141 -131
  355. package/dist/tests/core/utilities/mocks/events.js.map +1 -7
  356. package/dist/tests/core/utilities/mocks/fetch.js +10 -34
  357. package/dist/tests/core/utilities/mocks/fetch.js.map +1 -7
  358. package/dist/tests/core/utilities/mocks/index.js +39 -51
  359. package/dist/tests/core/utilities/mocks/index.js.map +1 -7
  360. package/dist/tests/core/utilities/mocks/licenses.js +67 -107
  361. package/dist/tests/core/utilities/mocks/licenses.js.map +1 -7
  362. package/dist/tests/core/utilities/mocks/posthog.js +6 -6
  363. package/dist/tests/core/utilities/mocks/posthog.js.map +1 -7
  364. package/dist/tests/core/utilities/structures/Chance.js +17 -44
  365. package/dist/tests/core/utilities/structures/Chance.js.map +1 -7
  366. package/dist/tests/core/utilities/structures/accounts.js +61 -131
  367. package/dist/tests/core/utilities/structures/accounts.js.map +1 -7
  368. package/dist/tests/core/utilities/structures/apps.js +21 -44
  369. package/dist/tests/core/utilities/structures/apps.js.map +1 -7
  370. package/dist/tests/core/utilities/structures/common.js +8 -32
  371. package/dist/tests/core/utilities/structures/common.js.map +1 -7
  372. package/dist/tests/core/utilities/structures/db.js +11 -35
  373. package/dist/tests/core/utilities/structures/db.js.map +1 -7
  374. package/dist/tests/core/utilities/structures/documents/index.js +16 -21
  375. package/dist/tests/core/utilities/structures/documents/index.js.map +1 -7
  376. package/dist/tests/core/utilities/structures/documents/platform/index.js +26 -37
  377. package/dist/tests/core/utilities/structures/documents/platform/index.js.map +1 -7
  378. package/dist/tests/core/utilities/structures/documents/platform/installation.js +34 -44
  379. package/dist/tests/core/utilities/structures/documents/platform/installation.js.map +1 -7
  380. package/dist/tests/core/utilities/structures/generator.js +7 -38
  381. package/dist/tests/core/utilities/structures/generator.js.map +1 -7
  382. package/dist/tests/core/utilities/structures/index.js +43 -78
  383. package/dist/tests/core/utilities/structures/index.js.map +1 -7
  384. package/dist/tests/core/utilities/structures/koa.js +7 -39
  385. package/dist/tests/core/utilities/structures/koa.js.map +1 -7
  386. package/dist/tests/core/utilities/structures/licenses.js +121 -156
  387. package/dist/tests/core/utilities/structures/licenses.js.map +1 -7
  388. package/dist/tests/core/utilities/structures/plugins.js +20 -43
  389. package/dist/tests/core/utilities/structures/plugins.js.map +1 -7
  390. package/dist/tests/core/utilities/structures/quotas.js +67 -90
  391. package/dist/tests/core/utilities/structures/quotas.js.map +1 -7
  392. package/dist/tests/core/utilities/structures/scim.js +57 -84
  393. package/dist/tests/core/utilities/structures/scim.js.map +1 -7
  394. package/dist/tests/core/utilities/structures/shared.js +9 -41
  395. package/dist/tests/core/utilities/structures/shared.js.map +1 -7
  396. package/dist/tests/core/utilities/structures/sso.js +112 -124
  397. package/dist/tests/core/utilities/structures/sso.js.map +1 -7
  398. package/dist/tests/core/utilities/structures/tenants.js +6 -29
  399. package/dist/tests/core/utilities/structures/tenants.js.map +1 -7
  400. package/dist/tests/core/utilities/structures/userGroups.js +10 -33
  401. package/dist/tests/core/utilities/structures/userGroups.js.map +1 -7
  402. package/dist/tests/core/utilities/structures/users.js +36 -84
  403. package/dist/tests/core/utilities/structures/users.js.map +1 -7
  404. package/dist/tests/core/utilities/testContainerUtils.js +59 -84
  405. package/dist/tests/core/utilities/testContainerUtils.js.map +1 -7
  406. package/dist/tests/core/utilities/utils/index.js +26 -37
  407. package/dist/tests/core/utilities/utils/index.js.map +1 -7
  408. package/dist/tests/core/utilities/utils/time.js +5 -28
  409. package/dist/tests/core/utilities/utils/time.js.map +1 -7
  410. package/dist/tests/extra/DBTestConfiguration.js +50 -56
  411. package/dist/tests/extra/DBTestConfiguration.js.map +1 -7
  412. package/dist/tests/extra/index.js +30 -39
  413. package/dist/tests/extra/index.js.map +1 -7
  414. package/dist/tests/extra/testEnv.js +105 -84
  415. package/dist/tests/extra/testEnv.js.map +1 -7
  416. package/dist/tests/index.js +16 -21
  417. package/dist/tests/index.js.map +1 -7
  418. package/dist/tests/jestEnv.js +1 -1
  419. package/dist/tests/jestEnv.js.map +1 -7
  420. package/dist/tests/jestSetup.js +20 -33
  421. package/dist/tests/jestSetup.js.map +1 -7
  422. package/package.json +5 -5
  423. package/dist/plugins.js +0 -290
  424. package/dist/plugins.js.map +0 -7
  425. package/dist/plugins.js.meta.json +0 -1
  426. package/dist/src/auth/tests/auth.spec.js +0 -37
  427. package/dist/src/auth/tests/auth.spec.js.map +0 -7
  428. package/dist/src/blacklist/tests/blacklist.spec.js +0 -61
  429. package/dist/src/blacklist/tests/blacklist.spec.js.map +0 -7
  430. package/dist/src/cache/tests/writethrough.spec.js +0 -132
  431. package/dist/src/cache/tests/writethrough.spec.js.map +0 -7
  432. package/dist/src/configs/tests/configs.spec.js +0 -182
  433. package/dist/src/configs/tests/configs.spec.js.map +0 -7
  434. package/dist/src/context/tests/index.spec.js +0 -147
  435. package/dist/src/context/tests/index.spec.js.map +0 -7
  436. package/dist/src/db/tests/index.spec.js +0 -24
  437. package/dist/src/db/tests/index.spec.js.map +0 -7
  438. package/dist/src/db/tests/lucene.spec.js +0 -312
  439. package/dist/src/db/tests/lucene.spec.js.map +0 -7
  440. package/dist/src/db/tests/pouch.spec.js +0 -63
  441. package/dist/src/db/tests/pouch.spec.js.map +0 -7
  442. package/dist/src/db/tests/utils.spec.js +0 -50
  443. package/dist/src/db/tests/utils.spec.js.map +0 -7
  444. package/dist/src/events/processors/posthog/tests/PosthogProcessor.spec.js +0 -154
  445. package/dist/src/events/processors/posthog/tests/PosthogProcessor.spec.js.map +0 -7
  446. package/dist/src/features/tests/featureFlags.spec.js +0 -86
  447. package/dist/src/features/tests/featureFlags.spec.js.map +0 -7
  448. package/dist/src/logging/tests/system.spec.js +0 -59
  449. package/dist/src/logging/tests/system.spec.js.map +0 -7
  450. package/dist/src/middleware/passport/sso/tests/google.spec.js +0 -77
  451. package/dist/src/middleware/passport/sso/tests/google.spec.js.map +0 -7
  452. package/dist/src/middleware/passport/sso/tests/oidc.spec.js +0 -143
  453. package/dist/src/middleware/passport/sso/tests/oidc.spec.js.map +0 -7
  454. package/dist/src/middleware/passport/sso/tests/sso.spec.js +0 -167
  455. package/dist/src/middleware/passport/sso/tests/sso.spec.js.map +0 -7
  456. package/dist/src/middleware/tests/builder.spec.js +0 -169
  457. package/dist/src/middleware/tests/builder.spec.js.map +0 -7
  458. package/dist/src/middleware/tests/matchers.spec.js +0 -120
  459. package/dist/src/middleware/tests/matchers.spec.js.map +0 -7
  460. package/dist/src/migrations/tests/migrations.spec.js +0 -78
  461. package/dist/src/migrations/tests/migrations.spec.js.map +0 -7
  462. package/dist/src/objectStore/buckets/tests/app.spec.js +0 -171
  463. package/dist/src/objectStore/buckets/tests/app.spec.js.map +0 -7
  464. package/dist/src/objectStore/buckets/tests/global.spec.js +0 -87
  465. package/dist/src/objectStore/buckets/tests/global.spec.js.map +0 -7
  466. package/dist/src/objectStore/buckets/tests/plugins.spec.js +0 -123
  467. package/dist/src/objectStore/buckets/tests/plugins.spec.js.map +0 -7
  468. package/dist/src/platform/tests/tenants.spec.js +0 -46
  469. package/dist/src/platform/tests/tenants.spec.js.map +0 -7
  470. package/dist/src/plugin/tests/validation.spec.js +0 -97
  471. package/dist/src/plugin/tests/validation.spec.js.map +0 -7
  472. package/dist/src/security/tests/encryption.spec.js +0 -51
  473. package/dist/src/security/tests/encryption.spec.js.map +0 -7
  474. package/dist/src/security/tests/permissions.spec.js +0 -154
  475. package/dist/src/security/tests/permissions.spec.js.map +0 -7
  476. package/dist/src/security/tests/sessions.spec.js +0 -33
  477. package/dist/src/security/tests/sessions.spec.js.map +0 -7
  478. package/dist/src/tenancy/tests/tenancy.spec.js +0 -154
  479. package/dist/src/tenancy/tests/tenancy.spec.js.map +0 -7
  480. package/dist/src/utils/tests/utils.spec.js +0 -165
  481. package/dist/src/utils/tests/utils.spec.js.map +0 -7
@@ -1,381 +1,427 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
11
24
  };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
19
33
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var db_exports = {};
30
- __export(db_exports, {
31
- UserDB: () => UserDB
32
- });
33
- module.exports = __toCommonJS(db_exports);
34
- var import_environment = __toESM(require("../environment"));
35
- var eventHelpers = __toESM(require("./events"));
36
- var accounts = __toESM(require("../accounts"));
37
- var accountSdk = __toESM(require("../accounts"));
38
- var cache = __toESM(require("../cache"));
39
- var import_context = require("../context");
40
- var dbUtils = __toESM(require("../db"));
41
- var import_errors = require("../errors");
42
- var platform = __toESM(require("../platform"));
43
- var sessions = __toESM(require("../security/sessions"));
44
- var usersCore = __toESM(require("./users"));
45
- var import_types = require("@budibase/types");
46
- var import_utils = require("./utils");
47
- var import_lookup = require("./lookup");
48
- var import_utils2 = require("../utils");
49
- const bulkDeleteProcessing = async (dbUser) => {
50
- const userId = dbUser._id;
51
- await platform.users.removeUser(dbUser);
52
- await eventHelpers.handleDeleteEvents(dbUser);
53
- await cache.user.invalidateUser(userId);
54
- await sessions.invalidateSessions(userId, { reason: "bulk-deletion" });
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
55
36
  };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.UserDB = void 0;
39
+ const environment_1 = __importDefault(require("../environment"));
40
+ const eventHelpers = __importStar(require("./events"));
41
+ const accounts = __importStar(require("../accounts"));
42
+ const accountSdk = __importStar(require("../accounts"));
43
+ const cache = __importStar(require("../cache"));
44
+ const context_1 = require("../context");
45
+ const dbUtils = __importStar(require("../db"));
46
+ const errors_1 = require("../errors");
47
+ const platform = __importStar(require("../platform"));
48
+ const sessions = __importStar(require("../security/sessions"));
49
+ const usersCore = __importStar(require("./users"));
50
+ const types_1 = require("@budibase/types");
51
+ const utils_1 = require("./utils");
52
+ const lookup_1 = require("./lookup");
53
+ const utils_2 = require("../utils");
54
+ const bulkDeleteProcessing = (dbUser) => __awaiter(void 0, void 0, void 0, function* () {
55
+ const userId = dbUser._id;
56
+ yield platform.users.removeUser(dbUser);
57
+ yield eventHelpers.handleDeleteEvents(dbUser);
58
+ yield cache.user.invalidateUser(userId);
59
+ yield sessions.invalidateSessions(userId, { reason: "bulk-deletion" });
60
+ });
56
61
  class UserDB {
57
- static init(quotaFns, groupFns, featureFns) {
58
- UserDB.quotas = quotaFns;
59
- UserDB.groups = groupFns;
60
- UserDB.features = featureFns;
61
- }
62
- static async isPreventPasswordActions(user, account) {
63
- if (import_environment.default.ENABLE_SSO_MAINTENANCE_MODE && (0, import_utils.isAdmin)(user)) {
64
- return false;
65
- }
66
- if (await UserDB.features.isSSOEnforced()) {
67
- return true;
68
- }
69
- if ((0, import_types.isSSOUser)(user)) {
70
- return true;
62
+ static init(quotaFns, groupFns, featureFns) {
63
+ UserDB.quotas = quotaFns;
64
+ UserDB.groups = groupFns;
65
+ UserDB.features = featureFns;
71
66
  }
72
- if (!account) {
73
- account = await accountSdk.getAccountByTenantId((0, import_context.getTenantId)());
74
- }
75
- return !!(account && account.email === user.email && (0, import_types.isSSOAccount)(account));
76
- }
77
- static async buildUser(user, opts = {
78
- hashPassword: true,
79
- requirePassword: true
80
- }, tenantId, dbUser, account) {
81
- let { password, _id } = user;
82
- if (dbUser && !dbUser.password) {
83
- opts.requirePassword = false;
84
- }
85
- let hashedPassword;
86
- if (password) {
87
- if (await UserDB.isPreventPasswordActions(user, account)) {
88
- throw new import_errors.HTTPError("Password change is disabled for this user", 400);
89
- }
90
- hashedPassword = opts.hashPassword ? await (0, import_utils2.hash)(password) : password;
91
- } else if (dbUser) {
92
- hashedPassword = dbUser.password;
67
+ static isPreventPasswordActions(user, account) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ // when in maintenance mode we allow sso users with the admin role
70
+ // to perform any password action - this prevents lockout
71
+ if (environment_1.default.ENABLE_SSO_MAINTENANCE_MODE && (0, utils_1.isAdmin)(user)) {
72
+ return false;
73
+ }
74
+ // SSO is enforced for all users
75
+ if (yield UserDB.features.isSSOEnforced()) {
76
+ return true;
77
+ }
78
+ // Check local sso
79
+ if ((0, types_1.isSSOUser)(user)) {
80
+ return true;
81
+ }
82
+ // Check account sso
83
+ if (!account) {
84
+ account = yield accountSdk.getAccountByTenantId((0, context_1.getTenantId)());
85
+ }
86
+ return !!(account && account.email === user.email && (0, types_1.isSSOAccount)(account));
87
+ });
93
88
  }
94
- const requirePasswords = opts.requirePassword && !await UserDB.features.isSSOEnforced();
95
- if (!hashedPassword && requirePasswords) {
96
- throw "Password must be specified.";
89
+ static buildUser(user, opts = {
90
+ hashPassword: true,
91
+ requirePassword: true,
92
+ }, tenantId, dbUser, account) {
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ let { password, _id } = user;
95
+ // don't require a password if the db user doesn't already have one
96
+ if (dbUser && !dbUser.password) {
97
+ opts.requirePassword = false;
98
+ }
99
+ let hashedPassword;
100
+ if (password) {
101
+ if (yield UserDB.isPreventPasswordActions(user, account)) {
102
+ throw new errors_1.HTTPError("Password change is disabled for this user", 400);
103
+ }
104
+ hashedPassword = opts.hashPassword ? yield (0, utils_2.hash)(password) : password;
105
+ }
106
+ else if (dbUser) {
107
+ hashedPassword = dbUser.password;
108
+ }
109
+ // passwords are never required if sso is enforced
110
+ const requirePasswords = opts.requirePassword && !(yield UserDB.features.isSSOEnforced());
111
+ if (!hashedPassword && requirePasswords) {
112
+ throw "Password must be specified.";
113
+ }
114
+ _id = _id || dbUtils.generateGlobalUserID();
115
+ const fullUser = Object.assign(Object.assign(Object.assign({ createdAt: Date.now() }, dbUser), user), { _id, password: hashedPassword, tenantId });
116
+ // make sure the roles object is always present
117
+ if (!fullUser.roles) {
118
+ fullUser.roles = {};
119
+ }
120
+ // add the active status to a user if its not provided
121
+ if (fullUser.status == null) {
122
+ fullUser.status = types_1.UserStatus.ACTIVE;
123
+ }
124
+ return fullUser;
125
+ });
97
126
  }
98
- _id = _id || dbUtils.generateGlobalUserID();
99
- const fullUser = {
100
- createdAt: Date.now(),
101
- ...dbUser,
102
- ...user,
103
- _id,
104
- password: hashedPassword,
105
- tenantId
106
- };
107
- if (!fullUser.roles) {
108
- fullUser.roles = {};
127
+ static allUsers() {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ const db = (0, context_1.getGlobalDB)();
130
+ const response = yield db.allDocs(dbUtils.getGlobalUserParams(null, {
131
+ include_docs: true,
132
+ }));
133
+ return response.rows.map((row) => row.doc);
134
+ });
109
135
  }
110
- if (fullUser.status == null) {
111
- fullUser.status = import_types.UserStatus.ACTIVE;
136
+ static countUsersByApp(appId) {
137
+ return __awaiter(this, void 0, void 0, function* () {
138
+ let response = yield usersCore.searchGlobalUsersByApp(appId, {});
139
+ return {
140
+ userCount: response.length,
141
+ };
142
+ });
112
143
  }
113
- return fullUser;
114
- }
115
- static async allUsers() {
116
- const db = (0, import_context.getGlobalDB)();
117
- const response = await db.allDocs(
118
- dbUtils.getGlobalUserParams(null, {
119
- include_docs: true
120
- })
121
- );
122
- return response.rows.map((row) => row.doc);
123
- }
124
- static async countUsersByApp(appId) {
125
- let response = await usersCore.searchGlobalUsersByApp(appId, {});
126
- return {
127
- userCount: response.length
128
- };
129
- }
130
- static async getUsersByAppAccess(appId) {
131
- const opts = {
132
- include_docs: true,
133
- limit: 50
134
- };
135
- let response = await usersCore.searchGlobalUsersByAppAccess(
136
- appId,
137
- opts
138
- );
139
- return response;
140
- }
141
- static async getUserByEmail(email) {
142
- return usersCore.getGlobalUserByEmail(email);
143
- }
144
- /**
145
- * Gets a user by ID from the global database, based on the current tenancy.
146
- */
147
- static async getUser(userId) {
148
- const user = await usersCore.getById(userId);
149
- if (user) {
150
- delete user.password;
144
+ static getUsersByAppAccess(appId) {
145
+ return __awaiter(this, void 0, void 0, function* () {
146
+ const opts = {
147
+ include_docs: true,
148
+ limit: 50,
149
+ };
150
+ let response = yield usersCore.searchGlobalUsersByAppAccess(appId, opts);
151
+ return response;
152
+ });
151
153
  }
152
- return user;
153
- }
154
- static async bulkGet(userIds) {
155
- return await usersCore.bulkGetGlobalUsersById(userIds);
156
- }
157
- static async bulkUpdate(users) {
158
- return await usersCore.bulkUpdateGlobalUsers(users);
159
- }
160
- static async save(user, opts = {}) {
161
- if (opts.hashPassword == null) {
162
- opts.hashPassword = true;
154
+ static getUserByEmail(email) {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ return usersCore.getGlobalUserByEmail(email);
157
+ });
163
158
  }
164
- if (opts.requirePassword == null) {
165
- opts.requirePassword = true;
159
+ /**
160
+ * Gets a user by ID from the global database, based on the current tenancy.
161
+ */
162
+ static getUser(userId) {
163
+ return __awaiter(this, void 0, void 0, function* () {
164
+ const user = yield usersCore.getById(userId);
165
+ if (user) {
166
+ delete user.password;
167
+ }
168
+ return user;
169
+ });
166
170
  }
167
- const tenantId = (0, import_context.getTenantId)();
168
- const db = (0, import_context.getGlobalDB)();
169
- let { email, _id, userGroups = [], roles } = user;
170
- if (!email && !_id) {
171
- throw new Error("_id or email is required");
171
+ static bulkGet(userIds) {
172
+ return __awaiter(this, void 0, void 0, function* () {
173
+ return yield usersCore.bulkGetGlobalUsersById(userIds);
174
+ });
172
175
  }
173
- if (user.builder?.apps?.length && !await UserDB.features.isAppBuildersEnabled()) {
174
- throw new Error("Unable to update app builders, please check license");
176
+ static bulkUpdate(users) {
177
+ return __awaiter(this, void 0, void 0, function* () {
178
+ return yield usersCore.bulkUpdateGlobalUsers(users);
179
+ });
175
180
  }
176
- let dbUser;
177
- if (_id) {
178
- try {
179
- dbUser = await db.get(_id);
180
- if (email && dbUser.email !== email) {
181
- throw "Email address cannot be changed";
182
- }
183
- email = dbUser.email;
184
- } catch (e) {
185
- if (e.status === 404) {
186
- } else {
187
- throw e;
188
- }
189
- }
181
+ static save(user, opts = {}) {
182
+ var _a, _b;
183
+ return __awaiter(this, void 0, void 0, function* () {
184
+ // default booleans to true
185
+ if (opts.hashPassword == null) {
186
+ opts.hashPassword = true;
187
+ }
188
+ if (opts.requirePassword == null) {
189
+ opts.requirePassword = true;
190
+ }
191
+ const tenantId = (0, context_1.getTenantId)();
192
+ const db = (0, context_1.getGlobalDB)();
193
+ let { email, _id, userGroups = [], roles } = user;
194
+ if (!email && !_id) {
195
+ throw new Error("_id or email is required");
196
+ }
197
+ if (((_b = (_a = user.builder) === null || _a === void 0 ? void 0 : _a.apps) === null || _b === void 0 ? void 0 : _b.length) &&
198
+ !(yield UserDB.features.isAppBuildersEnabled())) {
199
+ throw new Error("Unable to update app builders, please check license");
200
+ }
201
+ let dbUser;
202
+ if (_id) {
203
+ // try to get existing user from db
204
+ try {
205
+ dbUser = (yield db.get(_id));
206
+ if (email && dbUser.email !== email) {
207
+ throw "Email address cannot be changed";
208
+ }
209
+ email = dbUser.email;
210
+ }
211
+ catch (e) {
212
+ if (e.status === 404) {
213
+ // do nothing, save this new user with the id specified - required for SSO auth
214
+ }
215
+ else {
216
+ throw e;
217
+ }
218
+ }
219
+ }
220
+ if (!dbUser && email) {
221
+ // no id was specified - load from email instead
222
+ dbUser = yield usersCore.getGlobalUserByEmail(email);
223
+ if (dbUser && dbUser._id !== _id) {
224
+ throw new errors_1.EmailUnavailableError(email);
225
+ }
226
+ }
227
+ const change = dbUser ? 0 : 1; // no change if there is existing user
228
+ return UserDB.quotas.addUsers(change, () => __awaiter(this, void 0, void 0, function* () {
229
+ yield (0, utils_1.validateUniqueUser)(email, tenantId);
230
+ let builtUser = yield UserDB.buildUser(user, opts, tenantId, dbUser);
231
+ // don't allow a user to update its own roles/perms
232
+ if (opts.currentUserId && opts.currentUserId === (dbUser === null || dbUser === void 0 ? void 0 : dbUser._id)) {
233
+ builtUser = usersCore.cleanseUserObject(builtUser, dbUser);
234
+ }
235
+ if (!dbUser && (roles === null || roles === void 0 ? void 0 : roles.length)) {
236
+ builtUser.roles = Object.assign({}, roles);
237
+ }
238
+ // make sure we set the _id field for a new user
239
+ // Also if this is a new user, associate groups with them
240
+ let groupPromises = [];
241
+ if (!_id) {
242
+ _id = builtUser._id;
243
+ if (userGroups.length > 0) {
244
+ for (let groupId of userGroups) {
245
+ groupPromises.push(UserDB.groups.addUsers(groupId, [_id]));
246
+ }
247
+ }
248
+ }
249
+ try {
250
+ // save the user to db
251
+ let response = yield db.put(builtUser);
252
+ builtUser._rev = response.rev;
253
+ yield eventHelpers.handleSaveEvents(builtUser, dbUser);
254
+ yield platform.users.addUser(tenantId, builtUser._id, builtUser.email);
255
+ yield cache.user.invalidateUser(response.id);
256
+ yield Promise.all(groupPromises);
257
+ // finally returned the saved user from the db
258
+ return db.get(builtUser._id);
259
+ }
260
+ catch (err) {
261
+ if (err.status === 409) {
262
+ throw "User exists already";
263
+ }
264
+ else {
265
+ throw err;
266
+ }
267
+ }
268
+ }));
269
+ });
190
270
  }
191
- if (!dbUser && email) {
192
- dbUser = await usersCore.getGlobalUserByEmail(email);
193
- if (dbUser && dbUser._id !== _id) {
194
- throw new import_errors.EmailUnavailableError(email);
195
- }
271
+ static bulkCreate(newUsersRequested, groups) {
272
+ return __awaiter(this, void 0, void 0, function* () {
273
+ const tenantId = (0, context_1.getTenantId)();
274
+ let usersToSave = [];
275
+ let newUsers = [];
276
+ const emails = newUsersRequested.map((user) => user.email);
277
+ const existingEmails = yield (0, lookup_1.searchExistingEmails)(emails);
278
+ const unsuccessful = [];
279
+ for (const newUser of newUsersRequested) {
280
+ if (newUsers.find((x) => x.email.toLowerCase() === newUser.email.toLowerCase()) ||
281
+ existingEmails.includes(newUser.email.toLowerCase())) {
282
+ unsuccessful.push({
283
+ email: newUser.email,
284
+ reason: `Unavailable`,
285
+ });
286
+ continue;
287
+ }
288
+ newUser.userGroups = groups;
289
+ newUsers.push(newUser);
290
+ }
291
+ const account = yield accountSdk.getAccountByTenantId(tenantId);
292
+ return UserDB.quotas.addUsers(newUsers.length, () => __awaiter(this, void 0, void 0, function* () {
293
+ // create the promises array that will be called by bulkDocs
294
+ newUsers.forEach((user) => {
295
+ usersToSave.push(UserDB.buildUser(user, {
296
+ hashPassword: true,
297
+ requirePassword: user.requirePassword,
298
+ }, tenantId, undefined, // no dbUser
299
+ account));
300
+ });
301
+ const usersToBulkSave = yield Promise.all(usersToSave);
302
+ yield usersCore.bulkUpdateGlobalUsers(usersToBulkSave);
303
+ // Post-processing of bulk added users, e.g. events and cache operations
304
+ for (const user of usersToBulkSave) {
305
+ // TODO: Refactor to bulk insert users into the info db
306
+ // instead of relying on looping tenant creation
307
+ yield platform.users.addUser(tenantId, user._id, user.email);
308
+ yield eventHelpers.handleSaveEvents(user, undefined);
309
+ }
310
+ const saved = usersToBulkSave.map(user => {
311
+ return {
312
+ _id: user._id,
313
+ email: user.email,
314
+ };
315
+ });
316
+ // now update the groups
317
+ if (Array.isArray(saved) && groups) {
318
+ const groupPromises = [];
319
+ const createdUserIds = saved.map(user => user._id);
320
+ for (let groupId of groups) {
321
+ groupPromises.push(UserDB.groups.addUsers(groupId, createdUserIds));
322
+ }
323
+ yield Promise.all(groupPromises);
324
+ }
325
+ return {
326
+ successful: saved,
327
+ unsuccessful,
328
+ };
329
+ }));
330
+ });
196
331
  }
197
- const change = dbUser ? 0 : 1;
198
- return UserDB.quotas.addUsers(change, async () => {
199
- await (0, import_utils.validateUniqueUser)(email, tenantId);
200
- let builtUser = await UserDB.buildUser(user, opts, tenantId, dbUser);
201
- if (opts.currentUserId && opts.currentUserId === dbUser?._id) {
202
- builtUser = usersCore.cleanseUserObject(builtUser, dbUser);
203
- }
204
- if (!dbUser && roles?.length) {
205
- builtUser.roles = { ...roles };
206
- }
207
- let groupPromises = [];
208
- if (!_id) {
209
- _id = builtUser._id;
210
- if (userGroups.length > 0) {
211
- for (let groupId of userGroups) {
212
- groupPromises.push(UserDB.groups.addUsers(groupId, [_id]));
213
- }
214
- }
215
- }
216
- try {
217
- let response = await db.put(builtUser);
218
- builtUser._rev = response.rev;
219
- await eventHelpers.handleSaveEvents(builtUser, dbUser);
220
- await platform.users.addUser(tenantId, builtUser._id, builtUser.email);
221
- await cache.user.invalidateUser(response.id);
222
- await Promise.all(groupPromises);
223
- return db.get(builtUser._id);
224
- } catch (err) {
225
- if (err.status === 409) {
226
- throw "User exists already";
227
- } else {
228
- throw err;
229
- }
230
- }
231
- });
232
- }
233
- static async bulkCreate(newUsersRequested, groups) {
234
- const tenantId = (0, import_context.getTenantId)();
235
- let usersToSave = [];
236
- let newUsers = [];
237
- const emails = newUsersRequested.map((user) => user.email);
238
- const existingEmails = await (0, import_lookup.searchExistingEmails)(emails);
239
- const unsuccessful = [];
240
- for (const newUser of newUsersRequested) {
241
- if (newUsers.find(
242
- (x) => x.email.toLowerCase() === newUser.email.toLowerCase()
243
- ) || existingEmails.includes(newUser.email.toLowerCase())) {
244
- unsuccessful.push({
245
- email: newUser.email,
246
- reason: `Unavailable`
332
+ static bulkDelete(userIds) {
333
+ return __awaiter(this, void 0, void 0, function* () {
334
+ const db = (0, context_1.getGlobalDB)();
335
+ const response = {
336
+ successful: [],
337
+ unsuccessful: [],
338
+ };
339
+ // remove the account holder from the delete request if present
340
+ const account = yield (0, utils_1.getAccountHolderFromUserIds)(userIds);
341
+ if (account) {
342
+ userIds = userIds.filter(u => u !== account.budibaseUserId);
343
+ // mark user as unsuccessful
344
+ response.unsuccessful.push({
345
+ _id: account.budibaseUserId,
346
+ email: account.email,
347
+ reason: "Account holder cannot be deleted",
348
+ });
349
+ }
350
+ // Get users and delete
351
+ const allDocsResponse = yield db.allDocs({
352
+ include_docs: true,
353
+ keys: userIds,
354
+ });
355
+ const usersToDelete = allDocsResponse.rows.map((user) => {
356
+ return user.doc;
357
+ });
358
+ // Delete from DB
359
+ const toDelete = usersToDelete.map(user => (Object.assign(Object.assign({}, user), { _deleted: true })));
360
+ const dbResponse = yield usersCore.bulkUpdateGlobalUsers(toDelete);
361
+ yield UserDB.quotas.removeUsers(toDelete.length);
362
+ for (let user of usersToDelete) {
363
+ yield bulkDeleteProcessing(user);
364
+ }
365
+ // Build Response
366
+ // index users by id
367
+ const userIndex = {};
368
+ usersToDelete.reduce((prev, current) => {
369
+ prev[current._id] = current;
370
+ return prev;
371
+ }, userIndex);
372
+ // add the successful and unsuccessful users to response
373
+ dbResponse.forEach(item => {
374
+ const email = userIndex[item.id].email;
375
+ if (item.ok) {
376
+ response.successful.push({ _id: item.id, email });
377
+ }
378
+ else {
379
+ response.unsuccessful.push({
380
+ _id: item.id,
381
+ email,
382
+ reason: "Database error",
383
+ });
384
+ }
385
+ });
386
+ return response;
247
387
  });
248
- continue;
249
- }
250
- newUser.userGroups = groups;
251
- newUsers.push(newUser);
252
388
  }
253
- const account = await accountSdk.getAccountByTenantId(tenantId);
254
- return UserDB.quotas.addUsers(newUsers.length, async () => {
255
- newUsers.forEach((user) => {
256
- usersToSave.push(
257
- UserDB.buildUser(
258
- user,
259
- {
260
- hashPassword: true,
261
- requirePassword: user.requirePassword
262
- },
263
- tenantId,
264
- void 0,
265
- // no dbUser
266
- account
267
- )
268
- );
269
- });
270
- const usersToBulkSave = await Promise.all(usersToSave);
271
- await usersCore.bulkUpdateGlobalUsers(usersToBulkSave);
272
- for (const user of usersToBulkSave) {
273
- await platform.users.addUser(tenantId, user._id, user.email);
274
- await eventHelpers.handleSaveEvents(user, void 0);
275
- }
276
- const saved = usersToBulkSave.map((user) => {
277
- return {
278
- _id: user._id,
279
- email: user.email
280
- };
281
- });
282
- if (Array.isArray(saved) && groups) {
283
- const groupPromises = [];
284
- const createdUserIds = saved.map((user) => user._id);
285
- for (let groupId of groups) {
286
- groupPromises.push(UserDB.groups.addUsers(groupId, createdUserIds));
287
- }
288
- await Promise.all(groupPromises);
289
- }
290
- return {
291
- successful: saved,
292
- unsuccessful
293
- };
294
- });
295
- }
296
- static async bulkDelete(userIds) {
297
- const db = (0, import_context.getGlobalDB)();
298
- const response = {
299
- successful: [],
300
- unsuccessful: []
301
- };
302
- const account = await (0, import_utils.getAccountHolderFromUserIds)(userIds);
303
- if (account) {
304
- userIds = userIds.filter((u) => u !== account.budibaseUserId);
305
- response.unsuccessful.push({
306
- _id: account.budibaseUserId,
307
- email: account.email,
308
- reason: "Account holder cannot be deleted"
309
- });
389
+ static destroy(id) {
390
+ return __awaiter(this, void 0, void 0, function* () {
391
+ const db = (0, context_1.getGlobalDB)();
392
+ const dbUser = (yield db.get(id));
393
+ const userId = dbUser._id;
394
+ if (!environment_1.default.SELF_HOSTED && !environment_1.default.DISABLE_ACCOUNT_PORTAL) {
395
+ // root account holder can't be deleted from inside budibase
396
+ const email = dbUser.email;
397
+ const account = yield accounts.getAccount(email);
398
+ if (account) {
399
+ if (dbUser.userId === (0, context_1.getIdentity)()._id) {
400
+ throw new errors_1.HTTPError('Please visit "Account" to delete this user', 400);
401
+ }
402
+ else {
403
+ throw new errors_1.HTTPError("Account holder cannot be deleted", 400);
404
+ }
405
+ }
406
+ }
407
+ yield platform.users.removeUser(dbUser);
408
+ yield db.remove(userId, dbUser._rev);
409
+ yield UserDB.quotas.removeUsers(1);
410
+ yield eventHelpers.handleDeleteEvents(dbUser);
411
+ yield cache.user.invalidateUser(userId);
412
+ yield sessions.invalidateSessions(userId, { reason: "deletion" });
413
+ });
310
414
  }
311
- const allDocsResponse = await db.allDocs({
312
- include_docs: true,
313
- keys: userIds
314
- });
315
- const usersToDelete = allDocsResponse.rows.map(
316
- (user) => {
317
- return user.doc;
318
- }
319
- );
320
- const toDelete = usersToDelete.map((user) => ({
321
- ...user,
322
- _deleted: true
323
- }));
324
- const dbResponse = await usersCore.bulkUpdateGlobalUsers(toDelete);
325
- await UserDB.quotas.removeUsers(toDelete.length);
326
- for (let user of usersToDelete) {
327
- await bulkDeleteProcessing(user);
415
+ static getGroups(groupIds) {
416
+ return __awaiter(this, void 0, void 0, function* () {
417
+ return yield this.groups.getBulk(groupIds);
418
+ });
328
419
  }
329
- const userIndex = {};
330
- usersToDelete.reduce((prev, current) => {
331
- prev[current._id] = current;
332
- return prev;
333
- }, userIndex);
334
- dbResponse.forEach((item) => {
335
- const email = userIndex[item.id].email;
336
- if (item.ok) {
337
- response.successful.push({ _id: item.id, email });
338
- } else {
339
- response.unsuccessful.push({
340
- _id: item.id,
341
- email,
342
- reason: "Database error"
420
+ static getGroupBuilderAppIds(user) {
421
+ return __awaiter(this, void 0, void 0, function* () {
422
+ return yield this.groups.getGroupBuilderAppIds(user);
343
423
  });
344
- }
345
- });
346
- return response;
347
- }
348
- static async destroy(id) {
349
- const db = (0, import_context.getGlobalDB)();
350
- const dbUser = await db.get(id);
351
- const userId = dbUser._id;
352
- if (!import_environment.default.SELF_HOSTED && !import_environment.default.DISABLE_ACCOUNT_PORTAL) {
353
- const email = dbUser.email;
354
- const account = await accounts.getAccount(email);
355
- if (account) {
356
- if (dbUser.userId === (0, import_context.getIdentity)()._id) {
357
- throw new import_errors.HTTPError('Please visit "Account" to delete this user', 400);
358
- } else {
359
- throw new import_errors.HTTPError("Account holder cannot be deleted", 400);
360
- }
361
- }
362
424
  }
363
- await platform.users.removeUser(dbUser);
364
- await db.remove(userId, dbUser._rev);
365
- await UserDB.quotas.removeUsers(1);
366
- await eventHelpers.handleDeleteEvents(dbUser);
367
- await cache.user.invalidateUser(userId);
368
- await sessions.invalidateSessions(userId, { reason: "deletion" });
369
- }
370
- static async getGroups(groupIds) {
371
- return await this.groups.getBulk(groupIds);
372
- }
373
- static async getGroupBuilderAppIds(user) {
374
- return await this.groups.getGroupBuilderAppIds(user);
375
- }
376
425
  }
377
- // Annotate the CommonJS export names for ESM import in node:
378
- 0 && (module.exports = {
379
- UserDB
380
- });
381
- //# sourceMappingURL=db.js.map
426
+ exports.UserDB = UserDB;
427
+ //# sourceMappingURL=db.js.map