@researchdatabox/redbox-core 0.0.0-bootstrap.0 → 0.0.1-beta.10173

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 (649) hide show
  1. package/dist/CoreController.d.ts +4 -0
  2. package/dist/CoreController.d.ts.map +1 -1
  3. package/dist/CoreController.js +68 -23
  4. package/dist/CoreService.d.ts +1 -1
  5. package/dist/CoreService.d.ts.map +1 -1
  6. package/dist/CoreService.js +1 -1
  7. package/dist/DatastreamService.d.ts +5 -2
  8. package/dist/DatastreamService.d.ts.map +1 -1
  9. package/dist/HarvestRunService.d.ts +49 -0
  10. package/dist/HarvestRunService.d.ts.map +1 -0
  11. package/dist/HarvestRunService.js +13 -0
  12. package/dist/IntegrationAuditParams.d.ts +11 -0
  13. package/dist/IntegrationAuditParams.js +14 -0
  14. package/dist/QueueService.d.ts +1 -1
  15. package/dist/QueueService.d.ts.map +1 -1
  16. package/dist/RecordAuditParams.d.ts +2 -0
  17. package/dist/RecordAuditParams.d.ts.map +1 -1
  18. package/dist/RecordAuditParams.js +3 -1
  19. package/dist/RecordsService.d.ts +52 -2
  20. package/dist/RecordsService.d.ts.map +1 -1
  21. package/dist/StorageService.d.ts +5 -1
  22. package/dist/StorageService.d.ts.map +1 -1
  23. package/dist/api-routes/apib.d.ts +7 -0
  24. package/dist/api-routes/apib.d.ts.map +1 -0
  25. package/dist/api-routes/apib.js +43 -0
  26. package/dist/api-routes/define.d.ts +4 -0
  27. package/dist/api-routes/define.d.ts.map +1 -0
  28. package/dist/api-routes/define.js +29 -0
  29. package/dist/api-routes/groups/admin.d.ts +6 -0
  30. package/dist/api-routes/groups/admin.d.ts.map +1 -0
  31. package/dist/api-routes/groups/admin.js +53 -0
  32. package/dist/api-routes/groups/appconfig.d.ts +4 -0
  33. package/dist/api-routes/groups/appconfig.d.ts.map +1 -0
  34. package/dist/api-routes/groups/appconfig.js +33 -0
  35. package/dist/api-routes/groups/branding.d.ts +8 -0
  36. package/dist/api-routes/groups/branding.d.ts.map +1 -0
  37. package/dist/api-routes/groups/branding.js +61 -0
  38. package/dist/api-routes/groups/dashboard-config.d.ts +11 -0
  39. package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -0
  40. package/dist/api-routes/groups/dashboard-config.js +90 -0
  41. package/dist/api-routes/groups/export.d.ts +3 -0
  42. package/dist/api-routes/groups/export.d.ts.map +1 -0
  43. package/dist/api-routes/groups/export.js +30 -0
  44. package/dist/api-routes/groups/forms.d.ts +4 -0
  45. package/dist/api-routes/groups/forms.d.ts.map +1 -0
  46. package/dist/api-routes/groups/forms.js +29 -0
  47. package/dist/api-routes/groups/harvest-runs.d.ts +5 -0
  48. package/dist/api-routes/groups/harvest-runs.d.ts.map +1 -0
  49. package/dist/api-routes/groups/harvest-runs.js +79 -0
  50. package/dist/api-routes/groups/integration-audit.d.ts +3 -0
  51. package/dist/api-routes/groups/integration-audit.d.ts.map +1 -0
  52. package/dist/api-routes/groups/integration-audit.js +35 -0
  53. package/dist/api-routes/groups/named-query.d.ts +8 -0
  54. package/dist/api-routes/groups/named-query.d.ts.map +1 -0
  55. package/dist/api-routes/groups/named-query.js +54 -0
  56. package/dist/api-routes/groups/notifications.d.ts +3 -0
  57. package/dist/api-routes/groups/notifications.d.ts.map +1 -0
  58. package/dist/api-routes/groups/notifications.js +20 -0
  59. package/dist/api-routes/groups/records.d.ts +28 -0
  60. package/dist/api-routes/groups/records.d.ts.map +1 -0
  61. package/dist/api-routes/groups/records.js +353 -0
  62. package/dist/api-routes/groups/recordtypes.d.ts +4 -0
  63. package/dist/api-routes/groups/recordtypes.d.ts.map +1 -0
  64. package/dist/api-routes/groups/recordtypes.js +27 -0
  65. package/dist/api-routes/groups/reports.d.ts +9 -0
  66. package/dist/api-routes/groups/reports.d.ts.map +1 -0
  67. package/dist/api-routes/groups/reports.js +63 -0
  68. package/dist/api-routes/groups/search-query.d.ts +4 -0
  69. package/dist/api-routes/groups/search-query.d.ts.map +1 -0
  70. package/dist/api-routes/groups/search-query.js +51 -0
  71. package/dist/api-routes/groups/search.d.ts +6 -0
  72. package/dist/api-routes/groups/search.d.ts.map +1 -0
  73. package/dist/api-routes/groups/search.js +31 -0
  74. package/dist/api-routes/groups/translation.d.ts +8 -0
  75. package/dist/api-routes/groups/translation.d.ts.map +1 -0
  76. package/dist/api-routes/groups/translation.js +82 -0
  77. package/dist/api-routes/groups/users.d.ts +17 -0
  78. package/dist/api-routes/groups/users.d.ts.map +1 -0
  79. package/dist/api-routes/groups/users.js +149 -0
  80. package/dist/api-routes/groups/vocabulary.d.ts +10 -0
  81. package/dist/api-routes/groups/vocabulary.d.ts.map +1 -0
  82. package/dist/api-routes/groups/vocabulary.js +97 -0
  83. package/dist/api-routes/helpers.d.ts +29 -0
  84. package/dist/api-routes/helpers.d.ts.map +1 -0
  85. package/dist/api-routes/helpers.js +485 -0
  86. package/dist/api-routes/index.d.ts +27 -0
  87. package/dist/api-routes/index.d.ts.map +1 -0
  88. package/dist/api-routes/index.js +43 -0
  89. package/dist/api-routes/openapi.d.ts +26 -0
  90. package/dist/api-routes/openapi.d.ts.map +1 -0
  91. package/dist/api-routes/openapi.js +292 -0
  92. package/dist/api-routes/request-extraction.d.ts +14 -0
  93. package/dist/api-routes/request-extraction.d.ts.map +1 -0
  94. package/dist/api-routes/request-extraction.js +100 -0
  95. package/dist/api-routes/route-factory.d.ts +3 -0
  96. package/dist/api-routes/route-factory.d.ts.map +1 -0
  97. package/dist/api-routes/route-factory.js +30 -0
  98. package/dist/api-routes/route-registry.d.ts +24 -0
  99. package/dist/api-routes/route-registry.d.ts.map +1 -0
  100. package/dist/api-routes/route-registry.js +117 -0
  101. package/dist/api-routes/route-resolution.d.ts +4 -0
  102. package/dist/api-routes/route-resolution.d.ts.map +1 -0
  103. package/dist/api-routes/route-resolution.js +71 -0
  104. package/dist/api-routes/schemas/common.d.ts +35 -0
  105. package/dist/api-routes/schemas/common.d.ts.map +1 -0
  106. package/dist/api-routes/schemas/common.js +146 -0
  107. package/dist/api-routes/schemas/responses.d.ts +972 -0
  108. package/dist/api-routes/schemas/responses.d.ts.map +1 -0
  109. package/dist/api-routes/schemas/responses.js +512 -0
  110. package/dist/api-routes/types.d.ts +70 -0
  111. package/dist/api-routes/types.d.ts.map +1 -0
  112. package/dist/api-routes/types.js +3 -0
  113. package/dist/api-routes/validation.d.ts +32 -0
  114. package/dist/api-routes/validation.d.ts.map +1 -0
  115. package/dist/api-routes/validation.js +142 -0
  116. package/dist/api-routes/zod-openapi.d.ts +3 -0
  117. package/dist/api-routes/zod-openapi.d.ts.map +1 -0
  118. package/dist/api-routes/zod-openapi.js +8 -0
  119. package/dist/bootstrap.d.ts.map +1 -1
  120. package/dist/bootstrap.js +12 -12
  121. package/dist/config/agendaQueue.config.d.ts +33 -6
  122. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  123. package/dist/config/agendaQueue.config.js +40 -18
  124. package/dist/config/auth.config.d.ts.map +1 -1
  125. package/dist/config/auth.config.js +29 -2
  126. package/dist/config/branding.config.d.ts +2 -1
  127. package/dist/config/branding.config.d.ts.map +1 -1
  128. package/dist/config/branding.config.js +5 -95
  129. package/dist/config/brandingConfigurationDefaults.config.d.ts +3 -0
  130. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
  131. package/dist/config/brandingConfigurationDefaults.config.js +158 -5
  132. package/dist/config/custom.config.d.ts +6 -0
  133. package/dist/config/custom.config.d.ts.map +1 -1
  134. package/dist/config/custom.config.js +10 -1
  135. package/dist/config/dashboardtype.config.d.ts +5 -0
  136. package/dist/config/dashboardtype.config.d.ts.map +1 -1
  137. package/dist/config/dashboardtype.config.js +1 -1
  138. package/dist/config/dashboardview.config.d.ts +24 -0
  139. package/dist/config/dashboardview.config.d.ts.map +1 -0
  140. package/dist/config/dashboardview.config.js +137 -0
  141. package/dist/config/dompurify.config.d.ts +1 -0
  142. package/dist/config/dompurify.config.d.ts.map +1 -1
  143. package/dist/config/dompurify.config.js +5 -4
  144. package/dist/config/emailnotification.config.d.ts.map +1 -1
  145. package/dist/config/emailnotification.config.js +2 -1
  146. package/dist/config/figshareDev.config.d.ts +12 -0
  147. package/dist/config/figshareDev.config.js +9 -0
  148. package/dist/config/form.config.d.ts +4 -0
  149. package/dist/config/form.config.d.ts.map +1 -1
  150. package/dist/config/form.config.js +1 -1
  151. package/dist/config/harvestRuns.config.d.ts +9 -0
  152. package/dist/config/harvestRuns.config.d.ts.map +1 -0
  153. package/dist/config/harvestRuns.config.js +11 -0
  154. package/dist/config/http.config.d.ts +13 -1
  155. package/dist/config/http.config.d.ts.map +1 -1
  156. package/dist/config/http.config.js +201 -38
  157. package/dist/config/index.d.ts +14 -19
  158. package/dist/config/index.d.ts.map +1 -1
  159. package/dist/config/index.js +10 -15
  160. package/dist/config/namedQuery.config.d.ts +26 -4
  161. package/dist/config/namedQuery.config.d.ts.map +1 -1
  162. package/dist/config/namedQuery.config.js +7 -350
  163. package/dist/config/policies.config.d.ts +3 -0
  164. package/dist/config/policies.config.d.ts.map +1 -1
  165. package/dist/config/policies.config.js +35 -1
  166. package/dist/config/record.config.d.ts.map +1 -1
  167. package/dist/config/record.config.js +2 -1
  168. package/dist/config/recordtype.config.d.ts +28 -0
  169. package/dist/config/recordtype.config.d.ts.map +1 -1
  170. package/dist/config/recordtype.config.js +105 -13
  171. package/dist/config/redboxSession.config.d.ts +3 -0
  172. package/dist/config/redboxSession.config.d.ts.map +1 -1
  173. package/dist/config/redboxSession.config.js +1 -1
  174. package/dist/config/report.config.d.ts +2 -11
  175. package/dist/config/report.config.d.ts.map +1 -1
  176. package/dist/config/report.config.js +3 -49
  177. package/dist/config/reusableContributorFormDefinitions.config.d.ts +1 -1
  178. package/dist/config/reusableContributorFormDefinitions.config.d.ts.map +1 -1
  179. package/dist/config/reusableContributorFormDefinitions.config.js +371 -206
  180. package/dist/config/reusableViewFormDefinitions.config.js +3 -3
  181. package/dist/config/routes.config.d.ts +5 -2
  182. package/dist/config/routes.config.d.ts.map +1 -1
  183. package/dist/config/routes.config.js +55 -117
  184. package/dist/config/storage.config.d.ts +20 -2
  185. package/dist/config/storage.config.d.ts.map +1 -1
  186. package/dist/config/storage.config.js +2 -1
  187. package/dist/config/validators.config.d.ts +6 -4
  188. package/dist/config/validators.config.d.ts.map +1 -1
  189. package/dist/config/validators.config.js +5 -3
  190. package/dist/config/vocab.config.d.ts +30 -0
  191. package/dist/config/vocab.config.d.ts.map +1 -1
  192. package/dist/config/vocab.config.js +21 -1
  193. package/dist/config/webpack.config.d.ts.map +1 -1
  194. package/dist/config/webpack.config.js +18 -12
  195. package/dist/config/workflow.config.d.ts +0 -1
  196. package/dist/config/workflow.config.d.ts.map +1 -1
  197. package/dist/config/workflow.config.js +1 -137
  198. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
  199. package/dist/configmodels/AdminSidebarConfig.js +4 -3
  200. package/dist/configmodels/AuthorizedDomainsEmails.d.ts +48 -0
  201. package/dist/configmodels/AuthorizedDomainsEmails.d.ts.map +1 -1
  202. package/dist/configmodels/AuthorizedDomainsEmails.js +50 -2
  203. package/dist/configmodels/ConfigModels.d.ts +7 -1
  204. package/dist/configmodels/ConfigModels.d.ts.map +1 -1
  205. package/dist/configmodels/ConfigModels.js +41 -1
  206. package/dist/configmodels/DashboardTableOverrideConfig.d.ts +1011 -0
  207. package/dist/configmodels/DashboardTableOverrideConfig.d.ts.map +1 -0
  208. package/dist/configmodels/DashboardTableOverrideConfig.js +138 -0
  209. package/dist/configmodels/DoiPublishing.d.ts +4711 -0
  210. package/dist/configmodels/DoiPublishing.js +639 -0
  211. package/dist/configmodels/FigsharePublishing.d.ts +1376 -0
  212. package/dist/configmodels/FigsharePublishing.js +630 -0
  213. package/dist/configmodels/IntegrationNotificationConfig.d.ts +133 -0
  214. package/dist/configmodels/IntegrationNotificationConfig.d.ts.map +1 -0
  215. package/dist/configmodels/IntegrationNotificationConfig.js +64 -0
  216. package/dist/configmodels/SystemMessage.d.ts +32 -0
  217. package/dist/configmodels/SystemMessage.d.ts.map +1 -1
  218. package/dist/configmodels/SystemMessage.js +34 -2
  219. package/dist/controllers/AdminController.d.ts +1 -1
  220. package/dist/controllers/AdminController.d.ts.map +1 -1
  221. package/dist/controllers/AdminController.js +6 -32
  222. package/dist/controllers/AppConfigController.js +3 -3
  223. package/dist/controllers/BrandingAppController.d.ts.map +1 -1
  224. package/dist/controllers/BrandingAppController.js +11 -10
  225. package/dist/controllers/BrandingController.d.ts +11 -5
  226. package/dist/controllers/BrandingController.d.ts.map +1 -1
  227. package/dist/controllers/BrandingController.js +116 -48
  228. package/dist/controllers/DashboardConfigController.d.ts +8 -0
  229. package/dist/controllers/DashboardConfigController.d.ts.map +1 -0
  230. package/dist/controllers/DashboardConfigController.js +17 -0
  231. package/dist/controllers/DynamicAssetController.d.ts +1 -21
  232. package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
  233. package/dist/controllers/DynamicAssetController.js +19 -41
  234. package/dist/controllers/EmailController.d.ts.map +1 -1
  235. package/dist/controllers/EmailController.js +16 -12
  236. package/dist/controllers/FormVocabularyController.d.ts +3 -0
  237. package/dist/controllers/FormVocabularyController.d.ts.map +1 -1
  238. package/dist/controllers/FormVocabularyController.js +154 -4
  239. package/dist/controllers/NamedQueryController.d.ts +8 -0
  240. package/dist/controllers/NamedQueryController.d.ts.map +1 -0
  241. package/dist/controllers/NamedQueryController.js +17 -0
  242. package/dist/controllers/RecordAuditController.d.ts +31 -14
  243. package/dist/controllers/RecordAuditController.d.ts.map +1 -1
  244. package/dist/controllers/RecordAuditController.js +509 -57
  245. package/dist/controllers/RecordController.d.ts +18 -16
  246. package/dist/controllers/RecordController.d.ts.map +1 -1
  247. package/dist/controllers/RecordController.js +314 -167
  248. package/dist/controllers/RenderViewController.d.ts.map +1 -1
  249. package/dist/controllers/RenderViewController.js +4 -2
  250. package/dist/controllers/ReportController.d.ts +7 -0
  251. package/dist/controllers/ReportController.d.ts.map +1 -1
  252. package/dist/controllers/ReportController.js +75 -2
  253. package/dist/controllers/ReportsController.d.ts +1 -0
  254. package/dist/controllers/ReportsController.d.ts.map +1 -1
  255. package/dist/controllers/ReportsController.js +12 -2
  256. package/dist/controllers/TranslationController.d.ts.map +1 -1
  257. package/dist/controllers/TranslationController.js +14 -12
  258. package/dist/controllers/WorkspaceTypesController.d.ts +3 -2
  259. package/dist/controllers/WorkspaceTypesController.d.ts.map +1 -1
  260. package/dist/controllers/WorkspaceTypesController.js +120 -31
  261. package/dist/controllers/index.d.ts.map +1 -1
  262. package/dist/controllers/index.js +19 -4
  263. package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
  264. package/dist/controllers/webservice/AdminController.js +16 -17
  265. package/dist/controllers/webservice/AppConfigController.d.ts.map +1 -1
  266. package/dist/controllers/webservice/AppConfigController.js +17 -18
  267. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
  268. package/dist/controllers/webservice/BrandingController.js +102 -48
  269. package/dist/controllers/webservice/DashboardConfigController.d.ts +26 -0
  270. package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -0
  271. package/dist/controllers/webservice/DashboardConfigController.js +241 -0
  272. package/dist/controllers/webservice/ExportController.d.ts.map +1 -1
  273. package/dist/controllers/webservice/ExportController.js +11 -11
  274. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
  275. package/dist/controllers/webservice/FormManagementController.js +11 -13
  276. package/dist/controllers/webservice/HarvestRunController.d.ts +13 -0
  277. package/dist/controllers/webservice/HarvestRunController.d.ts.map +1 -0
  278. package/dist/controllers/webservice/HarvestRunController.js +148 -0
  279. package/dist/controllers/webservice/IntegrationAuditController.d.ts +10 -0
  280. package/dist/controllers/webservice/IntegrationAuditController.d.ts.map +1 -1
  281. package/dist/controllers/webservice/IntegrationAuditController.js +98 -0
  282. package/dist/controllers/webservice/NamedQueryController.d.ts +17 -0
  283. package/dist/controllers/webservice/NamedQueryController.d.ts.map +1 -0
  284. package/dist/controllers/webservice/NamedQueryController.js +127 -0
  285. package/dist/controllers/webservice/RecordController.d.ts +4 -0
  286. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  287. package/dist/controllers/webservice/RecordController.js +441 -314
  288. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
  289. package/dist/controllers/webservice/RecordTypeController.js +9 -10
  290. package/dist/controllers/webservice/ReportController.d.ts +7 -0
  291. package/dist/controllers/webservice/ReportController.d.ts.map +1 -1
  292. package/dist/controllers/webservice/ReportController.js +125 -19
  293. package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
  294. package/dist/controllers/webservice/SearchController.js +28 -35
  295. package/dist/controllers/webservice/TranslationController.d.ts.map +1 -1
  296. package/dist/controllers/webservice/TranslationController.js +65 -43
  297. package/dist/controllers/webservice/UserManagementController.d.ts +1 -1
  298. package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -1
  299. package/dist/controllers/webservice/UserManagementController.js +114 -101
  300. package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -1
  301. package/dist/controllers/webservice/VocabularyController.js +76 -28
  302. package/dist/form-config/dataRecord-1.0-draft.js +3 -3
  303. package/dist/form-config/default-1.0-draft.d.ts.map +1 -1
  304. package/dist/form-config/default-1.0-draft.js +27 -3
  305. package/dist/form-config/index.d.ts.map +1 -1
  306. package/dist/form-config/index.js +1 -1
  307. package/dist/hooks/defineRedboxHook.d.ts +3 -0
  308. package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
  309. package/dist/hooks/defineRedboxHook.js +4 -1
  310. package/dist/hooks/webpack.d.ts.map +1 -1
  311. package/dist/hooks/webpack.js +17 -7
  312. package/dist/index.d.ts +12 -2
  313. package/dist/index.d.ts.map +1 -1
  314. package/dist/index.js +17 -2
  315. package/dist/loader/MigrationRunner.d.ts +19 -0
  316. package/dist/loader/MigrationRunner.d.ts.map +1 -0
  317. package/dist/loader/MigrationRunner.js +108 -0
  318. package/dist/loader/bootstrapShimRuntime.d.ts +2 -1
  319. package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
  320. package/dist/loader/bootstrapShimRuntime.js +7 -2
  321. package/dist/loader/index.d.ts +17 -0
  322. package/dist/loader/index.d.ts.map +1 -1
  323. package/dist/loader/index.js +216 -13
  324. package/dist/middleware/redboxSession.d.ts +5 -0
  325. package/dist/middleware/redboxSession.d.ts.map +1 -1
  326. package/dist/middleware/redboxSession.js +19 -6
  327. package/dist/model/BuildResponse.d.ts +4 -0
  328. package/dist/model/BuildResponse.d.ts.map +1 -1
  329. package/dist/model/DashboardTypeResponseModel.d.ts +13 -1
  330. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
  331. package/dist/model/DashboardTypeResponseModel.js +12 -4
  332. package/dist/model/DashboardViewResponseModel.d.ts +20 -0
  333. package/dist/model/DashboardViewResponseModel.d.ts.map +1 -0
  334. package/dist/model/DashboardViewResponseModel.js +38 -0
  335. package/dist/model/RecordTypeResponseModel.d.ts +3 -1
  336. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
  337. package/dist/model/RecordTypeResponseModel.js +4 -2
  338. package/dist/model/RequestDetails.d.ts +1 -1
  339. package/dist/model/RequestDetails.d.ts.map +1 -1
  340. package/dist/model/RequestDetails.js +1 -1
  341. package/dist/model/config/ReportConfig.d.ts +1 -1
  342. package/dist/model/config/ReportConfig.d.ts.map +1 -1
  343. package/dist/model/config/ReportConfig.js +2 -2
  344. package/dist/model/index.d.ts +1 -0
  345. package/dist/model/index.d.ts.map +1 -1
  346. package/dist/model/index.js +5 -2
  347. package/dist/model/storage/BrandingModel.d.ts +0 -16
  348. package/dist/model/storage/BrandingModel.d.ts.map +1 -1
  349. package/dist/model/storage/BrandingModel.js +2 -51
  350. package/dist/model/storage/DashboardTypeModel.d.ts +4 -0
  351. package/dist/model/storage/DashboardTypeModel.d.ts.map +1 -1
  352. package/dist/model/storage/HarvestRunModel.d.ts +140 -0
  353. package/dist/model/storage/HarvestRunModel.d.ts.map +1 -0
  354. package/dist/model/storage/HarvestRunModel.js +110 -0
  355. package/dist/model/storage/IntegrationAuditModel.d.ts +49 -0
  356. package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
  357. package/dist/model/storage/IntegrationAuditModel.js +106 -0
  358. package/dist/model/storage/RecordTypeModel.d.ts +16 -0
  359. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
  360. package/dist/model/storage/RecordTypeModel.js +9 -1
  361. package/dist/model/storage/ReportModel.d.ts +1 -0
  362. package/dist/model/storage/ReportModel.d.ts.map +1 -1
  363. package/dist/model/storage/index.d.ts +2 -0
  364. package/dist/model/storage/index.d.ts.map +1 -1
  365. package/dist/model/storage/index.js +15 -2
  366. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
  367. package/dist/policies/contentSecurityPolicy.js +23 -2
  368. package/dist/policies/i18nLanguages.d.ts.map +1 -1
  369. package/dist/policies/i18nLanguages.js +1 -1
  370. package/dist/policies/index.d.ts +3 -0
  371. package/dist/policies/index.d.ts.map +1 -1
  372. package/dist/policies/index.js +6 -2
  373. package/dist/policies/menuResolver.d.ts.map +1 -1
  374. package/dist/policies/menuResolver.js +1 -1
  375. package/dist/policies/setLang.d.ts.map +1 -1
  376. package/dist/policies/setLang.js +1 -1
  377. package/dist/policies/validateApiContractRequest.d.ts +3 -0
  378. package/dist/policies/validateApiContractRequest.d.ts.map +1 -0
  379. package/dist/policies/validateApiContractRequest.js +74 -0
  380. package/dist/responses/badRequest.d.ts.map +1 -1
  381. package/dist/responses/badRequest.js +5 -3
  382. package/dist/responses/created.d.ts.map +1 -1
  383. package/dist/responses/created.js +5 -3
  384. package/dist/responses/forbidden.d.ts.map +1 -1
  385. package/dist/responses/forbidden.js +5 -3
  386. package/dist/responses/ok.d.ts.map +1 -1
  387. package/dist/responses/ok.js +5 -3
  388. package/dist/responses/serverError.d.ts.map +1 -1
  389. package/dist/responses/serverError.js +5 -3
  390. package/dist/responses/siteTitle.d.ts +6 -0
  391. package/dist/responses/siteTitle.d.ts.map +1 -0
  392. package/dist/responses/siteTitle.js +28 -0
  393. package/dist/sails.d.ts +9 -0
  394. package/dist/sails.d.ts.map +1 -1
  395. package/dist/services/AgendaQueueService.d.ts +39 -17
  396. package/dist/services/AgendaQueueService.d.ts.map +1 -1
  397. package/dist/services/AgendaQueueService.js +328 -87
  398. package/dist/services/AppConfigService.d.ts +20 -2
  399. package/dist/services/AppConfigService.d.ts.map +1 -1
  400. package/dist/services/AppConfigService.js +129 -15
  401. package/dist/services/AttachmentMetadataService.d.ts +34 -0
  402. package/dist/services/AttachmentMetadataService.d.ts.map +1 -0
  403. package/dist/services/AttachmentMetadataService.js +133 -0
  404. package/dist/services/BrandingLogoService.d.ts +11 -8
  405. package/dist/services/BrandingLogoService.d.ts.map +1 -1
  406. package/dist/services/BrandingLogoService.js +71 -72
  407. package/dist/services/BrandingService.d.ts.map +1 -1
  408. package/dist/services/BrandingService.js +4 -32
  409. package/dist/services/BrandingThemeCssService.d.ts +21 -0
  410. package/dist/services/BrandingThemeCssService.d.ts.map +1 -0
  411. package/dist/services/BrandingThemeCssService.js +113 -0
  412. package/dist/services/BrandingThemeTokens.d.ts +16 -0
  413. package/dist/services/BrandingThemeTokens.d.ts.map +1 -0
  414. package/dist/services/BrandingThemeTokens.js +82 -0
  415. package/dist/services/CacheService.d.ts.map +1 -1
  416. package/dist/services/CacheService.js +37 -29
  417. package/dist/services/DashboardConfigService.d.ts +71 -0
  418. package/dist/services/DashboardConfigService.d.ts.map +1 -0
  419. package/dist/services/DashboardConfigService.js +315 -0
  420. package/dist/services/DashboardTypesService.d.ts +61 -63
  421. package/dist/services/DashboardTypesService.d.ts.map +1 -1
  422. package/dist/services/DashboardTypesService.js +361 -198
  423. package/dist/services/DoiService.d.ts +30 -25
  424. package/dist/services/DoiService.d.ts.map +1 -1
  425. package/dist/services/DoiService.js +448 -393
  426. package/dist/services/EmailService.d.ts +17 -3
  427. package/dist/services/EmailService.d.ts.map +1 -1
  428. package/dist/services/EmailService.js +44 -17
  429. package/dist/services/FigshareService.d.ts +40 -65
  430. package/dist/services/FigshareService.d.ts.map +1 -1
  431. package/dist/services/FigshareService.js +616 -2038
  432. package/dist/services/FormPayloadPrehydrateService.d.ts +35 -0
  433. package/dist/services/FormPayloadPrehydrateService.d.ts.map +1 -0
  434. package/dist/services/FormPayloadPrehydrateService.js +200 -0
  435. package/dist/services/FormRecordConsistencyService.d.ts +3 -3
  436. package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
  437. package/dist/services/FormRecordConsistencyService.js +21 -19
  438. package/dist/services/FormVocabularyService.d.ts +45 -0
  439. package/dist/services/FormVocabularyService.d.ts.map +1 -0
  440. package/dist/services/FormVocabularyService.js +326 -0
  441. package/dist/services/FormsService.d.ts.map +1 -1
  442. package/dist/services/FormsService.js +8 -6
  443. package/dist/services/HarvestRunService.d.ts +73 -0
  444. package/dist/services/HarvestRunService.d.ts.map +1 -0
  445. package/dist/services/HarvestRunService.js +1317 -0
  446. package/dist/services/I18nEntriesService.d.ts +9 -4
  447. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  448. package/dist/services/I18nEntriesService.js +96 -18
  449. package/dist/services/IntegrationAuditService.d.ts +158 -0
  450. package/dist/services/IntegrationAuditService.d.ts.map +1 -1
  451. package/dist/services/IntegrationAuditService.js +838 -0
  452. package/dist/services/IntegrationNotificationService.d.ts +55 -0
  453. package/dist/services/IntegrationNotificationService.d.ts.map +1 -0
  454. package/dist/services/IntegrationNotificationService.js +271 -0
  455. package/dist/services/NamedQueryService.d.ts +51 -12
  456. package/dist/services/NamedQueryService.d.ts.map +1 -1
  457. package/dist/services/NamedQueryService.js +622 -125
  458. package/dist/services/OniService.js +2 -2
  459. package/dist/services/RDMPService.d.ts.map +1 -1
  460. package/dist/services/RDMPService.js +3 -2
  461. package/dist/services/RecordsService.d.ts +24 -2
  462. package/dist/services/RecordsService.d.ts.map +1 -1
  463. package/dist/services/RecordsService.js +119 -19
  464. package/dist/services/ReportsService.d.ts +57 -1
  465. package/dist/services/ReportsService.d.ts.map +1 -1
  466. package/dist/services/ReportsService.js +258 -34
  467. package/dist/services/SassCompilerService.d.ts +4 -10
  468. package/dist/services/SassCompilerService.d.ts.map +1 -1
  469. package/dist/services/SassCompilerService.js +9 -173
  470. package/dist/services/SolrSearchService.d.ts +1 -0
  471. package/dist/services/SolrSearchService.d.ts.map +1 -1
  472. package/dist/services/SolrSearchService.js +14 -3
  473. package/dist/services/StandardDatastreamService.d.ts +37 -5
  474. package/dist/services/StandardDatastreamService.d.ts.map +1 -1
  475. package/dist/services/StandardDatastreamService.js +535 -38
  476. package/dist/services/StorageManagerService.d.ts +13 -1
  477. package/dist/services/StorageManagerService.d.ts.map +1 -1
  478. package/dist/services/StorageManagerService.js +94 -11
  479. package/dist/services/TemplateService.d.ts +2 -18
  480. package/dist/services/TemplateService.d.ts.map +1 -1
  481. package/dist/services/TemplateService.js +9 -53
  482. package/dist/services/VocabularyService.d.ts +13 -0
  483. package/dist/services/VocabularyService.d.ts.map +1 -1
  484. package/dist/services/VocabularyService.js +204 -14
  485. package/dist/services/doi-v2/audit.d.ts +7 -0
  486. package/dist/services/doi-v2/audit.d.ts.map +1 -1
  487. package/dist/services/doi-v2/audit.js +30 -0
  488. package/dist/services/doi-v2/bindings.d.ts +8 -0
  489. package/dist/services/doi-v2/bindings.d.ts.map +1 -1
  490. package/dist/services/doi-v2/bindings.js +79 -0
  491. package/dist/services/doi-v2/config.d.ts +7 -0
  492. package/dist/services/doi-v2/config.js +51 -0
  493. package/dist/services/doi-v2/context.d.ts +18 -0
  494. package/dist/services/doi-v2/context.js +41 -0
  495. package/dist/services/doi-v2/http.d.ts +21 -0
  496. package/dist/services/doi-v2/http.js +88 -0
  497. package/dist/services/doi-v2/payload.d.ts +4 -0
  498. package/dist/services/doi-v2/payload.js +291 -0
  499. package/dist/services/doi-v2/profiles.d.ts +5 -0
  500. package/dist/services/doi-v2/profiles.js +31 -0
  501. package/dist/services/doi-v2/runtime.d.ts +16 -0
  502. package/dist/services/doi-v2/runtime.js +173 -0
  503. package/dist/services/doi-v2/types.d.ts +49 -0
  504. package/dist/services/doi-v2/types.js +3 -0
  505. package/dist/services/figshare-v2/assets.d.ts +5 -0
  506. package/dist/services/figshare-v2/assets.js +297 -0
  507. package/dist/services/figshare-v2/audit.d.ts +7 -0
  508. package/dist/services/figshare-v2/audit.d.ts.map +1 -0
  509. package/dist/services/figshare-v2/audit.js +30 -0
  510. package/dist/services/figshare-v2/bindings.d.ts +6 -0
  511. package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
  512. package/dist/services/figshare-v2/bindings.js +58 -0
  513. package/dist/services/figshare-v2/config.d.ts +13 -0
  514. package/dist/services/figshare-v2/config.d.ts.map +1 -1
  515. package/dist/services/figshare-v2/config.js +105 -0
  516. package/dist/services/figshare-v2/context.d.ts +4 -0
  517. package/dist/services/figshare-v2/context.d.ts.map +1 -1
  518. package/dist/services/figshare-v2/context.js +21 -0
  519. package/dist/services/figshare-v2/embargo.d.ts +5 -0
  520. package/dist/services/figshare-v2/embargo.js +36 -0
  521. package/dist/services/figshare-v2/http.d.ts +42 -0
  522. package/dist/services/figshare-v2/http.d.ts.map +1 -1
  523. package/dist/services/figshare-v2/http.js +324 -0
  524. package/dist/services/figshare-v2/metadata.d.ts +6 -0
  525. package/dist/services/figshare-v2/metadata.d.ts.map +1 -1
  526. package/dist/services/figshare-v2/metadata.js +280 -0
  527. package/dist/services/figshare-v2/observability.d.ts +7 -0
  528. package/dist/services/figshare-v2/observability.d.ts.map +1 -1
  529. package/dist/services/figshare-v2/observability.js +87 -0
  530. package/dist/services/figshare-v2/plan.d.ts +5 -0
  531. package/dist/services/figshare-v2/plan.js +51 -0
  532. package/dist/services/figshare-v2/publish.d.ts +5 -0
  533. package/dist/services/figshare-v2/publish.js +20 -0
  534. package/dist/services/figshare-v2/queue.d.ts +4 -0
  535. package/dist/services/figshare-v2/queue.js +11 -0
  536. package/dist/services/figshare-v2/runtime.d.ts +14 -0
  537. package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
  538. package/dist/services/figshare-v2/runtime.js +88 -0
  539. package/dist/services/figshare-v2/types.d.ts +198 -0
  540. package/dist/services/figshare-v2/types.d.ts.map +1 -1
  541. package/dist/services/figshare-v2/types.js +59 -0
  542. package/dist/services/figshare-v2/workflow.d.ts +3 -0
  543. package/dist/services/figshare-v2/workflow.js +7 -0
  544. package/dist/services/figshare-v2/writeback.d.ts +5 -0
  545. package/dist/services/figshare-v2/writeback.js +45 -0
  546. package/dist/services/index.d.ts +24 -3
  547. package/dist/services/index.d.ts.map +1 -1
  548. package/dist/services/index.js +43 -7
  549. package/dist/shims/momentShim.d.ts.map +1 -1
  550. package/dist/shims/momentShim.js +1 -6
  551. package/dist/storage/GridFSDriver.d.ts +101 -0
  552. package/dist/storage/GridFSDriver.d.ts.map +1 -0
  553. package/dist/storage/GridFSDriver.js +291 -0
  554. package/dist/storage/TusStorageManagerDataStore.d.ts +49 -0
  555. package/dist/storage/TusStorageManagerDataStore.d.ts.map +1 -0
  556. package/dist/storage/TusStorageManagerDataStore.js +300 -0
  557. package/dist/utilities/RequestParamUtils.d.ts +3 -0
  558. package/dist/utilities/RequestParamUtils.d.ts.map +1 -0
  559. package/dist/utilities/RequestParamUtils.js +13 -0
  560. package/dist/visitor/attachment-fields.visitor.d.ts +17 -17
  561. package/dist/visitor/attachment-fields.visitor.d.ts.map +1 -1
  562. package/dist/visitor/attachment-fields.visitor.js +44 -34
  563. package/dist/visitor/client.visitor.d.ts +145 -97
  564. package/dist/visitor/client.visitor.d.ts.map +1 -1
  565. package/dist/visitor/client.visitor.js +366 -273
  566. package/dist/visitor/construct.visitor.d.ts +99 -93
  567. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  568. package/dist/visitor/construct.visitor.js +302 -227
  569. package/dist/visitor/context-variables.visitor.d.ts +35 -35
  570. package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
  571. package/dist/visitor/context-variables.visitor.js +85 -75
  572. package/dist/visitor/data-value.visitor.d.ts +99 -93
  573. package/dist/visitor/data-value.visitor.d.ts.map +1 -1
  574. package/dist/visitor/data-value.visitor.js +157 -148
  575. package/dist/visitor/json-type-def.visitor.d.ts +96 -90
  576. package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
  577. package/dist/visitor/json-type-def.visitor.js +158 -149
  578. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +101 -94
  579. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  580. package/dist/visitor/migrate-config-v4-v5.visitor.js +356 -295
  581. package/dist/visitor/template.visitor.d.ts +100 -92
  582. package/dist/visitor/template.visitor.d.ts.map +1 -1
  583. package/dist/visitor/template.visitor.js +245 -156
  584. package/dist/visitor/validator.visitor.d.ts +95 -91
  585. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  586. package/dist/visitor/validator.visitor.js +184 -152
  587. package/dist/visitor/visitor-helpers.js +9 -9
  588. package/dist/visitor/vocab-inline.visitor.d.ts +34 -19
  589. package/dist/visitor/vocab-inline.visitor.d.ts.map +1 -1
  590. package/dist/visitor/vocab-inline.visitor.js +157 -48
  591. package/dist/waterline-models/AttachmentAccessAudit.d.ts +26 -0
  592. package/dist/waterline-models/AttachmentAccessAudit.d.ts.map +1 -0
  593. package/dist/waterline-models/AttachmentAccessAudit.js +63 -0
  594. package/dist/waterline-models/AttachmentMetadata.d.ts +40 -0
  595. package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -0
  596. package/dist/waterline-models/AttachmentMetadata.js +147 -0
  597. package/dist/waterline-models/BrandingConfig.d.ts +0 -2
  598. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
  599. package/dist/waterline-models/BrandingConfig.js +5 -9
  600. package/dist/waterline-models/DashboardType.d.ts +7 -0
  601. package/dist/waterline-models/DashboardType.d.ts.map +1 -1
  602. package/dist/waterline-models/DashboardType.js +16 -1
  603. package/dist/waterline-models/HarvestRecordEvent.d.ts +43 -0
  604. package/dist/waterline-models/HarvestRecordEvent.d.ts.map +1 -0
  605. package/dist/waterline-models/HarvestRecordEvent.js +107 -0
  606. package/dist/waterline-models/HarvestRun.d.ts +51 -0
  607. package/dist/waterline-models/HarvestRun.d.ts.map +1 -0
  608. package/dist/waterline-models/HarvestRun.js +125 -0
  609. package/dist/waterline-models/HarvestRunChunk.d.ts +57 -0
  610. package/dist/waterline-models/HarvestRunChunk.d.ts.map +1 -0
  611. package/dist/waterline-models/HarvestRunChunk.js +140 -0
  612. package/dist/waterline-models/I18nTranslation.d.ts +2 -0
  613. package/dist/waterline-models/I18nTranslation.d.ts.map +1 -1
  614. package/dist/waterline-models/I18nTranslation.js +6 -1
  615. package/dist/waterline-models/Migration.d.ts +24 -0
  616. package/dist/waterline-models/Migration.d.ts.map +1 -0
  617. package/dist/waterline-models/Migration.js +52 -0
  618. package/dist/waterline-models/NamedQuery.d.ts +6 -0
  619. package/dist/waterline-models/NamedQuery.d.ts.map +1 -1
  620. package/dist/waterline-models/NamedQuery.js +16 -1
  621. package/dist/waterline-models/index.d.ts +12 -0
  622. package/dist/waterline-models/index.d.ts.map +1 -1
  623. package/dist/waterline-models/index.js +19 -1
  624. package/package.json +77 -51
  625. package/redbox-loader-templates/bootstrap-shim.js.hbs +14 -1
  626. package/dist/config/datacite.config.d.ts +0 -51
  627. package/dist/config/datacite.config.d.ts.map +0 -1
  628. package/dist/config/datacite.config.js +0 -44
  629. package/dist/config/figshareAPI.config.d.ts +0 -116
  630. package/dist/config/figshareAPI.config.d.ts.map +0 -1
  631. package/dist/config/figshareAPI.config.js +0 -857
  632. package/dist/config/figshareAPIEnv.config.d.ts +0 -11
  633. package/dist/config/figshareAPIEnv.config.d.ts.map +0 -1
  634. package/dist/config/figshareAPIEnv.config.js +0 -13
  635. package/dist/config/figshareRedboxFORMapping.config.d.ts +0 -15
  636. package/dist/config/figshareRedboxFORMapping.config.d.ts.map +0 -1
  637. package/dist/config/figshareRedboxFORMapping.config.js +0 -7458
  638. package/dist/config/relatedObjectsFormDefinition.config.d.ts.map +0 -1
  639. package/dist/controllers/VocabController.d.ts +0 -43
  640. package/dist/controllers/VocabController.d.ts.map +0 -1
  641. package/dist/controllers/VocabController.js +0 -190
  642. package/dist/form-config/dataPublication-1.0-draft.d.ts.map +0 -1
  643. package/dist/form-config/dataPublication-1.0-embargoed.d.ts.map +0 -1
  644. package/dist/form-config/dataPublication-1.0-published.d.ts.map +0 -1
  645. package/dist/form-config/dataPublication-1.0-queued.d.ts.map +0 -1
  646. package/dist/form-config/dataPublication-1.0-retired.d.ts.map +0 -1
  647. package/dist/services/VocabService.d.ts +0 -81
  648. package/dist/services/VocabService.d.ts.map +0 -1
  649. package/dist/services/VocabService.js +0 -424
