@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.
- package/dist/Attachment.d.ts +17 -0
- package/dist/Attachment.d.ts.map +1 -0
- package/dist/Attachment.js +40 -0
- package/dist/CoreController.d.ts +202 -0
- package/dist/CoreController.d.ts.map +1 -0
- package/dist/CoreController.js +688 -0
- package/dist/CoreService.d.ts +95 -0
- package/dist/CoreService.d.ts.map +1 -0
- package/dist/CoreService.js +295 -0
- package/dist/Datastream.d.ts +11 -0
- package/dist/Datastream.d.ts.map +1 -0
- package/dist/Datastream.js +38 -0
- package/dist/DatastreamService.d.ts +19 -0
- package/dist/DatastreamService.d.ts.map +1 -0
- package/dist/DatastreamService.js +3 -0
- package/dist/DatastreamServiceResponse.d.ts +12 -0
- package/dist/DatastreamServiceResponse.d.ts.map +1 -0
- package/dist/DatastreamServiceResponse.js +37 -0
- package/dist/IntegrationAuditParams.d.ts.map +1 -0
- package/dist/Logger.d.ts +16 -0
- package/dist/Logger.d.ts.map +1 -0
- package/dist/Logger.js +3 -0
- package/dist/QueueService.d.ts +9 -0
- package/dist/QueueService.d.ts.map +1 -0
- package/dist/QueueService.js +21 -0
- package/dist/RecordAuditParams.d.ts +6 -0
- package/dist/RecordAuditParams.d.ts.map +1 -0
- package/dist/RecordAuditParams.js +10 -0
- package/dist/RecordsService.d.ts +39 -0
- package/dist/RecordsService.d.ts.map +1 -0
- package/dist/RecordsService.js +3 -0
- package/dist/SearchService.d.ts +8 -0
- package/dist/SearchService.d.ts.map +1 -0
- package/dist/SearchService.js +3 -0
- package/dist/StorageService.d.ts +27 -0
- package/dist/StorageService.d.ts.map +1 -0
- package/dist/StorageService.js +3 -0
- package/dist/StorageServiceResponse.d.ts +16 -0
- package/dist/StorageServiceResponse.d.ts.map +1 -0
- package/dist/StorageServiceResponse.js +41 -0
- package/dist/bootstrap.d.ts +32 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +172 -0
- package/dist/config/action.config.d.ts +13 -0
- package/dist/config/action.config.d.ts.map +1 -0
- package/dist/config/action.config.js +9 -0
- package/dist/config/agendaQueue.config.d.ts +49 -0
- package/dist/config/agendaQueue.config.d.ts.map +1 -0
- package/dist/config/agendaQueue.config.js +71 -0
- package/dist/config/api.config.d.ts +9 -0
- package/dist/config/api.config.d.ts.map +1 -0
- package/dist/config/api.config.js +11 -0
- package/dist/config/appmode.config.d.ts +12 -0
- package/dist/config/appmode.config.d.ts.map +1 -0
- package/dist/config/appmode.config.js +12 -0
- package/dist/config/auth.config.d.ts +15 -0
- package/dist/config/auth.config.d.ts.map +1 -0
- package/dist/config/auth.config.js +81 -0
- package/dist/config/autoreload.config.d.ts +18 -0
- package/dist/config/autoreload.config.d.ts.map +1 -0
- package/dist/config/autoreload.config.js +21 -0
- package/dist/config/blueprints.config.d.ts +28 -0
- package/dist/config/blueprints.config.d.ts.map +1 -0
- package/dist/config/blueprints.config.js +15 -0
- package/dist/config/bootstrap.config.d.ts +15 -0
- package/dist/config/bootstrap.config.d.ts.map +1 -0
- package/dist/config/bootstrap.config.js +12 -0
- package/dist/config/branding.config.d.ts +19 -0
- package/dist/config/branding.config.d.ts.map +1 -0
- package/dist/config/branding.config.js +109 -0
- package/dist/config/brandingConfigurationDefaults.config.d.ts +134 -0
- package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -0
- package/dist/config/brandingConfigurationDefaults.config.js +283 -0
- package/dist/config/companion.config.d.ts +41 -0
- package/dist/config/companion.config.d.ts.map +1 -0
- package/dist/config/companion.config.js +61 -0
- package/dist/config/cors.config.d.ts +22 -0
- package/dist/config/cors.config.d.ts.map +1 -0
- package/dist/config/cors.config.js +11 -0
- package/dist/config/crontab.config.d.ts +22 -0
- package/dist/config/crontab.config.d.ts.map +1 -0
- package/dist/config/crontab.config.js +18 -0
- package/dist/config/csp.config.d.ts +53 -0
- package/dist/config/csp.config.d.ts.map +1 -0
- package/dist/config/csp.config.js +32 -0
- package/dist/config/custom.config.d.ts +16 -0
- package/dist/config/custom.config.d.ts.map +1 -0
- package/dist/config/custom.config.js +22 -0
- package/dist/config/custom_cache.config.d.ts +14 -0
- package/dist/config/custom_cache.config.d.ts.map +1 -0
- package/dist/config/custom_cache.config.js +13 -0
- package/dist/config/dashboardtype.config.d.ts +45 -0
- package/dist/config/dashboardtype.config.d.ts.map +1 -0
- package/dist/config/dashboardtype.config.js +98 -0
- package/dist/config/datacite.config.d.ts +51 -0
- package/dist/config/datacite.config.d.ts.map +1 -0
- package/dist/config/datacite.config.js +44 -0
- package/dist/config/datapubs.config.d.ts +72 -0
- package/dist/config/datapubs.config.d.ts.map +1 -0
- package/dist/config/datapubs.config.js +74 -0
- package/dist/config/datastores.config.d.ts +20 -0
- package/dist/config/datastores.config.d.ts.map +1 -0
- package/dist/config/datastores.config.js +21 -0
- package/dist/config/dompurify.config.d.ts +65 -0
- package/dist/config/dompurify.config.d.ts.map +1 -0
- package/dist/config/dompurify.config.js +181 -0
- package/dist/config/dynamicasset.config.d.ts +13 -0
- package/dist/config/dynamicasset.config.d.ts.map +1 -0
- package/dist/config/dynamicasset.config.js +18 -0
- package/dist/config/dynamicconfig.config.d.ts +12 -0
- package/dist/config/dynamicconfig.config.d.ts.map +1 -0
- package/dist/config/dynamicconfig.config.js +13 -0
- package/dist/config/emailnotification.config.d.ts +49 -0
- package/dist/config/emailnotification.config.d.ts.map +1 -0
- package/dist/config/emailnotification.config.js +37 -0
- package/dist/config/figshareAPI.config.d.ts +116 -0
- package/dist/config/figshareAPI.config.d.ts.map +1 -0
- package/dist/config/figshareAPI.config.js +857 -0
- package/dist/config/figshareAPIEnv.config.d.ts +11 -0
- package/dist/config/figshareAPIEnv.config.d.ts.map +1 -0
- package/dist/config/figshareAPIEnv.config.js +13 -0
- package/dist/config/figshareDev.config.d.ts.map +1 -0
- package/dist/config/figshareRedboxFORMapping.config.d.ts +15 -0
- package/dist/config/figshareRedboxFORMapping.config.d.ts.map +1 -0
- package/dist/config/figshareRedboxFORMapping.config.js +7458 -0
- package/dist/config/form.config.d.ts +20 -0
- package/dist/config/form.config.d.ts.map +1 -0
- package/dist/config/form.config.js +11 -0
- package/dist/config/globals.config.d.ts +20 -0
- package/dist/config/globals.config.d.ts.map +1 -0
- package/dist/config/globals.config.js +52 -0
- package/dist/config/http.config.d.ts +57 -0
- package/dist/config/http.config.d.ts.map +1 -0
- package/dist/config/http.config.js +462 -0
- package/dist/config/i18n.config.d.ts +38 -0
- package/dist/config/i18n.config.d.ts.map +1 -0
- package/dist/config/i18n.config.js +30 -0
- package/dist/config/index.d.ts +306 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +240 -0
- package/dist/config/jsonld.config.d.ts +19 -0
- package/dist/config/jsonld.config.d.ts.map +1 -0
- package/dist/config/jsonld.config.js +33 -0
- package/dist/config/log.config.d.ts +20 -0
- package/dist/config/log.config.d.ts.map +1 -0
- package/dist/config/log.config.js +157 -0
- package/dist/config/lognamespace.config.d.ts +13 -0
- package/dist/config/lognamespace.config.d.ts.map +1 -0
- package/dist/config/lognamespace.config.js +17 -0
- package/dist/config/mint.config.d.ts +23 -0
- package/dist/config/mint.config.d.ts.map +1 -0
- package/dist/config/mint.config.js +20 -0
- package/dist/config/models.config.d.ts +37 -0
- package/dist/config/models.config.d.ts.map +1 -0
- package/dist/config/models.config.js +23 -0
- package/dist/config/namedQuery.config.d.ts +26 -0
- package/dist/config/namedQuery.config.d.ts.map +1 -0
- package/dist/config/namedQuery.config.js +358 -0
- package/dist/config/ng2.config.d.ts +11 -0
- package/dist/config/ng2.config.d.ts.map +1 -0
- package/dist/config/ng2.config.js +12 -0
- package/dist/config/orcid.config.d.ts +12 -0
- package/dist/config/orcid.config.d.ts.map +1 -0
- package/dist/config/orcid.config.js +13 -0
- package/dist/config/orm.config.d.ts +12 -0
- package/dist/config/orm.config.d.ts.map +1 -0
- package/dist/config/orm.config.js +13 -0
- package/dist/config/peopleSearch.config.d.ts +14 -0
- package/dist/config/peopleSearch.config.d.ts.map +1 -0
- package/dist/config/peopleSearch.config.js +15 -0
- package/dist/config/policies.config.d.ts +18 -0
- package/dist/config/policies.config.d.ts.map +1 -0
- package/dist/config/policies.config.js +65 -0
- package/dist/config/queue.config.d.ts +12 -0
- package/dist/config/queue.config.d.ts.map +1 -0
- package/dist/config/queue.config.js +13 -0
- package/dist/config/raid.config.d.ts +66 -0
- package/dist/config/raid.config.d.ts.map +1 -0
- package/dist/config/raid.config.js +272 -0
- package/dist/config/record.config.d.ts +74 -0
- package/dist/config/record.config.d.ts.map +1 -0
- package/dist/config/record.config.js +104 -0
- package/dist/config/recordtype.config.d.ts +66 -0
- package/dist/config/recordtype.config.d.ts.map +1 -0
- package/dist/config/recordtype.config.js +660 -0
- package/dist/config/redboxSession.config.d.ts +29 -0
- package/dist/config/redboxSession.config.d.ts.map +1 -0
- package/dist/config/redboxSession.config.js +14 -0
- package/dist/config/redboxToCkan.config.d.ts +17 -0
- package/dist/config/redboxToCkan.config.d.ts.map +1 -0
- package/dist/config/redboxToCkan.config.js +18 -0
- package/dist/config/relatedObjectsFormDefinition.config.d.ts.map +1 -0
- package/dist/config/report.config.d.ts +46 -0
- package/dist/config/report.config.d.ts.map +1 -0
- package/dist/config/report.config.js +54 -0
- package/dist/config/reusableContributorFormDefinitions.config.d.ts +3 -0
- package/dist/config/reusableContributorFormDefinitions.config.d.ts.map +1 -0
- package/dist/config/reusableContributorFormDefinitions.config.js +408 -0
- package/dist/config/reusableFormDefinitions.config.d.ts +16 -0
- package/dist/config/reusableFormDefinitions.config.d.ts.map +1 -0
- package/dist/config/reusableFormDefinitions.config.js +41 -0
- package/dist/config/reusableRelatedObjectsFormDefinitions.config.d.ts +22 -0
- package/dist/config/reusableRelatedObjectsFormDefinitions.config.d.ts.map +1 -0
- package/dist/config/reusableRelatedObjectsFormDefinitions.config.js +291 -0
- package/dist/config/reusableViewFormDefinitions.config.d.ts +3 -0
- package/dist/config/reusableViewFormDefinitions.config.d.ts.map +1 -0
- package/dist/config/reusableViewFormDefinitions.config.js +140 -0
- package/dist/config/routes.config.d.ts +21 -0
- package/dist/config/routes.config.d.ts.map +1 -0
- package/dist/config/routes.config.js +389 -0
- package/dist/config/search.config.d.ts +9 -0
- package/dist/config/search.config.d.ts.map +1 -0
- package/dist/config/search.config.js +11 -0
- package/dist/config/security.config.d.ts +22 -0
- package/dist/config/security.config.d.ts.map +1 -0
- package/dist/config/security.config.js +14 -0
- package/dist/config/session.config.d.ts +37 -0
- package/dist/config/session.config.d.ts.map +1 -0
- package/dist/config/session.config.js +11 -0
- package/dist/config/sockets.config.d.ts +17 -0
- package/dist/config/sockets.config.d.ts.map +1 -0
- package/dist/config/sockets.config.js +12 -0
- package/dist/config/solr.config.d.ts +73 -0
- package/dist/config/solr.config.d.ts.map +1 -0
- package/dist/config/solr.config.js +79 -0
- package/dist/config/static_assets.config.d.ts +10 -0
- package/dist/config/static_assets.config.d.ts.map +1 -0
- package/dist/config/static_assets.config.js +12 -0
- package/dist/config/storage.config.d.ts +42 -0
- package/dist/config/storage.config.d.ts.map +1 -0
- package/dist/config/storage.config.js +30 -0
- package/dist/config/typescript.config.d.ts +12 -0
- package/dist/config/typescript.config.d.ts.map +1 -0
- package/dist/config/typescript.config.js +13 -0
- package/dist/config/validators.config.d.ts +13 -0
- package/dist/config/validators.config.d.ts.map +1 -0
- package/dist/config/validators.config.js +15 -0
- package/dist/config/views.config.d.ts +20 -0
- package/dist/config/views.config.d.ts.map +1 -0
- package/dist/config/views.config.js +20 -0
- package/dist/config/vocab.config.d.ts +58 -0
- package/dist/config/vocab.config.d.ts.map +1 -0
- package/dist/config/vocab.config.js +58 -0
- package/dist/config/webpack.config.d.ts +16 -0
- package/dist/config/webpack.config.d.ts.map +1 -0
- package/dist/config/webpack.config.js +153 -0
- package/dist/config/workflow.config.d.ts +76 -0
- package/dist/config/workflow.config.d.ts.map +1 -0
- package/dist/config/workflow.config.js +339 -0
- package/dist/config/workspacetype.config.d.ts +23 -0
- package/dist/config/workspacetype.config.d.ts.map +1 -0
- package/dist/config/workspacetype.config.js +19 -0
- package/dist/configmodels/AdminSidebarConfig.d.ts +352 -0
- package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -0
- package/dist/configmodels/AdminSidebarConfig.js +163 -0
- package/dist/configmodels/AppConfig.interface.d.ts +4 -0
- package/dist/configmodels/AppConfig.interface.d.ts.map +1 -0
- package/dist/configmodels/AppConfig.interface.js +10 -0
- package/dist/configmodels/AuthorizedDomainsEmails.d.ts +43 -0
- package/dist/configmodels/AuthorizedDomainsEmails.d.ts.map +1 -0
- package/dist/configmodels/AuthorizedDomainsEmails.js +49 -0
- package/dist/configmodels/ConfigModels.d.ts +22 -0
- package/dist/configmodels/ConfigModels.d.ts.map +1 -0
- package/dist/configmodels/ConfigModels.js +98 -0
- package/dist/configmodels/DoiPublishing.d.ts.map +1 -0
- package/dist/configmodels/FigsharePublishing.d.ts.map +1 -0
- package/dist/configmodels/HomePanelConfig.d.ts +244 -0
- package/dist/configmodels/HomePanelConfig.d.ts.map +1 -0
- package/dist/configmodels/HomePanelConfig.js +132 -0
- package/dist/configmodels/MenuConfig.d.ts +203 -0
- package/dist/configmodels/MenuConfig.d.ts.map +1 -0
- package/dist/configmodels/MenuConfig.js +158 -0
- package/dist/configmodels/SystemMessage.d.ts +24 -0
- package/dist/configmodels/SystemMessage.d.ts.map +1 -0
- package/dist/configmodels/SystemMessage.js +30 -0
- package/dist/controllers/ActionController.d.ts +21 -0
- package/dist/controllers/ActionController.d.ts.map +1 -0
- package/dist/controllers/ActionController.js +41 -0
- package/dist/controllers/AdminController.d.ts +45 -0
- package/dist/controllers/AdminController.d.ts.map +1 -0
- package/dist/controllers/AdminController.js +498 -0
- package/dist/controllers/AppConfigController.d.ts +25 -0
- package/dist/controllers/AppConfigController.d.ts.map +1 -0
- package/dist/controllers/AppConfigController.js +90 -0
- package/dist/controllers/AsynchController.d.ts +30 -0
- package/dist/controllers/AsynchController.d.ts.map +1 -0
- package/dist/controllers/AsynchController.js +146 -0
- package/dist/controllers/BrandingAppController.d.ts +21 -0
- package/dist/controllers/BrandingAppController.d.ts.map +1 -0
- package/dist/controllers/BrandingAppController.js +144 -0
- package/dist/controllers/BrandingController.d.ts +64 -0
- package/dist/controllers/BrandingController.d.ts.map +1 -0
- package/dist/controllers/BrandingController.js +256 -0
- package/dist/controllers/DynamicAssetController.d.ts +67 -0
- package/dist/controllers/DynamicAssetController.d.ts.map +1 -0
- package/dist/controllers/DynamicAssetController.js +225 -0
- package/dist/controllers/EmailController.d.ts +35 -0
- package/dist/controllers/EmailController.d.ts.map +1 -0
- package/dist/controllers/EmailController.js +138 -0
- package/dist/controllers/ExportController.d.ts +22 -0
- package/dist/controllers/ExportController.d.ts.map +1 -0
- package/dist/controllers/ExportController.js +73 -0
- package/dist/controllers/FormVocabularyController.d.ts +12 -0
- package/dist/controllers/FormVocabularyController.d.ts.map +1 -0
- package/dist/controllers/FormVocabularyController.js +218 -0
- package/dist/controllers/RecordAuditController.d.ts +25 -0
- package/dist/controllers/RecordAuditController.d.ts.map +1 -0
- package/dist/controllers/RecordAuditController.js +74 -0
- package/dist/controllers/RecordController.d.ts +114 -0
- package/dist/controllers/RecordController.d.ts.map +1 -0
- package/dist/controllers/RecordController.js +1614 -0
- package/dist/controllers/RenderViewController.d.ts +14 -0
- package/dist/controllers/RenderViewController.d.ts.map +1 -0
- package/dist/controllers/RenderViewController.js +30 -0
- package/dist/controllers/ReportController.d.ts +25 -0
- package/dist/controllers/ReportController.d.ts.map +1 -0
- package/dist/controllers/ReportController.js +80 -0
- package/dist/controllers/ReportsController.d.ts +22 -0
- package/dist/controllers/ReportsController.d.ts.map +1 -0
- package/dist/controllers/ReportsController.js +37 -0
- package/dist/controllers/TranslationController.d.ts +27 -0
- package/dist/controllers/TranslationController.d.ts.map +1 -0
- package/dist/controllers/TranslationController.js +245 -0
- package/dist/controllers/UserController.d.ts +50 -0
- package/dist/controllers/UserController.d.ts.map +1 -0
- package/dist/controllers/UserController.js +518 -0
- package/dist/controllers/VocabController.d.ts +43 -0
- package/dist/controllers/VocabController.d.ts.map +1 -0
- package/dist/controllers/VocabController.js +190 -0
- package/dist/controllers/VocabularyController.d.ts +23 -0
- package/dist/controllers/VocabularyController.d.ts.map +1 -0
- package/dist/controllers/VocabularyController.js +344 -0
- package/dist/controllers/WorkspaceAsyncController.d.ts +18 -0
- package/dist/controllers/WorkspaceAsyncController.d.ts.map +1 -0
- package/dist/controllers/WorkspaceAsyncController.js +63 -0
- package/dist/controllers/WorkspaceTypesController.d.ts +19 -0
- package/dist/controllers/WorkspaceTypesController.d.ts.map +1 -0
- package/dist/controllers/WorkspaceTypesController.js +96 -0
- package/dist/controllers/index.d.ts +8 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +159 -0
- package/dist/controllers/webservice/AdminController.d.ts +20 -0
- package/dist/controllers/webservice/AdminController.d.ts.map +1 -0
- package/dist/controllers/webservice/AdminController.js +83 -0
- package/dist/controllers/webservice/AppConfigController.d.ts +25 -0
- package/dist/controllers/webservice/AppConfigController.d.ts.map +1 -0
- package/dist/controllers/webservice/AppConfigController.js +72 -0
- package/dist/controllers/webservice/BrandingController.d.ts +13 -0
- package/dist/controllers/webservice/BrandingController.d.ts.map +1 -0
- package/dist/controllers/webservice/BrandingController.js +147 -0
- package/dist/controllers/webservice/ExportController.d.ts +22 -0
- package/dist/controllers/webservice/ExportController.d.ts.map +1 -0
- package/dist/controllers/webservice/ExportController.js +67 -0
- package/dist/controllers/webservice/FormManagementController.d.ts +24 -0
- package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -0
- package/dist/controllers/webservice/FormManagementController.js +79 -0
- package/dist/controllers/webservice/IntegrationAuditController.d.ts.map +1 -0
- package/dist/controllers/webservice/RecordController.d.ts +65 -0
- package/dist/controllers/webservice/RecordController.d.ts.map +1 -0
- package/dist/controllers/webservice/RecordController.js +1348 -0
- package/dist/controllers/webservice/RecordTypeController.d.ts +24 -0
- package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -0
- package/dist/controllers/webservice/RecordTypeController.js +70 -0
- package/dist/controllers/webservice/ReportController.d.ts +22 -0
- package/dist/controllers/webservice/ReportController.d.ts.map +1 -0
- package/dist/controllers/webservice/ReportController.js +74 -0
- package/dist/controllers/webservice/SearchController.d.ts +28 -0
- package/dist/controllers/webservice/SearchController.d.ts.map +1 -0
- package/dist/controllers/webservice/SearchController.js +123 -0
- package/dist/controllers/webservice/TranslationController.d.ts +18 -0
- package/dist/controllers/webservice/TranslationController.d.ts.map +1 -0
- package/dist/controllers/webservice/TranslationController.js +226 -0
- package/dist/controllers/webservice/UserManagementController.d.ts +38 -0
- package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -0
- package/dist/controllers/webservice/UserManagementController.js +608 -0
- package/dist/controllers/webservice/VocabularyController.d.ts +18 -0
- package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -0
- package/dist/controllers/webservice/VocabularyController.js +172 -0
- package/dist/decorator/PopulateExportedMethods.decorator.d.ts +4 -0
- package/dist/decorator/PopulateExportedMethods.decorator.d.ts.map +1 -0
- package/dist/decorator/PopulateExportedMethods.decorator.js +22 -0
- package/dist/decorator/index.d.ts +2 -0
- package/dist/decorator/index.d.ts.map +1 -0
- package/dist/decorator/index.js +6 -0
- package/dist/decorators/Associations.d.ts +4 -0
- package/dist/decorators/Associations.d.ts.map +1 -0
- package/dist/decorators/Associations.js +12 -0
- package/dist/decorators/Attr.d.ts +4 -0
- package/dist/decorators/Attr.d.ts.map +1 -0
- package/dist/decorators/Attr.js +34 -0
- package/dist/decorators/Entity.d.ts +3 -0
- package/dist/decorators/Entity.d.ts.map +1 -0
- package/dist/decorators/Entity.js +29 -0
- package/dist/decorators/Lifecycle.d.ts +10 -0
- package/dist/decorators/Lifecycle.d.ts.map +1 -0
- package/dist/decorators/Lifecycle.js +26 -0
- package/dist/decorators/index.d.ts +8 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +35 -0
- package/dist/decorators/registry.d.ts +8 -0
- package/dist/decorators/registry.d.ts.map +1 -0
- package/dist/decorators/registry.js +68 -0
- package/dist/decorators/types.d.ts +81 -0
- package/dist/decorators/types.d.ts.map +1 -0
- package/dist/decorators/types.js +4 -0
- package/dist/decorators/utils.d.ts +5 -0
- package/dist/decorators/utils.d.ts.map +1 -0
- package/dist/decorators/utils.js +68 -0
- package/dist/form-config/dataPublication-1.0-draft.d.ts.map +1 -0
- package/dist/form-config/dataPublication-1.0-embargoed.d.ts.map +1 -0
- package/dist/form-config/dataPublication-1.0-published.d.ts.map +1 -0
- package/dist/form-config/dataPublication-1.0-queued.d.ts.map +1 -0
- package/dist/form-config/dataPublication-1.0-retired.d.ts.map +1 -0
- package/dist/form-config/dataRecord-1.0-draft.d.ts +4 -0
- package/dist/form-config/dataRecord-1.0-draft.d.ts.map +1 -0
- package/dist/form-config/dataRecord-1.0-draft.js +1042 -0
- package/dist/form-config/default-1.0-draft.d.ts +4 -0
- package/dist/form-config/default-1.0-draft.d.ts.map +1 -0
- package/dist/form-config/default-1.0-draft.js +1132 -0
- package/dist/form-config/generated-view-only.d.ts +12 -0
- package/dist/form-config/generated-view-only.d.ts.map +1 -0
- package/dist/form-config/generated-view-only.js +169 -0
- package/dist/form-config/index.d.ts +3 -0
- package/dist/form-config/index.d.ts.map +1 -0
- package/dist/form-config/index.js +15 -0
- package/dist/hooks/defineRedboxHook.d.ts +31 -0
- package/dist/hooks/defineRedboxHook.d.ts.map +1 -0
- package/dist/hooks/defineRedboxHook.js +47 -0
- package/dist/hooks/index.d.ts +9 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +13 -0
- package/dist/hooks/webpack.d.ts +27 -0
- package/dist/hooks/webpack.d.ts.map +1 -0
- package/dist/hooks/webpack.js +82 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/loader/bootstrapShimRuntime.d.ts +8 -0
- package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -0
- package/dist/loader/bootstrapShimRuntime.js +83 -0
- package/dist/loader/index.d.ts +93 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +767 -0
- package/dist/middleware/redboxSession.d.ts +6 -0
- package/dist/middleware/redboxSession.d.ts.map +1 -0
- package/dist/middleware/redboxSession.js +60 -0
- package/dist/model/APIActionResponse.d.ts +6 -0
- package/dist/model/APIActionResponse.d.ts.map +1 -0
- package/dist/model/APIActionResponse.js +13 -0
- package/dist/model/APIErrorResponse.d.ts +6 -0
- package/dist/model/APIErrorResponse.d.ts.map +1 -0
- package/dist/model/APIErrorResponse.js +13 -0
- package/dist/model/APIHarvestResponse.d.ts +9 -0
- package/dist/model/APIHarvestResponse.d.ts.map +1 -0
- package/dist/model/APIHarvestResponse.js +19 -0
- package/dist/model/APIObjectActionResponse.d.ts +7 -0
- package/dist/model/APIObjectActionResponse.d.ts.map +1 -0
- package/dist/model/APIObjectActionResponse.js +15 -0
- package/dist/model/BuildResponse.d.ts +47 -0
- package/dist/model/BuildResponse.d.ts.map +1 -0
- package/dist/model/BuildResponse.js +5 -0
- package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
- package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -0
- package/dist/model/DashboardTypeResponseModel.js +13 -0
- package/dist/model/ListAPIResponse.d.ts +7 -0
- package/dist/model/ListAPIResponse.d.ts.map +1 -0
- package/dist/model/ListAPIResponse.js +12 -0
- package/dist/model/ListAPISummary.d.ts +7 -0
- package/dist/model/ListAPISummary.d.ts.map +1 -0
- package/dist/model/ListAPISummary.js +12 -0
- package/dist/model/RBValidationError.d.ts +62 -0
- package/dist/model/RBValidationError.d.ts.map +1 -0
- package/dist/model/RBValidationError.js +98 -0
- package/dist/model/RecordTypeResponseModel.d.ts +10 -0
- package/dist/model/RecordTypeResponseModel.d.ts.map +1 -0
- package/dist/model/RecordTypeResponseModel.js +19 -0
- package/dist/model/RequestDetails.d.ts +27 -0
- package/dist/model/RequestDetails.d.ts.map +1 -0
- package/dist/model/RequestDetails.js +53 -0
- package/dist/model/SolrDocument.d.ts +17 -0
- package/dist/model/SolrDocument.d.ts.map +1 -0
- package/dist/model/SolrDocument.js +30 -0
- package/dist/model/api/APIResponseVersion2.d.ts +107 -0
- package/dist/model/api/APIResponseVersion2.d.ts.map +1 -0
- package/dist/model/api/APIResponseVersion2.js +3 -0
- package/dist/model/api/APIVersions.d.ts +9 -0
- package/dist/model/api/APIVersions.d.ts.map +1 -0
- package/dist/model/api/APIVersions.js +11 -0
- package/dist/model/api/CreateUserAPIResponse.d.ts +9 -0
- package/dist/model/api/CreateUserAPIResponse.d.ts.map +1 -0
- package/dist/model/api/CreateUserAPIResponse.js +13 -0
- package/dist/model/api/FigshareArticleCreate.d.ts +11 -0
- package/dist/model/api/FigshareArticleCreate.d.ts.map +1 -0
- package/dist/model/api/FigshareArticleCreate.js +16 -0
- package/dist/model/api/FigshareArticleEmbargo.d.ts +11 -0
- package/dist/model/api/FigshareArticleEmbargo.d.ts.map +1 -0
- package/dist/model/api/FigshareArticleEmbargo.js +23 -0
- package/dist/model/api/FigshareArticleUpdate.d.ts +13 -0
- package/dist/model/api/FigshareArticleUpdate.d.ts.map +1 -0
- package/dist/model/api/FigshareArticleUpdate.js +20 -0
- package/dist/model/api/UserAPITokenAPIResponse.d.ts +6 -0
- package/dist/model/api/UserAPITokenAPIResponse.d.ts.map +1 -0
- package/dist/model/api/UserAPITokenAPIResponse.js +10 -0
- package/dist/model/api/index.d.ts +8 -0
- package/dist/model/api/index.d.ts.map +1 -0
- package/dist/model/api/index.js +16 -0
- package/dist/model/config/ReportConfig.d.ts +50 -0
- package/dist/model/config/ReportConfig.d.ts.map +1 -0
- package/dist/model/config/ReportConfig.js +58 -0
- package/dist/model/config/SolrConfig.d.ts +72 -0
- package/dist/model/config/SolrConfig.d.ts.map +1 -0
- package/dist/model/config/SolrConfig.js +41 -0
- package/dist/model/config/VocabQueryConfig.d.ts +30 -0
- package/dist/model/config/VocabQueryConfig.d.ts.map +1 -0
- package/dist/model/config/VocabQueryConfig.js +32 -0
- package/dist/model/config/index.d.ts +4 -0
- package/dist/model/config/index.d.ts.map +1 -0
- package/dist/model/config/index.js +20 -0
- package/dist/model/index.d.ts +16 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +45 -0
- package/dist/model/storage/AppConfigModel.d.ts +9 -0
- package/dist/model/storage/AppConfigModel.d.ts.map +1 -0
- package/dist/model/storage/AppConfigModel.js +3 -0
- package/dist/model/storage/AsynchProgressModel.d.ts +18 -0
- package/dist/model/storage/AsynchProgressModel.d.ts.map +1 -0
- package/dist/model/storage/AsynchProgressModel.js +3 -0
- package/dist/model/storage/BrandingModel.d.ts +24 -0
- package/dist/model/storage/BrandingModel.d.ts.map +1 -0
- package/dist/model/storage/BrandingModel.js +60 -0
- package/dist/model/storage/CacheEntryModel.d.ts +6 -0
- package/dist/model/storage/CacheEntryModel.d.ts.map +1 -0
- package/dist/model/storage/CacheEntryModel.js +3 -0
- package/dist/model/storage/CounterModel.d.ts +7 -0
- package/dist/model/storage/CounterModel.d.ts.map +1 -0
- package/dist/model/storage/CounterModel.js +3 -0
- package/dist/model/storage/DashboardTypeModel.d.ts +9 -0
- package/dist/model/storage/DashboardTypeModel.d.ts.map +1 -0
- package/dist/model/storage/DashboardTypeModel.js +3 -0
- package/dist/model/storage/DeletedRecordModel.d.ts +7 -0
- package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -0
- package/dist/model/storage/DeletedRecordModel.js +3 -0
- package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -0
- package/dist/model/storage/NamedQueryModel.d.ts +13 -0
- package/dist/model/storage/NamedQueryModel.d.ts.map +1 -0
- package/dist/model/storage/NamedQueryModel.js +17 -0
- package/dist/model/storage/RecordAuditModel.d.ts +15 -0
- package/dist/model/storage/RecordAuditModel.d.ts.map +1 -0
- package/dist/model/storage/RecordAuditModel.js +28 -0
- package/dist/model/storage/RecordModel.d.ts +42 -0
- package/dist/model/storage/RecordModel.d.ts.map +1 -0
- package/dist/model/storage/RecordModel.js +3 -0
- package/dist/model/storage/RecordTypeModel.d.ts +36 -0
- package/dist/model/storage/RecordTypeModel.d.ts.map +1 -0
- package/dist/model/storage/RecordTypeModel.js +43 -0
- package/dist/model/storage/ReportModel.d.ts +5 -0
- package/dist/model/storage/ReportModel.d.ts.map +1 -0
- package/dist/model/storage/ReportModel.js +3 -0
- package/dist/model/storage/RoleModel.d.ts +9 -0
- package/dist/model/storage/RoleModel.d.ts.map +1 -0
- package/dist/model/storage/RoleModel.js +12 -0
- package/dist/model/storage/UserAuditModel.d.ts +9 -0
- package/dist/model/storage/UserAuditModel.d.ts.map +1 -0
- package/dist/model/storage/UserAuditModel.js +3 -0
- package/dist/model/storage/UserLinkModel.d.ts +14 -0
- package/dist/model/storage/UserLinkModel.d.ts.map +1 -0
- package/dist/model/storage/UserLinkModel.js +18 -0
- package/dist/model/storage/UserModel.d.ts +25 -0
- package/dist/model/storage/UserModel.d.ts.map +1 -0
- package/dist/model/storage/UserModel.js +26 -0
- package/dist/model/storage/WorkflowStepModel.d.ts +11 -0
- package/dist/model/storage/WorkflowStepModel.d.ts.map +1 -0
- package/dist/model/storage/WorkflowStepModel.js +3 -0
- package/dist/model/storage/WorkspaceAppModel.d.ts +8 -0
- package/dist/model/storage/WorkspaceAppModel.d.ts.map +1 -0
- package/dist/model/storage/WorkspaceAppModel.js +3 -0
- package/dist/model/storage/index.d.ts +18 -0
- package/dist/model/storage/index.d.ts.map +1 -0
- package/dist/model/storage/index.js +19 -0
- package/dist/policies/brandingAndPortal.d.ts +9 -0
- package/dist/policies/brandingAndPortal.d.ts.map +1 -0
- package/dist/policies/brandingAndPortal.js +34 -0
- package/dist/policies/checkAuth.d.ts +9 -0
- package/dist/policies/checkAuth.d.ts.map +1 -0
- package/dist/policies/checkAuth.js +64 -0
- package/dist/policies/checkBrandingValid.d.ts +9 -0
- package/dist/policies/checkBrandingValid.d.ts.map +1 -0
- package/dist/policies/checkBrandingValid.js +40 -0
- package/dist/policies/companionAttachmentUploadAuth.d.ts +9 -0
- package/dist/policies/companionAttachmentUploadAuth.d.ts.map +1 -0
- package/dist/policies/companionAttachmentUploadAuth.js +221 -0
- package/dist/policies/contentSecurityPolicy.d.ts +23 -0
- package/dist/policies/contentSecurityPolicy.d.ts.map +1 -0
- package/dist/policies/contentSecurityPolicy.js +135 -0
- package/dist/policies/disallowedHeadRequestHandler.d.ts +8 -0
- package/dist/policies/disallowedHeadRequestHandler.d.ts.map +1 -0
- package/dist/policies/disallowedHeadRequestHandler.js +17 -0
- package/dist/policies/i18nLanguages.d.ts +8 -0
- package/dist/policies/i18nLanguages.d.ts.map +1 -0
- package/dist/policies/i18nLanguages.js +56 -0
- package/dist/policies/index.d.ts +52 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +70 -0
- package/dist/policies/isAuthenticated.d.ts +9 -0
- package/dist/policies/isAuthenticated.d.ts.map +1 -0
- package/dist/policies/isAuthenticated.js +19 -0
- package/dist/policies/isWebServiceAuthenticated.d.ts +9 -0
- package/dist/policies/isWebServiceAuthenticated.d.ts.map +1 -0
- package/dist/policies/isWebServiceAuthenticated.js +25 -0
- package/dist/policies/menuResolver.d.ts +11 -0
- package/dist/policies/menuResolver.d.ts.map +1 -0
- package/dist/policies/menuResolver.js +58 -0
- package/dist/policies/noCache.d.ts +9 -0
- package/dist/policies/noCache.d.ts.map +1 -0
- package/dist/policies/noCache.js +34 -0
- package/dist/policies/prepWs.d.ts +9 -0
- package/dist/policies/prepWs.d.ts.map +1 -0
- package/dist/policies/prepWs.js +23 -0
- package/dist/policies/sessionAuth.d.ts +11 -0
- package/dist/policies/sessionAuth.d.ts.map +1 -0
- package/dist/policies/sessionAuth.js +23 -0
- package/dist/policies/setLang.d.ts +8 -0
- package/dist/policies/setLang.d.ts.map +1 -0
- package/dist/policies/setLang.js +13 -0
- package/dist/responses/badRequest.d.ts +22 -0
- package/dist/responses/badRequest.d.ts.map +1 -0
- package/dist/responses/badRequest.js +66 -0
- package/dist/responses/created.d.ts +22 -0
- package/dist/responses/created.d.ts.map +1 -0
- package/dist/responses/created.js +55 -0
- package/dist/responses/forbidden.d.ts +22 -0
- package/dist/responses/forbidden.d.ts.map +1 -0
- package/dist/responses/forbidden.js +66 -0
- package/dist/responses/index.d.ts +6 -0
- package/dist/responses/index.d.ts.map +1 -0
- package/dist/responses/index.js +22 -0
- package/dist/responses/ok.d.ts +26 -0
- package/dist/responses/ok.d.ts.map +1 -0
- package/dist/responses/ok.js +59 -0
- package/dist/responses/serverError.d.ts +22 -0
- package/dist/responses/serverError.d.ts.map +1 -0
- package/dist/responses/serverError.js +66 -0
- package/dist/sails.d.ts +238 -0
- package/dist/sails.d.ts.map +1 -0
- package/dist/sails.js +3 -0
- package/dist/services/AgendaQueueService.d.ts +58 -0
- package/dist/services/AgendaQueueService.d.ts.map +1 -0
- package/dist/services/AgendaQueueService.js +225 -0
- package/dist/services/AppConfigService.d.ts +59 -0
- package/dist/services/AppConfigService.d.ts.map +1 -0
- package/dist/services/AppConfigService.js +273 -0
- package/dist/services/AsynchsService.d.ts +20 -0
- package/dist/services/AsynchsService.d.ts.map +1 -0
- package/dist/services/AsynchsService.js +64 -0
- package/dist/services/BrandingLogoService.d.ts +47 -0
- package/dist/services/BrandingLogoService.d.ts.map +1 -0
- package/dist/services/BrandingLogoService.js +212 -0
- package/dist/services/BrandingService.d.ts +70 -0
- package/dist/services/BrandingService.d.ts.map +1 -0
- package/dist/services/BrandingService.js +332 -0
- package/dist/services/CacheService.d.ts +25 -0
- package/dist/services/CacheService.d.ts.map +1 -0
- package/dist/services/CacheService.js +153 -0
- package/dist/services/ConfigService.d.ts +23 -0
- package/dist/services/ConfigService.d.ts.map +1 -0
- package/dist/services/ConfigService.js +379 -0
- package/dist/services/ContrastService.d.ts +77 -0
- package/dist/services/ContrastService.d.ts.map +1 -0
- package/dist/services/ContrastService.js +218 -0
- package/dist/services/DashboardTypesService.d.ts +98 -0
- package/dist/services/DashboardTypesService.d.ts.map +1 -0
- package/dist/services/DashboardTypesService.js +291 -0
- package/dist/services/DoiService.d.ts +36 -0
- package/dist/services/DoiService.d.ts.map +1 -0
- package/dist/services/DoiService.js +494 -0
- package/dist/services/DomSanitizerService.d.ts +105 -0
- package/dist/services/DomSanitizerService.d.ts.map +1 -0
- package/dist/services/DomSanitizerService.js +506 -0
- package/dist/services/EmailService.d.ts +185 -0
- package/dist/services/EmailService.d.ts.map +1 -0
- package/dist/services/EmailService.js +527 -0
- package/dist/services/FigshareService.d.ts +75 -0
- package/dist/services/FigshareService.d.ts.map +1 -0
- package/dist/services/FigshareService.js +2193 -0
- package/dist/services/FormRecordConsistencyService.d.ts +156 -0
- package/dist/services/FormRecordConsistencyService.d.ts.map +1 -0
- package/dist/services/FormRecordConsistencyService.js +516 -0
- package/dist/services/FormsService.d.ts +65 -0
- package/dist/services/FormsService.d.ts.map +1 -0
- package/dist/services/FormsService.js +580 -0
- package/dist/services/I18nEntriesService.d.ts +80 -0
- package/dist/services/I18nEntriesService.d.ts.map +1 -0
- package/dist/services/I18nEntriesService.js +469 -0
- package/dist/services/IntegrationAuditService.d.ts.map +1 -0
- package/dist/services/NamedQueryService.d.ts +87 -0
- package/dist/services/NamedQueryService.d.ts.map +1 -0
- package/dist/services/NamedQueryService.js +396 -0
- package/dist/services/NavigationService.d.ts +115 -0
- package/dist/services/NavigationService.d.ts.map +1 -0
- package/dist/services/NavigationService.js +553 -0
- package/dist/services/OniService.d.ts +77 -0
- package/dist/services/OniService.d.ts.map +1 -0
- package/dist/services/OniService.js +753 -0
- package/dist/services/OrcidService.d.ts +30 -0
- package/dist/services/OrcidService.d.ts.map +1 -0
- package/dist/services/OrcidService.js +126 -0
- package/dist/services/PathRulesService.d.ts +57 -0
- package/dist/services/PathRulesService.d.ts.map +1 -0
- package/dist/services/PathRulesService.js +129 -0
- package/dist/services/RDMPService.d.ts +102 -0
- package/dist/services/RDMPService.d.ts.map +1 -0
- package/dist/services/RDMPService.js +767 -0
- package/dist/services/RaidService.d.ts +83 -0
- package/dist/services/RaidService.d.ts.map +1 -0
- package/dist/services/RaidService.js +556 -0
- package/dist/services/RecordTypesService.d.ts +27 -0
- package/dist/services/RecordTypesService.d.ts.map +1 -0
- package/dist/services/RecordTypesService.js +106 -0
- package/dist/services/RecordsService.d.ts +129 -0
- package/dist/services/RecordsService.d.ts.map +1 -0
- package/dist/services/RecordsService.js +1477 -0
- package/dist/services/ReportsService.d.ts +99 -0
- package/dist/services/ReportsService.d.ts.map +1 -0
- package/dist/services/ReportsService.js +475 -0
- package/dist/services/RolesService.d.ts +41 -0
- package/dist/services/RolesService.d.ts.map +1 -0
- package/dist/services/RolesService.js +171 -0
- package/dist/services/RvaImportService.d.ts +56 -0
- package/dist/services/RvaImportService.d.ts.map +1 -0
- package/dist/services/RvaImportService.js +410 -0
- package/dist/services/SassCompilerService.d.ts +26 -0
- package/dist/services/SassCompilerService.d.ts.map +1 -0
- package/dist/services/SassCompilerService.js +201 -0
- package/dist/services/SolrSearchService.d.ts +52 -0
- package/dist/services/SolrSearchService.d.ts.map +1 -0
- package/dist/services/SolrSearchService.js +463 -0
- package/dist/services/StandardDatastreamService.d.ts +66 -0
- package/dist/services/StandardDatastreamService.d.ts.map +1 -0
- package/dist/services/StandardDatastreamService.js +297 -0
- package/dist/services/StorageManagerService.d.ts +90 -0
- package/dist/services/StorageManagerService.d.ts.map +1 -0
- package/dist/services/StorageManagerService.js +234 -0
- package/dist/services/TemplateService.d.ts +65 -0
- package/dist/services/TemplateService.d.ts.map +1 -0
- package/dist/services/TemplateService.js +208 -0
- package/dist/services/TranslationService.d.ts +38 -0
- package/dist/services/TranslationService.d.ts.map +1 -0
- package/dist/services/TranslationService.js +358 -0
- package/dist/services/TriggerService.d.ts +72 -0
- package/dist/services/TriggerService.d.ts.map +1 -0
- package/dist/services/TriggerService.js +554 -0
- package/dist/services/UsersService.d.ts +174 -0
- package/dist/services/UsersService.d.ts.map +1 -0
- package/dist/services/UsersService.js +2108 -0
- package/dist/services/ViewUtilsService.d.ts +36 -0
- package/dist/services/ViewUtilsService.d.ts.map +1 -0
- package/dist/services/ViewUtilsService.js +120 -0
- package/dist/services/VocabService.d.ts +81 -0
- package/dist/services/VocabService.d.ts.map +1 -0
- package/dist/services/VocabService.js +424 -0
- package/dist/services/VocabularyService.d.ts +115 -0
- package/dist/services/VocabularyService.d.ts.map +1 -0
- package/dist/services/VocabularyService.js +752 -0
- package/dist/services/WorkflowStepsService.d.ts +29 -0
- package/dist/services/WorkflowStepsService.d.ts.map +1 -0
- package/dist/services/WorkflowStepsService.js +110 -0
- package/dist/services/WorkspaceAsyncService.d.ts +34 -0
- package/dist/services/WorkspaceAsyncService.d.ts.map +1 -0
- package/dist/services/WorkspaceAsyncService.js +68 -0
- package/dist/services/WorkspaceService.d.ts +67 -0
- package/dist/services/WorkspaceService.d.ts.map +1 -0
- package/dist/services/WorkspaceService.js +148 -0
- package/dist/services/WorkspaceTypesService.d.ts +33 -0
- package/dist/services/WorkspaceTypesService.d.ts.map +1 -0
- package/dist/services/WorkspaceTypesService.js +89 -0
- package/dist/services/doi-v2/audit.d.ts.map +1 -0
- package/dist/services/doi-v2/bindings.d.ts.map +1 -0
- package/dist/services/doi-v2/config.d.ts.map +1 -0
- package/dist/services/doi-v2/context.d.ts.map +1 -0
- package/dist/services/doi-v2/http.d.ts.map +1 -0
- package/dist/services/doi-v2/payload.d.ts.map +1 -0
- package/dist/services/doi-v2/profiles.d.ts.map +1 -0
- package/dist/services/doi-v2/runtime.d.ts.map +1 -0
- package/dist/services/doi-v2/types.d.ts.map +1 -0
- package/dist/services/figshare-v2/assets.d.ts.map +1 -0
- package/dist/services/figshare-v2/bindings.d.ts.map +1 -0
- package/dist/services/figshare-v2/config.d.ts.map +1 -0
- package/dist/services/figshare-v2/context.d.ts.map +1 -0
- package/dist/services/figshare-v2/embargo.d.ts.map +1 -0
- package/dist/services/figshare-v2/http.d.ts.map +1 -0
- package/dist/services/figshare-v2/metadata.d.ts.map +1 -0
- package/dist/services/figshare-v2/observability.d.ts.map +1 -0
- package/dist/services/figshare-v2/plan.d.ts.map +1 -0
- package/dist/services/figshare-v2/publish.d.ts.map +1 -0
- package/dist/services/figshare-v2/queue.d.ts.map +1 -0
- package/dist/services/figshare-v2/runtime.d.ts.map +1 -0
- package/dist/services/figshare-v2/types.d.ts.map +1 -0
- package/dist/services/figshare-v2/workflow.d.ts.map +1 -0
- package/dist/services/figshare-v2/writeback.d.ts.map +1 -0
- package/dist/services/index.d.ts +136 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +276 -0
- package/dist/shims/index.d.ts +9 -0
- package/dist/shims/index.d.ts.map +1 -0
- package/dist/shims/index.js +15 -0
- package/dist/shims/momentShim.d.ts +7 -0
- package/dist/shims/momentShim.d.ts.map +1 -0
- package/dist/shims/momentShim.js +69 -0
- package/dist/transformers/ExportJSONTransformer.d.ts +16 -0
- package/dist/transformers/ExportJSONTransformer.d.ts.map +1 -0
- package/dist/transformers/ExportJSONTransformer.js +90 -0
- package/dist/utilities/ContextVariableUtils.d.ts +8 -0
- package/dist/utilities/ContextVariableUtils.d.ts.map +1 -0
- package/dist/utilities/ContextVariableUtils.js +91 -0
- package/dist/utilities/TransactionUtils.d.ts +7 -0
- package/dist/utilities/TransactionUtils.d.ts.map +1 -0
- package/dist/utilities/TransactionUtils.js +25 -0
- package/dist/visitor/attachment-fields.visitor.d.ts +37 -0
- package/dist/visitor/attachment-fields.visitor.d.ts.map +1 -0
- package/dist/visitor/attachment-fields.visitor.js +93 -0
- package/dist/visitor/client.visitor.d.ts +211 -0
- package/dist/visitor/client.visitor.d.ts.map +1 -0
- package/dist/visitor/client.visitor.js +865 -0
- package/dist/visitor/construct.visitor.d.ts +219 -0
- package/dist/visitor/construct.visitor.d.ts.map +1 -0
- package/dist/visitor/construct.visitor.js +1499 -0
- package/dist/visitor/context-variables.visitor.d.ts +51 -0
- package/dist/visitor/context-variables.visitor.d.ts.map +1 -0
- package/dist/visitor/context-variables.visitor.js +192 -0
- package/dist/visitor/data-value.visitor.d.ts +159 -0
- package/dist/visitor/data-value.visitor.d.ts.map +1 -0
- package/dist/visitor/data-value.visitor.js +310 -0
- package/dist/visitor/json-type-def.visitor.d.ts +155 -0
- package/dist/visitor/json-type-def.visitor.d.ts.map +1 -0
- package/dist/visitor/json-type-def.visitor.js +384 -0
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +244 -0
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -0
- package/dist/visitor/migrate-config-v4-v5.visitor.js +2941 -0
- package/dist/visitor/template.visitor.d.ts +163 -0
- package/dist/visitor/template.visitor.d.ts.map +1 -0
- package/dist/visitor/template.visitor.js +397 -0
- package/dist/visitor/validator.visitor.d.ts +123 -0
- package/dist/visitor/validator.visitor.d.ts.map +1 -0
- package/dist/visitor/validator.visitor.js +480 -0
- package/dist/visitor/visitor-helpers.d.ts +15 -0
- package/dist/visitor/visitor-helpers.d.ts.map +1 -0
- package/dist/visitor/visitor-helpers.js +191 -0
- package/dist/visitor/vocab-inline.visitor.d.ts +33 -0
- package/dist/visitor/vocab-inline.visitor.d.ts.map +1 -0
- package/dist/visitor/vocab-inline.visitor.js +173 -0
- package/dist/waterline-models/AppConfig.d.ts +19 -0
- package/dist/waterline-models/AppConfig.d.ts.map +1 -0
- package/dist/waterline-models/AppConfig.js +38 -0
- package/dist/waterline-models/AsynchProgress.d.ts +37 -0
- package/dist/waterline-models/AsynchProgress.d.ts.map +1 -0
- package/dist/waterline-models/AsynchProgress.js +83 -0
- package/dist/waterline-models/BrandingConfig.d.ts +28 -0
- package/dist/waterline-models/BrandingConfig.d.ts.map +1 -0
- package/dist/waterline-models/BrandingConfig.js +132 -0
- package/dist/waterline-models/BrandingConfigHistory.d.ts +25 -0
- package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -0
- package/dist/waterline-models/BrandingConfigHistory.js +66 -0
- package/dist/waterline-models/CacheEntry.d.ts +18 -0
- package/dist/waterline-models/CacheEntry.d.ts.map +1 -0
- package/dist/waterline-models/CacheEntry.js +38 -0
- package/dist/waterline-models/Counter.d.ts +19 -0
- package/dist/waterline-models/Counter.d.ts.map +1 -0
- package/dist/waterline-models/Counter.js +38 -0
- package/dist/waterline-models/DashboardType.d.ts +23 -0
- package/dist/waterline-models/DashboardType.d.ts.map +1 -0
- package/dist/waterline-models/DashboardType.js +53 -0
- package/dist/waterline-models/Form.d.ts +21 -0
- package/dist/waterline-models/Form.d.ts.map +1 -0
- package/dist/waterline-models/Form.js +38 -0
- package/dist/waterline-models/I18nBundle.d.ts +29 -0
- package/dist/waterline-models/I18nBundle.d.ts.map +1 -0
- package/dist/waterline-models/I18nBundle.js +85 -0
- package/dist/waterline-models/I18nTranslation.d.ts +32 -0
- package/dist/waterline-models/I18nTranslation.d.ts.map +1 -0
- package/dist/waterline-models/I18nTranslation.js +110 -0
- package/dist/waterline-models/NamedQuery.d.ts +29 -0
- package/dist/waterline-models/NamedQuery.d.ts.map +1 -0
- package/dist/waterline-models/NamedQuery.js +68 -0
- package/dist/waterline-models/PathRule.d.ts +26 -0
- package/dist/waterline-models/PathRule.d.ts.map +1 -0
- package/dist/waterline-models/PathRule.js +53 -0
- package/dist/waterline-models/RBReport.d.ts +38 -0
- package/dist/waterline-models/RBReport.d.ts.map +1 -0
- package/dist/waterline-models/RBReport.js +73 -0
- package/dist/waterline-models/RecordType.d.ts +37 -0
- package/dist/waterline-models/RecordType.d.ts.map +1 -0
- package/dist/waterline-models/RecordType.js +88 -0
- package/dist/waterline-models/Role.d.ts +19 -0
- package/dist/waterline-models/Role.d.ts.map +1 -0
- package/dist/waterline-models/Role.js +38 -0
- package/dist/waterline-models/ThemeConfig.d.ts +16 -0
- package/dist/waterline-models/ThemeConfig.d.ts.map +1 -0
- package/dist/waterline-models/ThemeConfig.js +33 -0
- package/dist/waterline-models/User.d.ts +50 -0
- package/dist/waterline-models/User.d.ts.map +1 -0
- package/dist/waterline-models/User.js +151 -0
- package/dist/waterline-models/UserAudit.d.ts +18 -0
- package/dist/waterline-models/UserAudit.d.ts.map +1 -0
- package/dist/waterline-models/UserAudit.js +38 -0
- package/dist/waterline-models/UserLink.d.ts +30 -0
- package/dist/waterline-models/UserLink.d.ts.map +1 -0
- package/dist/waterline-models/UserLink.js +62 -0
- package/dist/waterline-models/Vocabulary.d.ts +38 -0
- package/dist/waterline-models/Vocabulary.d.ts.map +1 -0
- package/dist/waterline-models/Vocabulary.js +183 -0
- package/dist/waterline-models/VocabularyEntry.d.ts +33 -0
- package/dist/waterline-models/VocabularyEntry.d.ts.map +1 -0
- package/dist/waterline-models/VocabularyEntry.js +210 -0
- package/dist/waterline-models/WorkflowStep.d.ts +25 -0
- package/dist/waterline-models/WorkflowStep.d.ts.map +1 -0
- package/dist/waterline-models/WorkflowStep.js +53 -0
- package/dist/waterline-models/WorkspaceApp.d.ts +19 -0
- package/dist/waterline-models/WorkspaceApp.d.ts.map +1 -0
- package/dist/waterline-models/WorkspaceApp.js +50 -0
- package/dist/waterline-models/WorkspaceAsync.d.ts +32 -0
- package/dist/waterline-models/WorkspaceAsync.d.ts.map +1 -0
- package/dist/waterline-models/WorkspaceAsync.js +73 -0
- package/dist/waterline-models/WorkspaceType.d.ts +25 -0
- package/dist/waterline-models/WorkspaceType.d.ts.map +1 -0
- package/dist/waterline-models/WorkspaceType.js +53 -0
- package/dist/waterline-models/index.d.ts +53 -0
- package/dist/waterline-models/index.d.ts.map +1 -0
- package/dist/waterline-models/index.js +99 -0
- package/dist/waterline-models/types.d.ts +8 -0
- package/dist/waterline-models/types.d.ts.map +1 -0
- package/dist/waterline-models/types.js +3 -0
- package/package.json +150 -0
- package/redbox-loader-templates/bootstrap-shim.js.hbs +17 -0
- 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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
|