@researchdatabox/redbox-core 0.0.1-beta.9225 → 0.0.1-beta.9474

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 (355) hide show
  1. package/dist/CoreController.d.ts +4 -0
  2. package/dist/CoreController.d.ts.map +1 -1
  3. package/dist/CoreController.js +33 -1
  4. package/dist/DatastreamService.d.ts +5 -2
  5. package/dist/DatastreamService.d.ts.map +1 -1
  6. package/dist/QueueService.d.ts +1 -1
  7. package/dist/QueueService.d.ts.map +1 -1
  8. package/dist/RecordsService.d.ts +38 -2
  9. package/dist/RecordsService.d.ts.map +1 -1
  10. package/dist/StorageService.d.ts +2 -1
  11. package/dist/StorageService.d.ts.map +1 -1
  12. package/dist/api-routes/apib.d.ts +7 -0
  13. package/dist/api-routes/apib.d.ts.map +1 -0
  14. package/dist/api-routes/apib.js +43 -0
  15. package/dist/api-routes/define.d.ts +4 -0
  16. package/dist/api-routes/define.d.ts.map +1 -0
  17. package/dist/api-routes/define.js +29 -0
  18. package/dist/api-routes/groups/admin.d.ts +6 -0
  19. package/dist/api-routes/groups/admin.d.ts.map +1 -0
  20. package/dist/api-routes/groups/admin.js +53 -0
  21. package/dist/api-routes/groups/appconfig.d.ts +4 -0
  22. package/dist/api-routes/groups/appconfig.d.ts.map +1 -0
  23. package/dist/api-routes/groups/appconfig.js +33 -0
  24. package/dist/api-routes/groups/branding.d.ts +8 -0
  25. package/dist/api-routes/groups/branding.d.ts.map +1 -0
  26. package/dist/api-routes/groups/branding.js +61 -0
  27. package/dist/api-routes/groups/dashboard-config.d.ts +11 -0
  28. package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -0
  29. package/dist/api-routes/groups/dashboard-config.js +90 -0
  30. package/dist/api-routes/groups/export.d.ts +3 -0
  31. package/dist/api-routes/groups/export.d.ts.map +1 -0
  32. package/dist/api-routes/groups/export.js +30 -0
  33. package/dist/api-routes/groups/forms.d.ts +4 -0
  34. package/dist/api-routes/groups/forms.d.ts.map +1 -0
  35. package/dist/api-routes/groups/forms.js +29 -0
  36. package/dist/api-routes/groups/integration-audit.d.ts +3 -0
  37. package/dist/api-routes/groups/integration-audit.d.ts.map +1 -0
  38. package/dist/api-routes/groups/integration-audit.js +35 -0
  39. package/dist/api-routes/groups/notifications.d.ts +3 -0
  40. package/dist/api-routes/groups/notifications.d.ts.map +1 -0
  41. package/dist/api-routes/groups/notifications.js +20 -0
  42. package/dist/api-routes/groups/records.d.ts +28 -0
  43. package/dist/api-routes/groups/records.d.ts.map +1 -0
  44. package/dist/api-routes/groups/records.js +349 -0
  45. package/dist/api-routes/groups/recordtypes.d.ts +4 -0
  46. package/dist/api-routes/groups/recordtypes.d.ts.map +1 -0
  47. package/dist/api-routes/groups/recordtypes.js +27 -0
  48. package/dist/api-routes/groups/reports.d.ts +3 -0
  49. package/dist/api-routes/groups/reports.d.ts.map +1 -0
  50. package/dist/api-routes/groups/reports.js +20 -0
  51. package/dist/api-routes/groups/search-query.d.ts +4 -0
  52. package/dist/api-routes/groups/search-query.d.ts.map +1 -0
  53. package/dist/api-routes/groups/search-query.js +51 -0
  54. package/dist/api-routes/groups/search.d.ts +6 -0
  55. package/dist/api-routes/groups/search.d.ts.map +1 -0
  56. package/dist/api-routes/groups/search.js +31 -0
  57. package/dist/api-routes/groups/translation.d.ts +8 -0
  58. package/dist/api-routes/groups/translation.d.ts.map +1 -0
  59. package/dist/api-routes/groups/translation.js +78 -0
  60. package/dist/api-routes/groups/users.d.ts +17 -0
  61. package/dist/api-routes/groups/users.d.ts.map +1 -0
  62. package/dist/api-routes/groups/users.js +149 -0
  63. package/dist/api-routes/groups/vocabulary.d.ts +10 -0
  64. package/dist/api-routes/groups/vocabulary.d.ts.map +1 -0
  65. package/dist/api-routes/groups/vocabulary.js +97 -0
  66. package/dist/api-routes/helpers.d.ts +29 -0
  67. package/dist/api-routes/helpers.d.ts.map +1 -0
  68. package/dist/api-routes/helpers.js +486 -0
  69. package/dist/api-routes/index.d.ts +25 -0
  70. package/dist/api-routes/index.d.ts.map +1 -0
  71. package/dist/api-routes/index.js +41 -0
  72. package/dist/api-routes/openapi.d.ts +27 -0
  73. package/dist/api-routes/openapi.d.ts.map +1 -0
  74. package/dist/api-routes/openapi.js +273 -0
  75. package/dist/api-routes/request-extraction.d.ts +14 -0
  76. package/dist/api-routes/request-extraction.d.ts.map +1 -0
  77. package/dist/api-routes/request-extraction.js +100 -0
  78. package/dist/api-routes/route-factory.d.ts +3 -0
  79. package/dist/api-routes/route-factory.d.ts.map +1 -0
  80. package/dist/api-routes/route-factory.js +30 -0
  81. package/dist/api-routes/route-registry.d.ts +24 -0
  82. package/dist/api-routes/route-registry.d.ts.map +1 -0
  83. package/dist/api-routes/route-registry.js +113 -0
  84. package/dist/api-routes/route-resolution.d.ts +4 -0
  85. package/dist/api-routes/route-resolution.d.ts.map +1 -0
  86. package/dist/api-routes/route-resolution.js +57 -0
  87. package/dist/api-routes/schemas/common.d.ts +37 -0
  88. package/dist/api-routes/schemas/common.d.ts.map +1 -0
  89. package/dist/api-routes/schemas/common.js +147 -0
  90. package/dist/api-routes/schemas/responses.d.ts +2904 -0
  91. package/dist/api-routes/schemas/responses.d.ts.map +1 -0
  92. package/dist/api-routes/schemas/responses.js +417 -0
  93. package/dist/api-routes/types.d.ts +70 -0
  94. package/dist/api-routes/types.d.ts.map +1 -0
  95. package/dist/api-routes/types.js +3 -0
  96. package/dist/api-routes/validation.d.ts +32 -0
  97. package/dist/api-routes/validation.d.ts.map +1 -0
  98. package/dist/api-routes/validation.js +142 -0
  99. package/dist/bootstrap.d.ts.map +1 -1
  100. package/dist/bootstrap.js +10 -10
  101. package/dist/config/agendaQueue.config.d.ts +25 -1
  102. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  103. package/dist/config/agendaQueue.config.js +19 -2
  104. package/dist/config/auth.config.d.ts.map +1 -1
  105. package/dist/config/auth.config.js +21 -2
  106. package/dist/config/brandingConfigurationDefaults.config.js +3 -3
  107. package/dist/config/dashboardtype.config.d.ts +5 -0
  108. package/dist/config/dashboardtype.config.d.ts.map +1 -1
  109. package/dist/config/dashboardtype.config.js +1 -1
  110. package/dist/config/dashboardview.config.d.ts +24 -0
  111. package/dist/config/dashboardview.config.d.ts.map +1 -0
  112. package/dist/config/dashboardview.config.js +137 -0
  113. package/dist/config/dompurify.config.d.ts.map +1 -1
  114. package/dist/config/dompurify.config.js +2 -2
  115. package/dist/config/http.config.d.ts.map +1 -1
  116. package/dist/config/http.config.js +5 -3
  117. package/dist/config/index.d.ts +6 -0
  118. package/dist/config/index.d.ts.map +1 -1
  119. package/dist/config/index.js +4 -1
  120. package/dist/config/namedQuery.config.d.ts +10 -2
  121. package/dist/config/namedQuery.config.d.ts.map +1 -1
  122. package/dist/config/namedQuery.config.js +17 -17
  123. package/dist/config/policies.config.d.ts +3 -0
  124. package/dist/config/policies.config.d.ts.map +1 -1
  125. package/dist/config/policies.config.js +35 -1
  126. package/dist/config/record.config.d.ts.map +1 -1
  127. package/dist/config/record.config.js +2 -1
  128. package/dist/config/recordtype.config.d.ts +28 -0
  129. package/dist/config/recordtype.config.d.ts.map +1 -1
  130. package/dist/config/recordtype.config.js +85 -9
  131. package/dist/config/routes.config.d.ts +5 -2
  132. package/dist/config/routes.config.d.ts.map +1 -1
  133. package/dist/config/routes.config.js +24 -110
  134. package/dist/config/storage.config.d.ts +20 -2
  135. package/dist/config/storage.config.d.ts.map +1 -1
  136. package/dist/config/storage.config.js +2 -1
  137. package/dist/config/vocab.config.d.ts +30 -0
  138. package/dist/config/vocab.config.d.ts.map +1 -1
  139. package/dist/config/vocab.config.js +21 -1
  140. package/dist/config/webpack.config.d.ts.map +1 -1
  141. package/dist/config/webpack.config.js +13 -7
  142. package/dist/config/workflow.config.d.ts +0 -1
  143. package/dist/config/workflow.config.d.ts.map +1 -1
  144. package/dist/config/workflow.config.js +1 -137
  145. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
  146. package/dist/configmodels/AdminSidebarConfig.js +1 -2
  147. package/dist/configmodels/ConfigModels.d.ts +1 -1
  148. package/dist/configmodels/ConfigModels.d.ts.map +1 -1
  149. package/dist/configmodels/ConfigModels.js +9 -1
  150. package/dist/configmodels/DashboardTableOverrideConfig.d.ts +1011 -0
  151. package/dist/configmodels/DashboardTableOverrideConfig.d.ts.map +1 -0
  152. package/dist/configmodels/DashboardTableOverrideConfig.js +138 -0
  153. package/dist/controllers/AdminController.d.ts +0 -1
  154. package/dist/controllers/AdminController.d.ts.map +1 -1
  155. package/dist/controllers/AdminController.js +2 -32
  156. package/dist/controllers/BrandingAppController.d.ts.map +1 -1
  157. package/dist/controllers/BrandingAppController.js +10 -9
  158. package/dist/controllers/BrandingController.d.ts +3 -5
  159. package/dist/controllers/BrandingController.d.ts.map +1 -1
  160. package/dist/controllers/BrandingController.js +29 -21
  161. package/dist/controllers/DashboardConfigController.d.ts +8 -0
  162. package/dist/controllers/DashboardConfigController.d.ts.map +1 -0
  163. package/dist/controllers/DashboardConfigController.js +17 -0
  164. package/dist/controllers/DynamicAssetController.d.ts +1 -0
  165. package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
  166. package/dist/controllers/DynamicAssetController.js +20 -1
  167. package/dist/controllers/EmailController.d.ts.map +1 -1
  168. package/dist/controllers/EmailController.js +16 -12
  169. package/dist/controllers/FormVocabularyController.d.ts +1 -0
  170. package/dist/controllers/FormVocabularyController.d.ts.map +1 -1
  171. package/dist/controllers/FormVocabularyController.js +94 -4
  172. package/dist/controllers/RecordController.d.ts +18 -1
  173. package/dist/controllers/RecordController.d.ts.map +1 -1
  174. package/dist/controllers/RecordController.js +274 -124
  175. package/dist/controllers/RenderViewController.d.ts.map +1 -1
  176. package/dist/controllers/RenderViewController.js +4 -2
  177. package/dist/controllers/TranslationController.d.ts.map +1 -1
  178. package/dist/controllers/TranslationController.js +12 -10
  179. package/dist/controllers/WorkspaceTypesController.d.ts +3 -2
  180. package/dist/controllers/WorkspaceTypesController.d.ts.map +1 -1
  181. package/dist/controllers/WorkspaceTypesController.js +120 -31
  182. package/dist/controllers/index.d.ts.map +1 -1
  183. package/dist/controllers/index.js +7 -4
  184. package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
  185. package/dist/controllers/webservice/AdminController.js +15 -16
  186. package/dist/controllers/webservice/AppConfigController.d.ts.map +1 -1
  187. package/dist/controllers/webservice/AppConfigController.js +19 -20
  188. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
  189. package/dist/controllers/webservice/BrandingController.js +101 -47
  190. package/dist/controllers/webservice/DashboardConfigController.d.ts +26 -0
  191. package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -0
  192. package/dist/controllers/webservice/DashboardConfigController.js +241 -0
  193. package/dist/controllers/webservice/ExportController.d.ts.map +1 -1
  194. package/dist/controllers/webservice/ExportController.js +11 -11
  195. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
  196. package/dist/controllers/webservice/FormManagementController.js +11 -13
  197. package/dist/controllers/webservice/RecordController.d.ts +4 -0
  198. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  199. package/dist/controllers/webservice/RecordController.js +428 -257
  200. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
  201. package/dist/controllers/webservice/RecordTypeController.js +9 -10
  202. package/dist/controllers/webservice/ReportController.d.ts.map +1 -1
  203. package/dist/controllers/webservice/ReportController.js +18 -20
  204. package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
  205. package/dist/controllers/webservice/SearchController.js +28 -35
  206. package/dist/controllers/webservice/TranslationController.d.ts.map +1 -1
  207. package/dist/controllers/webservice/TranslationController.js +61 -39
  208. package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -1
  209. package/dist/controllers/webservice/UserManagementController.js +112 -99
  210. package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -1
  211. package/dist/controllers/webservice/VocabularyController.js +76 -28
  212. package/dist/hooks/defineRedboxHook.d.ts +3 -0
  213. package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
  214. package/dist/hooks/defineRedboxHook.js +4 -1
  215. package/dist/index.d.ts +2 -0
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +2 -1
  218. package/dist/loader/index.d.ts +6 -0
  219. package/dist/loader/index.d.ts.map +1 -1
  220. package/dist/loader/index.js +57 -10
  221. package/dist/middleware/redboxSession.js +1 -1
  222. package/dist/model/DashboardTypeResponseModel.d.ts +13 -1
  223. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
  224. package/dist/model/DashboardTypeResponseModel.js +12 -4
  225. package/dist/model/DashboardViewResponseModel.d.ts +20 -0
  226. package/dist/model/DashboardViewResponseModel.d.ts.map +1 -0
  227. package/dist/model/DashboardViewResponseModel.js +38 -0
  228. package/dist/model/RecordTypeResponseModel.d.ts +3 -1
  229. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
  230. package/dist/model/RecordTypeResponseModel.js +4 -2
  231. package/dist/model/RequestDetails.d.ts +1 -1
  232. package/dist/model/RequestDetails.d.ts.map +1 -1
  233. package/dist/model/RequestDetails.js +1 -1
  234. package/dist/model/index.d.ts +1 -0
  235. package/dist/model/index.d.ts.map +1 -1
  236. package/dist/model/index.js +5 -2
  237. package/dist/model/storage/BrandingModel.d.ts +0 -16
  238. package/dist/model/storage/BrandingModel.d.ts.map +1 -1
  239. package/dist/model/storage/BrandingModel.js +2 -51
  240. package/dist/model/storage/DashboardTypeModel.d.ts +4 -0
  241. package/dist/model/storage/DashboardTypeModel.d.ts.map +1 -1
  242. package/dist/model/storage/RecordTypeModel.d.ts +16 -0
  243. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
  244. package/dist/model/storage/RecordTypeModel.js +9 -1
  245. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
  246. package/dist/policies/contentSecurityPolicy.js +23 -2
  247. package/dist/policies/index.d.ts +3 -0
  248. package/dist/policies/index.d.ts.map +1 -1
  249. package/dist/policies/index.js +6 -2
  250. package/dist/policies/validateApiContractRequest.d.ts +3 -0
  251. package/dist/policies/validateApiContractRequest.d.ts.map +1 -0
  252. package/dist/policies/validateApiContractRequest.js +74 -0
  253. package/dist/responses/badRequest.d.ts.map +1 -1
  254. package/dist/responses/badRequest.js +5 -3
  255. package/dist/responses/created.d.ts.map +1 -1
  256. package/dist/responses/created.js +5 -3
  257. package/dist/responses/forbidden.d.ts.map +1 -1
  258. package/dist/responses/forbidden.js +5 -3
  259. package/dist/responses/ok.d.ts.map +1 -1
  260. package/dist/responses/ok.js +5 -3
  261. package/dist/responses/serverError.d.ts.map +1 -1
  262. package/dist/responses/serverError.js +5 -3
  263. package/dist/responses/siteTitle.d.ts +6 -0
  264. package/dist/responses/siteTitle.d.ts.map +1 -0
  265. package/dist/responses/siteTitle.js +28 -0
  266. package/dist/sails.d.ts +7 -0
  267. package/dist/sails.d.ts.map +1 -1
  268. package/dist/services/AgendaQueueService.d.ts +38 -17
  269. package/dist/services/AgendaQueueService.d.ts.map +1 -1
  270. package/dist/services/AgendaQueueService.js +311 -81
  271. package/dist/services/AttachmentMetadataService.d.ts +34 -0
  272. package/dist/services/AttachmentMetadataService.d.ts.map +1 -0
  273. package/dist/services/AttachmentMetadataService.js +133 -0
  274. package/dist/services/BrandingLogoService.d.ts +6 -8
  275. package/dist/services/BrandingLogoService.d.ts.map +1 -1
  276. package/dist/services/BrandingLogoService.js +66 -72
  277. package/dist/services/DashboardConfigService.d.ts +71 -0
  278. package/dist/services/DashboardConfigService.d.ts.map +1 -0
  279. package/dist/services/DashboardConfigService.js +309 -0
  280. package/dist/services/DashboardTypesService.d.ts +61 -63
  281. package/dist/services/DashboardTypesService.d.ts.map +1 -1
  282. package/dist/services/DashboardTypesService.js +361 -198
  283. package/dist/services/DoiService.d.ts +11 -0
  284. package/dist/services/DoiService.d.ts.map +1 -1
  285. package/dist/services/DoiService.js +206 -1
  286. package/dist/services/FigshareService.d.ts.map +1 -1
  287. package/dist/services/FigshareService.js +5 -1
  288. package/dist/services/FormVocabularyService.d.ts +45 -0
  289. package/dist/services/FormVocabularyService.d.ts.map +1 -0
  290. package/dist/services/FormVocabularyService.js +326 -0
  291. package/dist/services/I18nEntriesService.d.ts +3 -0
  292. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  293. package/dist/services/I18nEntriesService.js +14 -2
  294. package/dist/services/NamedQueryService.d.ts +27 -9
  295. package/dist/services/NamedQueryService.d.ts.map +1 -1
  296. package/dist/services/NamedQueryService.js +223 -55
  297. package/dist/services/RDMPService.d.ts.map +1 -1
  298. package/dist/services/RDMPService.js +3 -2
  299. package/dist/services/RecordsService.d.ts +8 -2
  300. package/dist/services/RecordsService.d.ts.map +1 -1
  301. package/dist/services/RecordsService.js +64 -16
  302. package/dist/services/ReportsService.d.ts.map +1 -1
  303. package/dist/services/ReportsService.js +7 -1
  304. package/dist/services/StandardDatastreamService.d.ts +32 -5
  305. package/dist/services/StandardDatastreamService.d.ts.map +1 -1
  306. package/dist/services/StandardDatastreamService.js +490 -38
  307. package/dist/services/StorageManagerService.d.ts +12 -1
  308. package/dist/services/StorageManagerService.d.ts.map +1 -1
  309. package/dist/services/StorageManagerService.js +72 -7
  310. package/dist/services/index.d.ts +9 -3
  311. package/dist/services/index.d.ts.map +1 -1
  312. package/dist/services/index.js +17 -7
  313. package/dist/storage/GridFSDriver.d.ts +101 -0
  314. package/dist/storage/GridFSDriver.d.ts.map +1 -0
  315. package/dist/storage/GridFSDriver.js +291 -0
  316. package/dist/storage/TusStorageManagerDataStore.d.ts +49 -0
  317. package/dist/storage/TusStorageManagerDataStore.d.ts.map +1 -0
  318. package/dist/storage/TusStorageManagerDataStore.js +300 -0
  319. package/dist/utilities/RequestParamUtils.d.ts +3 -0
  320. package/dist/utilities/RequestParamUtils.d.ts.map +1 -0
  321. package/dist/utilities/RequestParamUtils.js +13 -0
  322. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  323. package/dist/visitor/construct.visitor.js +6 -3
  324. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  325. package/dist/visitor/migrate-config-v4-v5.visitor.js +19 -1
  326. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  327. package/dist/visitor/validator.visitor.js +11 -3
  328. package/dist/waterline-models/AttachmentAccessAudit.d.ts +26 -0
  329. package/dist/waterline-models/AttachmentAccessAudit.d.ts.map +1 -0
  330. package/dist/waterline-models/AttachmentAccessAudit.js +63 -0
  331. package/dist/waterline-models/AttachmentMetadata.d.ts +40 -0
  332. package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -0
  333. package/dist/waterline-models/AttachmentMetadata.js +147 -0
  334. package/dist/waterline-models/BrandingConfig.d.ts +0 -2
  335. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
  336. package/dist/waterline-models/BrandingConfig.js +1 -6
  337. package/dist/waterline-models/DashboardType.d.ts +7 -0
  338. package/dist/waterline-models/DashboardType.d.ts.map +1 -1
  339. package/dist/waterline-models/DashboardType.js +16 -1
  340. package/dist/waterline-models/I18nTranslation.d.ts +2 -0
  341. package/dist/waterline-models/I18nTranslation.d.ts.map +1 -1
  342. package/dist/waterline-models/I18nTranslation.js +6 -1
  343. package/dist/waterline-models/NamedQuery.d.ts +6 -0
  344. package/dist/waterline-models/NamedQuery.d.ts.map +1 -1
  345. package/dist/waterline-models/NamedQuery.js +16 -1
  346. package/dist/waterline-models/index.d.ts +4 -0
  347. package/dist/waterline-models/index.d.ts.map +1 -1
  348. package/dist/waterline-models/index.js +7 -1
  349. package/package.json +36 -26
  350. package/dist/controllers/VocabController.d.ts +0 -43
  351. package/dist/controllers/VocabController.d.ts.map +0 -1
  352. package/dist/controllers/VocabController.js +0 -190
  353. package/dist/services/VocabService.d.ts +0 -81
  354. package/dist/services/VocabService.d.ts.map +0 -1
  355. package/dist/services/VocabService.js +0 -424
