@researchdatabox/redbox-core 0.0.0-bootstrap.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/dist/Attachment.d.ts +17 -0
  2. package/dist/Attachment.d.ts.map +1 -0
  3. package/dist/Attachment.js +40 -0
  4. package/dist/CoreController.d.ts +202 -0
  5. package/dist/CoreController.d.ts.map +1 -0
  6. package/dist/CoreController.js +688 -0
  7. package/dist/CoreService.d.ts +95 -0
  8. package/dist/CoreService.d.ts.map +1 -0
  9. package/dist/CoreService.js +295 -0
  10. package/dist/Datastream.d.ts +11 -0
  11. package/dist/Datastream.d.ts.map +1 -0
  12. package/dist/Datastream.js +38 -0
  13. package/dist/DatastreamService.d.ts +19 -0
  14. package/dist/DatastreamService.d.ts.map +1 -0
  15. package/dist/DatastreamService.js +3 -0
  16. package/dist/DatastreamServiceResponse.d.ts +12 -0
  17. package/dist/DatastreamServiceResponse.d.ts.map +1 -0
  18. package/dist/DatastreamServiceResponse.js +37 -0
  19. package/dist/IntegrationAuditParams.d.ts.map +1 -0
  20. package/dist/Logger.d.ts +16 -0
  21. package/dist/Logger.d.ts.map +1 -0
  22. package/dist/Logger.js +3 -0
  23. package/dist/QueueService.d.ts +9 -0
  24. package/dist/QueueService.d.ts.map +1 -0
  25. package/dist/QueueService.js +21 -0
  26. package/dist/RecordAuditParams.d.ts +6 -0
  27. package/dist/RecordAuditParams.d.ts.map +1 -0
  28. package/dist/RecordAuditParams.js +10 -0
  29. package/dist/RecordsService.d.ts +39 -0
  30. package/dist/RecordsService.d.ts.map +1 -0
  31. package/dist/RecordsService.js +3 -0
  32. package/dist/SearchService.d.ts +8 -0
  33. package/dist/SearchService.d.ts.map +1 -0
  34. package/dist/SearchService.js +3 -0
  35. package/dist/StorageService.d.ts +27 -0
  36. package/dist/StorageService.d.ts.map +1 -0
  37. package/dist/StorageService.js +3 -0
  38. package/dist/StorageServiceResponse.d.ts +16 -0
  39. package/dist/StorageServiceResponse.d.ts.map +1 -0
  40. package/dist/StorageServiceResponse.js +41 -0
  41. package/dist/bootstrap.d.ts +32 -0
  42. package/dist/bootstrap.d.ts.map +1 -0
  43. package/dist/bootstrap.js +172 -0
  44. package/dist/config/action.config.d.ts +13 -0
  45. package/dist/config/action.config.d.ts.map +1 -0
  46. package/dist/config/action.config.js +9 -0
  47. package/dist/config/agendaQueue.config.d.ts +49 -0
  48. package/dist/config/agendaQueue.config.d.ts.map +1 -0
  49. package/dist/config/agendaQueue.config.js +71 -0
  50. package/dist/config/api.config.d.ts +9 -0
  51. package/dist/config/api.config.d.ts.map +1 -0
  52. package/dist/config/api.config.js +11 -0
  53. package/dist/config/appmode.config.d.ts +12 -0
  54. package/dist/config/appmode.config.d.ts.map +1 -0
  55. package/dist/config/appmode.config.js +12 -0
  56. package/dist/config/auth.config.d.ts +15 -0
  57. package/dist/config/auth.config.d.ts.map +1 -0
  58. package/dist/config/auth.config.js +81 -0
  59. package/dist/config/autoreload.config.d.ts +18 -0
  60. package/dist/config/autoreload.config.d.ts.map +1 -0
  61. package/dist/config/autoreload.config.js +21 -0
  62. package/dist/config/blueprints.config.d.ts +28 -0
  63. package/dist/config/blueprints.config.d.ts.map +1 -0
  64. package/dist/config/blueprints.config.js +15 -0
  65. package/dist/config/bootstrap.config.d.ts +15 -0
  66. package/dist/config/bootstrap.config.d.ts.map +1 -0
  67. package/dist/config/bootstrap.config.js +12 -0
  68. package/dist/config/branding.config.d.ts +19 -0
  69. package/dist/config/branding.config.d.ts.map +1 -0
  70. package/dist/config/branding.config.js +109 -0
  71. package/dist/config/brandingConfigurationDefaults.config.d.ts +134 -0
  72. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -0
  73. package/dist/config/brandingConfigurationDefaults.config.js +283 -0
  74. package/dist/config/companion.config.d.ts +41 -0
  75. package/dist/config/companion.config.d.ts.map +1 -0
  76. package/dist/config/companion.config.js +61 -0
  77. package/dist/config/cors.config.d.ts +22 -0
  78. package/dist/config/cors.config.d.ts.map +1 -0
  79. package/dist/config/cors.config.js +11 -0
  80. package/dist/config/crontab.config.d.ts +22 -0
  81. package/dist/config/crontab.config.d.ts.map +1 -0
  82. package/dist/config/crontab.config.js +18 -0
  83. package/dist/config/csp.config.d.ts +53 -0
  84. package/dist/config/csp.config.d.ts.map +1 -0
  85. package/dist/config/csp.config.js +32 -0
  86. package/dist/config/custom.config.d.ts +16 -0
  87. package/dist/config/custom.config.d.ts.map +1 -0
  88. package/dist/config/custom.config.js +22 -0
  89. package/dist/config/custom_cache.config.d.ts +14 -0
  90. package/dist/config/custom_cache.config.d.ts.map +1 -0
  91. package/dist/config/custom_cache.config.js +13 -0
  92. package/dist/config/dashboardtype.config.d.ts +45 -0
  93. package/dist/config/dashboardtype.config.d.ts.map +1 -0
  94. package/dist/config/dashboardtype.config.js +98 -0
  95. package/dist/config/datacite.config.d.ts +51 -0
  96. package/dist/config/datacite.config.d.ts.map +1 -0
  97. package/dist/config/datacite.config.js +44 -0
  98. package/dist/config/datapubs.config.d.ts +72 -0
  99. package/dist/config/datapubs.config.d.ts.map +1 -0
  100. package/dist/config/datapubs.config.js +74 -0
  101. package/dist/config/datastores.config.d.ts +20 -0
  102. package/dist/config/datastores.config.d.ts.map +1 -0
  103. package/dist/config/datastores.config.js +21 -0
  104. package/dist/config/dompurify.config.d.ts +65 -0
  105. package/dist/config/dompurify.config.d.ts.map +1 -0
  106. package/dist/config/dompurify.config.js +181 -0
  107. package/dist/config/dynamicasset.config.d.ts +13 -0
  108. package/dist/config/dynamicasset.config.d.ts.map +1 -0
  109. package/dist/config/dynamicasset.config.js +18 -0
  110. package/dist/config/dynamicconfig.config.d.ts +12 -0
  111. package/dist/config/dynamicconfig.config.d.ts.map +1 -0
  112. package/dist/config/dynamicconfig.config.js +13 -0
  113. package/dist/config/emailnotification.config.d.ts +49 -0
  114. package/dist/config/emailnotification.config.d.ts.map +1 -0
  115. package/dist/config/emailnotification.config.js +37 -0
  116. package/dist/config/figshareAPI.config.d.ts +116 -0
  117. package/dist/config/figshareAPI.config.d.ts.map +1 -0
  118. package/dist/config/figshareAPI.config.js +857 -0
  119. package/dist/config/figshareAPIEnv.config.d.ts +11 -0
  120. package/dist/config/figshareAPIEnv.config.d.ts.map +1 -0
  121. package/dist/config/figshareAPIEnv.config.js +13 -0
  122. package/dist/config/figshareDev.config.d.ts.map +1 -0
  123. package/dist/config/figshareRedboxFORMapping.config.d.ts +15 -0
  124. package/dist/config/figshareRedboxFORMapping.config.d.ts.map +1 -0
  125. package/dist/config/figshareRedboxFORMapping.config.js +7458 -0
  126. package/dist/config/form.config.d.ts +20 -0
  127. package/dist/config/form.config.d.ts.map +1 -0
  128. package/dist/config/form.config.js +11 -0
  129. package/dist/config/globals.config.d.ts +20 -0
  130. package/dist/config/globals.config.d.ts.map +1 -0
  131. package/dist/config/globals.config.js +52 -0
  132. package/dist/config/http.config.d.ts +57 -0
  133. package/dist/config/http.config.d.ts.map +1 -0
  134. package/dist/config/http.config.js +462 -0
  135. package/dist/config/i18n.config.d.ts +38 -0
  136. package/dist/config/i18n.config.d.ts.map +1 -0
  137. package/dist/config/i18n.config.js +30 -0
  138. package/dist/config/index.d.ts +306 -0
  139. package/dist/config/index.d.ts.map +1 -0
  140. package/dist/config/index.js +240 -0
  141. package/dist/config/jsonld.config.d.ts +19 -0
  142. package/dist/config/jsonld.config.d.ts.map +1 -0
  143. package/dist/config/jsonld.config.js +33 -0
  144. package/dist/config/log.config.d.ts +20 -0
  145. package/dist/config/log.config.d.ts.map +1 -0
  146. package/dist/config/log.config.js +157 -0
  147. package/dist/config/lognamespace.config.d.ts +13 -0
  148. package/dist/config/lognamespace.config.d.ts.map +1 -0
  149. package/dist/config/lognamespace.config.js +17 -0
  150. package/dist/config/mint.config.d.ts +23 -0
  151. package/dist/config/mint.config.d.ts.map +1 -0
  152. package/dist/config/mint.config.js +20 -0
  153. package/dist/config/models.config.d.ts +37 -0
  154. package/dist/config/models.config.d.ts.map +1 -0
  155. package/dist/config/models.config.js +23 -0
  156. package/dist/config/namedQuery.config.d.ts +26 -0
  157. package/dist/config/namedQuery.config.d.ts.map +1 -0
  158. package/dist/config/namedQuery.config.js +358 -0
  159. package/dist/config/ng2.config.d.ts +11 -0
  160. package/dist/config/ng2.config.d.ts.map +1 -0
  161. package/dist/config/ng2.config.js +12 -0
  162. package/dist/config/orcid.config.d.ts +12 -0
  163. package/dist/config/orcid.config.d.ts.map +1 -0
  164. package/dist/config/orcid.config.js +13 -0
  165. package/dist/config/orm.config.d.ts +12 -0
  166. package/dist/config/orm.config.d.ts.map +1 -0
  167. package/dist/config/orm.config.js +13 -0
  168. package/dist/config/peopleSearch.config.d.ts +14 -0
  169. package/dist/config/peopleSearch.config.d.ts.map +1 -0
  170. package/dist/config/peopleSearch.config.js +15 -0
  171. package/dist/config/policies.config.d.ts +18 -0
  172. package/dist/config/policies.config.d.ts.map +1 -0
  173. package/dist/config/policies.config.js +65 -0
  174. package/dist/config/queue.config.d.ts +12 -0
  175. package/dist/config/queue.config.d.ts.map +1 -0
  176. package/dist/config/queue.config.js +13 -0
  177. package/dist/config/raid.config.d.ts +66 -0
  178. package/dist/config/raid.config.d.ts.map +1 -0
  179. package/dist/config/raid.config.js +272 -0
  180. package/dist/config/record.config.d.ts +74 -0
  181. package/dist/config/record.config.d.ts.map +1 -0
  182. package/dist/config/record.config.js +104 -0
  183. package/dist/config/recordtype.config.d.ts +66 -0
  184. package/dist/config/recordtype.config.d.ts.map +1 -0
  185. package/dist/config/recordtype.config.js +660 -0
  186. package/dist/config/redboxSession.config.d.ts +29 -0
  187. package/dist/config/redboxSession.config.d.ts.map +1 -0
  188. package/dist/config/redboxSession.config.js +14 -0
  189. package/dist/config/redboxToCkan.config.d.ts +17 -0
  190. package/dist/config/redboxToCkan.config.d.ts.map +1 -0
  191. package/dist/config/redboxToCkan.config.js +18 -0
  192. package/dist/config/relatedObjectsFormDefinition.config.d.ts.map +1 -0
  193. package/dist/config/report.config.d.ts +46 -0
  194. package/dist/config/report.config.d.ts.map +1 -0
  195. package/dist/config/report.config.js +54 -0
  196. package/dist/config/reusableContributorFormDefinitions.config.d.ts +3 -0
  197. package/dist/config/reusableContributorFormDefinitions.config.d.ts.map +1 -0
  198. package/dist/config/reusableContributorFormDefinitions.config.js +408 -0
  199. package/dist/config/reusableFormDefinitions.config.d.ts +16 -0
  200. package/dist/config/reusableFormDefinitions.config.d.ts.map +1 -0
  201. package/dist/config/reusableFormDefinitions.config.js +41 -0
  202. package/dist/config/reusableRelatedObjectsFormDefinitions.config.d.ts +22 -0
  203. package/dist/config/reusableRelatedObjectsFormDefinitions.config.d.ts.map +1 -0
  204. package/dist/config/reusableRelatedObjectsFormDefinitions.config.js +291 -0
  205. package/dist/config/reusableViewFormDefinitions.config.d.ts +3 -0
  206. package/dist/config/reusableViewFormDefinitions.config.d.ts.map +1 -0
  207. package/dist/config/reusableViewFormDefinitions.config.js +140 -0
  208. package/dist/config/routes.config.d.ts +21 -0
  209. package/dist/config/routes.config.d.ts.map +1 -0
  210. package/dist/config/routes.config.js +389 -0
  211. package/dist/config/search.config.d.ts +9 -0
  212. package/dist/config/search.config.d.ts.map +1 -0
  213. package/dist/config/search.config.js +11 -0
  214. package/dist/config/security.config.d.ts +22 -0
  215. package/dist/config/security.config.d.ts.map +1 -0
  216. package/dist/config/security.config.js +14 -0
  217. package/dist/config/session.config.d.ts +37 -0
  218. package/dist/config/session.config.d.ts.map +1 -0
  219. package/dist/config/session.config.js +11 -0
  220. package/dist/config/sockets.config.d.ts +17 -0
  221. package/dist/config/sockets.config.d.ts.map +1 -0
  222. package/dist/config/sockets.config.js +12 -0
  223. package/dist/config/solr.config.d.ts +73 -0
  224. package/dist/config/solr.config.d.ts.map +1 -0
  225. package/dist/config/solr.config.js +79 -0
  226. package/dist/config/static_assets.config.d.ts +10 -0
  227. package/dist/config/static_assets.config.d.ts.map +1 -0
  228. package/dist/config/static_assets.config.js +12 -0
  229. package/dist/config/storage.config.d.ts +42 -0
  230. package/dist/config/storage.config.d.ts.map +1 -0
  231. package/dist/config/storage.config.js +30 -0
  232. package/dist/config/typescript.config.d.ts +12 -0
  233. package/dist/config/typescript.config.d.ts.map +1 -0
  234. package/dist/config/typescript.config.js +13 -0
  235. package/dist/config/validators.config.d.ts +13 -0
  236. package/dist/config/validators.config.d.ts.map +1 -0
  237. package/dist/config/validators.config.js +15 -0
  238. package/dist/config/views.config.d.ts +20 -0
  239. package/dist/config/views.config.d.ts.map +1 -0
  240. package/dist/config/views.config.js +20 -0
  241. package/dist/config/vocab.config.d.ts +58 -0
  242. package/dist/config/vocab.config.d.ts.map +1 -0
  243. package/dist/config/vocab.config.js +58 -0
  244. package/dist/config/webpack.config.d.ts +16 -0
  245. package/dist/config/webpack.config.d.ts.map +1 -0
  246. package/dist/config/webpack.config.js +153 -0
  247. package/dist/config/workflow.config.d.ts +76 -0
  248. package/dist/config/workflow.config.d.ts.map +1 -0
  249. package/dist/config/workflow.config.js +339 -0
  250. package/dist/config/workspacetype.config.d.ts +23 -0
  251. package/dist/config/workspacetype.config.d.ts.map +1 -0
  252. package/dist/config/workspacetype.config.js +19 -0
  253. package/dist/configmodels/AdminSidebarConfig.d.ts +352 -0
  254. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -0
  255. package/dist/configmodels/AdminSidebarConfig.js +163 -0
  256. package/dist/configmodels/AppConfig.interface.d.ts +4 -0
  257. package/dist/configmodels/AppConfig.interface.d.ts.map +1 -0
  258. package/dist/configmodels/AppConfig.interface.js +10 -0
  259. package/dist/configmodels/AuthorizedDomainsEmails.d.ts +43 -0
  260. package/dist/configmodels/AuthorizedDomainsEmails.d.ts.map +1 -0
  261. package/dist/configmodels/AuthorizedDomainsEmails.js +49 -0
  262. package/dist/configmodels/ConfigModels.d.ts +22 -0
  263. package/dist/configmodels/ConfigModels.d.ts.map +1 -0
  264. package/dist/configmodels/ConfigModels.js +98 -0
  265. package/dist/configmodels/DoiPublishing.d.ts.map +1 -0
  266. package/dist/configmodels/FigsharePublishing.d.ts.map +1 -0
  267. package/dist/configmodels/HomePanelConfig.d.ts +244 -0
  268. package/dist/configmodels/HomePanelConfig.d.ts.map +1 -0
  269. package/dist/configmodels/HomePanelConfig.js +132 -0
  270. package/dist/configmodels/MenuConfig.d.ts +203 -0
  271. package/dist/configmodels/MenuConfig.d.ts.map +1 -0
  272. package/dist/configmodels/MenuConfig.js +158 -0
  273. package/dist/configmodels/SystemMessage.d.ts +24 -0
  274. package/dist/configmodels/SystemMessage.d.ts.map +1 -0
  275. package/dist/configmodels/SystemMessage.js +30 -0
  276. package/dist/controllers/ActionController.d.ts +21 -0
  277. package/dist/controllers/ActionController.d.ts.map +1 -0
  278. package/dist/controllers/ActionController.js +41 -0
  279. package/dist/controllers/AdminController.d.ts +45 -0
  280. package/dist/controllers/AdminController.d.ts.map +1 -0
  281. package/dist/controllers/AdminController.js +498 -0
  282. package/dist/controllers/AppConfigController.d.ts +25 -0
  283. package/dist/controllers/AppConfigController.d.ts.map +1 -0
  284. package/dist/controllers/AppConfigController.js +90 -0
  285. package/dist/controllers/AsynchController.d.ts +30 -0
  286. package/dist/controllers/AsynchController.d.ts.map +1 -0
  287. package/dist/controllers/AsynchController.js +146 -0
  288. package/dist/controllers/BrandingAppController.d.ts +21 -0
  289. package/dist/controllers/BrandingAppController.d.ts.map +1 -0
  290. package/dist/controllers/BrandingAppController.js +144 -0
  291. package/dist/controllers/BrandingController.d.ts +64 -0
  292. package/dist/controllers/BrandingController.d.ts.map +1 -0
  293. package/dist/controllers/BrandingController.js +256 -0
  294. package/dist/controllers/DynamicAssetController.d.ts +67 -0
  295. package/dist/controllers/DynamicAssetController.d.ts.map +1 -0
  296. package/dist/controllers/DynamicAssetController.js +225 -0
  297. package/dist/controllers/EmailController.d.ts +35 -0
  298. package/dist/controllers/EmailController.d.ts.map +1 -0
  299. package/dist/controllers/EmailController.js +138 -0
  300. package/dist/controllers/ExportController.d.ts +22 -0
  301. package/dist/controllers/ExportController.d.ts.map +1 -0
  302. package/dist/controllers/ExportController.js +73 -0
  303. package/dist/controllers/FormVocabularyController.d.ts +12 -0
  304. package/dist/controllers/FormVocabularyController.d.ts.map +1 -0
  305. package/dist/controllers/FormVocabularyController.js +218 -0
  306. package/dist/controllers/RecordAuditController.d.ts +25 -0
  307. package/dist/controllers/RecordAuditController.d.ts.map +1 -0
  308. package/dist/controllers/RecordAuditController.js +74 -0
  309. package/dist/controllers/RecordController.d.ts +114 -0
  310. package/dist/controllers/RecordController.d.ts.map +1 -0
  311. package/dist/controllers/RecordController.js +1614 -0
  312. package/dist/controllers/RenderViewController.d.ts +14 -0
  313. package/dist/controllers/RenderViewController.d.ts.map +1 -0
  314. package/dist/controllers/RenderViewController.js +30 -0
  315. package/dist/controllers/ReportController.d.ts +25 -0
  316. package/dist/controllers/ReportController.d.ts.map +1 -0
  317. package/dist/controllers/ReportController.js +80 -0
  318. package/dist/controllers/ReportsController.d.ts +22 -0
  319. package/dist/controllers/ReportsController.d.ts.map +1 -0
  320. package/dist/controllers/ReportsController.js +37 -0
  321. package/dist/controllers/TranslationController.d.ts +27 -0
  322. package/dist/controllers/TranslationController.d.ts.map +1 -0
  323. package/dist/controllers/TranslationController.js +245 -0
  324. package/dist/controllers/UserController.d.ts +50 -0
  325. package/dist/controllers/UserController.d.ts.map +1 -0
  326. package/dist/controllers/UserController.js +518 -0
  327. package/dist/controllers/VocabController.d.ts +43 -0
  328. package/dist/controllers/VocabController.d.ts.map +1 -0
  329. package/dist/controllers/VocabController.js +190 -0
  330. package/dist/controllers/VocabularyController.d.ts +23 -0
  331. package/dist/controllers/VocabularyController.d.ts.map +1 -0
  332. package/dist/controllers/VocabularyController.js +344 -0
  333. package/dist/controllers/WorkspaceAsyncController.d.ts +18 -0
  334. package/dist/controllers/WorkspaceAsyncController.d.ts.map +1 -0
  335. package/dist/controllers/WorkspaceAsyncController.js +63 -0
  336. package/dist/controllers/WorkspaceTypesController.d.ts +19 -0
  337. package/dist/controllers/WorkspaceTypesController.d.ts.map +1 -0
  338. package/dist/controllers/WorkspaceTypesController.js +96 -0
  339. package/dist/controllers/index.d.ts +8 -0
  340. package/dist/controllers/index.d.ts.map +1 -0
  341. package/dist/controllers/index.js +159 -0
  342. package/dist/controllers/webservice/AdminController.d.ts +20 -0
  343. package/dist/controllers/webservice/AdminController.d.ts.map +1 -0
  344. package/dist/controllers/webservice/AdminController.js +83 -0
  345. package/dist/controllers/webservice/AppConfigController.d.ts +25 -0
  346. package/dist/controllers/webservice/AppConfigController.d.ts.map +1 -0
  347. package/dist/controllers/webservice/AppConfigController.js +72 -0
  348. package/dist/controllers/webservice/BrandingController.d.ts +13 -0
  349. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -0
  350. package/dist/controllers/webservice/BrandingController.js +147 -0
  351. package/dist/controllers/webservice/ExportController.d.ts +22 -0
  352. package/dist/controllers/webservice/ExportController.d.ts.map +1 -0
  353. package/dist/controllers/webservice/ExportController.js +67 -0
  354. package/dist/controllers/webservice/FormManagementController.d.ts +24 -0
  355. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -0
  356. package/dist/controllers/webservice/FormManagementController.js +79 -0
  357. package/dist/controllers/webservice/IntegrationAuditController.d.ts.map +1 -0
  358. package/dist/controllers/webservice/RecordController.d.ts +65 -0
  359. package/dist/controllers/webservice/RecordController.d.ts.map +1 -0
  360. package/dist/controllers/webservice/RecordController.js +1348 -0
  361. package/dist/controllers/webservice/RecordTypeController.d.ts +24 -0
  362. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -0
  363. package/dist/controllers/webservice/RecordTypeController.js +70 -0
  364. package/dist/controllers/webservice/ReportController.d.ts +22 -0
  365. package/dist/controllers/webservice/ReportController.d.ts.map +1 -0
  366. package/dist/controllers/webservice/ReportController.js +74 -0
  367. package/dist/controllers/webservice/SearchController.d.ts +28 -0
  368. package/dist/controllers/webservice/SearchController.d.ts.map +1 -0
  369. package/dist/controllers/webservice/SearchController.js +123 -0
  370. package/dist/controllers/webservice/TranslationController.d.ts +18 -0
  371. package/dist/controllers/webservice/TranslationController.d.ts.map +1 -0
  372. package/dist/controllers/webservice/TranslationController.js +226 -0
  373. package/dist/controllers/webservice/UserManagementController.d.ts +38 -0
  374. package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -0
  375. package/dist/controllers/webservice/UserManagementController.js +608 -0
  376. package/dist/controllers/webservice/VocabularyController.d.ts +18 -0
  377. package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -0
  378. package/dist/controllers/webservice/VocabularyController.js +172 -0
  379. package/dist/decorator/PopulateExportedMethods.decorator.d.ts +4 -0
  380. package/dist/decorator/PopulateExportedMethods.decorator.d.ts.map +1 -0
  381. package/dist/decorator/PopulateExportedMethods.decorator.js +22 -0
  382. package/dist/decorator/index.d.ts +2 -0
  383. package/dist/decorator/index.d.ts.map +1 -0
  384. package/dist/decorator/index.js +6 -0
  385. package/dist/decorators/Associations.d.ts +4 -0
  386. package/dist/decorators/Associations.d.ts.map +1 -0
  387. package/dist/decorators/Associations.js +12 -0
  388. package/dist/decorators/Attr.d.ts +4 -0
  389. package/dist/decorators/Attr.d.ts.map +1 -0
  390. package/dist/decorators/Attr.js +34 -0
  391. package/dist/decorators/Entity.d.ts +3 -0
  392. package/dist/decorators/Entity.d.ts.map +1 -0
  393. package/dist/decorators/Entity.js +29 -0
  394. package/dist/decorators/Lifecycle.d.ts +10 -0
  395. package/dist/decorators/Lifecycle.d.ts.map +1 -0
  396. package/dist/decorators/Lifecycle.js +26 -0
  397. package/dist/decorators/index.d.ts +8 -0
  398. package/dist/decorators/index.d.ts.map +1 -0
  399. package/dist/decorators/index.js +35 -0
  400. package/dist/decorators/registry.d.ts +8 -0
  401. package/dist/decorators/registry.d.ts.map +1 -0
  402. package/dist/decorators/registry.js +68 -0
  403. package/dist/decorators/types.d.ts +81 -0
  404. package/dist/decorators/types.d.ts.map +1 -0
  405. package/dist/decorators/types.js +4 -0
  406. package/dist/decorators/utils.d.ts +5 -0
  407. package/dist/decorators/utils.d.ts.map +1 -0
  408. package/dist/decorators/utils.js +68 -0
  409. package/dist/form-config/dataPublication-1.0-draft.d.ts.map +1 -0
  410. package/dist/form-config/dataPublication-1.0-embargoed.d.ts.map +1 -0
  411. package/dist/form-config/dataPublication-1.0-published.d.ts.map +1 -0
  412. package/dist/form-config/dataPublication-1.0-queued.d.ts.map +1 -0
  413. package/dist/form-config/dataPublication-1.0-retired.d.ts.map +1 -0
  414. package/dist/form-config/dataRecord-1.0-draft.d.ts +4 -0
  415. package/dist/form-config/dataRecord-1.0-draft.d.ts.map +1 -0
  416. package/dist/form-config/dataRecord-1.0-draft.js +1042 -0
  417. package/dist/form-config/default-1.0-draft.d.ts +4 -0
  418. package/dist/form-config/default-1.0-draft.d.ts.map +1 -0
  419. package/dist/form-config/default-1.0-draft.js +1132 -0
  420. package/dist/form-config/generated-view-only.d.ts +12 -0
  421. package/dist/form-config/generated-view-only.d.ts.map +1 -0
  422. package/dist/form-config/generated-view-only.js +169 -0
  423. package/dist/form-config/index.d.ts +3 -0
  424. package/dist/form-config/index.d.ts.map +1 -0
  425. package/dist/form-config/index.js +15 -0
  426. package/dist/hooks/defineRedboxHook.d.ts +31 -0
  427. package/dist/hooks/defineRedboxHook.d.ts.map +1 -0
  428. package/dist/hooks/defineRedboxHook.js +47 -0
  429. package/dist/hooks/index.d.ts +9 -0
  430. package/dist/hooks/index.d.ts.map +1 -0
  431. package/dist/hooks/index.js +13 -0
  432. package/dist/hooks/webpack.d.ts +27 -0
  433. package/dist/hooks/webpack.d.ts.map +1 -0
  434. package/dist/hooks/webpack.js +82 -0
  435. package/dist/index.d.ts +58 -0
  436. package/dist/index.d.ts.map +1 -0
  437. package/dist/index.js +116 -0
  438. package/dist/loader/bootstrapShimRuntime.d.ts +8 -0
  439. package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -0
  440. package/dist/loader/bootstrapShimRuntime.js +83 -0
  441. package/dist/loader/index.d.ts +93 -0
  442. package/dist/loader/index.d.ts.map +1 -0
  443. package/dist/loader/index.js +767 -0
  444. package/dist/middleware/redboxSession.d.ts +6 -0
  445. package/dist/middleware/redboxSession.d.ts.map +1 -0
  446. package/dist/middleware/redboxSession.js +60 -0
  447. package/dist/model/APIActionResponse.d.ts +6 -0
  448. package/dist/model/APIActionResponse.d.ts.map +1 -0
  449. package/dist/model/APIActionResponse.js +13 -0
  450. package/dist/model/APIErrorResponse.d.ts +6 -0
  451. package/dist/model/APIErrorResponse.d.ts.map +1 -0
  452. package/dist/model/APIErrorResponse.js +13 -0
  453. package/dist/model/APIHarvestResponse.d.ts +9 -0
  454. package/dist/model/APIHarvestResponse.d.ts.map +1 -0
  455. package/dist/model/APIHarvestResponse.js +19 -0
  456. package/dist/model/APIObjectActionResponse.d.ts +7 -0
  457. package/dist/model/APIObjectActionResponse.d.ts.map +1 -0
  458. package/dist/model/APIObjectActionResponse.js +15 -0
  459. package/dist/model/BuildResponse.d.ts +47 -0
  460. package/dist/model/BuildResponse.d.ts.map +1 -0
  461. package/dist/model/BuildResponse.js +5 -0
  462. package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
  463. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -0
  464. package/dist/model/DashboardTypeResponseModel.js +13 -0
  465. package/dist/model/ListAPIResponse.d.ts +7 -0
  466. package/dist/model/ListAPIResponse.d.ts.map +1 -0
  467. package/dist/model/ListAPIResponse.js +12 -0
  468. package/dist/model/ListAPISummary.d.ts +7 -0
  469. package/dist/model/ListAPISummary.d.ts.map +1 -0
  470. package/dist/model/ListAPISummary.js +12 -0
  471. package/dist/model/RBValidationError.d.ts +62 -0
  472. package/dist/model/RBValidationError.d.ts.map +1 -0
  473. package/dist/model/RBValidationError.js +98 -0
  474. package/dist/model/RecordTypeResponseModel.d.ts +10 -0
  475. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -0
  476. package/dist/model/RecordTypeResponseModel.js +19 -0
  477. package/dist/model/RequestDetails.d.ts +27 -0
  478. package/dist/model/RequestDetails.d.ts.map +1 -0
  479. package/dist/model/RequestDetails.js +53 -0
  480. package/dist/model/SolrDocument.d.ts +17 -0
  481. package/dist/model/SolrDocument.d.ts.map +1 -0
  482. package/dist/model/SolrDocument.js +30 -0
  483. package/dist/model/api/APIResponseVersion2.d.ts +107 -0
  484. package/dist/model/api/APIResponseVersion2.d.ts.map +1 -0
  485. package/dist/model/api/APIResponseVersion2.js +3 -0
  486. package/dist/model/api/APIVersions.d.ts +9 -0
  487. package/dist/model/api/APIVersions.d.ts.map +1 -0
  488. package/dist/model/api/APIVersions.js +11 -0
  489. package/dist/model/api/CreateUserAPIResponse.d.ts +9 -0
  490. package/dist/model/api/CreateUserAPIResponse.d.ts.map +1 -0
  491. package/dist/model/api/CreateUserAPIResponse.js +13 -0
  492. package/dist/model/api/FigshareArticleCreate.d.ts +11 -0
  493. package/dist/model/api/FigshareArticleCreate.d.ts.map +1 -0
  494. package/dist/model/api/FigshareArticleCreate.js +16 -0
  495. package/dist/model/api/FigshareArticleEmbargo.d.ts +11 -0
  496. package/dist/model/api/FigshareArticleEmbargo.d.ts.map +1 -0
  497. package/dist/model/api/FigshareArticleEmbargo.js +23 -0
  498. package/dist/model/api/FigshareArticleUpdate.d.ts +13 -0
  499. package/dist/model/api/FigshareArticleUpdate.d.ts.map +1 -0
  500. package/dist/model/api/FigshareArticleUpdate.js +20 -0
  501. package/dist/model/api/UserAPITokenAPIResponse.d.ts +6 -0
  502. package/dist/model/api/UserAPITokenAPIResponse.d.ts.map +1 -0
  503. package/dist/model/api/UserAPITokenAPIResponse.js +10 -0
  504. package/dist/model/api/index.d.ts +8 -0
  505. package/dist/model/api/index.d.ts.map +1 -0
  506. package/dist/model/api/index.js +16 -0
  507. package/dist/model/config/ReportConfig.d.ts +50 -0
  508. package/dist/model/config/ReportConfig.d.ts.map +1 -0
  509. package/dist/model/config/ReportConfig.js +58 -0
  510. package/dist/model/config/SolrConfig.d.ts +72 -0
  511. package/dist/model/config/SolrConfig.d.ts.map +1 -0
  512. package/dist/model/config/SolrConfig.js +41 -0
  513. package/dist/model/config/VocabQueryConfig.d.ts +30 -0
  514. package/dist/model/config/VocabQueryConfig.d.ts.map +1 -0
  515. package/dist/model/config/VocabQueryConfig.js +32 -0
  516. package/dist/model/config/index.d.ts +4 -0
  517. package/dist/model/config/index.d.ts.map +1 -0
  518. package/dist/model/config/index.js +20 -0
  519. package/dist/model/index.d.ts +16 -0
  520. package/dist/model/index.d.ts.map +1 -0
  521. package/dist/model/index.js +45 -0
  522. package/dist/model/storage/AppConfigModel.d.ts +9 -0
  523. package/dist/model/storage/AppConfigModel.d.ts.map +1 -0
  524. package/dist/model/storage/AppConfigModel.js +3 -0
  525. package/dist/model/storage/AsynchProgressModel.d.ts +18 -0
  526. package/dist/model/storage/AsynchProgressModel.d.ts.map +1 -0
  527. package/dist/model/storage/AsynchProgressModel.js +3 -0
  528. package/dist/model/storage/BrandingModel.d.ts +24 -0
  529. package/dist/model/storage/BrandingModel.d.ts.map +1 -0
  530. package/dist/model/storage/BrandingModel.js +60 -0
  531. package/dist/model/storage/CacheEntryModel.d.ts +6 -0
  532. package/dist/model/storage/CacheEntryModel.d.ts.map +1 -0
  533. package/dist/model/storage/CacheEntryModel.js +3 -0
  534. package/dist/model/storage/CounterModel.d.ts +7 -0
  535. package/dist/model/storage/CounterModel.d.ts.map +1 -0
  536. package/dist/model/storage/CounterModel.js +3 -0
  537. package/dist/model/storage/DashboardTypeModel.d.ts +9 -0
  538. package/dist/model/storage/DashboardTypeModel.d.ts.map +1 -0
  539. package/dist/model/storage/DashboardTypeModel.js +3 -0
  540. package/dist/model/storage/DeletedRecordModel.d.ts +7 -0
  541. package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -0
  542. package/dist/model/storage/DeletedRecordModel.js +3 -0
  543. package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -0
  544. package/dist/model/storage/NamedQueryModel.d.ts +13 -0
  545. package/dist/model/storage/NamedQueryModel.d.ts.map +1 -0
  546. package/dist/model/storage/NamedQueryModel.js +17 -0
  547. package/dist/model/storage/RecordAuditModel.d.ts +15 -0
  548. package/dist/model/storage/RecordAuditModel.d.ts.map +1 -0
  549. package/dist/model/storage/RecordAuditModel.js +28 -0
  550. package/dist/model/storage/RecordModel.d.ts +42 -0
  551. package/dist/model/storage/RecordModel.d.ts.map +1 -0
  552. package/dist/model/storage/RecordModel.js +3 -0
  553. package/dist/model/storage/RecordTypeModel.d.ts +36 -0
  554. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -0
  555. package/dist/model/storage/RecordTypeModel.js +43 -0
  556. package/dist/model/storage/ReportModel.d.ts +5 -0
  557. package/dist/model/storage/ReportModel.d.ts.map +1 -0
  558. package/dist/model/storage/ReportModel.js +3 -0
  559. package/dist/model/storage/RoleModel.d.ts +9 -0
  560. package/dist/model/storage/RoleModel.d.ts.map +1 -0
  561. package/dist/model/storage/RoleModel.js +12 -0
  562. package/dist/model/storage/UserAuditModel.d.ts +9 -0
  563. package/dist/model/storage/UserAuditModel.d.ts.map +1 -0
  564. package/dist/model/storage/UserAuditModel.js +3 -0
  565. package/dist/model/storage/UserLinkModel.d.ts +14 -0
  566. package/dist/model/storage/UserLinkModel.d.ts.map +1 -0
  567. package/dist/model/storage/UserLinkModel.js +18 -0
  568. package/dist/model/storage/UserModel.d.ts +25 -0
  569. package/dist/model/storage/UserModel.d.ts.map +1 -0
  570. package/dist/model/storage/UserModel.js +26 -0
  571. package/dist/model/storage/WorkflowStepModel.d.ts +11 -0
  572. package/dist/model/storage/WorkflowStepModel.d.ts.map +1 -0
  573. package/dist/model/storage/WorkflowStepModel.js +3 -0
  574. package/dist/model/storage/WorkspaceAppModel.d.ts +8 -0
  575. package/dist/model/storage/WorkspaceAppModel.d.ts.map +1 -0
  576. package/dist/model/storage/WorkspaceAppModel.js +3 -0
  577. package/dist/model/storage/index.d.ts +18 -0
  578. package/dist/model/storage/index.d.ts.map +1 -0
  579. package/dist/model/storage/index.js +19 -0
  580. package/dist/policies/brandingAndPortal.d.ts +9 -0
  581. package/dist/policies/brandingAndPortal.d.ts.map +1 -0
  582. package/dist/policies/brandingAndPortal.js +34 -0
  583. package/dist/policies/checkAuth.d.ts +9 -0
  584. package/dist/policies/checkAuth.d.ts.map +1 -0
  585. package/dist/policies/checkAuth.js +64 -0
  586. package/dist/policies/checkBrandingValid.d.ts +9 -0
  587. package/dist/policies/checkBrandingValid.d.ts.map +1 -0
  588. package/dist/policies/checkBrandingValid.js +40 -0
  589. package/dist/policies/companionAttachmentUploadAuth.d.ts +9 -0
  590. package/dist/policies/companionAttachmentUploadAuth.d.ts.map +1 -0
  591. package/dist/policies/companionAttachmentUploadAuth.js +221 -0
  592. package/dist/policies/contentSecurityPolicy.d.ts +23 -0
  593. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -0
  594. package/dist/policies/contentSecurityPolicy.js +135 -0
  595. package/dist/policies/disallowedHeadRequestHandler.d.ts +8 -0
  596. package/dist/policies/disallowedHeadRequestHandler.d.ts.map +1 -0
  597. package/dist/policies/disallowedHeadRequestHandler.js +17 -0
  598. package/dist/policies/i18nLanguages.d.ts +8 -0
  599. package/dist/policies/i18nLanguages.d.ts.map +1 -0
  600. package/dist/policies/i18nLanguages.js +56 -0
  601. package/dist/policies/index.d.ts +52 -0
  602. package/dist/policies/index.d.ts.map +1 -0
  603. package/dist/policies/index.js +70 -0
  604. package/dist/policies/isAuthenticated.d.ts +9 -0
  605. package/dist/policies/isAuthenticated.d.ts.map +1 -0
  606. package/dist/policies/isAuthenticated.js +19 -0
  607. package/dist/policies/isWebServiceAuthenticated.d.ts +9 -0
  608. package/dist/policies/isWebServiceAuthenticated.d.ts.map +1 -0
  609. package/dist/policies/isWebServiceAuthenticated.js +25 -0
  610. package/dist/policies/menuResolver.d.ts +11 -0
  611. package/dist/policies/menuResolver.d.ts.map +1 -0
  612. package/dist/policies/menuResolver.js +58 -0
  613. package/dist/policies/noCache.d.ts +9 -0
  614. package/dist/policies/noCache.d.ts.map +1 -0
  615. package/dist/policies/noCache.js +34 -0
  616. package/dist/policies/prepWs.d.ts +9 -0
  617. package/dist/policies/prepWs.d.ts.map +1 -0
  618. package/dist/policies/prepWs.js +23 -0
  619. package/dist/policies/sessionAuth.d.ts +11 -0
  620. package/dist/policies/sessionAuth.d.ts.map +1 -0
  621. package/dist/policies/sessionAuth.js +23 -0
  622. package/dist/policies/setLang.d.ts +8 -0
  623. package/dist/policies/setLang.d.ts.map +1 -0
  624. package/dist/policies/setLang.js +13 -0
  625. package/dist/responses/badRequest.d.ts +22 -0
  626. package/dist/responses/badRequest.d.ts.map +1 -0
  627. package/dist/responses/badRequest.js +66 -0
  628. package/dist/responses/created.d.ts +22 -0
  629. package/dist/responses/created.d.ts.map +1 -0
  630. package/dist/responses/created.js +55 -0
  631. package/dist/responses/forbidden.d.ts +22 -0
  632. package/dist/responses/forbidden.d.ts.map +1 -0
  633. package/dist/responses/forbidden.js +66 -0
  634. package/dist/responses/index.d.ts +6 -0
  635. package/dist/responses/index.d.ts.map +1 -0
  636. package/dist/responses/index.js +22 -0
  637. package/dist/responses/ok.d.ts +26 -0
  638. package/dist/responses/ok.d.ts.map +1 -0
  639. package/dist/responses/ok.js +59 -0
  640. package/dist/responses/serverError.d.ts +22 -0
  641. package/dist/responses/serverError.d.ts.map +1 -0
  642. package/dist/responses/serverError.js +66 -0
  643. package/dist/sails.d.ts +238 -0
  644. package/dist/sails.d.ts.map +1 -0
  645. package/dist/sails.js +3 -0
  646. package/dist/services/AgendaQueueService.d.ts +58 -0
  647. package/dist/services/AgendaQueueService.d.ts.map +1 -0
  648. package/dist/services/AgendaQueueService.js +225 -0
  649. package/dist/services/AppConfigService.d.ts +59 -0
  650. package/dist/services/AppConfigService.d.ts.map +1 -0
  651. package/dist/services/AppConfigService.js +273 -0
  652. package/dist/services/AsynchsService.d.ts +20 -0
  653. package/dist/services/AsynchsService.d.ts.map +1 -0
  654. package/dist/services/AsynchsService.js +64 -0
  655. package/dist/services/BrandingLogoService.d.ts +47 -0
  656. package/dist/services/BrandingLogoService.d.ts.map +1 -0
  657. package/dist/services/BrandingLogoService.js +212 -0
  658. package/dist/services/BrandingService.d.ts +70 -0
  659. package/dist/services/BrandingService.d.ts.map +1 -0
  660. package/dist/services/BrandingService.js +332 -0
  661. package/dist/services/CacheService.d.ts +25 -0
  662. package/dist/services/CacheService.d.ts.map +1 -0
  663. package/dist/services/CacheService.js +153 -0
  664. package/dist/services/ConfigService.d.ts +23 -0
  665. package/dist/services/ConfigService.d.ts.map +1 -0
  666. package/dist/services/ConfigService.js +379 -0
  667. package/dist/services/ContrastService.d.ts +77 -0
  668. package/dist/services/ContrastService.d.ts.map +1 -0
  669. package/dist/services/ContrastService.js +218 -0
  670. package/dist/services/DashboardTypesService.d.ts +98 -0
  671. package/dist/services/DashboardTypesService.d.ts.map +1 -0
  672. package/dist/services/DashboardTypesService.js +291 -0
  673. package/dist/services/DoiService.d.ts +36 -0
  674. package/dist/services/DoiService.d.ts.map +1 -0
  675. package/dist/services/DoiService.js +494 -0
  676. package/dist/services/DomSanitizerService.d.ts +105 -0
  677. package/dist/services/DomSanitizerService.d.ts.map +1 -0
  678. package/dist/services/DomSanitizerService.js +506 -0
  679. package/dist/services/EmailService.d.ts +185 -0
  680. package/dist/services/EmailService.d.ts.map +1 -0
  681. package/dist/services/EmailService.js +527 -0
  682. package/dist/services/FigshareService.d.ts +75 -0
  683. package/dist/services/FigshareService.d.ts.map +1 -0
  684. package/dist/services/FigshareService.js +2193 -0
  685. package/dist/services/FormRecordConsistencyService.d.ts +156 -0
  686. package/dist/services/FormRecordConsistencyService.d.ts.map +1 -0
  687. package/dist/services/FormRecordConsistencyService.js +516 -0
  688. package/dist/services/FormsService.d.ts +65 -0
  689. package/dist/services/FormsService.d.ts.map +1 -0
  690. package/dist/services/FormsService.js +580 -0
  691. package/dist/services/I18nEntriesService.d.ts +80 -0
  692. package/dist/services/I18nEntriesService.d.ts.map +1 -0
  693. package/dist/services/I18nEntriesService.js +469 -0
  694. package/dist/services/IntegrationAuditService.d.ts.map +1 -0
  695. package/dist/services/NamedQueryService.d.ts +87 -0
  696. package/dist/services/NamedQueryService.d.ts.map +1 -0
  697. package/dist/services/NamedQueryService.js +396 -0
  698. package/dist/services/NavigationService.d.ts +115 -0
  699. package/dist/services/NavigationService.d.ts.map +1 -0
  700. package/dist/services/NavigationService.js +553 -0
  701. package/dist/services/OniService.d.ts +77 -0
  702. package/dist/services/OniService.d.ts.map +1 -0
  703. package/dist/services/OniService.js +753 -0
  704. package/dist/services/OrcidService.d.ts +30 -0
  705. package/dist/services/OrcidService.d.ts.map +1 -0
  706. package/dist/services/OrcidService.js +126 -0
  707. package/dist/services/PathRulesService.d.ts +57 -0
  708. package/dist/services/PathRulesService.d.ts.map +1 -0
  709. package/dist/services/PathRulesService.js +129 -0
  710. package/dist/services/RDMPService.d.ts +102 -0
  711. package/dist/services/RDMPService.d.ts.map +1 -0
  712. package/dist/services/RDMPService.js +767 -0
  713. package/dist/services/RaidService.d.ts +83 -0
  714. package/dist/services/RaidService.d.ts.map +1 -0
  715. package/dist/services/RaidService.js +556 -0
  716. package/dist/services/RecordTypesService.d.ts +27 -0
  717. package/dist/services/RecordTypesService.d.ts.map +1 -0
  718. package/dist/services/RecordTypesService.js +106 -0
  719. package/dist/services/RecordsService.d.ts +129 -0
  720. package/dist/services/RecordsService.d.ts.map +1 -0
  721. package/dist/services/RecordsService.js +1477 -0
  722. package/dist/services/ReportsService.d.ts +99 -0
  723. package/dist/services/ReportsService.d.ts.map +1 -0
  724. package/dist/services/ReportsService.js +475 -0
  725. package/dist/services/RolesService.d.ts +41 -0
  726. package/dist/services/RolesService.d.ts.map +1 -0
  727. package/dist/services/RolesService.js +171 -0
  728. package/dist/services/RvaImportService.d.ts +56 -0
  729. package/dist/services/RvaImportService.d.ts.map +1 -0
  730. package/dist/services/RvaImportService.js +410 -0
  731. package/dist/services/SassCompilerService.d.ts +26 -0
  732. package/dist/services/SassCompilerService.d.ts.map +1 -0
  733. package/dist/services/SassCompilerService.js +201 -0
  734. package/dist/services/SolrSearchService.d.ts +52 -0
  735. package/dist/services/SolrSearchService.d.ts.map +1 -0
  736. package/dist/services/SolrSearchService.js +463 -0
  737. package/dist/services/StandardDatastreamService.d.ts +66 -0
  738. package/dist/services/StandardDatastreamService.d.ts.map +1 -0
  739. package/dist/services/StandardDatastreamService.js +297 -0
  740. package/dist/services/StorageManagerService.d.ts +90 -0
  741. package/dist/services/StorageManagerService.d.ts.map +1 -0
  742. package/dist/services/StorageManagerService.js +234 -0
  743. package/dist/services/TemplateService.d.ts +65 -0
  744. package/dist/services/TemplateService.d.ts.map +1 -0
  745. package/dist/services/TemplateService.js +208 -0
  746. package/dist/services/TranslationService.d.ts +38 -0
  747. package/dist/services/TranslationService.d.ts.map +1 -0
  748. package/dist/services/TranslationService.js +358 -0
  749. package/dist/services/TriggerService.d.ts +72 -0
  750. package/dist/services/TriggerService.d.ts.map +1 -0
  751. package/dist/services/TriggerService.js +554 -0
  752. package/dist/services/UsersService.d.ts +174 -0
  753. package/dist/services/UsersService.d.ts.map +1 -0
  754. package/dist/services/UsersService.js +2108 -0
  755. package/dist/services/ViewUtilsService.d.ts +36 -0
  756. package/dist/services/ViewUtilsService.d.ts.map +1 -0
  757. package/dist/services/ViewUtilsService.js +120 -0
  758. package/dist/services/VocabService.d.ts +81 -0
  759. package/dist/services/VocabService.d.ts.map +1 -0
  760. package/dist/services/VocabService.js +424 -0
  761. package/dist/services/VocabularyService.d.ts +115 -0
  762. package/dist/services/VocabularyService.d.ts.map +1 -0
  763. package/dist/services/VocabularyService.js +752 -0
  764. package/dist/services/WorkflowStepsService.d.ts +29 -0
  765. package/dist/services/WorkflowStepsService.d.ts.map +1 -0
  766. package/dist/services/WorkflowStepsService.js +110 -0
  767. package/dist/services/WorkspaceAsyncService.d.ts +34 -0
  768. package/dist/services/WorkspaceAsyncService.d.ts.map +1 -0
  769. package/dist/services/WorkspaceAsyncService.js +68 -0
  770. package/dist/services/WorkspaceService.d.ts +67 -0
  771. package/dist/services/WorkspaceService.d.ts.map +1 -0
  772. package/dist/services/WorkspaceService.js +148 -0
  773. package/dist/services/WorkspaceTypesService.d.ts +33 -0
  774. package/dist/services/WorkspaceTypesService.d.ts.map +1 -0
  775. package/dist/services/WorkspaceTypesService.js +89 -0
  776. package/dist/services/doi-v2/audit.d.ts.map +1 -0
  777. package/dist/services/doi-v2/bindings.d.ts.map +1 -0
  778. package/dist/services/doi-v2/config.d.ts.map +1 -0
  779. package/dist/services/doi-v2/context.d.ts.map +1 -0
  780. package/dist/services/doi-v2/http.d.ts.map +1 -0
  781. package/dist/services/doi-v2/payload.d.ts.map +1 -0
  782. package/dist/services/doi-v2/profiles.d.ts.map +1 -0
  783. package/dist/services/doi-v2/runtime.d.ts.map +1 -0
  784. package/dist/services/doi-v2/types.d.ts.map +1 -0
  785. package/dist/services/figshare-v2/assets.d.ts.map +1 -0
  786. package/dist/services/figshare-v2/bindings.d.ts.map +1 -0
  787. package/dist/services/figshare-v2/config.d.ts.map +1 -0
  788. package/dist/services/figshare-v2/context.d.ts.map +1 -0
  789. package/dist/services/figshare-v2/embargo.d.ts.map +1 -0
  790. package/dist/services/figshare-v2/http.d.ts.map +1 -0
  791. package/dist/services/figshare-v2/metadata.d.ts.map +1 -0
  792. package/dist/services/figshare-v2/observability.d.ts.map +1 -0
  793. package/dist/services/figshare-v2/plan.d.ts.map +1 -0
  794. package/dist/services/figshare-v2/publish.d.ts.map +1 -0
  795. package/dist/services/figshare-v2/queue.d.ts.map +1 -0
  796. package/dist/services/figshare-v2/runtime.d.ts.map +1 -0
  797. package/dist/services/figshare-v2/types.d.ts.map +1 -0
  798. package/dist/services/figshare-v2/workflow.d.ts.map +1 -0
  799. package/dist/services/figshare-v2/writeback.d.ts.map +1 -0
  800. package/dist/services/index.d.ts +136 -0
  801. package/dist/services/index.d.ts.map +1 -0
  802. package/dist/services/index.js +276 -0
  803. package/dist/shims/index.d.ts +9 -0
  804. package/dist/shims/index.d.ts.map +1 -0
  805. package/dist/shims/index.js +15 -0
  806. package/dist/shims/momentShim.d.ts +7 -0
  807. package/dist/shims/momentShim.d.ts.map +1 -0
  808. package/dist/shims/momentShim.js +69 -0
  809. package/dist/transformers/ExportJSONTransformer.d.ts +16 -0
  810. package/dist/transformers/ExportJSONTransformer.d.ts.map +1 -0
  811. package/dist/transformers/ExportJSONTransformer.js +90 -0
  812. package/dist/utilities/ContextVariableUtils.d.ts +8 -0
  813. package/dist/utilities/ContextVariableUtils.d.ts.map +1 -0
  814. package/dist/utilities/ContextVariableUtils.js +91 -0
  815. package/dist/utilities/TransactionUtils.d.ts +7 -0
  816. package/dist/utilities/TransactionUtils.d.ts.map +1 -0
  817. package/dist/utilities/TransactionUtils.js +25 -0
  818. package/dist/visitor/attachment-fields.visitor.d.ts +37 -0
  819. package/dist/visitor/attachment-fields.visitor.d.ts.map +1 -0
  820. package/dist/visitor/attachment-fields.visitor.js +93 -0
  821. package/dist/visitor/client.visitor.d.ts +211 -0
  822. package/dist/visitor/client.visitor.d.ts.map +1 -0
  823. package/dist/visitor/client.visitor.js +865 -0
  824. package/dist/visitor/construct.visitor.d.ts +219 -0
  825. package/dist/visitor/construct.visitor.d.ts.map +1 -0
  826. package/dist/visitor/construct.visitor.js +1499 -0
  827. package/dist/visitor/context-variables.visitor.d.ts +51 -0
  828. package/dist/visitor/context-variables.visitor.d.ts.map +1 -0
  829. package/dist/visitor/context-variables.visitor.js +192 -0
  830. package/dist/visitor/data-value.visitor.d.ts +159 -0
  831. package/dist/visitor/data-value.visitor.d.ts.map +1 -0
  832. package/dist/visitor/data-value.visitor.js +310 -0
  833. package/dist/visitor/json-type-def.visitor.d.ts +155 -0
  834. package/dist/visitor/json-type-def.visitor.d.ts.map +1 -0
  835. package/dist/visitor/json-type-def.visitor.js +384 -0
  836. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +244 -0
  837. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -0
  838. package/dist/visitor/migrate-config-v4-v5.visitor.js +2941 -0
  839. package/dist/visitor/template.visitor.d.ts +163 -0
  840. package/dist/visitor/template.visitor.d.ts.map +1 -0
  841. package/dist/visitor/template.visitor.js +397 -0
  842. package/dist/visitor/validator.visitor.d.ts +123 -0
  843. package/dist/visitor/validator.visitor.d.ts.map +1 -0
  844. package/dist/visitor/validator.visitor.js +480 -0
  845. package/dist/visitor/visitor-helpers.d.ts +15 -0
  846. package/dist/visitor/visitor-helpers.d.ts.map +1 -0
  847. package/dist/visitor/visitor-helpers.js +191 -0
  848. package/dist/visitor/vocab-inline.visitor.d.ts +33 -0
  849. package/dist/visitor/vocab-inline.visitor.d.ts.map +1 -0
  850. package/dist/visitor/vocab-inline.visitor.js +173 -0
  851. package/dist/waterline-models/AppConfig.d.ts +19 -0
  852. package/dist/waterline-models/AppConfig.d.ts.map +1 -0
  853. package/dist/waterline-models/AppConfig.js +38 -0
  854. package/dist/waterline-models/AsynchProgress.d.ts +37 -0
  855. package/dist/waterline-models/AsynchProgress.d.ts.map +1 -0
  856. package/dist/waterline-models/AsynchProgress.js +83 -0
  857. package/dist/waterline-models/BrandingConfig.d.ts +28 -0
  858. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -0
  859. package/dist/waterline-models/BrandingConfig.js +132 -0
  860. package/dist/waterline-models/BrandingConfigHistory.d.ts +25 -0
  861. package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -0
  862. package/dist/waterline-models/BrandingConfigHistory.js +66 -0
  863. package/dist/waterline-models/CacheEntry.d.ts +18 -0
  864. package/dist/waterline-models/CacheEntry.d.ts.map +1 -0
  865. package/dist/waterline-models/CacheEntry.js +38 -0
  866. package/dist/waterline-models/Counter.d.ts +19 -0
  867. package/dist/waterline-models/Counter.d.ts.map +1 -0
  868. package/dist/waterline-models/Counter.js +38 -0
  869. package/dist/waterline-models/DashboardType.d.ts +23 -0
  870. package/dist/waterline-models/DashboardType.d.ts.map +1 -0
  871. package/dist/waterline-models/DashboardType.js +53 -0
  872. package/dist/waterline-models/Form.d.ts +21 -0
  873. package/dist/waterline-models/Form.d.ts.map +1 -0
  874. package/dist/waterline-models/Form.js +38 -0
  875. package/dist/waterline-models/I18nBundle.d.ts +29 -0
  876. package/dist/waterline-models/I18nBundle.d.ts.map +1 -0
  877. package/dist/waterline-models/I18nBundle.js +85 -0
  878. package/dist/waterline-models/I18nTranslation.d.ts +32 -0
  879. package/dist/waterline-models/I18nTranslation.d.ts.map +1 -0
  880. package/dist/waterline-models/I18nTranslation.js +110 -0
  881. package/dist/waterline-models/NamedQuery.d.ts +29 -0
  882. package/dist/waterline-models/NamedQuery.d.ts.map +1 -0
  883. package/dist/waterline-models/NamedQuery.js +68 -0
  884. package/dist/waterline-models/PathRule.d.ts +26 -0
  885. package/dist/waterline-models/PathRule.d.ts.map +1 -0
  886. package/dist/waterline-models/PathRule.js +53 -0
  887. package/dist/waterline-models/RBReport.d.ts +38 -0
  888. package/dist/waterline-models/RBReport.d.ts.map +1 -0
  889. package/dist/waterline-models/RBReport.js +73 -0
  890. package/dist/waterline-models/RecordType.d.ts +37 -0
  891. package/dist/waterline-models/RecordType.d.ts.map +1 -0
  892. package/dist/waterline-models/RecordType.js +88 -0
  893. package/dist/waterline-models/Role.d.ts +19 -0
  894. package/dist/waterline-models/Role.d.ts.map +1 -0
  895. package/dist/waterline-models/Role.js +38 -0
  896. package/dist/waterline-models/ThemeConfig.d.ts +16 -0
  897. package/dist/waterline-models/ThemeConfig.d.ts.map +1 -0
  898. package/dist/waterline-models/ThemeConfig.js +33 -0
  899. package/dist/waterline-models/User.d.ts +50 -0
  900. package/dist/waterline-models/User.d.ts.map +1 -0
  901. package/dist/waterline-models/User.js +151 -0
  902. package/dist/waterline-models/UserAudit.d.ts +18 -0
  903. package/dist/waterline-models/UserAudit.d.ts.map +1 -0
  904. package/dist/waterline-models/UserAudit.js +38 -0
  905. package/dist/waterline-models/UserLink.d.ts +30 -0
  906. package/dist/waterline-models/UserLink.d.ts.map +1 -0
  907. package/dist/waterline-models/UserLink.js +62 -0
  908. package/dist/waterline-models/Vocabulary.d.ts +38 -0
  909. package/dist/waterline-models/Vocabulary.d.ts.map +1 -0
  910. package/dist/waterline-models/Vocabulary.js +183 -0
  911. package/dist/waterline-models/VocabularyEntry.d.ts +33 -0
  912. package/dist/waterline-models/VocabularyEntry.d.ts.map +1 -0
  913. package/dist/waterline-models/VocabularyEntry.js +210 -0
  914. package/dist/waterline-models/WorkflowStep.d.ts +25 -0
  915. package/dist/waterline-models/WorkflowStep.d.ts.map +1 -0
  916. package/dist/waterline-models/WorkflowStep.js +53 -0
  917. package/dist/waterline-models/WorkspaceApp.d.ts +19 -0
  918. package/dist/waterline-models/WorkspaceApp.d.ts.map +1 -0
  919. package/dist/waterline-models/WorkspaceApp.js +50 -0
  920. package/dist/waterline-models/WorkspaceAsync.d.ts +32 -0
  921. package/dist/waterline-models/WorkspaceAsync.d.ts.map +1 -0
  922. package/dist/waterline-models/WorkspaceAsync.js +73 -0
  923. package/dist/waterline-models/WorkspaceType.d.ts +25 -0
  924. package/dist/waterline-models/WorkspaceType.d.ts.map +1 -0
  925. package/dist/waterline-models/WorkspaceType.js +53 -0
  926. package/dist/waterline-models/index.d.ts +53 -0
  927. package/dist/waterline-models/index.d.ts.map +1 -0
  928. package/dist/waterline-models/index.js +99 -0
  929. package/dist/waterline-models/types.d.ts +8 -0
  930. package/dist/waterline-models/types.d.ts.map +1 -0
  931. package/dist/waterline-models/types.js +3 -0
  932. package/package.json +150 -0
  933. package/redbox-loader-templates/bootstrap-shim.js.hbs +17 -0
  934. package/redbox-loader-templates/form-config-index.js.hbs +11 -0