@@ -17,22 +17,112 @@
17
17
  // You should have received a copy of the GNU General Public License along
18
18
  // with this program; if not, write to the Free Software Foundation, Inc.,
19
19
  // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ var __importDefault = (this && this.__importDefault) || function (mod) {
54
+ return (mod && mod.__esModule) ? mod : { "default": mod };
55
+ };
20
56
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.NamedQueryResponseRecord = exports.NamedQueryConfig = exports.Services = void 0;
57
+ exports.NamedQueryResponseRecord = exports.NamedQueryConfig = exports.RelatedRecordFilter = exports.Services = void 0;
22
58
  const CoreService_1 = require("../CoreService");
59
+ const fs = __importStar(require("node:fs/promises"));
60
+ const path = __importStar(require("node:path"));
23
61
  const luxon_1 = require("luxon");
62
+ const handlebars_1 = __importDefault(require("handlebars"));
63
+ const sails_ng_common_1 = require("@researchdatabox/sails-ng-common");
24
64
  const ListAPIResponse_1 = require("../model/ListAPIResponse");
25
65
  const rxjs_1 = require("rxjs");
26
- const parseJson = (input, fallback) => {
27
- if (typeof input !== 'string' || input.length === 0) {
28
- return fallback;
66
+ const isRecordValue = (value) => typeof value === 'object' && value !== null;
67
+ const getStringProperty = (value, propertyName) => {
68
+ if (!isRecordValue(value)) {
69
+ return undefined;
70
+ }
71
+ const propertyValue = value[propertyName];
72
+ return typeof propertyValue === 'string' ? propertyValue : undefined;
73
+ };
74
+ const getIdentifierProperty = (value, propertyName) => {
75
+ if (!isRecordValue(value)) {
76
+ return undefined;
29
77
  }
30
- try {
31
- return JSON.parse(input);
78
+ const propertyValue = value[propertyName];
79
+ if (typeof propertyValue === 'string' || typeof propertyValue === 'number') {
80
+ return String(propertyValue);
81
+ }
82
+ return undefined;
83
+ };
84
+ const parseSerializedValue = (input, fallback) => {
85
+ if (typeof input === 'string') {
86
+ if (input.length === 0) {
87
+ return fallback;
88
+ }
89
+ try {
90
+ return JSON.parse(input);
91
+ }
92
+ catch (_error) {
93
+ return fallback;
94
+ }
32
95
  }
33
- catch (_error) {
96
+ if (input === undefined || input === null) {
34
97
  return fallback;
35
98
  }
99
+ return input;
100
+ };
101
+ const parseObjectParamValue = (queryParamKey, value) => {
102
+ if (_.isPlainObject(value)) {
103
+ return value;
104
+ }
105
+ if (typeof value === 'string') {
106
+ try {
107
+ const parsed = JSON.parse(value);
108
+ if (_.isPlainObject(parsed)) {
109
+ return parsed;
110
+ }
111
+ }
112
+ catch (_error) {
113
+ throw Error(`${queryParamKey} must be a valid JSON object`);
114
+ }
115
+ }
116
+ throw Error(`${queryParamKey} must be a valid JSON object`);
117
+ };
118
+ const DEFAULT_BOOTSTRAP_DATA_PATH = 'bootstrap-data';
119
+ let namedQueryHandlebarsHelpersRegistered = false;
120
+ const ensureNamedQueryHandlebarsHelpers = () => {
121
+ if (namedQueryHandlebarsHelpersRegistered) {
122
+ return;
123
+ }
124
+ (0, sails_ng_common_1.registerSharedHandlebarsHelpers)(handlebars_1.default);
125
+ namedQueryHandlebarsHelpersRegistered = true;
36
126
  };
37
127
  var Services;
38
128
  (function (Services) {
@@ -42,73 +132,378 @@ var Services;
42
132
  */
43
133
  class NamedQueryService extends CoreService_1.Services.Core.Service {
44
134
  _exportedMethods = [
45
- "bootstrap",
135
+ "bootstrapData",
46
136
  "getNamedQueryConfig",
137
+ "getSupportedCollections",
47
138
  "performNamedQuery",
48
139
  "performNamedQueryFromConfig",
49
140
  "performNamedQueryFromConfigResults",
141
+ "create",
142
+ "list",
143
+ "update",
144
+ "delete",
50
145
  ];
51
- async bootstrap(defBrand) {
52
- const namedQueries = await (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.find({
53
- branding: defBrand.id
54
- })));
55
- if (!_.isEmpty(namedQueries)) {
56
- if (sails.config.appmode.bootstrapAlways) {
57
- for (const namedQuery of namedQueries) {
58
- await NamedQuery.destroyOne({ id: namedQuery.id });
146
+ async bootstrapData(defBrand) {
147
+ const bootstrapPath = this.getBootstrapDataPath();
148
+ let fileNames = [];
149
+ const fileOps = this.getBootstrapFileOps();
150
+ try {
151
+ const fileEntries = await fileOps.readdir(bootstrapPath, { withFileTypes: true });
152
+ fileNames = fileEntries
153
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))
154
+ .map((entry) => entry.name)
155
+ .sort((a, b) => a.localeCompare(b));
156
+ }
157
+ catch (error) {
158
+ const ioError = error;
159
+ if (ioError.code === 'ENOENT') {
160
+ sails.log.verbose(`Named query bootstrap data path not found: ${bootstrapPath}`);
161
+ return;
162
+ }
163
+ sails.log.error(`Failed to read named query bootstrap data path: ${bootstrapPath}`, error);
164
+ return;
165
+ }
166
+ for (const fileName of fileNames) {
167
+ try {
168
+ const filePath = path.join(bootstrapPath, fileName);
169
+ const definition = await this.readJsonFile(filePath);
170
+ if (!definition) {
171
+ continue;
172
+ }
173
+ const name = fileName.replace(/\.json$/, '');
174
+ if (!name || typeof definition.collectionName !== 'string' || definition.collectionName.length === 0) {
175
+ sails.log.error(`Skipping named query bootstrap file with missing name or collectionName: ${fileName}`);
176
+ continue;
177
+ }
178
+ const existing = await NamedQuery.findOne({ key: `${defBrand.id}_${name}` });
179
+ if (existing) {
180
+ sails.log.verbose(`Skipping existing named query bootstrap data: ${name}`);
181
+ continue;
182
+ }
183
+ await this.create(defBrand, name, definition);
184
+ sails.log.verbose(`Bootstrapped named query: ${name}`);
185
+ }
186
+ catch (error) {
187
+ sails.log.error(`Failed to bootstrap named query from file: ${fileName}`, error);
188
+ }
189
+ }
190
+ }
191
+ getBootstrapDataPath() {
192
+ const configuredPath = _.get(sails.config, 'bootstrap.bootstrapDataPath', DEFAULT_BOOTSTRAP_DATA_PATH);
193
+ return path.resolve(String(configuredPath), 'namedqueries');
194
+ }
195
+ getBootstrapFileOps() {
196
+ return fs;
197
+ }
198
+ async readJsonFile(filePath) {
199
+ try {
200
+ const content = await this.getBootstrapFileOps().readFile(filePath, 'utf8');
201
+ return JSON.parse(content);
202
+ }
203
+ catch (error) {
204
+ sails.log.error(`Failed to read named query bootstrap file: ${path.basename(filePath)}`, error);
205
+ return null;
206
+ }
207
+ }
208
+ getModel(collectionName) {
209
+ return sails.models?.[collectionName];
210
+ }
211
+ resolveBrandScope(collectionName) {
212
+ if (_.isEmpty(collectionName)) {
213
+ throw new Error('collectionName is required');
214
+ }
215
+ if (collectionName === 'record') {
216
+ return { type: 'field', fieldPath: 'metaMetadata.brandId' };
217
+ }
218
+ if (collectionName === 'user') {
219
+ return { type: 'userRoles', fieldPath: '' };
220
+ }
221
+ const model = this.getModel(collectionName);
222
+ if (!model) {
223
+ throw new Error(`Invalid collectionName '${collectionName}': model not found`);
224
+ }
225
+ const attributes = model.attributes;
226
+ if (attributes && Object.prototype.hasOwnProperty.call(attributes, 'branding')) {
227
+ return { type: 'field', fieldPath: 'branding' };
228
+ }
229
+ throw new Error(`Invalid collectionName '${collectionName}': model does not expose a brand scope`);
230
+ }
231
+ hasRoleInBrand(user, brandId) {
232
+ return _.some(user.roles ?? [], (role) => {
233
+ const roleObj = role;
234
+ const branding = roleObj?.branding;
235
+ const roleBrandId = _.isObject(branding) ? String(branding.id ?? '') : String(branding ?? '');
236
+ return roleBrandId === brandId;
237
+ });
238
+ }
239
+ async getLinkedSecondaryUserIds(brandId) {
240
+ if (typeof UserLink === 'undefined') {
241
+ return new Set();
242
+ }
243
+ const activeLinks = await UserLink.find({ brandId, status: 'active' });
244
+ return new Set(_.map(activeLinks, (link) => String(link.secondaryUserId ?? '')).filter((id) => id !== ''));
245
+ }
246
+ sanitizeUserForNamedQuery(user) {
247
+ const sanitized = { ...user };
248
+ delete sanitized.password;
249
+ delete sanitized.token;
250
+ return sanitized;
251
+ }
252
+ getMongoQueryValue(mongoQuery, path) {
253
+ return Object.prototype.hasOwnProperty.call(mongoQuery, path) ? mongoQuery[path] : _.get(mongoQuery, path);
254
+ }
255
+ setMongoQueryValue(mongoQuery, path, value) {
256
+ if (path.includes('.')) {
257
+ mongoQuery[path] = value;
258
+ }
259
+ else {
260
+ _.set(mongoQuery, path, value);
261
+ }
262
+ }
263
+ unsetMongoQueryValue(mongoQuery, path) {
264
+ if (Object.prototype.hasOwnProperty.call(mongoQuery, path)) {
265
+ delete mongoQuery[path];
266
+ }
267
+ else {
268
+ _.unset(mongoQuery, path);
269
+ }
270
+ }
271
+ isQueryOperatorObject(value) {
272
+ return Object.keys(value).some((key) => key.startsWith('$') || [
273
+ 'contains',
274
+ 'startsWith',
275
+ 'endsWith',
276
+ 'like',
277
+ '>',
278
+ '>=',
279
+ '<',
280
+ '<=',
281
+ '!=',
282
+ 'in',
283
+ 'nin',
284
+ ].includes(key));
285
+ }
286
+ flattenDeepTargetCriteria(criteria, prefix = '') {
287
+ const flattened = {};
288
+ for (const [key, value] of Object.entries(criteria)) {
289
+ const path = prefix ? `${prefix}.${key}` : key;
290
+ if (_.isPlainObject(value) && !this.isQueryOperatorObject(value)) {
291
+ Object.assign(flattened, this.flattenDeepTargetCriteria(value, path));
292
+ }
293
+ else {
294
+ flattened[path] = value;
295
+ }
296
+ }
297
+ return flattened;
298
+ }
299
+ toNativeMongoCriteria(criteria) {
300
+ const mongoCriteria = {};
301
+ const operatorMap = {
302
+ '>': '$gt',
303
+ '>=': '$gte',
304
+ '<': '$lt',
305
+ '<=': '$lte',
306
+ '!=': '$ne',
307
+ in: '$in',
308
+ nin: '$nin',
309
+ };
310
+ for (const [key, value] of Object.entries(criteria)) {
311
+ if (_.isPlainObject(value)) {
312
+ const mappedValue = {};
313
+ for (const [operator, operatorValue] of Object.entries(value)) {
314
+ if (operator === 'contains') {
315
+ mappedValue.$regex = _.escapeRegExp(String(operatorValue ?? ''));
316
+ mappedValue.$options = 'i';
317
+ }
318
+ else {
319
+ mappedValue[operatorMap[operator] ?? operator] = operatorValue;
320
+ }
59
321
  }
322
+ mongoCriteria[key] = mappedValue;
60
323
  }
61
324
  else {
62
- return;
325
+ mongoCriteria[key] = value;
63
326
  }
64
327
  }
65
- sails.log.verbose("Bootstrapping named query definitions... ");
66
- await this.createNamedQueriesForBrand(defBrand);
328
+ return mongoCriteria;
67
329
  }
68
- async createNamedQueriesForBrand(defBrand) {
69
- for (const [namedQuery, config] of Object.entries(sails.config.namedQuery)) {
70
- const namedQueryConfig = config;
71
- await (0, rxjs_1.firstValueFrom)(this.create(defBrand, namedQuery, namedQueryConfig));
330
+ toNativeMongoSort(sort) {
331
+ const mongoSort = {};
332
+ for (const sortEntry of sort ?? []) {
333
+ for (const [field, direction] of Object.entries(sortEntry)) {
334
+ mongoSort[field] = direction === 'DESC' ? -1 : 1;
335
+ }
72
336
  }
337
+ return mongoSort;
73
338
  }
74
- create(brand, name, config) {
75
- return super.getObservable(NamedQuery.create({
339
+ async getNativeRecordCollection(model) {
340
+ const native = model.native;
341
+ if (typeof native !== 'function') {
342
+ throw new Error("Model record does not expose native collection access");
343
+ }
344
+ return new Promise((resolve, reject) => {
345
+ const nativeFn = native;
346
+ nativeFn((error, collection) => {
347
+ if (error) {
348
+ reject(error);
349
+ }
350
+ else {
351
+ resolve(collection);
352
+ }
353
+ });
354
+ });
355
+ }
356
+ async create(brand, name, config) {
357
+ const key = `${brand.id}_${name}`;
358
+ const existing = await NamedQuery.findOne({ key });
359
+ if (existing) {
360
+ throw new Error(`Named query '${name}' already exists`);
361
+ }
362
+ const brandScope = this.resolveBrandScope(config.collectionName);
363
+ return (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.create({
76
364
  name: name,
77
365
  branding: brand.id,
78
366
  mongoQuery: JSON.stringify(config.mongoQuery),
79
367
  queryParams: JSON.stringify(config.queryParams),
80
368
  collectionName: config.collectionName,
81
369
  resultObjectMapping: JSON.stringify(config.resultObjectMapping),
82
- brandIdFieldPath: config.brandIdFieldPath,
370
+ brandIdFieldPath: brandScope.fieldPath,
83
371
  sort: (config.sort !== undefined && Array.isArray(config.sort) && config.sort.length > 0) ? JSON.stringify(config.sort) : "",
372
+ expandRelations: config.expandRelations === true,
373
+ relatedRecordFilters: (config.relatedRecordFilters !== undefined && Array.isArray(config.relatedRecordFilters) && config.relatedRecordFilters.length > 0)
374
+ ? JSON.stringify(config.relatedRecordFilters)
375
+ : "",
376
+ })));
377
+ }
378
+ async list(brand) {
379
+ const records = (await NamedQuery.find({
380
+ branding: brand.id
381
+ }));
382
+ return records.map((r) => ({
383
+ name: r.name,
384
+ collectionName: r.collectionName,
385
+ mongoQuery: parseSerializedValue(r.mongoQuery, {}),
386
+ queryParams: parseSerializedValue(r.queryParams, {}),
387
+ resultObjectMapping: parseSerializedValue(r.resultObjectMapping, {}),
388
+ brandIdFieldPath: r.brandIdFieldPath || undefined,
389
+ sort: r.sort ? parseSerializedValue(r.sort, []) : undefined,
390
+ expandRelations: r.expandRelations || false,
391
+ relatedRecordFilters: r.relatedRecordFilters ? parseSerializedValue(r.relatedRecordFilters, []) : undefined,
84
392
  }));
85
393
  }
394
+ async update(brand, name, config) {
395
+ const key = `${brand.id}_${name}`;
396
+ const existing = await NamedQuery.findOne({ key });
397
+ if (!existing) {
398
+ throw new Error(`Named query '${name}' not found`);
399
+ }
400
+ const brandScope = this.resolveBrandScope(config.collectionName);
401
+ const updated = await (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.updateOne({ key }).set({
402
+ name: name,
403
+ branding: brand.id,
404
+ mongoQuery: JSON.stringify(config.mongoQuery),
405
+ queryParams: JSON.stringify(config.queryParams),
406
+ collectionName: config.collectionName,
407
+ resultObjectMapping: JSON.stringify(config.resultObjectMapping),
408
+ brandIdFieldPath: brandScope.fieldPath,
409
+ sort: (config.sort !== undefined && Array.isArray(config.sort) && config.sort.length > 0) ? JSON.stringify(config.sort) : "",
410
+ expandRelations: config.expandRelations === true,
411
+ relatedRecordFilters: (config.relatedRecordFilters !== undefined && Array.isArray(config.relatedRecordFilters) && config.relatedRecordFilters.length > 0)
412
+ ? JSON.stringify(config.relatedRecordFilters)
413
+ : "",
414
+ })));
415
+ if (!updated) {
416
+ throw new Error(`Named query '${name}' not found`);
417
+ }
418
+ return updated;
419
+ }
420
+ async delete(brand, name) {
421
+ const key = `${brand.id}_${name}`;
422
+ const existing = await NamedQuery.findOne({ key });
423
+ if (!existing) {
424
+ throw new Error(`Named query '${name}' not found`);
425
+ }
426
+ return (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.destroyOne({ key })));
427
+ }
86
428
  async getNamedQueryConfig(brand, namedQuery) {
87
429
  const nQDBEntry = await NamedQuery.findOne({
88
430
  key: brand.id + "_" + namedQuery
89
431
  });
90
- return new NamedQueryConfig(nQDBEntry);
432
+ if (nQDBEntry) {
433
+ return new NamedQueryConfig(nQDBEntry);
434
+ }
435
+ return null;
91
436
  }
92
- async performNamedQuery(brandIdFieldPath, resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, _user = undefined, sort = undefined) {
437
+ getSupportedCollections() {
438
+ const collections = _.get(sails.config, ['namedQuery', 'supportedCollections'], []);
439
+ return Array.isArray(collections) ? collections.filter((c) => typeof c === 'string') : [];
440
+ }
441
+ async performNamedQuery(_brandIdFieldPath, resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, _user = undefined, sort = undefined, expandRelations = false, relatedRecordFilters = []) {
93
442
  const criteriaMeta = { enableExperimentalDeepTargets: true };
94
443
  this.setParamsInQuery(mongoQuery, queryParams, paramMap);
444
+ if (relatedRecordFilters && relatedRecordFilters.length > 0) {
445
+ for (const filter of relatedRecordFilters) {
446
+ const filterModel = sails.models[filter.collectionName];
447
+ if (!filterModel) {
448
+ sails.log.warn(`Skipping related record filter: model '${filter.collectionName}' not found for collectionName='${filter.collectionName}', localField='${filter.localField}', foreignField='${filter.foreignField}'`);
449
+ continue;
450
+ }
451
+ const filterMongoQuery = _.cloneDeep(filter.mongoQuery);
452
+ const filterQueryParams = _.pickBy(queryParams, (queryParam) => _.has(filterMongoQuery, queryParam.path));
453
+ this.setParamsInQuery(filterMongoQuery, filterQueryParams, paramMap);
454
+ const relatedRecords = await filterModel.find({ where: filterMongoQuery, select: [filter.foreignField] }).meta(criteriaMeta);
455
+ const relatedIds = _.uniq(relatedRecords.map((relatedRecord) => _.get(relatedRecord, filter.foreignField)).filter((id) => id != null && id !== ''));
456
+ const existingLocalFieldFilter = this.getMongoQueryValue(mongoQuery, filter.localField);
457
+ const existingRelatedIds = _.isPlainObject(existingLocalFieldFilter) ? _.get(existingLocalFieldFilter, '$in') : undefined;
458
+ if (Array.isArray(existingRelatedIds)) {
459
+ this.setMongoQueryValue(mongoQuery, filter.localField, {
460
+ $in: _.intersection(existingRelatedIds, relatedIds)
461
+ });
462
+ }
463
+ else {
464
+ this.setMongoQueryValue(mongoQuery, filter.localField, { $in: relatedIds });
465
+ }
466
+ }
467
+ }
468
+ const brandScope = this.resolveBrandScope(collectionName);
95
469
  const that = this;
96
- // Add branding
97
- if (brandIdFieldPath != '') {
98
- mongoQuery[brandIdFieldPath] = brand.id;
470
+ if (brandScope.type === 'userRoles') {
471
+ return this.performUserNamedQuery(resultObjectMapping, mongoQuery, brand, start, rows, sort);
99
472
  }
100
- sails.log.debug("Mongo query to be executed", mongoQuery);
473
+ this.setMongoQueryValue(mongoQuery, brandScope.fieldPath, brand.id);
474
+ const waterlineQuery = this.flattenDeepTargetCriteria(mongoQuery);
475
+ sails.log.debug("Mongo query to be executed", waterlineQuery);
101
476
  // Get the total count of matching records
102
477
  let totalItems = 0;
103
- if (collectionName == 'user') {
104
- totalItems = await User.count(mongoQuery).meta(criteriaMeta);
478
+ const model = this.getModel(collectionName);
479
+ if (!model) {
480
+ throw new Error(`Model ${collectionName} not found`);
481
+ }
482
+ let results = [];
483
+ if (collectionName === 'record') {
484
+ const nativeCollection = await this.getNativeRecordCollection(model);
485
+ const nativeCriteria = this.toNativeMongoCriteria(waterlineQuery);
486
+ totalItems = await nativeCollection.countDocuments(nativeCriteria);
487
+ if (totalItems > 0) {
488
+ let nativeQuery = nativeCollection.find(nativeCriteria);
489
+ const nativeSort = this.toNativeMongoSort(sort);
490
+ if (!_.isEmpty(nativeSort)) {
491
+ nativeQuery = nativeQuery.sort(nativeSort);
492
+ }
493
+ results = await nativeQuery.skip(start).limit(rows).toArray();
494
+ }
105
495
  }
106
496
  else {
107
- totalItems = await Record.count(mongoQuery).meta(criteriaMeta);
497
+ const count = model.count;
498
+ if (typeof count !== 'function') {
499
+ throw new Error(`Model ${collectionName} does not expose count`);
500
+ }
501
+ const countFn = count;
502
+ totalItems = await countFn(waterlineQuery).meta(criteriaMeta);
108
503
  }
109
504
  // Build query criteria
110
505
  const criteria = {
111
- where: mongoQuery,
506
+ where: waterlineQuery,
112
507
  skip: start,
113
508
  limit: rows,
114
509
  };
@@ -119,69 +514,55 @@ var Services;
119
514
  }
120
515
  // Run query
121
516
  sails.log.debug("Mongo query criteria", criteria);
122
- let results = [];
123
- if (totalItems > 0) {
124
- if (collectionName == 'user') {
125
- results = await User.find(criteria).meta(criteriaMeta);
126
- }
127
- else {
128
- results = await Record.find(criteria).meta(criteriaMeta);
517
+ if (collectionName !== 'record' && totalItems > 0) {
518
+ const find = model.find;
519
+ if (typeof find !== 'function') {
520
+ throw new Error(`Model ${collectionName} does not expose find`);
129
521
  }
522
+ const findFn = find;
523
+ results = await findFn(criteria).meta(criteriaMeta);
130
524
  }
131
525
  const responseRecords = [];
526
+ const recordsService = sails.services.recordsservice;
527
+ const expandRelationsActual = expandRelations === true && collectionName === 'record';
528
+ if (expandRelations === true && collectionName !== 'record') {
529
+ sails.log.debug(`expandRelations is only supported for the 'record' collection; ignoring for '${collectionName}'`);
530
+ }
531
+ // 'user' collections are scoped and rendered separately via performUserNamedQuery,
532
+ // so anything reaching this loop is a record-like (record or scoped dynamic) model.
132
533
  for (const record of results) {
133
- if (collectionName == 'user') {
134
- const userRecord = record;
135
- let defaultMetadata = {};
136
- const variables = { record: userRecord };
137
- if (!_.isEmpty(resultObjectMapping)) {
138
- const resultMetadata = _.cloneDeep(resultObjectMapping);
139
- _.forOwn(resultObjectMapping, function (value, key) {
140
- _.set(resultMetadata, key, that.runTemplate(value, variables));
141
- });
142
- defaultMetadata = resultMetadata;
534
+ const recordItem = record;
535
+ if (expandRelationsActual && recordsService && recordItem.redboxOid) {
536
+ try {
537
+ const relationships = await recordsService.getRelatedRecords(recordItem.redboxOid, brand);
538
+ recordItem.relationships = relationships;
143
539
  }
144
- else {
145
- defaultMetadata = {
146
- type: that.runTemplate('record.type', variables),
147
- name: that.runTemplate('record.name', variables),
148
- email: that.runTemplate('record.email', variables),
149
- username: that.runTemplate('record.username', variables),
150
- lastLogin: that.runTemplate('record.lastLogin', variables)
151
- };
540
+ catch (err) {
541
+ sails.log.warn(`Failed to fetch relationships for record ${recordItem.redboxOid}`, err);
152
542
  }
153
- const responseRecord = new NamedQueryResponseRecord({
154
- oid: '',
155
- title: '',
156
- metadata: defaultMetadata,
157
- lastSaveDate: userRecord.updatedAt ?? null,
158
- dateCreated: userRecord.createdAt ?? null
543
+ }
544
+ let defaultMetadata = {};
545
+ const variables = { record: recordItem };
546
+ if (!_.isEmpty(resultObjectMapping)) {
547
+ const resultMetadata = _.cloneDeep(resultObjectMapping);
548
+ _.forOwn(resultObjectMapping, function (value, key) {
549
+ _.set(resultMetadata, key, that.runTemplate(value, variables));
159
550
  });
160
- responseRecords.push(responseRecord);
551
+ defaultMetadata = resultMetadata;
161
552
  }
162
553
  else {
163
- const recordItem = record;
164
- let defaultMetadata = {};
165
- const variables = { record: recordItem };
166
- if (!_.isEmpty(resultObjectMapping)) {
167
- const resultMetadata = _.cloneDeep(resultObjectMapping);
168
- _.forOwn(resultObjectMapping, function (value, key) {
169
- _.set(resultMetadata, key, that.runTemplate(value, variables));
170
- });
171
- defaultMetadata = resultMetadata;
172
- }
173
- else {
174
- defaultMetadata = that.runTemplate('record.metadata', variables);
175
- }
176
- const responseRecord = new NamedQueryResponseRecord({
177
- oid: recordItem.redboxOid ?? '',
178
- title: recordItem.metadata?.title ?? '',
179
- metadata: defaultMetadata,
180
- lastSaveDate: recordItem.lastSaveDate ?? null,
181
- dateCreated: recordItem.dateCreated ?? null
182
- });
183
- responseRecords.push(responseRecord);
554
+ defaultMetadata = collectionName === 'record'
555
+ ? that.runTemplate('record.metadata', variables)
556
+ : recordItem;
184
557
  }
558
+ const responseRecord = new NamedQueryResponseRecord({
559
+ oid: recordItem.redboxOid ?? getIdentifierProperty(recordItem, 'id') ?? '',
560
+ title: getStringProperty(recordItem.metadata, 'title') ?? getStringProperty(recordItem, 'name') ?? getStringProperty(recordItem, 'title') ?? '',
561
+ metadata: defaultMetadata,
562
+ lastSaveDate: recordItem.lastSaveDate ?? null,
563
+ dateCreated: recordItem.dateCreated ?? null
564
+ });
565
+ responseRecords.push(responseRecord);
185
566
  }
186
567
  const response = new ListAPIResponse_1.ListAPIResponse();
187
568
  const startIndex = start;
@@ -193,44 +574,135 @@ var Services;
193
574
  response.summary.numFound = totalItems;
194
575
  return response;
195
576
  }
577
+ async performUserNamedQuery(resultObjectMapping, mongoQuery, brand, start, rows, sort = undefined) {
578
+ const criteriaMeta = { enableExperimentalDeepTargets: true };
579
+ const model = this.getModel('user');
580
+ if (!model) {
581
+ throw new Error(`Invalid collectionName 'user': model not found`);
582
+ }
583
+ const userModel = model;
584
+ const criteria = { where: mongoQuery };
585
+ if (sort !== undefined && Array.isArray(sort) && (sort?.length ?? 0) > 0) {
586
+ criteria.sort = sort;
587
+ }
588
+ let query = userModel.find(criteria);
589
+ if (query && typeof query.populate === 'function') {
590
+ query = query.populate('roles');
591
+ }
592
+ const allUsers = query && typeof query.meta === 'function'
593
+ ? await query.meta(criteriaMeta)
594
+ : await query;
595
+ const brandId = String(brand.id);
596
+ const linkedSecondaryUserIds = await this.getLinkedSecondaryUserIds(brandId);
597
+ const scopedUsers = allUsers
598
+ .filter((user) => this.hasRoleInBrand(user, brandId) || linkedSecondaryUserIds.has(String(user.id ?? '')))
599
+ .map((user) => this.sanitizeUserForNamedQuery(user));
600
+ const pagedUsers = scopedUsers.slice(start, start + rows);
601
+ const responseRecords = [];
602
+ for (const userRecord of pagedUsers) {
603
+ let defaultMetadata = {};
604
+ const variables = { record: userRecord };
605
+ if (!_.isEmpty(resultObjectMapping)) {
606
+ const resultMetadata = _.cloneDeep(resultObjectMapping);
607
+ _.forOwn(resultObjectMapping, (value, key) => {
608
+ _.set(resultMetadata, key, this.runTemplate(value, variables));
609
+ });
610
+ defaultMetadata = resultMetadata;
611
+ }
612
+ else {
613
+ defaultMetadata = {
614
+ type: this.runTemplate('record.type', variables),
615
+ name: this.runTemplate('record.name', variables),
616
+ email: this.runTemplate('record.email', variables),
617
+ username: this.runTemplate('record.username', variables),
618
+ lastLogin: this.runTemplate('record.lastLogin', variables)
619
+ };
620
+ }
621
+ responseRecords.push(new NamedQueryResponseRecord({
622
+ oid: '',
623
+ title: '',
624
+ metadata: defaultMetadata,
625
+ lastSaveDate: userRecord.updatedAt ?? null,
626
+ dateCreated: userRecord.createdAt ?? null
627
+ }));
628
+ }
629
+ const response = new ListAPIResponse_1.ListAPIResponse();
630
+ response.records = responseRecords;
631
+ response.summary.start = start;
632
+ response.summary.page = Math.floor((start / rows) + 1);
633
+ response.summary.numFound = scopedUsers.length;
634
+ return response;
635
+ }
196
636
  setParamsInQuery(mongoQuery, queryParams, paramMap) {
197
637
  for (const queryParamKey in queryParams) {
198
638
  let value = paramMap[queryParamKey];
199
639
  const queryParam = queryParams[queryParamKey];
200
640
  sails.log.debug(`${queryParamKey} has value ${value}`);
201
- if (value == undefined && queryParam.required === true) {
641
+ if (_.isUndefined(value) && queryParam.required === true) {
202
642
  throw Error(`${queryParamKey} is a required parameter`);
203
643
  }
644
+ if (_.isUndefined(value)) {
645
+ if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.ignore) {
646
+ this.unsetMongoQueryValue(mongoQuery, queryParam.path);
647
+ continue;
648
+ }
649
+ if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.defaultValue) {
650
+ value = queryParam.defaultValue;
651
+ }
652
+ }
204
653
  if (!_.isEmpty(queryParam.template)) {
205
654
  value = this.runTemplate(queryParam.template, { value: value, queryParams: queryParams, paramMap: paramMap });
206
655
  }
207
656
  if (queryParam.type == DataType.Number) {
208
- value = _.toNumber(value);
657
+ if (!_.isUndefined(value) && value !== null && value !== '') {
658
+ value = _.toNumber(value);
659
+ }
209
660
  }
210
- if (queryParam.type == DataType.String) {
211
- if (!_.isEmpty(queryParam.queryType)) {
212
- const query = {};
213
- // if there is no value pass empty string
214
- if (value == undefined) {
215
- if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.defaultValue) {
216
- value = queryParam.defaultValue;
661
+ if (queryParam.type == DataType.Boolean) {
662
+ if (!_.isUndefined(value)) {
663
+ if (typeof value === 'string') {
664
+ value = value.toLowerCase() === 'true';
665
+ }
666
+ else {
667
+ value = Boolean(value);
668
+ }
669
+ }
670
+ }
671
+ if (queryParam.type == DataType.Array) {
672
+ if (!_.isUndefined(value) && !Array.isArray(value)) {
673
+ if (typeof value === 'string') {
674
+ const trimmed = value.trim();
675
+ if (trimmed === '') {
676
+ value = [];
677
+ }
678
+ else if (trimmed.startsWith('[')) {
679
+ const parsed = parseSerializedValue(trimmed, [value]);
680
+ value = Array.isArray(parsed) ? parsed : [value];
681
+ }
682
+ else {
683
+ value = [value];
217
684
  }
218
685
  }
219
- if (value != undefined || (value == undefined && queryParam.whenUndefined != NamedQueryWhenUndefinedOptions.ignore)) {
220
- query[queryParam.queryType] = value;
221
- value = query;
686
+ else {
687
+ value = value !== null && value !== '' ? [value] : [];
222
688
  }
223
689
  }
224
690
  }
691
+ if (queryParam.type == DataType.Object && !_.isUndefined(value)) {
692
+ value = parseObjectParamValue(queryParamKey, value);
693
+ }
694
+ if (queryParam.type != DataType.Date &&
695
+ !_.isEmpty(queryParam.queryType)) {
696
+ const query = {};
697
+ if (value != undefined || (value == undefined && queryParam.whenUndefined != NamedQueryWhenUndefinedOptions.ignore)) {
698
+ query[queryParam.queryType] = value;
699
+ value = query;
700
+ }
701
+ }
225
702
  if (queryParam.type == DataType.Date) {
226
703
  if (!_.isEmpty(queryParam.queryType)) {
227
704
  const query = {};
228
- if (_.isUndefined(value)) {
229
- if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.defaultValue) {
230
- value = queryParam.defaultValue;
231
- }
232
- }
233
- if (queryParam.format == NamedQueryFormatOptions.days) {
705
+ if (queryParam.format == NamedQueryFormatOptions.days && !_.isUndefined(value)) {
234
706
  let days = _.toInteger(value);
235
707
  let nowDateAddOrSubtract = luxon_1.DateTime.local();
236
708
  if (days > 0) {
@@ -250,23 +722,32 @@ var Services;
250
722
  }
251
723
  }
252
724
  if (value == undefined && queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.ignore) {
253
- delete mongoQuery[queryParam.path];
725
+ this.unsetMongoQueryValue(mongoQuery, queryParam.path);
254
726
  }
255
727
  else {
256
- const existingValue = _.get(mongoQuery, queryParam.path);
257
- if (existingValue != null && _.isObject(existingValue)) {
728
+ const existingValue = this.getMongoQueryValue(mongoQuery, queryParam.path);
729
+ if (_.isPlainObject(existingValue) && _.isPlainObject(value)) {
258
730
  _.merge(value, existingValue);
259
731
  }
260
- _.set(mongoQuery, queryParam.path, value);
732
+ this.setMongoQueryValue(mongoQuery, queryParam.path, value);
261
733
  }
262
734
  }
263
735
  return mongoQuery;
264
736
  }
265
737
  runTemplate(templateOrPath, variables) {
266
- if (templateOrPath && templateOrPath.indexOf('<%') != -1) {
267
- return _.template(templateOrPath)(variables);
738
+ const templateVars = { ...variables };
739
+ if (templateOrPath && templateOrPath.indexOf('{{') != -1) {
740
+ try {
741
+ ensureNamedQueryHandlebarsHelpers();
742
+ const compiledTemplate = handlebars_1.default.compile(templateOrPath, { noEscape: true });
743
+ return compiledTemplate(templateVars);
744
+ }
745
+ catch (err) {
746
+ sails.log.error(`Template compilation failed for ${templateOrPath}`, err);
747
+ throw err;
748
+ }
268
749
  }
269
- return _.get(variables, templateOrPath);
750
+ return _.get(templateVars, templateOrPath);
270
751
  }
271
752
  async performNamedQueryFromConfig(config, paramMap, brand, start, rows, user) {
272
753
  sails.log.debug("performNamedQueryFromConfig with parameters", {
@@ -279,11 +760,12 @@ var Services;
279
760
  });
280
761
  const collectionName = _.get(config, 'collectionName', '') ?? '';
281
762
  const resultObjectMapping = _.get(config, 'resultObjectMapping', {}) ?? {};
282
- const brandIdFieldPath = _.get(config, 'brandIdFieldPath', '') ?? '';
283
- const mongoQuery = _.clone(_.get(config, 'mongoQuery', {}) ?? {});
763
+ const mongoQuery = _.cloneDeep(_.get(config, 'mongoQuery', {}) ?? {});
284
764
  const queryParams = (_.get(config, 'queryParams', {}) ?? {});
285
- const sort = _.get(config, 'sort', []) ?? [];
286
- return await this.performNamedQuery(brandIdFieldPath, resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, user, sort);
765
+ const sort = _.cloneDeep(_.get(config, 'sort', []) ?? []);
766
+ const expandRelations = _.get(config, 'expandRelations', false);
767
+ const relatedRecordFilters = _.cloneDeep(_.get(config, 'relatedRecordFilters', []) ?? []);
768
+ return await this.performNamedQuery('', resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, user, sort, expandRelations, relatedRecordFilters);
287
769
  }
288
770
  async performNamedQueryFromConfigResults(config, paramMap, brand, queryName, start = 0, rows = 30, maxRecords = 100, user = undefined) {
289
771
  const records = [];
@@ -311,9 +793,10 @@ var Services;
311
793
  }
312
794
  // update the start point
313
795
  start = currentRetrievedCount;
314
- // Check the number of records and fail if it is more than maxRecords.
796
+ // Check the number of records and stop if it exceeds maxRecords.
315
797
  if (records.length > maxRecords) {
316
798
  sails.log.warn(`All named query results: returning early before finished with ${records.length} results for '${queryName}' from ${requestCount} requests because the number of records is more than max records ${maxRecords}`);
799
+ break;
317
800
  }
318
801
  // continue the while loop
319
802
  }
@@ -328,6 +811,9 @@ var DataType;
328
811
  DataType["Date"] = "date";
329
812
  DataType["Number"] = "number";
330
813
  DataType["String"] = "string";
814
+ DataType["Boolean"] = "boolean";
815
+ DataType["Array"] = "array";
816
+ DataType["Object"] = "object";
331
817
  })(DataType || (DataType = {}));
332
818
  var NamedQueryWhenUndefinedOptions;
333
819
  (function (NamedQueryWhenUndefinedOptions) {
@@ -349,6 +835,13 @@ class QueryParameterDefinition {
349
835
  path = '';
350
836
  template = '';
351
837
  }
838
+ class RelatedRecordFilter {
839
+ collectionName = '';
840
+ mongoQuery = {};
841
+ localField = '';
842
+ foreignField = '';
843
+ }
844
+ exports.RelatedRecordFilter = RelatedRecordFilter;
352
845
  class NamedQueryConfig {
353
846
  name;
354
847
  branding;
@@ -362,19 +855,23 @@ class NamedQueryConfig {
362
855
  resultObjectMapping;
363
856
  brandIdFieldPath;
364
857
  sort;
858
+ expandRelations;
859
+ relatedRecordFilters;
365
860
  constructor(values) {
366
861
  this.name = values?.name ?? '';
367
- this.branding = values?.branding ?? '';
862
+ this.branding = values?.branding != null ? String(values.branding) : '';
368
863
  this.metadata = values?.metadata;
369
864
  this.createdAt = values?.createdAt ?? '';
370
865
  this.updatedAt = values?.updatedAt ?? '';
371
866
  this.key = values?.key ?? '';
372
- this.queryParams = parseJson(values?.queryParams, {});
373
- this.mongoQuery = parseJson(values?.mongoQuery, {});
867
+ this.queryParams = parseSerializedValue(values?.queryParams, {});
868
+ this.mongoQuery = parseSerializedValue(values?.mongoQuery, {});
374
869
  this.collectionName = values?.collectionName ?? '';
375
- this.resultObjectMapping = parseJson(values?.resultObjectMapping, {});
870
+ this.resultObjectMapping = parseSerializedValue(values?.resultObjectMapping, {});
376
871
  this.brandIdFieldPath = values?.brandIdFieldPath ?? '';
377
- this.sort = parseJson(values?.sort, []);
872
+ this.sort = parseSerializedValue(values?.sort, []);
873
+ this.expandRelations = values?.expandRelations === true || values?.expandRelations === 'true';
874
+ this.relatedRecordFilters = parseSerializedValue(values?.relatedRecordFilters, []);
378
875
  }
379
876
  }
380
877
  exports.NamedQueryConfig = NamedQueryConfig;
@@ -393,4 +890,4 @@ class NamedQueryResponseRecord {
393
890
  }
394
891
  }
395
892
  exports.NamedQueryResponseRecord = NamedQueryResponseRecord;
396
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZWRRdWVyeVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvTmFtZWRRdWVyeVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7QUFFOUQsZ0RBQXNEO0FBRXRELGlDQUFpQztBQUVqQyw4REFBMkQ7QUFDM0QsK0JBQXNDO0FBUXRDLE1BQU0sU0FBUyxHQUFHLENBQUksS0FBYyxFQUFFLFFBQVcsRUFBSyxFQUFFO0lBQ3RELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQU0sQ0FBQztJQUNoQyxDQUFDO0lBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztRQUNoQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsSUFBaUIsUUFBUSxDQTRWeEI7QUE1VkQsV0FBaUIsUUFBUTtJQUl2Qjs7O09BR0c7SUFDSCxNQUFhLGlCQUFrQixTQUFRLHNCQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87UUFJdkMsZ0JBQWdCLEdBQWE7WUFDOUMsV0FBVztZQUNYLHFCQUFxQjtZQUNyQixtQkFBbUI7WUFDbkIsNkJBQTZCO1lBQzdCLG9DQUFvQztTQUNyQyxDQUFD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
893
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZWRRdWVyeVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvTmFtZWRRdWVyeVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFOUQsZ0RBQXNEO0FBRXRELHFEQUF1QztBQUN2QyxnREFBa0M7QUFDbEMsaUNBQWlDO0FBQ2pDLDREQUFvQztBQUNwQyxzRUFBbUY7QUFFbkYsOERBQTJEO0FBQzNELCtCQUFzQztBQTZCdEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQXNCLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUUxRyxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYyxFQUFFLFlBQW9CLEVBQXNCLEVBQUU7SUFDckYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsT0FBTyxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFjLEVBQUUs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