@@ -18,7 +18,7 @@
18
18
  // with this program; if not, write to the Free Software Foundation, Inc.,
19
19
  // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.Services = void 0;
21
+ exports.Services = exports.AgendaQueueUnsupportedFeatureError = void 0;
22
22
  // Copyright (c) 2020 Queensland Cyber Infrastructure Foundation (http://www.qcif.edu.au/)
23
23
  //
24
24
  // GNU GENERAL PUBLIC LICENSE
@@ -38,9 +38,16 @@ exports.Services = void 0;
38
38
  // with this program; if not, write to the Free Software Foundation, Inc.,
39
39
  // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
40
40
  const CoreService_1 = require("../CoreService");
41
- const agenda_1 = require("agenda");
41
+ class AgendaQueueUnsupportedFeatureError extends Error {
42
+ constructor(message) {
43
+ super(message);
44
+ this.name = 'AgendaQueueUnsupportedFeatureError';
45
+ }
46
+ }
47
+ exports.AgendaQueueUnsupportedFeatureError = AgendaQueueUnsupportedFeatureError;
42
48
  var Services;
43
49
  (function (Services) {
50
+ const EXTERNAL_SCHEDULER_GUIDANCE = 'Use an external scheduler for SQS-backed recurring jobs.';
44
51
  /**
45
52
  * Service class for queuing using Agenda: https://github.com/agenda/agenda
46
53
  *
@@ -57,6 +64,11 @@ var Services;
57
64
  'init'
58
65
  ];
59
66
  agenda;
67
+ agendas = {};
68
+ defaultBackend = 'mongodb';
69
+ jobBackendByName = new Map();
70
+ readyInitPromise;
71
+ queueInitialized = false;
60
72
  constructor() {
61
73
  super();
62
74
  }
@@ -69,63 +81,66 @@ var Services;
69
81
  async init() {
70
82
  const that = this;
71
83
  this.registerSailsHook('on', 'ready', async function () {
72
- // set the options for Agenda, see: https://github.com/agenda/agenda#configuring-an-agenda
73
- const agendaOpts = {};
74
- _.forOwn(sails.config.agendaQueue.options, (optionVal, optionName) => {
75
- that.setOptionIfDefined(agendaOpts, optionName, optionVal);
76
- });
77
- const dbManager = User.getDatastore().manager;
78
- if (_.isEmpty(_.get(agendaOpts, 'db.address'))) {
79
- agendaOpts['mongo'] = dbManager;
80
- }
81
- that.agenda = new agenda_1.Agenda(agendaOpts);
82
- that.defineJobs(sails.config.agendaQueue.jobs, that);
83
- sails.log.verbose(`AgendaQueue:: All jobs defined.`);
84
- that.agenda.on('ready', () => {
85
- sails.log.verbose(`AgendaQueue:: Started!`);
86
- });
87
- that.agenda.on('error', (err) => {
88
- sails.log.error(`AgendaQueue:: Error:`);
89
- sails.log.error(JSON.stringify(err));
90
- });
91
- that.agenda.on('start', (job) => {
92
- sails.log.verbose(`AgendaQueue:: Job ${job.attrs.name} starting`);
93
- });
94
- that.agenda.on('complete', (job) => {
95
- sails.log.verbose(`AgendaQueue:: Job ${job.attrs.name} finished`);
96
- });
97
- that.agenda.on('fail', (err, job) => {
98
- sails.log.error(`AgendaQueue:: Job ${job.attrs.name} failed`);
99
- sails.log.error(err);
100
- });
101
- await that.agenda.start();
102
- //Create indexes after agenda start
103
- const collectionName = String(_.get(agendaOpts, 'collection', 'agendaJobs'));
104
- await dbManager.collection(collectionName).createIndex({ name: 1, disabled: 1, lockedAt: 1, nextRunAt: 1 });
105
- await dbManager.collection(collectionName).createIndex({ name: -1, disabled: -1, lockedAt: -1, nextRunAt: -1 });
106
- // check for in-line job schedule
107
- _.each(sails.config.agendaQueue.jobs, (job) => {
108
- if (!_.isEmpty(job.schedule)) {
109
- const method = job.schedule.method;
110
- const intervalOrSchedule = job.schedule.intervalOrSchedule;
111
- const data = job.schedule.data;
112
- const opts = job.schedule.opts;
113
- if (method == 'now') {
114
- that.now(job.name, data);
115
- }
116
- else if (method == 'every' && intervalOrSchedule) {
117
- that.every(job.name, intervalOrSchedule, data, opts);
118
- }
119
- else if (method == 'schedule' && intervalOrSchedule) {
120
- that.schedule(job.name, intervalOrSchedule, data);
121
- }
122
- else {
123
- sails.log.error(`AgendaQueue:: incorrect job schedule definition, method not found:`);
124
- sails.log.error(JSON.stringify(job));
125
- }
126
- }
84
+ await that.handleReady();
85
+ });
86
+ }
87
+ async handleReady() {
88
+ if (_.isNil(this.readyInitPromise)) {
89
+ this.readyInitPromise = this.handleReadyInternal().catch((err) => {
90
+ this.readyInitPromise = undefined;
91
+ throw err;
127
92
  });
93
+ }
94
+ await this.readyInitPromise;
95
+ }
96
+ async handleReadyInternal() {
97
+ this.queueInitialized = false;
98
+ const queueConfig = sails.config.agendaQueue;
99
+ const queueOptions = queueConfig.options ?? {};
100
+ const jobs = queueConfig.jobs;
101
+ const dbManager = User.getDatastore().manager;
102
+ this.defaultBackend = this.getDefaultBackend(queueOptions);
103
+ const requiredBackends = new Set();
104
+ this.jobBackendByName = new Map();
105
+ _.each(jobs, (job) => {
106
+ const backend = this.getBackendForJob(job);
107
+ this.jobBackendByName.set(job.name, backend);
108
+ requiredBackends.add(backend);
128
109
  });
110
+ if (requiredBackends.size === 0) {
111
+ requiredBackends.add(this.defaultBackend);
112
+ }
113
+ this.agendas = {};
114
+ if (requiredBackends.has('mongodb')) {
115
+ this.agendas.mongodb = await this.createAgendaForBackend('mongodb', queueOptions, dbManager);
116
+ }
117
+ if (requiredBackends.has('sqs')) {
118
+ this.agendas.sqs = await this.createAgendaForBackend('sqs', queueOptions, dbManager);
119
+ }
120
+ this.agenda = this.agendas.mongodb ?? this.agendas[this.defaultBackend] ?? this.agendas.sqs;
121
+ this.queueInitialized = true;
122
+ this.defineJobs(jobs, this);
123
+ sails.log.verbose('AgendaQueue:: All jobs defined.');
124
+ const activeAgendas = Object.values(this.agendas).filter((agenda) => !_.isNil(agenda));
125
+ if (this.agendas.mongodb) {
126
+ this.registerAgendaEvents(this.agendas.mongodb, 'mongodb');
127
+ }
128
+ if (this.agendas.sqs) {
129
+ this.registerAgendaEvents(this.agendas.sqs, 'sqs');
130
+ }
131
+ await Promise.all(activeAgendas.map((agenda) => agenda.start()));
132
+ if (this.agendas.mongodb) {
133
+ await this.createMongoIndexes(dbManager, queueOptions);
134
+ }
135
+ this.runConfiguredStartupSchedules(jobs);
136
+ }
137
+ hasQueueRuntimeState() {
138
+ return this.queueInitialized || this.jobBackendByName.size > 0 || Object.keys(this.agendas).length > 0;
139
+ }
140
+ async ensureQueueInitialized() {
141
+ if (!this.hasQueueRuntimeState()) {
142
+ await this.handleReady();
143
+ }
129
144
  }
130
145
  /*
131
146
  define the jobs... structure is:
@@ -152,11 +167,12 @@ var Services;
152
167
  sails.log.error(JSON.stringify(job));
153
168
  }
154
169
  else {
170
+ const agenda = ref.getAgendaForBackend(ref.getBackendForJob(job));
155
171
  if (_.isEmpty(job.options)) {
156
- ref.agenda.define(job.name, serviceFn);
172
+ agenda.define(job.name, serviceFn);
157
173
  }
158
174
  else {
159
- ref.agenda.define(job.name, serviceFn, job.options);
175
+ agenda.define(job.name, serviceFn, job.options);
160
176
  }
161
177
  sails.log.verbose(`AgendaQueue:: Defined job:`);
162
178
  sails.log.verbose(JSON.stringify(job));
@@ -164,15 +180,18 @@ var Services;
164
180
  });
165
181
  }
166
182
  defineJob(name, options, serviceFn) {
167
- if (!this.agenda) {
183
+ const backend = this.jobBackendByName.get(name) ?? this.defaultBackend;
184
+ const agenda = this.agendas[backend] ?? this.agenda;
185
+ if (!agenda) {
168
186
  sails.log.error(`AgendaQueue:: defineJob called before init for job: ${name}`);
169
187
  return;
170
188
  }
189
+ this.jobBackendByName.set(name, backend);
171
190
  if (_.isEmpty(options)) {
172
- this.agenda.define(name, serviceFn);
191
+ agenda.define(name, serviceFn);
173
192
  }
174
193
  else {
175
- this.agenda.define(name, serviceFn, options);
194
+ agenda.define(name, serviceFn, options);
176
195
  }
177
196
  sails.log.verbose(`AgendaQueue:: Defined job: ${name}`);
178
197
  }
@@ -184,42 +203,253 @@ var Services;
184
203
  */
185
204
  async moveCompletedJobsToHistory(_job) {
186
205
  const dbManager = User.getDatastore().manager;
187
- const collectionName = String(_.get(sails.config.agendaQueue, 'collection', 'agendaJobs'));
188
- await dbManager.collection(collectionName).find({ nextRunAt: null }).forEach(async (doc) => {
189
- await dbManager.collection(`${collectionName}History`).insertOne(doc);
190
- await dbManager.collection(collectionName).deleteOne({ _id: doc._id });
191
- });
206
+ const collectionName = String(_.get(sails.config.agendaQueue, 'options.collection', 'agendaJobs'));
207
+ const jobsCollection = dbManager.collection(collectionName);
208
+ const historyCollection = dbManager.collection(`${collectionName}History`);
209
+ const completedJobs = await jobsCollection.find({ nextRunAt: null }).toArray();
210
+ for (const doc of completedJobs) {
211
+ await historyCollection.replaceOne({ _id: doc._id }, doc, { upsert: true });
212
+ await jobsCollection.deleteOne({ _id: doc._id });
213
+ }
192
214
  sails.log.verbose(`moveCompletedJobsToHistory:: Moved completed jobs to history`);
193
215
  }
194
- setOptionIfDefined(agendaOpts, optionName, optionVal) {
195
- if (!_.isEmpty(optionVal)) {
196
- _.set(agendaOpts, optionName, optionVal);
216
+ getDefaultBackend(options) {
217
+ return options.backend ?? 'mongodb';
218
+ }
219
+ getBackendForJob(job) {
220
+ if (job.backend === 'mongodb' || job.backend === 'sqs') {
221
+ return job.backend;
222
+ }
223
+ return this.defaultBackend;
224
+ }
225
+ getBackendForJobName(jobName) {
226
+ const backend = this.jobBackendByName.get(jobName);
227
+ if (_.isNil(backend)) {
228
+ throw new Error(`AgendaQueue:: Unknown job '${jobName}'. Define it in sails.config.agendaQueue.jobs before queuing it.`);
229
+ }
230
+ return backend;
231
+ }
232
+ getAgendaForBackend(backend) {
233
+ const agenda = this.agendas[backend];
234
+ if (_.isNil(agenda)) {
235
+ throw new Error(`AgendaQueue:: No Agenda instance is configured for backend '${backend}'.`);
236
+ }
237
+ return agenda;
238
+ }
239
+ getAgendaForJobName(jobName) {
240
+ return this.getAgendaForBackend(this.getBackendForJobName(jobName));
241
+ }
242
+ ensureRecurringScheduleSupported(jobName) {
243
+ if (this.getBackendForJobName(jobName) === 'sqs') {
244
+ throw new AgendaQueueUnsupportedFeatureError(`AgendaQueue:: every() is not supported for SQS-backed job '${jobName}'. ${EXTERNAL_SCHEDULER_GUIDANCE}`);
245
+ }
246
+ }
247
+ toSerializableJobData(value, seen = new WeakSet()) {
248
+ if (_.isNil(value) || typeof value !== 'object') {
249
+ return value;
250
+ }
251
+ if (value instanceof Date || Buffer.isBuffer(value)) {
252
+ return value;
253
+ }
254
+ const bsonLikeValue = value;
255
+ if (_.isString(bsonLikeValue._bsontype)) {
256
+ if (typeof bsonLikeValue.toHexString === 'function') {
257
+ return bsonLikeValue.toHexString();
258
+ }
259
+ if (typeof bsonLikeValue.toJSON === 'function') {
260
+ return this.toSerializableJobData(bsonLikeValue.toJSON(), seen);
261
+ }
262
+ }
263
+ if (seen.has(value)) {
264
+ return undefined;
265
+ }
266
+ seen.add(value);
267
+ if (Array.isArray(value)) {
268
+ return value.map((item) => this.toSerializableJobData(item, seen));
269
+ }
270
+ return Object.fromEntries(Object.entries(value)
271
+ .map(([key, item]) => [key, this.toSerializableJobData(item, seen)])
272
+ .filter(([, item]) => !_.isUndefined(item)));
273
+ }
274
+ applyCommonAgendaOptions(agendaOptions, options) {
275
+ if (!_.isNil(options.defaultLockLifetime)) {
276
+ agendaOptions.defaultLockLifetime = options.defaultLockLifetime;
277
+ }
278
+ if (!_.isNil(options.processEvery)) {
279
+ agendaOptions.processEvery = options.processEvery;
280
+ }
281
+ }
282
+ async createAgendaForBackend(backend, options, dbManager) {
283
+ const { Agenda: AgendaConstructor } = await import('agenda');
284
+ const agendaOptions = {
285
+ backend: undefined
286
+ };
287
+ this.applyCommonAgendaOptions(agendaOptions, options);
288
+ if (backend === 'mongodb') {
289
+ const { MongoBackend } = await import('@agendajs/mongo-backend');
290
+ const datastoreUrl = _.get(sails.config, 'datastores.mongodb.url');
291
+ const address = typeof options.db === 'string' && options.db.length > 0
292
+ ? options.db
293
+ : typeof datastoreUrl === 'string' && datastoreUrl.length > 0
294
+ ? datastoreUrl
295
+ : undefined;
296
+ agendaOptions.backend = !_.isNil(address)
297
+ ? new MongoBackend({ address, collection: options.collection })
298
+ : new MongoBackend({ mongo: dbManager, collection: options.collection });
299
+ return new AgendaConstructor(agendaOptions);
300
+ }
301
+ const sqsOptions = options.sqs;
302
+ if (_.isNil(sqsOptions) || _.isEmpty(sqsOptions.queueUrl)) {
303
+ throw new Error('AgendaQueue:: SQS backend requires agendaQueue.options.sqs.queueUrl.');
304
+ }
305
+ const { SqsBackend } = await import('@researchdatabox/agenda-sqs-backend');
306
+ agendaOptions.backend = new SqsBackend({
307
+ queueUrl: sqsOptions.queueUrl,
308
+ region: sqsOptions.region,
309
+ waitTimeSeconds: sqsOptions.waitTimeSeconds,
310
+ receiveBatchSize: sqsOptions.maxMessagesPerPoll,
311
+ visibilityTimeoutSeconds: sqsOptions.visibilityTimeout,
312
+ fifo: sqsOptions.queueType === 'fifo'
313
+ ? {
314
+ enabled: true,
315
+ messageGroupId: sqsOptions.fifoMessageGroupId,
316
+ deduplicationIdStrategy: 'job-id'
317
+ }
318
+ : undefined
319
+ });
320
+ return new AgendaConstructor(agendaOptions);
321
+ }
322
+ registerAgendaEvents(agenda, backend) {
323
+ agenda.on('ready', () => {
324
+ sails.log.verbose(`AgendaQueue:: Started ${backend} backend.`);
325
+ });
326
+ agenda.on('error', (err) => {
327
+ sails.log.error(`AgendaQueue:: ${backend} backend error:`);
328
+ sails.log.error(err instanceof Error ? err.stack ?? err.message : JSON.stringify(err));
329
+ });
330
+ agenda.on('start', (job) => {
331
+ sails.log.verbose(`AgendaQueue:: [${backend}] Job ${job.attrs.name} starting`);
332
+ });
333
+ agenda.on('complete', (job) => {
334
+ sails.log.verbose(`AgendaQueue:: [${backend}] Job ${job.attrs.name} finished`);
335
+ });
336
+ agenda.on('fail', (err, job) => {
337
+ sails.log.error(`AgendaQueue:: [${backend}] Job ${job.attrs.name} failed`);
338
+ sails.log.error(err);
339
+ });
340
+ }
341
+ async createMongoIndexes(dbManager, options) {
342
+ const collectionName = String(options.collection ?? 'agendaJobs');
343
+ await dbManager.collection(collectionName).createIndex({ name: 1, disabled: 1, lockedAt: 1, nextRunAt: 1 });
344
+ await dbManager.collection(collectionName).createIndex({ name: -1, disabled: -1, lockedAt: -1, nextRunAt: -1 });
345
+ }
346
+ runConfiguredStartupSchedules(jobs) {
347
+ _.each(jobs, (job) => {
348
+ if (_.isEmpty(job.schedule)) {
349
+ return;
350
+ }
351
+ const method = job.schedule?.method;
352
+ const intervalOrSchedule = job.schedule?.intervalOrSchedule;
353
+ const data = job.schedule?.data;
354
+ const opts = job.schedule?.opts;
355
+ if (method === 'now') {
356
+ this.now(job.name, data);
357
+ return;
358
+ }
359
+ if (method === 'every' && intervalOrSchedule) {
360
+ this.every(job.name, intervalOrSchedule, data, opts);
361
+ return;
362
+ }
363
+ if (method === 'schedule' && intervalOrSchedule) {
364
+ this.schedule(job.name, intervalOrSchedule, data);
365
+ return;
366
+ }
367
+ sails.log.error('AgendaQueue:: incorrect job schedule definition, method not found:');
368
+ sails.log.error(JSON.stringify(job));
369
+ });
370
+ }
371
+ ensureScheduleSupported(jobName, schedule, data) {
372
+ if (this.getBackendForJobName(jobName) !== 'sqs') {
373
+ return;
374
+ }
375
+ const agenda = this.getAgendaForJobName(jobName);
376
+ const scheduledJob = agenda.create(jobName, data).schedule(schedule);
377
+ const nextRunAt = scheduledJob.attrs.nextRunAt;
378
+ if (!(nextRunAt instanceof Date) || Number.isNaN(nextRunAt.getTime())) {
379
+ throw new Error(`AgendaQueue:: schedule() received an invalid schedule for SQS-backed job '${jobName}'.`);
380
+ }
381
+ const delayMs = nextRunAt.getTime() - Date.now();
382
+ if (delayMs > 15 * 60 * 1000) {
383
+ throw new AgendaQueueUnsupportedFeatureError(`AgendaQueue:: schedule() only supports delays up to 15 minutes for SQS-backed job '${jobName}'.`);
197
384
  }
198
385
  }
386
+ queryTargetsSqsJobs(query) {
387
+ if (_.isNil(query) || _.isNil(query.name)) {
388
+ return false;
389
+ }
390
+ const nameQuery = query.name;
391
+ if (_.isString(nameQuery)) {
392
+ return this.jobBackendByName.get(nameQuery) === 'sqs';
393
+ }
394
+ if (_.isPlainObject(nameQuery)) {
395
+ const structuredNameQuery = nameQuery;
396
+ const supportedKeys = ['$in'];
397
+ const nameQueryKeys = Object.keys(structuredNameQuery);
398
+ const hasOnlySupportedKeys = nameQueryKeys.length > 0 && nameQueryKeys.every((key) => supportedKeys.includes(key));
399
+ if (!hasOnlySupportedKeys) {
400
+ throw new AgendaQueueUnsupportedFeatureError('AgendaQueue:: jobs() only supports name queries using an exact string or $in when SQS-backed jobs are configured.');
401
+ }
402
+ const inNames = structuredNameQuery.$in;
403
+ if (!Array.isArray(inNames) || !inNames.every((name) => _.isString(name))) {
404
+ throw new AgendaQueueUnsupportedFeatureError('AgendaQueue:: jobs() only supports name queries using an exact string or $in when SQS-backed jobs are configured.');
405
+ }
406
+ return inNames.some((name) => this.jobBackendByName.get(name) === 'sqs');
407
+ }
408
+ return false;
409
+ }
410
+ toJobsQueryOptions(query) {
411
+ if (_.isNil(query?.name)) {
412
+ return undefined;
413
+ }
414
+ if (_.isString(query.name)) {
415
+ return { name: query.name };
416
+ }
417
+ return { names: query.name.$in };
418
+ }
199
419
  async sampleFunctionToDemonstrateHowToDefineAJobFunction(job) {
200
420
  sails.log.info(`AgendaQueue:: sample function called by job: `);
201
421
  sails.log.info(JSON.stringify(job));
202
422
  }
203
423
  every(jobName, interval, data = undefined, options = undefined) {
204
- this.agenda.every(interval, jobName, data, options);
424
+ this.ensureRecurringScheduleSupported(jobName);
425
+ void this.getAgendaForJobName(jobName).every(interval, jobName, this.toSerializableJobData(data), options);
205
426
  }
206
427
  schedule(jobName, schedule, data = undefined) {
207
- this.agenda.schedule(schedule, jobName, data);
428
+ this.ensureScheduleSupported(jobName, schedule, data);
429
+ void this.getAgendaForJobName(jobName).schedule(schedule, jobName, this.toSerializableJobData(data));
208
430
  }
209
- now(jobName, data = undefined) {
210
- sails.log.verbose(`AgendaQueue:: Starting job: '${jobName}' now!`);
211
- try {
212
- this.agenda.now(jobName, data);
431
+ async now(jobName, data = undefined) {
432
+ if (!this.hasQueueRuntimeState()) {
433
+ await this.handleReady();
213
434
  }
214
- catch (e) {
435
+ sails.log.verbose(`AgendaQueue:: Starting job: '${jobName}' now!`);
436
+ const queuedJob = this.getAgendaForJobName(jobName).now(jobName, this.toSerializableJobData(data));
437
+ queuedJob.catch((e) => {
215
438
  sails.log.error(`AgendaQueue:: Failed to start job now: ${jobName}`);
216
439
  sails.log.error(e);
217
- }
440
+ });
441
+ return await queuedJob;
218
442
  }
219
- async jobs(query = {}, sort = {}, limit = 0, skip = 0) {
220
- return await this.agenda.jobs(query, sort, limit, skip);
443
+ async jobs(query) {
444
+ if (_.isNil(this.agendas.mongodb)) {
445
+ throw new AgendaQueueUnsupportedFeatureError('AgendaQueue:: jobs() is only supported when a MongoDB-backed agenda is configured.');
446
+ }
447
+ if (this.queryTargetsSqsJobs(query)) {
448
+ throw new AgendaQueueUnsupportedFeatureError('AgendaQueue:: jobs() is not supported for SQS-backed jobs.');
449
+ }
450
+ return await this.agendas.mongodb.queryJobs(this.toJobsQueryOptions(query));
221
451
  }
222
452
  }
223
453
  Services.AgendaQueue = AgendaQueue;
224
454
  })(Services || (exports.Services = Services = {}));
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbmRhUXVldWVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0FnZW5kYVF1ZXVlU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7OztBQUU5RCwwRkFBMEY7QUFDMUYsRUFBRTtBQUNGLDZCQUE2QjtBQUM3QiwwQkFBMEI7QUFDMUIsRUFBRTtBQUNGLHVFQUF1RTtBQUN2RSx1RUFBdUU7QUFDdkUsb0VBQW9FO0FBQ3BFLHNDQUFzQztBQUN0QyxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLGlFQUFpRTtBQUNqRSxnRUFBZ0U7QUFDaEUsK0NBQStDO0FBQy9DLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLDhEQUE4RDtBQUc5RCxnREFBc0Q7QUFHdEQsbUNBQTBDO0FBbUIxQyxJQUFpQixRQUFRLENBOEx4QjtBQTlMRCxXQUFpQixRQUFRO0lBQ3ZCOzs7T0FHRztJQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87UUFDakMsZ0JBQWdCLEdBQWE7WUFDOUMsT0FBTztZQUNQLFVBQVU7WUFDVixLQUFLO1lBQ0wsTUFBTTtZQUNOLG9EQUFvRDtZQUNwRCxXQUFXO1lBQ1gsNEJBQTRCO1lBQzVCLE1BQU07U0FDUCxDQUFDO1FBRVEsTUFBTSxDQUFVO1FBRTFCO1lBQ0UsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDYSxLQUFL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
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbmRhUXVldWVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0FnZW5kYVF1ZXVlU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7OztBQUU5RCwwRkFBMEY7QUFDMUYsRUFBRTtBQUNGLDZCQUE2QjtBQUM3QiwwQkFBMEI7QUFDMUIsRUFBRTtBQUNGLHVFQUF1RTtBQUN2RSx1RUFBdUU7QUFDdkUsb0VBQW9FO0FBQ3BFLHNDQUFzQztBQUN0QyxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLGlFQUFpRTtBQUNqRSxnRUFBZ0U7QUFDaEUsK0NBQStDO0FBQy9DLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLDhEQUE4RDtBQUc5RCxnREFBc0Q7QUFvQnRELE1BQWEsa0NBQW1DLFNBQVEsS0FBSztJQUMzRCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxvQ0FBb0MsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFMRCxnRkFLQztBQUdELElBQWlCLFFBQVEsQ0EyZHhCO0FBM2RELFdBQWlCLFFBQVE7SUFDdkIsTUFBTSwyQkFBMkIsR0FBRywwREFBMEQsQ0FBQztJQUUvRjs7O09BR0c7SUFDSCxNQUFhLFdBQVksU0FBUSxzQkFBUSxDQUFDLElBQUksQ0FBQyxPQUFPO1FBQ2pDLGdCQUFnQixHQUFhO1lBQzlDLE9BQU87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
@@ -0,0 +1,34 @@
1
+ import { Services as services } from '../CoreService';
2
+ import { AttachmentAccessAuditAttributes, AttachmentMetadataAttributes } from '../waterline-models';
3
+ export declare namespace Services {
4
+ type AttachmentAccessAction = 'access' | 'download' | 'list' | 'upload' | 'remove';
5
+ type AttachmentMetadataInput = Omit<AttachmentMetadataAttributes, 'id' | 'createdAt' | 'updatedAt'>;
6
+ type AttachmentAccessAuditInput = Omit<AttachmentAccessAuditAttributes, 'id' | 'createdAt' | 'updatedAt'>;
7
+ type AttachmentAccessEvent = {
8
+ oid: string;
9
+ fileId?: string;
10
+ storageKey?: string;
11
+ action: AttachmentAccessAction;
12
+ accessedBy?: string;
13
+ itemCount?: number;
14
+ };
15
+ class AttachmentMetadataService extends services.Core.Service {
16
+ protected _exportedMethods: string[];
17
+ protected logHeader: string;
18
+ upsert(row: AttachmentMetadataInput): Promise<void>;
19
+ findByOid(oid: string): Promise<AttachmentMetadataAttributes[]>;
20
+ findOneByStorageKey(storageKey: string): Promise<AttachmentMetadataAttributes | undefined>;
21
+ deleteByStorageKey(storageKey: string): Promise<void>;
22
+ recordAccess(event: AttachmentAccessEvent): Promise<void>;
23
+ private shouldIncrementAccessCount;
24
+ private normalizeMetadataRow;
25
+ private normalizeAccessEvent;
26
+ private optionalString;
27
+ private optionalNumber;
28
+ private optionalDateString;
29
+ }
30
+ }
31
+ declare global {
32
+ let AttachmentMetadataService: Services.AttachmentMetadataService;
33
+ }
34
+ //# sourceMappingURL=AttachmentMetadataService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentMetadataService.d.ts","sourceRoot":"","sources":["../../src/services/AttachmentMetadataService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEpG,yBAAiB,QAAQ,CAAC;IACxB,KAAY,sBAAsB,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1F,KAAY,uBAAuB,GAAG,IAAI,CAAC,4BAA4B,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;IAC3G,KAAY,0BAA0B,GAAG,IAAI,CAAC,+BAA+B,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;IACjH,KAAY,qBAAqB,GAAG;QAClC,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,sBAAsB,CAAC;QAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,MAAa,yBAA0B,SAAQ,QAAQ,CAAC,IAAI,CAAC,OAAO;QAClE,UAAmB,gBAAgB,EAAE,MAAM,EAAE,CAM3C;QAEF,UAAmB,SAAS,EAAE,MAAM,CAAiC;QAExD,MAAM,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;QAoBnD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,EAAE,CAAC;QAQ/D,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAQ1F,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAQrD,YAAY,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;QA2BtE,OAAO,CAAC,0BAA0B;QAIlC,OAAO,CAAC,oBAAoB;QAmB5B,OAAO,CAAC,oBAAoB;QAY5B,OAAO,CAAC,cAAc;QAKtB,OAAO,CAAC,cAAc;QAQtB,OAAO,CAAC,kBAAkB;KAO3B;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB,CAAC;CACnE"}