@@ -0,0 +1,1477 @@
1
+ "use strict";
2
+ // Copyright (c) 2017 Queensland Cyber Infrastructure Foundation (http://www.qcif.edu.au/)
3
+ //
4
+ // GNU GENERAL PUBLIC LICENSE
5
+ // Version 2, June 1991
6
+ //
7
+ // This program is free software; you can redistribute it and/or modify
8
+ // it under the terms of the GNU General Public License as published by
9
+ // the Free Software Foundation; either version 2 of the License, or
10
+ // (at your option) any later version.
11
+ //
12
+ // This program is distributed in the hope that it will be useful,
13
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ // GNU General Public License for more details.
16
+ //
17
+ // You should have received a copy of the GNU General Public License along
18
+ // with this program; if not, write to the Free Software Foundation, Inc.,
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
+ };
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.Services = void 0;
58
+ const rxjs_1 = require("rxjs");
59
+ const operators_1 = require("rxjs/operators");
60
+ const RecordAuditModel_1 = require("../model/storage/RecordAuditModel");
61
+ const CoreService_1 = require("../CoreService");
62
+ const StorageServiceResponse_1 = require("../StorageServiceResponse");
63
+ const RBValidationError_1 = require("../model/RBValidationError");
64
+ const axios_1 = __importDefault(require("axios"));
65
+ const fs = __importStar(require("node:fs/promises"));
66
+ const path = __importStar(require("node:path"));
67
+ const luceneEscapeQueryModule = require('lucene-escape-query');
68
+ const luceneEscapeQuery = typeof luceneEscapeQueryModule === 'function'
69
+ ? luceneEscapeQueryModule
70
+ : (luceneEscapeQueryModule.escape ||
71
+ luceneEscapeQueryModule.default);
72
+ const luxon_1 = require("luxon");
73
+ const rxjs_2 = require("rxjs");
74
+ var Services;
75
+ (function (Services) {
76
+ const DEFAULT_BOOTSTRAP_DATA_PATH = 'bootstrap-data';
77
+ /**
78
+ * Records related functions...
79
+ *
80
+ * Author: <a href='https://github.com/shilob' target='_blank'>Shilo Banihit</a>
81
+ *
82
+ */
83
+ class Records extends CoreService_1.Services.Core.Service {
84
+ storageService;
85
+ datastreamService;
86
+ searchService;
87
+ queueService;
88
+ constructor() {
89
+ super();
90
+ this.logHeader = 'RecordsService::';
91
+ }
92
+ asArray(value) {
93
+ if (Array.isArray(value)) {
94
+ return value;
95
+ }
96
+ if (typeof value === 'string') {
97
+ return [value];
98
+ }
99
+ return undefined;
100
+ }
101
+ normalizeRecord(record) {
102
+ const recordObj = record;
103
+ recordObj.metaMetadata = (recordObj.metaMetadata ?? {});
104
+ recordObj.metadata = (recordObj.metadata ?? {});
105
+ recordObj.authorization = (recordObj.authorization ?? {});
106
+ const authorization = recordObj.authorization;
107
+ authorization.edit = authorization.edit ?? this.asArray(recordObj.authorization_edit);
108
+ authorization.view = authorization.view ?? this.asArray(recordObj.authorization_view);
109
+ authorization.editRoles = authorization.editRoles ?? this.asArray(recordObj.authorization_editRoles);
110
+ authorization.viewRoles = authorization.viewRoles ?? this.asArray(recordObj.authorization_viewRoles);
111
+ authorization.editPending = authorization.editPending ?? this.asArray(recordObj.authorization_editPending);
112
+ authorization.viewPending = authorization.viewPending ?? this.asArray(recordObj.authorization_viewPending);
113
+ return recordObj;
114
+ }
115
+ asError(error) {
116
+ return error instanceof Error ? error : new Error(String(error));
117
+ }
118
+ getBootstrapDataPath() {
119
+ const configuredPath = _.get(sails.config, 'bootstrap.bootstrapDataPath', DEFAULT_BOOTSTRAP_DATA_PATH);
120
+ return path.resolve(String(configuredPath), 'records');
121
+ }
122
+ getRecordTypeFromFileName(fileName) {
123
+ return path.basename(fileName, path.extname(fileName)).trim();
124
+ }
125
+ getBootstrapOid(recordType, index, metadata) {
126
+ const inputOid = typeof metadata.redboxOid === 'string' ? metadata.redboxOid.trim() : '';
127
+ if (inputOid) {
128
+ return inputOid;
129
+ }
130
+ const safeRecordType = recordType.replace(/[^a-zA-Z0-9_-]/g, '-');
131
+ return `bootstrap-${safeRecordType}-${index + 1}`;
132
+ }
133
+ async bootstrapData() {
134
+ this.getServices();
135
+ const bootstrapPath = this.getBootstrapDataPath();
136
+ let fileNames = [];
137
+ try {
138
+ const fileEntries = await fs.readdir(bootstrapPath, { withFileTypes: true });
139
+ fileNames = fileEntries
140
+ .filter(entry => entry.isFile() && entry.name.endsWith('.json'))
141
+ .map(entry => entry.name)
142
+ .sort((a, b) => a.localeCompare(b));
143
+ }
144
+ catch (error) {
145
+ const ioError = error;
146
+ if (ioError.code === 'ENOENT') {
147
+ sails.log.verbose(`Records bootstrap data path not found: ${bootstrapPath}`);
148
+ return;
149
+ }
150
+ sails.log.error(`Failed to read records bootstrap data path: ${bootstrapPath}`, error);
151
+ return;
152
+ }
153
+ const defaultBrand = BrandingService.getDefault();
154
+ if (!defaultBrand) {
155
+ sails.log.error('Unable to resolve default branding for records bootstrap data');
156
+ return;
157
+ }
158
+ const bootstrapUser = { username: 'bootstrap-data' };
159
+ for (const fileName of fileNames) {
160
+ const recordType = this.getRecordTypeFromFileName(fileName);
161
+ if (!recordType) {
162
+ sails.log.error(`Skipping records bootstrap file with invalid record type name: ${fileName}`);
163
+ continue;
164
+ }
165
+ let recordTypeModel = null;
166
+ try {
167
+ recordTypeModel = await (0, rxjs_1.firstValueFrom)(RecordTypesService.get(defaultBrand, recordType));
168
+ }
169
+ catch (_error) {
170
+ sails.log.warn(`Record type lookup failed for '${recordType}', using bootstrap-safe create path.`);
171
+ }
172
+ if (!recordTypeModel) {
173
+ sails.log.warn(`No configured record type found for '${recordType}', using bootstrap-safe create path.`);
174
+ }
175
+ const filePath = path.join(bootstrapPath, fileName);
176
+ let parsed;
177
+ try {
178
+ const content = await fs.readFile(filePath, 'utf8');
179
+ parsed = JSON.parse(content);
180
+ }
181
+ catch (error) {
182
+ sails.log.error(`Failed to read records bootstrap file: ${fileName}`, error);
183
+ continue;
184
+ }
185
+ if (!Array.isArray(parsed)) {
186
+ sails.log.error(`Skipping records bootstrap file with invalid format (expected array): ${fileName}`);
187
+ continue;
188
+ }
189
+ for (let index = 0; index < parsed.length; index++) {
190
+ const metadata = parsed[index];
191
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
192
+ sails.log.error(`Skipping invalid record metadata entry at index ${index} in ${fileName}`);
193
+ continue;
194
+ }
195
+ const redboxOid = this.getBootstrapOid(recordType, index, metadata);
196
+ const bootstrapSeedId = `${recordType}:${index + 1}`;
197
+ const metadataWithSeed = {
198
+ ...metadata,
199
+ bootstrapSeedId,
200
+ };
201
+ try {
202
+ const existing = await Record.findOne({
203
+ or: [{ redboxOid }, { 'metadata.bootstrapSeedId': bootstrapSeedId }],
204
+ }).meta({ enableExperimentalDeepTargets: true });
205
+ if (existing) {
206
+ sails.log.verbose(`Skipping existing records bootstrap entry: ${redboxOid}`);
207
+ continue;
208
+ }
209
+ const createResponse = await this.create(defaultBrand, {
210
+ redboxOid,
211
+ metadata: metadataWithSeed,
212
+ metaMetadata: { type: recordType },
213
+ }, recordTypeModel, bootstrapUser, true, true);
214
+ if (createResponse?.isSuccessful?.()) {
215
+ sails.log.verbose(`Created records bootstrap entry: ${redboxOid}`);
216
+ }
217
+ else {
218
+ sails.log.error(`Failed to create records bootstrap entry: ${redboxOid}`);
219
+ }
220
+ }
221
+ catch (error) {
222
+ sails.log.error(`Failed to create records bootstrap entry: ${redboxOid}`, error);
223
+ }
224
+ }
225
+ }
226
+ }
227
+ init() {
228
+ const that = this;
229
+ this.registerSailsHook('after', ['hook:redbox:storage:ready', 'hook:redbox:datastream:ready', 'ready'], function () {
230
+ that.getServices(that);
231
+ });
232
+ }
233
+ getServices(ref = this) {
234
+ ref.getDatastreamService(ref);
235
+ ref.searchService = sails.services[sails.config.search.serviceName];
236
+ ref.queueService = sails.services[sails.config.queue.serviceName];
237
+ ref.getStorageService(ref);
238
+ }
239
+ getStorageService(ref = this) {
240
+ if (_.isEmpty(sails.config.storage) || _.isEmpty(sails.config.storage.serviceName)) {
241
+ ref.storageService = RedboxJavaStorageService;
242
+ }
243
+ else {
244
+ ref.storageService = sails.services[sails.config.storage.serviceName];
245
+ }
246
+ }
247
+ getDatastreamService(ref = this) {
248
+ if (_.isEmpty(sails.config.record) || _.isEmpty(sails.config.record.datastreamService)) {
249
+ ref.datastreamService = RedboxJavaStorageService;
250
+ }
251
+ else {
252
+ const datastreamServiceName = sails.config.record.datastreamService;
253
+ ref.datastreamService = sails.services[datastreamServiceName];
254
+ sails.log.verbose(`${ref.logHeader} Using datastreamService: ${datastreamServiceName}`);
255
+ }
256
+ }
257
+ getSearchService(ref = this) {
258
+ if (_.isEmpty(sails.config.storage) || _.isEmpty(sails.config.search.serviceName)) {
259
+ ref.searchService = SolrSearchService;
260
+ }
261
+ else {
262
+ ref.searchService = sails.services[sails.config.search.serviceName];
263
+ }
264
+ }
265
+ _exportedMethods = [
266
+ 'create',
267
+ 'updateMeta',
268
+ 'getMeta',
269
+ 'getRecordAudit',
270
+ 'hasEditAccess',
271
+ 'hasViewAccess',
272
+ 'createBatch',
273
+ 'provideUserAccessAndRemovePendingAccess',
274
+ 'searchFuzzy',
275
+ 'getRelatedRecords',
276
+ 'delete',
277
+ 'restoreRecord',
278
+ 'destroyDeletedRecord',
279
+ 'getDeletedRecords',
280
+ 'updateNotificationLog',
281
+ 'triggerPreSaveTriggers',
282
+ 'triggerPostSaveTriggers',
283
+ 'triggerPostSaveSyncTriggers',
284
+ 'checkRedboxRunning',
285
+ 'bootstrapData',
286
+ 'getAttachments',
287
+ 'appendToRecord',
288
+ 'removeFromRecord',
289
+ 'getRecords',
290
+ 'exportAllPlans',
291
+ 'storeRecordAudit',
292
+ 'exists',
293
+ 'transitionWorkflowStep',
294
+ 'setWorkflowStepRelatedMetadata',
295
+ 'transitionWorkflowStepMetadata',
296
+ 'triggerPreSaveTransitionWorkflowTriggers',
297
+ 'triggerPostSaveTransitionWorkflowTriggers',
298
+ // 'updateDataStream',
299
+ 'handleUpdateDataStream',
300
+ 'init',
301
+ ];
302
+ initRecordMetaMetadata(brandId, username, recordType, metaMetadataWorkflowStep, form, dateCreated) {
303
+ const metaMetadata = {};
304
+ const recordTypeObj = recordType;
305
+ const formObj = (form ?? {});
306
+ if (recordTypeObj.packageType) {
307
+ _.set(metaMetadata, 'packageType', recordTypeObj.packageType);
308
+ }
309
+ if (recordTypeObj.packageName) {
310
+ _.set(metaMetadata, 'packageName', recordTypeObj.packageName);
311
+ }
312
+ _.set(metaMetadata, 'brandId', brandId);
313
+ _.set(metaMetadata, 'createdBy', username);
314
+ _.set(metaMetadata, 'type', recordTypeObj.name);
315
+ _.set(metaMetadata, 'searchCore', recordTypeObj.searchCore);
316
+ if (!_.isEmpty(dateCreated)) {
317
+ _.set(metaMetadata, 'createdOn', dateCreated);
318
+ _.set(metaMetadata, 'lastSaveDate', dateCreated);
319
+ }
320
+ _.set(metaMetadata, 'form', _.get(metaMetadataWorkflowStep, 'config.form'));
321
+ _.set(metaMetadata, 'attachmentFields', formObj.attachmentFields);
322
+ return metaMetadata;
323
+ }
324
+ async create(brand, record, recordType, user = {}, triggerPreSaveTriggers = true, triggerPostSaveTriggers = true, targetStep = null) {
325
+ const brandObj = brand;
326
+ const recordTypeObj = recordType;
327
+ let recordObj = this.normalizeRecord(record);
328
+ const userObj = user;
329
+ const recordTypeName = String(recordTypeObj?.name ?? _.get(recordObj, 'metaMetadata.type', '')).trim();
330
+ // Bootstrap-safe path when no configured RecordType/workflow exists.
331
+ if (!recordTypeObj?.name) {
332
+ if (!this.storageService || typeof this.storageService.create !== 'function') {
333
+ throw new Error('RecordsService storageService is not initialized');
334
+ }
335
+ const meta = (recordObj.metaMetadata ?? {});
336
+ const nowIso = String(luxon_1.DateTime.local().toISO());
337
+ meta.brandId = meta.brandId ?? String(brandObj?.id ?? '');
338
+ meta.type = meta.type ?? recordTypeName;
339
+ meta.createdBy = meta.createdBy ?? String(userObj?.username ?? 'unknown');
340
+ meta.createdOn = meta.createdOn ?? nowIso;
341
+ meta.lastSaveDate = meta.lastSaveDate ?? nowIso;
342
+ recordObj.metaMetadata = meta;
343
+ const authorization = (recordObj.authorization ?? {});
344
+ authorization.view = authorization.view ?? [];
345
+ authorization.edit = authorization.edit ?? [];
346
+ authorization.viewRoles = authorization.viewRoles ?? [];
347
+ authorization.editRoles = authorization.editRoles ?? [];
348
+ recordObj.authorization = authorization;
349
+ recordObj.authorization_view = recordObj.authorization_view ?? authorization.view;
350
+ recordObj.authorization_edit = recordObj.authorization_edit ?? authorization.edit;
351
+ recordObj.authorization_viewRoles = recordObj.authorization_viewRoles ?? authorization.viewRoles;
352
+ recordObj.authorization_editRoles = recordObj.authorization_editRoles ?? authorization.editRoles;
353
+ const createResponse = await this.storageService.create(brandObj, recordObj, recordTypeObj, userObj);
354
+ if (createResponse.isSuccessful()) {
355
+ if (this.searchService && typeof this.searchService.index === 'function') {
356
+ this.searchService.index(createResponse['oid'], recordObj);
357
+ }
358
+ await this.auditRecord(createResponse['oid'], recordObj, userObj, RecordAuditModel_1.RecordAuditActionType.created);
359
+ }
360
+ return createResponse;
361
+ }
362
+ let wfStep = await (0, rxjs_1.firstValueFrom)(WorkflowStepsService.getFirst(recordTypeObj));
363
+ const formName = String(_.get(wfStep, 'config.form', ''));
364
+ const form = await FormsService.getForm(brandObj, formName, true, recordTypeObj.name, recordObj);
365
+ const username = String(userObj?.username ?? 'unknown');
366
+ const brandId = String(brandObj.id ?? '');
367
+ const metaMetadata = this.initRecordMetaMetadata(brandId, username, recordTypeObj, wfStep, form, String(luxon_1.DateTime.local().toISO()));
368
+ _.set(recordObj, 'metaMetadata', metaMetadata);
369
+ //set the initial workflow metadata to the first step
370
+ this.setWorkflowStepRelatedMetadata(recordObj, wfStep);
371
+ if (targetStep) {
372
+ wfStep = await (0, rxjs_1.firstValueFrom)(WorkflowStepsService.get(recordTypeObj, targetStep));
373
+ recordObj = await this.triggerPreSaveTransitionWorkflowTriggers(null, recordObj, recordTypeObj, wfStep, userObj);
374
+ this.setWorkflowStepRelatedMetadata(recordObj, wfStep);
375
+ }
376
+ let createResponse = new StorageServiceResponse_1.StorageServiceResponse();
377
+ const failedMessage = 'Failed to created record, please check server logs.';
378
+ // trigger the pre-save
379
+ if (triggerPreSaveTriggers) {
380
+ try {
381
+ recordObj = await this.triggerPreSaveTriggers(null, recordObj, recordTypeObj, 'onCreate', userObj);
382
+ }
383
+ catch (err) {
384
+ sails.log.error(`${this.logHeader} Failed to run pre-save hooks when onCreate...`);
385
+ sails.log.error(err);
386
+ createResponse.success = false;
387
+ createResponse.message = RBValidationError_1.RBValidationError.displayMessage({
388
+ t: TranslationService,
389
+ errors: [this.asError(err)],
390
+ defaultMessage: failedMessage,
391
+ });
392
+ return createResponse;
393
+ }
394
+ }
395
+ // save the record ...
396
+ sails.log.verbose(`${this.logHeader} create() -> recordObj before save: ${JSON.stringify(recordObj)}`);
397
+ createResponse = await this.storageService.create(brandObj, recordObj, recordTypeObj, userObj);
398
+ if (createResponse.isSuccessful()) {
399
+ const fieldsToCheck = ['location', 'uploadUrl'];
400
+ const oid = createResponse.oid;
401
+ sails.log.verbose(`RecordsService - create - oid ${oid}`);
402
+ const recordMetadata = recordObj.metadata;
403
+ const attachmentFields = (recordObj.metaMetadata?.attachmentFields ?? []);
404
+ if (!_.isEmpty(attachmentFields)) {
405
+ // check if we have any pending-oid elements
406
+ _.each(attachmentFields, (attFieldName) => {
407
+ const attFieldKey = String(attFieldName ?? '');
408
+ _.each(_.get(recordMetadata, attFieldKey), (attFieldEntry, attFieldIdx) => {
409
+ if (!_.isEmpty(attFieldEntry)) {
410
+ _.each(fieldsToCheck, (fldName) => {
411
+ const fldKey = String(fldName ?? '');
412
+ const fldVal = _.get(attFieldEntry, fldKey);
413
+ if (!_.isEmpty(fldVal)) {
414
+ sails.log.verbose(`RecordsService - create - fldVal ${fldVal}`);
415
+ _.set(recordMetadata, `${attFieldKey}[${attFieldIdx}].${fldKey}`, _.replace(String(fldVal), 'pending-oid', oid));
416
+ }
417
+ });
418
+ }
419
+ });
420
+ });
421
+ try {
422
+ // handle datastream update
423
+ // we emtpy the data locations in cloned record so we can reuse the same `handleUpdateDataStream` method call
424
+ const emptyDatastreamRecord = _.cloneDeep(recordObj);
425
+ const emptyMetadata = emptyDatastreamRecord.metadata;
426
+ _.each(attachmentFields, (attFieldName) => {
427
+ const attFieldKey = String(attFieldName ?? '');
428
+ _.set(emptyMetadata, attFieldKey, []);
429
+ });
430
+ // update the datastreams in RB, this is a terminal call
431
+ sails.log.verbose(`RecordsService - create - before handleUpdateDataStream`);
432
+ await (0, rxjs_1.firstValueFrom)(this.handleUpdateDataStream(oid, emptyDatastreamRecord, recordMetadata));
433
+ }
434
+ catch (error) {
435
+ sails.log.error(`RecordsService - create - Failed to save record: ${error}`);
436
+ throw new RBValidationError_1.RBValidationError({
437
+ message: `Failed to save record oid ${oid}`,
438
+ options: { cause: error },
439
+ displayErrors: [{ title: 'Failed to save record', meta: { oid } }],
440
+ });
441
+ }
442
+ // update the metadata ...
443
+ createResponse = await this.updateMeta(brandObj, oid, recordObj, userObj, false, false);
444
+ }
445
+ if (triggerPostSaveTriggers) {
446
+ // post-save sync
447
+ try {
448
+ createResponse = (await this.triggerPostSaveSyncTriggers(createResponse['oid'], recordObj, recordTypeObj, 'onCreate', userObj, createResponse));
449
+ if (this.hasPostSaveSyncHooks(recordTypeObj, 'onCreate')) {
450
+ this.storageService.updateMeta(brandObj, oid, recordObj, userObj);
451
+ }
452
+ }
453
+ catch (err) {
454
+ sails.log.error(`${this.logHeader} Exception while running post save sync hooks when creating: ${createResponse['oid']}`);
455
+ sails.log.error(JSON.stringify(err));
456
+ createResponse.success = false;
457
+ createResponse.message = RBValidationError_1.RBValidationError.displayMessage({
458
+ t: TranslationService,
459
+ errors: [this.asError(err)],
460
+ defaultMessage: failedMessage,
461
+ });
462
+ const metadata = { postSaveSyncWarning: 'true' };
463
+ createResponse.metadata = metadata;
464
+ sails.log.error('RecordsService create - error - createResponse ' + JSON.stringify(createResponse));
465
+ return createResponse;
466
+ }
467
+ // Fire Post-save hooks async ...
468
+ this.triggerPostSaveTriggers(createResponse['oid'], recordObj, recordTypeObj, 'onCreate', userObj);
469
+ if (!_.isEmpty(targetStep)) {
470
+ try {
471
+ createResponse = (await this.triggerPostSaveTransitionWorkflowTriggers(createResponse['oid'], recordObj, recordTypeObj, wfStep, userObj, createResponse));
472
+ if (createResponse && createResponse.isSuccessful()) {
473
+ if (this.hasPostSaveSyncHooks(recordTypeObj, 'onTransitionWorkflow')) {
474
+ await this.storageService.updateMeta(brandObj, oid, recordObj, userObj);
475
+ }
476
+ }
477
+ else {
478
+ return createResponse;
479
+ }
480
+ }
481
+ catch (tErr) {
482
+ sails.log.error('RecordsService - create - Failed to run post-save hooks when onTransitionWorkflow... or Error updating meta:');
483
+ sails.log.error(tErr);
484
+ createResponse.success = false;
485
+ createResponse.message = RBValidationError_1.RBValidationError.displayMessage({
486
+ t: TranslationService,
487
+ errors: [this.asError(tErr)],
488
+ defaultMessage: failedMessage,
489
+ });
490
+ return createResponse;
491
+ }
492
+ }
493
+ }
494
+ const recordOid = String(_.get(recordObj, 'redboxOid', ''));
495
+ if (_.isEmpty(recordOid)) {
496
+ sails.log.warn(`recordOid: '${recordOid}' is empty! Using response oid: ${createResponse['oid']} for solr index.`);
497
+ this.searchService.index(createResponse['oid'], recordObj);
498
+ }
499
+ else {
500
+ if (createResponse['oid'] !== recordOid) {
501
+ sails.log.warn(`response oid: ${createResponse['oid']} is not the same as recordOid: ${recordOid}.`);
502
+ }
503
+ this.searchService.index(recordOid, recordObj);
504
+ }
505
+ await this.auditRecord(createResponse['oid'], recordObj, userObj, RecordAuditModel_1.RecordAuditActionType.created);
506
+ }
507
+ else {
508
+ sails.log.error(`${this.logHeader} Failed to create record, storage service response:`);
509
+ sails.log.error(JSON.stringify(createResponse));
510
+ createResponse.message = failedMessage;
511
+ }
512
+ return createResponse;
513
+ }
514
+ async updateMeta(brand, oid, record, user = {}, triggerPreSaveTriggers = true, triggerPostSaveTriggers = true, nextStep = {}, metadata = {}) {
515
+ const brandObj = brand;
516
+ let recordObj = this.normalizeRecord(record);
517
+ const recordMeta = recordObj.metaMetadata;
518
+ const userObj = user;
519
+ const nextStepObj = (nextStep ?? {});
520
+ let updateResponse = new StorageServiceResponse_1.StorageServiceResponse();
521
+ const preTriggerResponse = new StorageServiceResponse_1.StorageServiceResponse();
522
+ updateResponse.oid = oid;
523
+ const failedMessage = 'Failed to update record, please check server logs.';
524
+ let hasPermissionToTransition = true;
525
+ const origRecord = _.cloneDeep(recordObj);
526
+ const origRecordObj = this.normalizeRecord(origRecord);
527
+ sails.log.verbose(`RecordService - updateMeta - origRecord - cloneDeep`);
528
+ //This is done after cloning record to preserve origRecord during processing
529
+ if (!_.isEmpty(metadata)) {
530
+ recordObj.metadata = metadata;
531
+ }
532
+ let recordType = null;
533
+ if (!_.isEmpty(brand)) {
534
+ recordType = await (0, rxjs_1.firstValueFrom)(RecordTypesService.get(brandObj, recordMeta.type));
535
+ }
536
+ if (!_.isEmpty(nextStepObj) && !_.isEmpty(nextStepObj.config)) {
537
+ const nextStepConfig = (nextStepObj.config ?? {});
538
+ const transitionRoles = nextStepConfig.authorization?.transitionRoles;
539
+ if (transitionRoles != undefined) {
540
+ if (transitionRoles.length > 0) {
541
+ const validRoles = _.filter(transitionRoles, (role) => {
542
+ const val = _.find((userObj.roles ?? []), (userRole) => {
543
+ const userRoleObj = userRole;
544
+ return role == userRoleObj || role == userRoleObj.name;
545
+ });
546
+ if (val != undefined) {
547
+ return true;
548
+ }
549
+ return false;
550
+ });
551
+ if (validRoles.length == 0) {
552
+ hasPermissionToTransition = false;
553
+ }
554
+ }
555
+ }
556
+ if (hasPermissionToTransition && !_.isEmpty(nextStepObj) && !_.isEmpty(recordType)) {
557
+ try {
558
+ sails.log.verbose(`RecordService - updateMeta - hasPermissionToTransition - enter`);
559
+ sails.log.verbose(`RecordService - updateMeta triggerPreSaveTransitionWorkflowTriggers - before - nextStep ${JSON.stringify(nextStepObj)}`);
560
+ recordObj = await this.triggerPreSaveTransitionWorkflowTriggers(updateResponse['oid'], recordObj, recordType, nextStepObj, userObj);
561
+ this.transitionWorkflowStepMetadata(recordObj, nextStepObj);
562
+ }
563
+ catch (err) {
564
+ sails.log.verbose('RecordService - updateMeta - onTransitionWorkflow triggerPreSaveTriggers error');
565
+ sails.log.error(JSON.stringify(err));
566
+ preTriggerResponse.success = false;
567
+ preTriggerResponse.message = RBValidationError_1.RBValidationError.displayMessage({
568
+ t: TranslationService,
569
+ errors: [this.asError(err)],
570
+ defaultMessage: failedMessage,
571
+ });
572
+ return preTriggerResponse;
573
+ }
574
+ }
575
+ }
576
+ const brandId = recordMeta.brandId ?? brandObj?.id ? String(recordMeta.brandId ?? brandObj?.id) : undefined;
577
+ const form = await (0, rxjs_1.firstValueFrom)(FormsService.getFormByName(String(recordMeta.form ?? ''), true, brandId));
578
+ recordMeta.attachmentFields = form != undefined ? form.configuration?.attachmentFields ?? [] : [];
579
+ // process pre-save
580
+ if (!_.isEmpty(brand) && triggerPreSaveTriggers === true) {
581
+ try {
582
+ sails.log.verbose('RecordService - updateMeta - calling triggerPreSaveTriggers');
583
+ recordType = await (0, rxjs_1.firstValueFrom)(RecordTypesService.get(brandObj, recordMeta.type));
584
+ recordObj = await this.triggerPreSaveTriggers(oid, recordObj, recordType, 'onUpdate', userObj);
585
+ }
586
+ catch (err) {
587
+ sails.log.error(`${this.logHeader} Failed to run pre-save hooks when onUpdate...`);
588
+ sails.log.error(err);
589
+ updateResponse.success = false;
590
+ updateResponse.message = RBValidationError_1.RBValidationError.displayMessage({
591
+ t: TranslationService,
592
+ errors: [this.asError(err)],
593
+ defaultMessage: failedMessage,
594
+ });
595
+ return updateResponse;
596
+ }
597
+ }
598
+ sails.log.verbose(`RecordService - updateMeta - origRecord.metadata.dataLocations ` +
599
+ JSON.stringify(origRecordObj.metadata?.dataLocations));
600
+ sails.log.verbose(`RecordService - updateMeta - record.metadata.dataLocations ` +
601
+ JSON.stringify(recordObj.metadata?.dataLocations));
602
+ updateResponse = (await (0, rxjs_1.firstValueFrom)(this.handleUpdateDataStream(oid, origRecordObj, recordObj.metadata ?? {})));
603
+ sails.log.verbose(`RecordService - updateMeta - Done with updating streams...`);
604
+ const fieldsToCheck = ['location', 'uploadUrl'];
605
+ if (!_.isEmpty(recordMeta.attachmentFields)) {
606
+ const recordMetadata = recordObj.metadata;
607
+ // check if we have any pending-oid elements
608
+ _.each(recordMeta.attachmentFields, (attFieldName) => {
609
+ const attFieldKey = String(attFieldName ?? '');
610
+ _.each(_.get(recordMetadata, attFieldKey), (attFieldEntry, attFieldIdx) => {
611
+ if (!_.isEmpty(attFieldEntry)) {
612
+ _.each(fieldsToCheck, (fldName) => {
613
+ const fldKey = String(fldName ?? '');
614
+ const fldVal = _.get(attFieldEntry, fldKey);
615
+ if (!_.isEmpty(fldVal)) {
616
+ sails.log.verbose(`RecordService - updateMeta - fldVal ${fldVal}`);
617
+ _.set(recordMetadata, `${attFieldKey}[${attFieldIdx}].${fldKey}`, _.replace(String(fldVal), 'pending-oid', oid));
618
+ }
619
+ });
620
+ }
621
+ });
622
+ });
623
+ }
624
+ // End of potential dead code
625
+ // unsetting the ID just to be safe
626
+ _.unset(recordObj, 'id');
627
+ _.unset(recordObj, 'redboxOid');
628
+ sails.log.verbose(`RecordService - updateMeta - before storageService.updateMeta`);
629
+ //Some of the automated tests may be passing undefined or empty user
630
+ if (!_.isUndefined(userObj) && !_.isEmpty(_.get(userObj, 'username', ''))) {
631
+ recordMeta.lastSavedBy = _.get(userObj, 'username');
632
+ }
633
+ recordMeta.lastSaveDate = luxon_1.DateTime.local().toISO();
634
+ // update
635
+ updateResponse = await this.storageService.updateMeta(brandObj, oid, recordObj, userObj);
636
+ sails.log.verbose('RecordService - updateMeta - updateResponse.isSuccessful ' + updateResponse.isSuccessful());
637
+ if (updateResponse.isSuccessful()) {
638
+ //if triggerPreSaveTriggers is false recordType will be empty even if triggerPostSaveTriggers is true
639
+ //therefore try to set recordType if triggerPostSaveTriggers is true
640
+ if (_.isEmpty(recordType) && !_.isEmpty(brand) && triggerPostSaveTriggers === true) {
641
+ recordType = await (0, rxjs_1.firstValueFrom)(RecordTypesService.get(brandObj, recordMeta.type));
642
+ }
643
+ // post-save async
644
+ if (!_.isEmpty(recordType) && triggerPostSaveTriggers === true) {
645
+ // Trigger Post-save sync hooks ...
646
+ try {
647
+ sails.log.verbose('RecordService - updateMeta - calling triggerPostSaveSyncTriggers');
648
+ updateResponse = (await this.triggerPostSaveSyncTriggers(updateResponse['oid'], recordObj, recordType, 'onUpdate', userObj, updateResponse));
649
+ if (this.hasPostSaveSyncHooks(recordType, 'onUpdate')) {
650
+ await this.storageService.updateMeta(brandObj, oid, recordObj, userObj);
651
+ }
652
+ }
653
+ catch (err) {
654
+ sails.log.error(`${this.logHeader} Exception while running post save sync hooks when updating:`);
655
+ sails.log.error(JSON.stringify(err));
656
+ updateResponse.success = false;
657
+ updateResponse.message = RBValidationError_1.RBValidationError.displayMessage({
658
+ t: TranslationService,
659
+ errors: [this.asError(err)],
660
+ defaultMessage: failedMessage,
661
+ });
662
+ const metadataRes = { postSaveSyncWarning: 'true' };
663
+ updateResponse.metadata = metadataRes;
664
+ sails.log.error('RecordsService - updateMeta - error - updateResponse ' + JSON.stringify(updateResponse));
665
+ return updateResponse;
666
+ }
667
+ sails.log.verbose('RecordService - updateMeta - calling triggerPostSaveTriggers');
668
+ // Fire Post-save hooks async ...
669
+ this.triggerPostSaveTriggers(updateResponse['oid'], recordObj, recordType, 'onUpdate', userObj);
670
+ if (hasPermissionToTransition && !_.isEmpty(nextStepObj)) {
671
+ try {
672
+ updateResponse = (await this.triggerPostSaveTransitionWorkflowTriggers(updateResponse['oid'], recordObj, recordType, nextStepObj, userObj, updateResponse));
673
+ sails.log.verbose(`RecordService - updateMeta - triggerPostSaveTransitionWorkflowTriggers post save hook enter`);
674
+ sails.log.verbose(JSON.stringify(updateResponse));
675
+ if (updateResponse && updateResponse.isSuccessful()) {
676
+ sails.log.verbose(`RecordService - updateMeta - triggerPostSaveTransitionWorkflowTriggers ajaxOk`);
677
+ if (this.hasPostSaveSyncHooks(recordType, 'onTransitionWorkflow')) {
678
+ await this.storageService.updateMeta(brandObj, oid, recordObj, userObj);
679
+ }
680
+ }
681
+ else {
682
+ sails.log.verbose(`RecordService - updateMeta - triggerPostSaveTransitionWorkflowTriggers post save hook not successful`);
683
+ return updateResponse;
684
+ }
685
+ }
686
+ catch (tErr) {
687
+ sails.log.error('RecordService - updateMeta - Failed to run post-save hooks when onTransitionWorkflow... or Error updating meta:');
688
+ sails.log.error(tErr);
689
+ updateResponse.success = false;
690
+ updateResponse.message = RBValidationError_1.RBValidationError.displayMessage({
691
+ t: TranslationService,
692
+ errors: [this.asError(tErr)],
693
+ defaultMessage: failedMessage,
694
+ });
695
+ return updateResponse;
696
+ }
697
+ }
698
+ }
699
+ this.searchService.index(oid, record);
700
+ await this.auditRecord(updateResponse['oid'], record, user, RecordAuditModel_1.RecordAuditActionType.updated);
701
+ }
702
+ else {
703
+ sails.log.error(`${this.logHeader} Failed to update record, storage service response:`);
704
+ sails.log.error(JSON.stringify(updateResponse));
705
+ updateResponse.success = false;
706
+ updateResponse.message = failedMessage;
707
+ }
708
+ return updateResponse;
709
+ }
710
+ hasPostSaveSyncHooks(recordType, mode) {
711
+ const postSaveSyncHooks = _.get(recordType, `hooks.${mode}.postSync`, []);
712
+ if (_.isArray(postSaveSyncHooks) && postSaveSyncHooks.length > 0) {
713
+ return true;
714
+ }
715
+ return false;
716
+ }
717
+ getMeta(oid) {
718
+ return this.storageService.getMeta(oid);
719
+ }
720
+ async getRecordAudit(params) {
721
+ const audit = (await this.storageService.getRecordAudit(params));
722
+ if (Array.isArray(audit) && audit.length === 0) {
723
+ const storageServiceAny = this.storageService;
724
+ if (typeof storageServiceAny.createRecordAudit === 'function') {
725
+ try {
726
+ const data = new RecordAuditModel_1.RecordAuditModel(params.oid, {}, {}, RecordAuditModel_1.RecordAuditActionType.created);
727
+ await storageServiceAny.createRecordAudit(data);
728
+ const refreshed = (await this.storageService.getRecordAudit(params));
729
+ if (Array.isArray(refreshed) && refreshed.length > 0) {
730
+ return refreshed;
731
+ }
732
+ }
733
+ catch (err) {
734
+ sails.log.error(`${this.logHeader} Failed to create fallback record audit:`);
735
+ sails.log.error(JSON.stringify(err));
736
+ }
737
+ }
738
+ const fallbackDate = new Date();
739
+ const dateFrom = params.dateFrom instanceof Date ? params.dateFrom : null;
740
+ const dateTo = params.dateTo instanceof Date ? params.dateTo : null;
741
+ const inRange = (!dateFrom || fallbackDate >= dateFrom) && (!dateTo || fallbackDate <= dateTo);
742
+ if (!inRange) {
743
+ return [];
744
+ }
745
+ return [
746
+ {
747
+ redboxOid: params.oid,
748
+ action: RecordAuditModel_1.RecordAuditActionType.created,
749
+ user: {},
750
+ record: {},
751
+ dateCreated: fallbackDate.toISOString(),
752
+ },
753
+ ];
754
+ }
755
+ return audit;
756
+ }
757
+ createBatch(type, data, harvestIdFldName) {
758
+ return this.storageService.createBatch(type, data, harvestIdFldName);
759
+ }
760
+ provideUserAccessAndRemovePendingAccess(oid, userid, pendingValue) {
761
+ this.storageService.provideUserAccessAndRemovePendingAccess(oid, userid, pendingValue);
762
+ }
763
+ getRelatedRecords(oid, brand) {
764
+ return this.storageService.getRelatedRecords(oid, brand);
765
+ }
766
+ async delete(oid, permanentlyDelete, currentRec, recordType, user) {
767
+ let currentRecObj = currentRec;
768
+ const recordTypeObj = recordType;
769
+ const preTriggerResponse = new StorageServiceResponse_1.StorageServiceResponse();
770
+ const failedMessage = 'Failed to delete record, please check server logs.';
771
+ try {
772
+ sails.log.verbose('RecordsService - delete - triggerPreSaveTriggers onDelete');
773
+ preTriggerResponse.oid = oid;
774
+ currentRecObj = await this.triggerPreSaveTriggers(oid, currentRecObj, recordTypeObj, 'onDelete', user);
775
+ }
776
+ catch (err) {
777
+ sails.log.verbose('RecordsService - delete - triggerPreSaveTriggers onDelete error');
778
+ sails.log.error(JSON.stringify(err));
779
+ preTriggerResponse.success = false;
780
+ preTriggerResponse.message = RBValidationError_1.RBValidationError.displayMessage({
781
+ t: TranslationService,
782
+ errors: [this.asError(err)],
783
+ defaultMessage: failedMessage,
784
+ });
785
+ return preTriggerResponse;
786
+ }
787
+ let response = await this.storageService.delete(oid, permanentlyDelete);
788
+ if (response.isSuccessful()) {
789
+ const action = permanentlyDelete
790
+ ? RecordAuditModel_1.RecordAuditActionType.destroyed
791
+ : RecordAuditModel_1.RecordAuditActionType.deleted;
792
+ await this.auditRecord(oid, {}, user, action);
793
+ this.searchService.remove(oid);
794
+ try {
795
+ sails.log.verbose('RecordsService - delete - calling triggerPostSaveSyncTriggers');
796
+ response = (await this.triggerPostSaveSyncTriggers(oid, currentRecObj, recordTypeObj, 'onDelete', user, response));
797
+ }
798
+ catch (err) {
799
+ sails.log.error(`RecordsService - delete - Exception while running post delate sync hooks when updating:`);
800
+ sails.log.error(JSON.stringify(err));
801
+ response.success = false;
802
+ response.message = RBValidationError_1.RBValidationError.displayMessage({
803
+ t: TranslationService,
804
+ errors: [this.asError(err)],
805
+ defaultMessage: failedMessage,
806
+ });
807
+ const metadata = { postSaveSyncWarning: 'true' };
808
+ response.metadata = metadata;
809
+ sails.log.error('RecordsService - delete - error - triggerPostSaveSyncTriggers ' + JSON.stringify(response));
810
+ return response;
811
+ }
812
+ sails.log.verbose('RecordService - delete - calling triggerPostSaveTriggers');
813
+ this.triggerPostSaveTriggers(oid, currentRecObj, recordTypeObj, 'onDelete', user);
814
+ }
815
+ return response;
816
+ }
817
+ updateNotificationLog(oid, record, options) {
818
+ return this.storageService.updateNotificationLog(oid, record, options);
819
+ }
820
+ getRecords(workflowState, recordType = undefined, start, rows = 10, username, roles, brand, editAccessOnly = undefined, packageType = undefined, sort = undefined, fieldNames = undefined, filterString = undefined, filterMode = undefined, secondarySort = undefined) {
821
+ return this.storageService.getRecords(workflowState, recordType, start, rows, username, roles, brand, editAccessOnly, packageType, sort, fieldNames, filterString, filterMode, secondarySort);
822
+ }
823
+ exportAllPlans(username, roles, brand, format, modBefore, modAfter, recType) {
824
+ return this.storageService.exportAllPlans(username, roles, brand, format, modBefore, modAfter, recType);
825
+ }
826
+ // Gets attachments for this record, will use the `sails.config.record.datastreamService` if set, otherwise will use this service
827
+ //
828
+ // Params:
829
+ // oid - record idea
830
+ // labelFilterStr - set if you want to be selective in your attachments, will just run a simple `.indexOf`
831
+ async getAttachments(oid, labelFilterStr = undefined) {
832
+ sails.log.verbose(`RecordsService::Getting attachments of ${oid}`);
833
+ const datastreams = (await this.datastreamService.listDatastreams(oid, ''));
834
+ const attachments = [];
835
+ _.each(datastreams, (datastream) => {
836
+ const datastreamObj = datastream;
837
+ let attachment = {};
838
+ attachment['dateUpdated'] = luxon_1.DateTime.fromJSDate(new Date(datastreamObj['uploadDate'])).toISO();
839
+ attachment['label'] = _.get(datastreamObj.metadata, 'name');
840
+ attachment['contentType'] = _.get(datastreamObj.metadata, 'mimeType');
841
+ attachment = _.merge(attachment, datastreamObj.metadata);
842
+ if (_.isUndefined(labelFilterStr) && _.isEmpty(labelFilterStr)) {
843
+ attachments.push(attachment);
844
+ }
845
+ else {
846
+ if (datastreamObj['label'] && datastreamObj['label'].indexOf(labelFilterStr) != -1) {
847
+ attachments.push(attachment);
848
+ }
849
+ }
850
+ });
851
+ return attachments;
852
+ }
853
+ /*
854
+ *
855
+ */
856
+ async checkRedboxRunning() {
857
+ // check if a valid storage plugin is loaded....
858
+ if (!_.isEmpty(sails.config.storage)) {
859
+ sails.log.info('ReDBox storage plugin is active!');
860
+ return true;
861
+ }
862
+ const retries = 1000;
863
+ for (let i = 0; i < retries; i++) {
864
+ try {
865
+ const response = (await this.info());
866
+ if (response['applicationVersion']) {
867
+ return true;
868
+ }
869
+ }
870
+ catch (_err) {
871
+ sails.log.info("ReDBox Storage hasn't started yet. Retrying...");
872
+ }
873
+ await this.sleep(1000);
874
+ }
875
+ return false;
876
+ }
877
+ async auditRecord(id, record, user, action = RecordAuditModel_1.RecordAuditActionType.updated) {
878
+ const auditingEnabled = sails.config.record.auditing.enabled;
879
+ if (auditingEnabled !== true && auditingEnabled !== 'true') {
880
+ sails.log.verbose(`${this.logHeader} Not enabled. Skipping auditing`);
881
+ return;
882
+ }
883
+ sails.log.verbose(`${this.logHeader} adding record audit job: ${id} with data:`);
884
+ _.unset(user, 'password');
885
+ _.unset(user, 'token');
886
+ // storage_id is used as the main ID in searches
887
+ const data = new RecordAuditModel_1.RecordAuditModel(id, record, user, action);
888
+ sails.log.verbose(JSON.stringify(data));
889
+ const envName = String(sails.config.environment ?? process.env.NODE_ENV ?? '');
890
+ if (envName === 'integrationtest') {
891
+ const storageServiceAny = this.storageService;
892
+ try {
893
+ await storageServiceAny.createRecordAudit(data);
894
+ }
895
+ catch (err) {
896
+ sails.log.error(`${this.logHeader} Failed to create record audit in integrationtest:`);
897
+ sails.log.error(JSON.stringify(err));
898
+ }
899
+ return;
900
+ }
901
+ if (this.queueService == null) {
902
+ sails.log.verbose(`${this.logHeader} Queue service isn't defined. Skipping auditing`);
903
+ return;
904
+ }
905
+ this.queueService.now(sails.config.record.auditing.recordAuditJobName, data);
906
+ }
907
+ storeRecordAudit(job) {
908
+ const jobObj = job;
909
+ const jobAttrs = (jobObj.attrs ?? {});
910
+ const data = (jobAttrs.data ?? jobAttrs);
911
+ sails.log.verbose(`${this.logHeader} Storing record Audit entry: `);
912
+ sails.log.verbose(JSON.stringify(data));
913
+ const storageServiceAny = this.storageService;
914
+ storageServiceAny.createRecordAudit(data)
915
+ .then((response) => {
916
+ const responseObj = response;
917
+ if (responseObj.isSuccessful()) {
918
+ sails.log.verbose(`${this.logHeader} Record Audit stored successfully `);
919
+ }
920
+ else {
921
+ sails.log.error(`${this.logHeader} Failed to storeRecordAudit for record:`);
922
+ sails.log.verbose(JSON.stringify(responseObj));
923
+ }
924
+ })
925
+ .catch((err) => {
926
+ sails.log.error(`${this.logHeader} Failed to storeRecordAudit for record: `);
927
+ sails.log.error(JSON.stringify(err));
928
+ });
929
+ }
930
+ info() {
931
+ const options = this.getOptions(sails.config.record.baseUrl.redbox + sails.config.record.api.info.url, sails.config.record.api.info.method);
932
+ return (0, axios_1.default)(options);
933
+ }
934
+ getOptions(url, method, oid = null, packageType = null, contentType = 'application/json; charset=utf-8') {
935
+ if (!_.isEmpty(oid)) {
936
+ url = url.replace('$oid', String(oid));
937
+ }
938
+ if (!_.isEmpty(packageType)) {
939
+ url = url.replace('$packageType', String(packageType));
940
+ }
941
+ const opts = {
942
+ method: method,
943
+ url: url,
944
+ headers: {
945
+ Authorization: `Bearer ${sails.config.redbox?.apiKey}`,
946
+ 'Content-Type': contentType,
947
+ },
948
+ };
949
+ return opts;
950
+ }
951
+ /**
952
+ * End of block to move/remove
953
+ */
954
+ /**
955
+ * Sets/appends to a field in the targetRecord
956
+ *
957
+ * @param targetRecordOid - the record to modify
958
+ * @param data - the data to set
959
+ * @param fieldName - the field name to use
960
+ * @param fieldType - blank for any, 'array' to create an array
961
+ * @param targetRecord - leave blank, otherwise will use this record for updates...
962
+ * @return - response of the update
963
+ */
964
+ async appendToRecord(targetRecordOid, linkData, fieldName, fieldType = undefined, targetRecord = undefined) {
965
+ sails.log.verbose(`RecordsService::Appending to record:${targetRecordOid}`);
966
+ let targetRecordObj = targetRecord;
967
+ if (_.isEmpty(targetRecord)) {
968
+ sails.log.verbose(`RecordsService::Getting record metadata:${targetRecordOid}`);
969
+ targetRecordObj = (await this.getMeta(targetRecordOid));
970
+ }
971
+ const existingData = _.get(targetRecordObj, fieldName);
972
+ if (_.isUndefined(existingData)) {
973
+ if (fieldType == 'array') {
974
+ linkData = [linkData];
975
+ }
976
+ }
977
+ else if (_.isArray(existingData)) {
978
+ existingData.push(linkData);
979
+ linkData = existingData;
980
+ }
981
+ _.set(targetRecordObj, fieldName, linkData);
982
+ sails.log.verbose(`RecordsService::Updating record:${targetRecordOid}`);
983
+ return await this.updateMeta(null, targetRecordOid, targetRecordObj);
984
+ }
985
+ /**
986
+ * Removes a field in the targetRecord. If field is an array, uses the `_.isEqual` to compare the field value.
987
+ *
988
+ * @param targetRecordOid - the record to modify
989
+ * @param dataToRemove - the data to remove
990
+ * @param fieldName - the field name
991
+ * @param targetRecord - leave blank, otherwise will use this record for updates...
992
+ * @return - response of the update
993
+ */
994
+ async removeFromRecord(targetRecordOid, dataToRemove, fieldName, targetRecord = undefined) {
995
+ sails.log.verbose(`RecordsService::Removing field from record:${targetRecordOid}`);
996
+ let targetRecordObj = targetRecord;
997
+ if (_.isEmpty(targetRecord)) {
998
+ sails.log.verbose(`RecordsService::Getting record metadata:${targetRecordOid}`);
999
+ targetRecordObj = (await this.getMeta(targetRecordOid));
1000
+ }
1001
+ const existingData = _.get(targetRecordObj, fieldName);
1002
+ let removedData = existingData;
1003
+ if (_.isUndefined(existingData)) {
1004
+ // Data doesn't exist, nothing to remove
1005
+ }
1006
+ else if (_.isArray(existingData)) {
1007
+ removedData = _.remove(existingData, (dataElem) => {
1008
+ return _.isEqual(dataElem, dataToRemove);
1009
+ });
1010
+ }
1011
+ else {
1012
+ _.unset(targetRecordObj, fieldName);
1013
+ }
1014
+ sails.log.verbose(`RecordsService::Updating record, removing ${_.isString(removedData) ? removedData : JSON.stringify(removedData)} from:${targetRecordOid}`);
1015
+ return await this.updateMeta(null, targetRecordOid, targetRecordObj);
1016
+ }
1017
+ /**
1018
+ * Fine-grained access to the record, converted to sync.
1019
+ *
1020
+ */
1021
+ hasViewAccess(brand, user, roles, record) {
1022
+ const auth = record.authorization;
1023
+ const editArr = auth ? auth.edit : record.authorization_edit;
1024
+ const editRolesArr = auth ? auth.editRoles : record.authorization_editRoles;
1025
+ const viewArr = auth ? auth.view : record.authorization_view;
1026
+ const viewRolesArr = auth ? auth.viewRoles : record.authorization_viewRoles;
1027
+ const uname = String(user.username ?? '');
1028
+ const brandObj = brand;
1029
+ const combinedViewArr = _.union(this.asArray(viewArr) ?? [], this.asArray(editArr) ?? []);
1030
+ const combinedViewRolesArr = _.union(this.asArray(viewRolesArr) ?? [], this.asArray(editRolesArr) ?? []);
1031
+ const isInUserView = _.find(combinedViewArr, (username) => {
1032
+ return uname == username;
1033
+ });
1034
+ if (!_.isUndefined(isInUserView)) {
1035
+ return true;
1036
+ }
1037
+ const isInRoleView = _.find(combinedViewRolesArr, (roleName) => {
1038
+ const role = RolesService.getRole(brandObj, String(roleName));
1039
+ return (role &&
1040
+ !_.isUndefined(_.find(roles, (r) => {
1041
+ return role.id == r.id;
1042
+ })));
1043
+ });
1044
+ return !_.isUndefined(isInRoleView);
1045
+ }
1046
+ /**
1047
+ * Fine-grained access to the record, converted to sync.
1048
+ *
1049
+ */
1050
+ hasEditAccess(brand, user, roles, record) {
1051
+ const auth = record.authorization;
1052
+ const editArr = auth ? auth.edit : record.authorization_edit;
1053
+ const editRolesArr = auth ? auth.editRoles : record.authorization_editRoles;
1054
+ const uname = String(user.username ?? '');
1055
+ const brandObj = brand;
1056
+ const isInUserEdit = _.find(this.asArray(editArr), (username) => {
1057
+ return uname == username;
1058
+ });
1059
+ if (!_.isUndefined(isInUserEdit)) {
1060
+ return true;
1061
+ }
1062
+ const isInRoleEdit = _.find(this.asArray(editRolesArr), (roleName) => {
1063
+ const role = RolesService.getRole(brandObj, String(roleName));
1064
+ return (role &&
1065
+ !_.isUndefined(_.find(roles, (r) => {
1066
+ return role.id == r.id;
1067
+ })));
1068
+ });
1069
+ return !_.isUndefined(isInRoleEdit);
1070
+ }
1071
+ searchFuzzy(type, workflowState, searchQuery, exactSearches, facetSearches, brand, user, roles, returnFields) {
1072
+ const username = user.username;
1073
+ const brandObj = brand;
1074
+ const typeStr = String(type ?? '');
1075
+ const searchQueryStr = String(searchQuery ?? '');
1076
+ const exactSearchArr = (exactSearches ?? []);
1077
+ const facetSearchArr = (facetSearches ?? []);
1078
+ const returnFieldsArr = (returnFields ?? []);
1079
+ // const url = `${this.getSearchTypeUrl(type, searchField, searchStr)}&start=0&rows=${sails.config.record.export.maxRecords}`;
1080
+ let searchParam = workflowState ? ` AND workflow_stage:${workflowState} ` : '';
1081
+ searchParam = `${searchParam} AND full_text:${searchQueryStr}`;
1082
+ _.forEach(exactSearchArr, (exactSearch) => {
1083
+ searchParam = `${searchParam}&fq=${exactSearch.name}:${this.luceneEscape(String(exactSearch.value))}`;
1084
+ });
1085
+ if (facetSearchArr.length > 0) {
1086
+ searchParam = `${searchParam}&facet=true`;
1087
+ _.forEach(facetSearchArr, (facetSearch) => {
1088
+ searchParam = `${searchParam}&facet.field=${facetSearch.name}${_.isEmpty(facetSearch.value) ? '' : `&fq=${facetSearch.name}:${this.luceneEscape(String(facetSearch.value))}`}`;
1089
+ });
1090
+ }
1091
+ let url = `${sails.config.record.baseUrl.redbox}${sails.config.record.api.search.url}?q=metaMetadata_brandId:${brandObj.id} AND metaMetadata_type:${typeStr}${searchParam}&version=2.2&wt=json&sort=date_object_modified desc`;
1092
+ url = this.addAuthFilter(url, username, roles, brandObj, false);
1093
+ sails.log.debug(`Searching fuzzy using: ${url}`);
1094
+ const options = this.getOptions(url, sails.config.record.api.search.method);
1095
+ return (0, rxjs_1.firstValueFrom)((0, rxjs_1.from)((0, axios_1.default)(options)).pipe((0, rxjs_1.mergeMap)(resp => {
1096
+ const response = resp;
1097
+ const customResp = {
1098
+ records: [],
1099
+ };
1100
+ _.forEach((response.response?.docs ?? []), (solrdoc) => {
1101
+ const customDoc = {};
1102
+ _.forEach(returnFieldsArr, (retField) => {
1103
+ if (_.isArray(solrdoc[retField])) {
1104
+ customDoc[retField] = solrdoc[retField][0];
1105
+ }
1106
+ else {
1107
+ customDoc[retField] = solrdoc[retField];
1108
+ }
1109
+ });
1110
+ customDoc['hasEditAccess'] = this.hasEditAccess(brandObj, user, roles, solrdoc);
1111
+ customResp.records.push(customDoc);
1112
+ });
1113
+ // check if have facets turned on...
1114
+ if (response.facet_counts) {
1115
+ customResp['facets'] = [];
1116
+ _.forOwn(response.facet_counts.facet_fields, (facet_field, facet_name) => {
1117
+ const facetFieldArr = facet_field;
1118
+ const numFacetsValues = _.size(facetFieldArr) / 2;
1119
+ const facetValues = [];
1120
+ for (let i = 0, j = 0; i < numFacetsValues; i++) {
1121
+ facetValues.push({
1122
+ value: facetFieldArr[j++],
1123
+ count: facetFieldArr[j++],
1124
+ });
1125
+ }
1126
+ customResp['facets'].push({
1127
+ name: String(facet_name),
1128
+ values: facetValues,
1129
+ });
1130
+ });
1131
+ }
1132
+ return (0, rxjs_1.of)(customResp);
1133
+ })));
1134
+ }
1135
+ addAuthFilter(url, username, roles, brand, editAccessOnly = undefined) {
1136
+ const brandObj = brand;
1137
+ const usernameStr = String(username ?? '');
1138
+ let urlStr = String(url ?? '');
1139
+ let roleString = '';
1140
+ let matched = false;
1141
+ for (let i = 0; i < roles.length; i++) {
1142
+ const role = roles[i];
1143
+ if (role.branding == brandObj.id) {
1144
+ if (matched) {
1145
+ roleString += ' OR ';
1146
+ matched = false;
1147
+ }
1148
+ roleString += roles[i].name;
1149
+ matched = true;
1150
+ }
1151
+ }
1152
+ urlStr =
1153
+ urlStr +
1154
+ '&fq=authorization_edit:' +
1155
+ usernameStr +
1156
+ (editAccessOnly
1157
+ ? ''
1158
+ : ' OR authorization_view:' + usernameStr + ' OR authorization_viewRoles:(' + roleString + ')') +
1159
+ ' OR authorization_editRoles:(' +
1160
+ roleString +
1161
+ ')';
1162
+ return urlStr;
1163
+ }
1164
+ getSearchTypeUrl(type, searchField = null, searchStr = null) {
1165
+ const searchParam = searchField ? ` AND ${searchField}:${searchStr}*` : '';
1166
+ const redboxConfig = sails.config.redbox || '';
1167
+ return `${sails.config.record.baseUrl.redbox ?? redboxConfig}${sails.config.record.api.search.url}?q=metaMetadata_type:${type}${searchParam}&version=2.2&wt=json&sort=date_object_modified desc`;
1168
+ }
1169
+ luceneEscape(str) {
1170
+ return luceneEscapeQuery(String(str));
1171
+ }
1172
+ /**
1173
+ * Pre-save trigger to clear and re-assign permissions based on security config
1174
+ *
1175
+ */
1176
+ assignPermissions(_oid, _record, _options, _user) {
1177
+ // sails.log.verbose(`Assign Permissions executing on oid: ${oid}, using options:`);
1178
+ // sails.log.verbose(JSON.stringify(options));
1179
+ // sails.log.verbose(`With record: `);
1180
+ // sails.log.verbose(record);
1181
+ // const emailProperty = _.get(options, "emailProperty", "email");
1182
+ // const editContributorProperties = _.get(options, "editContributorProperties", []);
1183
+ // const viewContributorProperties = _.get(options, "viewContributorProperties", []);
1184
+ // let authorization = _.get(record, "authorization", {});
1185
+ // let editContributorObs = [];
1186
+ // let viewContributorObs = [];
1187
+ // let editContributorEmails = [];
1188
+ // let viewContributorEmails = [];
1189
+ //
1190
+ // // get the new editor list...
1191
+ // editContributorEmails = this.populateContribList(editContributorProperties, record, emailProperty, editContributorEmails);
1192
+ // // get the new viewer list...
1193
+ // viewContributorEmails = this.populateContribList(viewContributorProperties, record, emailProperty, viewContributorEmails);
1194
+ //
1195
+ // if (_.isEmpty(editContributorEmails)) {
1196
+ // sails.log.error(`No editors for record: ${oid}`);
1197
+ // }
1198
+ // if (_.isEmpty(viewContributorEmails)) {
1199
+ // sails.log.error(`No viewers for record: ${oid}`);
1200
+ // }
1201
+ // _.each(editContributorEmails, editorEmail => {
1202
+ // editContributorObs.push(this.getObservable(User.findOne({email: editorEmail})));
1203
+ // });
1204
+ // _.each(viewContributorEmails, viewerEmail => {
1205
+ // viewContributorObs.push(this.getObservable(User.findOne({email: viewerEmail})));
1206
+ // });
1207
+ //
1208
+ // return Observable.zip(...editContributorObs)
1209
+ // .flatMap(editContributorUsers => {
1210
+ // let newEditList = [];
1211
+ // this.filterPending(editContributorUsers, editContributorEmails, newEditList);
1212
+ // record.authorization.edit = newEditList;
1213
+ // record.authorization.editPending = editContributorEmails;
1214
+ // return Observable.zip(...viewContributorObs);
1215
+ // })
1216
+ // .flatMap(viewContributorUsers => {
1217
+ // let newviewList = [];
1218
+ // this.filterPending(viewContributorUsers, editContributorEmails, newviewList);
1219
+ // record.authorization.view = newviewList;
1220
+ // record.authorization.viewPending = viewContributorEmails;
1221
+ // return Observable.of(record);
1222
+ // });
1223
+ }
1224
+ async restoreRecord(oid, user) {
1225
+ const record = await this.storageService.restoreRecord(oid);
1226
+ this.searchService.index(oid, record);
1227
+ await this.auditRecord(oid, record, user, RecordAuditModel_1.RecordAuditActionType.restored);
1228
+ return record;
1229
+ }
1230
+ async destroyDeletedRecord(oid, user) {
1231
+ const record = await this.storageService.destroyDeletedRecord(oid);
1232
+ await this.auditRecord(oid, record, user, RecordAuditModel_1.RecordAuditActionType.destroyed);
1233
+ return record;
1234
+ }
1235
+ async getDeletedRecords(workflowState, recordType, start, rows, username, roles, brand, editAccessOnly, packageType, sort, fieldNames, filterString, filterMode) {
1236
+ return await this.storageService.getDeletedRecords(workflowState, recordType, start, rows, username, roles, brand, editAccessOnly, packageType, sort, fieldNames, filterString, filterMode);
1237
+ }
1238
+ async createRecordAudit(record) {
1239
+ const storageServiceAny = this.storageService;
1240
+ return await storageServiceAny.createRecordAudit(record);
1241
+ }
1242
+ async transitionWorkflowStep(_currentRec, _recordType, _nextStep, _user, _triggerPreSaveTriggers = true, _triggerPostSaveTriggers = true) {
1243
+ throw new Error("Use separate calls to 'transitionWorkflowStepMetadata', 'triggerPreSaveTransitionWorkflowTriggers', and 'triggerPostSaveTransitionWorkflowTriggers' instead.");
1244
+ }
1245
+ setWorkflowStepRelatedMetadata(currentRec, nextStep) {
1246
+ sails.log.warn('Deprecated call to setWorkflowStepRelatedMetadata. Use transitionWorkflowStepMetadata instead.');
1247
+ return this.transitionWorkflowStepMetadata(currentRec, nextStep);
1248
+ }
1249
+ transitionWorkflowStepMetadata(currentRec, nextStep) {
1250
+ const currentRecObj = this.normalizeRecord(currentRec);
1251
+ const nextStepObj = (nextStep ?? {});
1252
+ const meta = currentRecObj.metaMetadata;
1253
+ const metadata = currentRecObj.metadata;
1254
+ sails.log.verbose(`transitionWorkflowStepMetadata - start - previousWorkflow: ${currentRecObj.previousWorkflow}; workflow: ${currentRecObj.workflow}; nextStep: ${nextStepObj}`);
1255
+ if (!_.isEmpty(nextStepObj)) {
1256
+ const config = nextStepObj.config;
1257
+ currentRecObj.previousWorkflow = currentRecObj.workflow;
1258
+ currentRecObj.workflow = config.workflow;
1259
+ // TODO: validate data with form fields
1260
+ meta.form = config.form;
1261
+ // Check for JSON-LD config
1262
+ if (sails.config.jsonld.addJsonLdContext) {
1263
+ metadata['@context'] = sails.config.jsonld.contexts[meta.form];
1264
+ }
1265
+ //TODO: if this was all typed we probably don't need these sorts of initialisations
1266
+ if (currentRecObj.authorization == undefined) {
1267
+ currentRecObj.authorization = {
1268
+ viewRoles: [],
1269
+ editRoles: [],
1270
+ edit: [],
1271
+ view: [],
1272
+ };
1273
+ }
1274
+ // update authorizations based on workflow...
1275
+ const configAuth = config.authorization;
1276
+ currentRecObj.authorization.viewRoles = configAuth.viewRoles;
1277
+ currentRecObj.authorization.editRoles = configAuth.editRoles;
1278
+ }
1279
+ sails.log.verbose(`transitionWorkflowStepMetadata - finish - previousWorkflow: ${currentRecObj.previousWorkflow}; workflow: ${currentRecObj.workflow}; nextStep: ${nextStepObj}`);
1280
+ }
1281
+ async triggerPreSaveTransitionWorkflowTriggers(oid, record, recordType, nextStep, user = {}) {
1282
+ if (!_.isEmpty(nextStep)) {
1283
+ record = await this.triggerPreSaveTriggers(oid, record, recordType, 'onTransitionWorkflow', user);
1284
+ }
1285
+ return record;
1286
+ }
1287
+ async triggerPostSaveTransitionWorkflowTriggers(oid, record, recordType, nextStep, user = {}, response = {}) {
1288
+ let responseObj = response;
1289
+ try {
1290
+ if (!_.isEmpty(nextStep)) {
1291
+ responseObj = (await this.triggerPostSaveSyncTriggers(oid, record, recordType, 'onTransitionWorkflow', user, responseObj));
1292
+ }
1293
+ }
1294
+ catch (err) {
1295
+ sails.log.error(`${this.logHeader} Exception while running post save sync hooks when transitioning workflow: ${JSON.stringify(err)}`);
1296
+ responseObj.success = false;
1297
+ responseObj.message = RBValidationError_1.RBValidationError.displayMessage({
1298
+ t: TranslationService,
1299
+ errors: [this.asError(err)],
1300
+ defaultMessage: 'Failed to transition record workflow, please check server logs.',
1301
+ });
1302
+ responseObj.metadata = { postSaveSyncWarning: 'true' };
1303
+ sails.log.error(`RecordsService - triggerPostSaveTransitionWorkflowTriggers - error - response: ${JSON.stringify(responseObj)}`);
1304
+ return responseObj;
1305
+ }
1306
+ if (!_.isEmpty(nextStep)) {
1307
+ this.triggerPostSaveTriggers(oid, record, recordType, 'onTransitionWorkflow', user);
1308
+ }
1309
+ return responseObj;
1310
+ }
1311
+ async triggerPreSaveTriggers(oid, record, recordType, mode = 'onUpdate', user = {}) {
1312
+ sails.log.verbose('Triggering pre save triggers for record type: ');
1313
+ sails.log.verbose(`hooks.${mode}.pre`);
1314
+ sails.log.verbose(JSON.stringify(recordType));
1315
+ const preSaveUpdateHooks = _.get(recordType, `hooks.${mode}.pre`, null);
1316
+ sails.log.debug(preSaveUpdateHooks);
1317
+ if (Array.isArray(preSaveUpdateHooks)) {
1318
+ for (let i = 0; i < preSaveUpdateHooks.length; i++) {
1319
+ const preSaveUpdateHook = preSaveUpdateHooks[i];
1320
+ const preSaveUpdateHookFunctionString = _.get(preSaveUpdateHook, 'function', null);
1321
+ if (preSaveUpdateHookFunctionString != null) {
1322
+ try {
1323
+ const preSaveUpdateHookFunction = eval(preSaveUpdateHookFunctionString);
1324
+ const options = _.get(preSaveUpdateHook, 'options', {});
1325
+ sails.log.verbose(`Triggering pre save triggers: ${preSaveUpdateHookFunctionString}`);
1326
+ const hookResponse = preSaveUpdateHookFunction(oid, record, options, user);
1327
+ record = (await this.resolveHookResponse(hookResponse));
1328
+ sails.log.debug(`${preSaveUpdateHookFunctionString} response now is:`);
1329
+ sails.log.verbose(JSON.stringify(record));
1330
+ sails.log.debug(`pre-save sync trigger ${preSaveUpdateHookFunctionString} completed for ${oid}`);
1331
+ }
1332
+ catch (err) {
1333
+ sails.log.error(`pre-save trigger ${preSaveUpdateHookFunctionString} failed to complete for oid ${oid} mode ${mode} user ${user}`);
1334
+ sails.log.error(err);
1335
+ throw new RBValidationError_1.RBValidationError({
1336
+ message: `pre-save trigger ${preSaveUpdateHookFunctionString} failed to complete for oid ${oid} mode ${mode} user ${user}`,
1337
+ options: { cause: err },
1338
+ displayErrors: [{ title: 'Failed to save record', meta: { oid } }],
1339
+ });
1340
+ }
1341
+ }
1342
+ }
1343
+ }
1344
+ return record;
1345
+ }
1346
+ async triggerPostSaveSyncTriggers(oid, record, recordType, mode = 'onUpdate', user = {}, response = {}) {
1347
+ sails.log.debug('Triggering post save sync triggers ');
1348
+ sails.log.debug(`hooks.${mode}.postSync`);
1349
+ sails.log.debug(recordType);
1350
+ const postSaveSyncHooks = _.get(recordType, `hooks.${mode}.postSync`, null);
1351
+ if (Array.isArray(postSaveSyncHooks)) {
1352
+ for (let i = 0; i < postSaveSyncHooks.length; i++) {
1353
+ const postSaveSyncHook = postSaveSyncHooks[i];
1354
+ sails.log.debug(postSaveSyncHooks);
1355
+ const postSaveSyncHooksFunctionString = _.get(postSaveSyncHook, 'function', null);
1356
+ if (postSaveSyncHooksFunctionString != null) {
1357
+ const postSaveSyncHookFunction = eval(postSaveSyncHooksFunctionString);
1358
+ const options = _.get(postSaveSyncHook, 'options', {});
1359
+ if (_.isFunction(postSaveSyncHookFunction)) {
1360
+ try {
1361
+ sails.log.debug(`Triggering post-save sync trigger: ${postSaveSyncHooksFunctionString}`);
1362
+ const hookResponse = postSaveSyncHookFunction(oid, record, options, user, response);
1363
+ const returnType = options.returnType == undefined ? 'record' : options.returnType;
1364
+ //TODO: response from these functions is not consistent, some return the record, some return the storage response
1365
+ if (returnType == 'record') {
1366
+ record = (await this.resolveHookResponse(hookResponse));
1367
+ }
1368
+ else {
1369
+ response = (await this.resolveHookResponse(hookResponse));
1370
+ }
1371
+ sails.log.debug(`${postSaveSyncHooksFunctionString} response now is:`);
1372
+ sails.log.verbose(JSON.stringify(response));
1373
+ sails.log.debug(`post-save sync trigger ${postSaveSyncHooksFunctionString} completed for ${oid}`);
1374
+ }
1375
+ catch (err) {
1376
+ sails.log.error(`post-save async trigger ${postSaveSyncHooksFunctionString} failed to complete for oid ${oid} mode ${mode} user ${user}`);
1377
+ sails.log.error(err);
1378
+ throw new RBValidationError_1.RBValidationError({
1379
+ message: `post-save async trigger ${postSaveSyncHooksFunctionString} failed to complete for oid ${oid} mode ${mode} user ${user}`,
1380
+ options: { cause: err },
1381
+ displayErrors: [{ title: 'Failed to run processing after saving record', meta: { oid } }],
1382
+ });
1383
+ }
1384
+ }
1385
+ else {
1386
+ sails.log.error(`Post save function: '${postSaveSyncHooksFunctionString}' did not resolve to a valid function, what I got:`);
1387
+ sails.log.error(postSaveSyncHookFunction);
1388
+ }
1389
+ }
1390
+ }
1391
+ }
1392
+ return response;
1393
+ }
1394
+ triggerPostSaveTriggers(oid, record, recordType, mode = 'onUpdate', user = {}) {
1395
+ sails.log.debug('Triggering post save triggers ');
1396
+ sails.log.debug(`hooks.${mode}.post`);
1397
+ sails.log.debug(recordType);
1398
+ const postSaveCreateHooks = _.get(recordType, `hooks.${mode}.post`, null);
1399
+ if (Array.isArray(postSaveCreateHooks)) {
1400
+ _.each(postSaveCreateHooks, (postSaveCreateHook) => {
1401
+ sails.log.debug(postSaveCreateHook);
1402
+ const postSaveCreateHookFunctionString = _.get(postSaveCreateHook, 'function', null);
1403
+ if (postSaveCreateHookFunctionString != null) {
1404
+ const postSaveCreateHookFunction = eval(postSaveCreateHookFunctionString);
1405
+ const options = _.get(postSaveCreateHook, 'options', {});
1406
+ if (_.isFunction(postSaveCreateHookFunction)) {
1407
+ //add try/catch just as an extra safety measure in case the function called
1408
+ //by the trigger is not correctly implemented (or old). In example: An old
1409
+ //function that is not async and retruns and Observable.of instead of a promise
1410
+ //and then throws an error. In this case the error is not caught by chained
1411
+ //.then().catch() and propagates to the front end and this has to be prevented
1412
+ try {
1413
+ const hookResponse = postSaveCreateHookFunction(oid, record, options, user);
1414
+ this.resolveHookResponse(hookResponse)
1415
+ .then((_result) => {
1416
+ sails.log.debug(`post-save trigger ${postSaveCreateHookFunctionString} completed for ${oid}`);
1417
+ })
1418
+ .catch((error) => {
1419
+ sails.log.error(`post-save trigger ${postSaveCreateHookFunctionString} failed to complete`);
1420
+ sails.log.error(error);
1421
+ });
1422
+ }
1423
+ catch (err) {
1424
+ sails.log.error(`post-save trigger external catch ${postSaveCreateHookFunctionString} failed to complete`);
1425
+ sails.log.error(err);
1426
+ }
1427
+ }
1428
+ else {
1429
+ sails.log.error(`Post save function: '${postSaveCreateHookFunctionString}' did not resolve to a valid function, what I got:`);
1430
+ sails.log.error(postSaveCreateHookFunction);
1431
+ }
1432
+ }
1433
+ });
1434
+ }
1435
+ }
1436
+ resolveHookResponse(hookResponse) {
1437
+ if ((0, rxjs_2.isObservable)(hookResponse)) {
1438
+ return (0, rxjs_1.firstValueFrom)(hookResponse);
1439
+ }
1440
+ return Promise.resolve(hookResponse);
1441
+ }
1442
+ async exists(oid) {
1443
+ return this.storageService.exists(oid);
1444
+ }
1445
+ handleUpdateDataStream(oid, origRecord, metadata) {
1446
+ const fileIdsAdded = [];
1447
+ const stagingDisk = StorageManagerService.stagingDisk();
1448
+ return this.datastreamService.updateDatastream(oid, origRecord, metadata, stagingDisk, fileIdsAdded).pipe((0, operators_1.concatMap)((reqs) => {
1449
+ if (Array.isArray(reqs) && reqs.length > 0) {
1450
+ sails.log.verbose(`Updating data streams...`);
1451
+ return (0, rxjs_1.from)(reqs);
1452
+ }
1453
+ sails.log.verbose(`No datastreams to update...`);
1454
+ return (0, rxjs_1.of)(null);
1455
+ }), (0, operators_1.concatMap)((promise) => {
1456
+ if (promise) {
1457
+ sails.log.verbose(`Update datastream request is...`);
1458
+ sails.log.verbose(JSON.stringify(promise));
1459
+ return (0, rxjs_1.from)(promise).pipe((0, operators_1.catchError)((e) => {
1460
+ sails.log.verbose(`Error in updating stream::::`);
1461
+ sails.log.verbose(JSON.stringify(e));
1462
+ return (0, rxjs_1.throwError)(new Error(TranslationService.t('attachment-upload-error')));
1463
+ }));
1464
+ }
1465
+ return (0, rxjs_1.of)(null);
1466
+ }), (0, operators_1.concatMap)(updateResp => {
1467
+ if (updateResp) {
1468
+ sails.log.verbose(`Got response from update datastream request...`);
1469
+ sails.log.verbose(JSON.stringify(updateResp));
1470
+ }
1471
+ return (0, rxjs_1.of)(updateResp);
1472
+ }), (0, operators_1.last)());
1473
+ }
1474
+ }
1475
+ Services.Records = Records;
1476
+ })(Services || (exports.Services = Services = {}));
1477
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3Jkc1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvUmVjb3Jkc1NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFOUQsK0JBQWlGO0FBQ2pGLDhDQUE2RDtBQUs3RCx3RUFBNEY7QUFHNUYsZ0RBQXNEO0FBSXRELHNFQUFtRTtBQUVuRSxrRUFBK0Q7QUFLL0Qsa0RBQTBCO0FBQzFCLHFEQUF1QztBQUN2QyxnREFBa0M7QUFDbEMsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQTBELENBQUM7QUFDeEgsTUFBTSxpQkFBaUIsR0FDckIsT0FBTyx1QkFBdUIsS0FBSyxVQUFVO0lBQzNDLENBQUMsQ0FBQyx1QkFBdUI7SUFDekIsQ0FBQyxDQUFFLENBQUUsdUJBQW1ELENBQUMsTUFBTTtRQUM1RCx1QkFBbUQsQ0FBQyxPQUFPLENBQStCLENBQUM7QUFDbEcsaUNBQWlDO0FBRWpDLCtCQUFvQztBQUtwQyxJQUFpQixRQUFRLENBOHdEeEI7QUE5d0RELFdBQWlCLFFBQVE7SUFTdkIsTUFBTSwyQkFBMkIsR0FBRyxnQkFBZ0IsQ0FBQztJQUNyRDs7Ozs7T0FLRztJQUNILE1BQWEsT0FBUSxTQUFRLHNCQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87UUFDaEQsY0FBYyxDQUFrQjtRQUNoQyxpQkFBaUIsQ0FBcUI7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