@researchdatabox/redbox-core 5.0.4-beta.12498 → 5.0.5
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/CoreController.d.ts +3 -7
- package/dist/CoreController.d.ts.map +1 -1
- package/dist/CoreController.js +3 -85
- package/dist/DatastreamService.d.ts +2 -4
- package/dist/DatastreamService.d.ts.map +1 -1
- package/dist/HarvestRunService.d.ts +3 -4
- package/dist/HarvestRunService.d.ts.map +1 -1
- package/dist/HarvestRunService.js +1 -1
- package/dist/QueueService.d.ts +1 -1
- package/dist/QueueService.d.ts.map +1 -1
- package/dist/RecordWriteOptions.d.ts +21 -0
- package/dist/RecordWriteOptions.d.ts.map +1 -0
- package/dist/RecordWriteOptions.js +17 -0
- package/dist/RecordsService.d.ts +14 -105
- package/dist/RecordsService.d.ts.map +1 -1
- package/dist/RecordsService.js +1 -44
- package/dist/SearchService.d.ts +1 -2
- package/dist/SearchService.d.ts.map +1 -1
- package/dist/StorageService.d.ts +20 -48
- package/dist/StorageService.d.ts.map +1 -1
- package/dist/StorageService.js +1 -19
- package/dist/StorageServiceResponse.d.ts +1 -22
- package/dist/StorageServiceResponse.d.ts.map +1 -1
- package/dist/StorageServiceResponse.js +4 -22
- package/dist/api-routes/groups/branding.d.ts +0 -8
- package/dist/api-routes/groups/branding.d.ts.map +1 -1
- package/dist/api-routes/groups/branding.js +11 -86
- package/dist/api-routes/groups/dashboard-config.d.ts +9 -12
- package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -1
- package/dist/api-routes/groups/dashboard-config.js +73 -136
- package/dist/api-routes/groups/forms.d.ts.map +1 -1
- package/dist/api-routes/groups/forms.js +2 -10
- package/dist/api-routes/groups/records.d.ts +0 -1
- package/dist/api-routes/groups/records.d.ts.map +1 -1
- package/dist/api-routes/groups/records.js +26 -141
- package/dist/api-routes/index.d.ts +0 -3
- package/dist/api-routes/index.d.ts.map +1 -1
- package/dist/api-routes/index.js +1 -4
- package/dist/api-routes/openapi.d.ts.map +1 -1
- package/dist/api-routes/openapi.js +5 -7
- package/dist/api-routes/request-extraction.d.ts.map +1 -1
- package/dist/api-routes/request-extraction.js +8 -10
- package/dist/api-routes/route-factory.d.ts.map +1 -1
- package/dist/api-routes/route-factory.js +1 -2
- package/dist/api-routes/route-registry.d.ts.map +1 -1
- package/dist/api-routes/route-registry.js +1 -3
- package/dist/api-routes/schemas/common.d.ts +0 -36
- package/dist/api-routes/schemas/common.d.ts.map +1 -1
- package/dist/api-routes/schemas/common.js +5 -95
- package/dist/api-routes/schemas/responses.d.ts +1 -1424
- package/dist/api-routes/schemas/responses.d.ts.map +1 -1
- package/dist/api-routes/schemas/responses.js +60 -382
- package/dist/api-routes/types.d.ts +0 -1
- package/dist/api-routes/types.d.ts.map +1 -1
- package/dist/api-routes/validation.d.ts +1 -5
- package/dist/api-routes/validation.d.ts.map +1 -1
- package/dist/api-routes/validation.js +15 -14
- package/dist/bootstrap.d.ts +1 -3
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +41 -58
- package/dist/config/agendaQueue.config.d.ts +0 -3
- package/dist/config/agendaQueue.config.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.js +11 -29
- package/dist/config/branding.config.d.ts +0 -13
- package/dist/config/branding.config.d.ts.map +1 -1
- package/dist/config/branding.config.js +2 -34
- package/dist/config/brandingConfigurationDefaults.config.d.ts +0 -4
- package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
- package/dist/config/brandingConfigurationDefaults.config.js +3 -42
- 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/i18n.config.d.ts +4 -0
- package/dist/config/i18n.config.d.ts.map +1 -1
- package/dist/config/i18n.config.js +1 -1
- package/dist/config/index.d.ts +4 -12
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -7
- package/dist/config/policies.config.d.ts.map +1 -1
- package/dist/config/policies.config.js +23 -37
- package/dist/config/raid.config.d.ts +4 -7
- package/dist/config/raid.config.d.ts.map +1 -1
- package/dist/config/raid.config.js +35 -21
- package/dist/config/record.config.d.ts +0 -3
- package/dist/config/record.config.d.ts.map +1 -1
- package/dist/config/record.config.js +35 -37
- package/dist/config/recordtype.config.d.ts +9 -32
- package/dist/config/recordtype.config.d.ts.map +1 -1
- package/dist/config/recordtype.config.js +7 -4
- package/dist/config/routes.config.d.ts.map +1 -1
- package/dist/config/routes.config.js +53 -135
- package/dist/config/session.config.d.ts +2 -2
- package/dist/config/session.config.d.ts.map +1 -1
- package/dist/config/workflow.config.d.ts +0 -6
- package/dist/config/workflow.config.d.ts.map +1 -1
- package/dist/config/workflow.config.js +1 -1
- package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
- package/dist/configmodels/AdminSidebarConfig.js +2 -4
- package/dist/configmodels/ConfigModels.d.ts +1 -1
- package/dist/configmodels/ConfigModels.d.ts.map +1 -1
- package/dist/configmodels/ConfigModels.js +9 -26
- package/dist/configmodels/FigsharePublishing.d.ts +103 -0
- package/dist/configmodels/FigsharePublishing.d.ts.map +1 -1
- package/dist/configmodels/FigsharePublishing.js +36 -2
- package/dist/controllers/AppConfigController.d.ts.map +1 -1
- package/dist/controllers/AppConfigController.js +1 -4
- package/dist/controllers/BrandingAppController.d.ts +7 -29
- package/dist/controllers/BrandingAppController.d.ts.map +1 -1
- package/dist/controllers/BrandingAppController.js +69 -265
- package/dist/controllers/BrandingController.d.ts +1 -24
- package/dist/controllers/BrandingController.d.ts.map +1 -1
- package/dist/controllers/BrandingController.js +43 -173
- package/dist/controllers/DashboardConfigController.d.ts +2 -6
- package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/DashboardConfigController.js +4 -18
- package/dist/controllers/DynamicAssetController.d.ts +5 -7
- package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
- package/dist/controllers/DynamicAssetController.js +12 -21
- package/dist/controllers/RecordAuditController.d.ts.map +1 -1
- package/dist/controllers/RecordAuditController.js +24 -6
- package/dist/controllers/RecordController.d.ts +4 -45
- package/dist/controllers/RecordController.d.ts.map +1 -1
- package/dist/controllers/RecordController.js +345 -778
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +1 -4
- package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
- package/dist/controllers/webservice/AdminController.js +3 -4
- package/dist/controllers/webservice/BrandingController.d.ts +1 -26
- package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
- package/dist/controllers/webservice/BrandingController.js +116 -292
- package/dist/controllers/webservice/DashboardConfigController.d.ts +17 -25
- package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/webservice/DashboardConfigController.js +205 -90
- package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
- package/dist/controllers/webservice/FormManagementController.js +3 -37
- package/dist/controllers/webservice/RecordController.d.ts +1 -15
- package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordController.js +267 -647
- package/dist/controllers/webservice/RecordTypeController.d.ts +1 -6
- package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordTypeController.js +3 -21
- package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
- package/dist/controllers/webservice/SearchController.js +3 -7
- package/dist/hooks/defineRedboxHook.d.ts +0 -3
- package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
- package/dist/hooks/defineRedboxHook.js +1 -4
- package/dist/index.d.ts +25 -50
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -90
- package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
- package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
- package/dist/loader/bootstrapShimRuntime.js +12 -20
- package/dist/loader/index.d.ts +0 -9
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +4 -93
- package/dist/middleware/redboxSession.d.ts.map +1 -1
- package/dist/middleware/redboxSession.js +15 -3
- package/dist/model/BuildResponse.d.ts +11 -25
- package/dist/model/BuildResponse.d.ts.map +1 -1
- package/dist/model/BuildResponse.js +3 -4
- package/dist/model/DashboardTypeResponseModel.d.ts +0 -6
- package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardTypeResponseModel.js +1 -7
- package/dist/model/DashboardViewResponseModel.d.ts +1 -5
- package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardViewResponseModel.js +3 -6
- package/dist/model/RBValidationError.d.ts +0 -17
- package/dist/model/RBValidationError.d.ts.map +1 -1
- package/dist/model/RBValidationError.js +1 -37
- package/dist/model/RecordTypeResponseModel.d.ts +4 -12
- package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
- package/dist/model/RecordTypeResponseModel.js +2 -11
- package/dist/model/index.d.ts +1 -5
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +2 -5
- package/dist/model/storage/BrandingModel.d.ts +0 -7
- package/dist/model/storage/BrandingModel.d.ts.map +1 -1
- package/dist/model/storage/BrandingModel.js +1 -7
- package/dist/model/storage/DeletedRecordModel.d.ts +0 -35
- package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
- package/dist/model/storage/DeletedRecordModel.js +1 -62
- package/dist/model/storage/FigshareSyncModel.d.ts +126 -0
- package/dist/model/storage/FigshareSyncModel.d.ts.map +1 -0
- package/dist/model/storage/FigshareSyncModel.js +3 -0
- package/dist/model/storage/IntegrationAuditModel.d.ts +2 -16
- package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
- package/dist/model/storage/IntegrationAuditModel.js +1 -15
- package/dist/model/storage/RecordAuditModel.d.ts +4 -11
- package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
- package/dist/model/storage/RecordAuditModel.js +30 -8
- package/dist/model/storage/RecordModel.d.ts +3 -6
- package/dist/model/storage/RecordModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.d.ts +0 -6
- package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.js +1 -4
- package/dist/model/storage/index.d.ts +10 -12
- package/dist/model/storage/index.d.ts.map +1 -1
- package/dist/model/storage/index.js +2 -24
- package/dist/policies/checkAuth.d.ts +6 -2
- package/dist/policies/checkAuth.d.ts.map +1 -1
- package/dist/policies/checkAuth.js +9 -32
- package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
- package/dist/policies/contentSecurityPolicy.js +2 -85
- package/dist/policies/index.d.ts +2 -3
- package/dist/policies/index.d.ts.map +1 -1
- package/dist/policies/index.js +2 -4
- package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
- package/dist/policies/validateApiContractRequest.js +11 -49
- package/dist/services/AgendaQueueService.d.ts +1 -1
- package/dist/services/AgendaQueueService.d.ts.map +1 -1
- package/dist/services/AgendaQueueService.js +7 -4
- package/dist/services/AppConfigService.d.ts +0 -6
- package/dist/services/AppConfigService.d.ts.map +1 -1
- package/dist/services/AppConfigService.js +1 -23
- package/dist/services/AttachmentMetadataService.d.ts +0 -58
- package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
- package/dist/services/AttachmentMetadataService.js +8 -643
- package/dist/services/BrandingLogoService.d.ts +1 -6
- package/dist/services/BrandingLogoService.d.ts.map +1 -1
- package/dist/services/BrandingLogoService.js +9 -77
- package/dist/services/BrandingService.d.ts +9 -171
- package/dist/services/BrandingService.d.ts.map +1 -1
- package/dist/services/BrandingService.js +68 -572
- package/dist/services/BrandingThemeCssService.d.ts +1 -17
- package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
- package/dist/services/BrandingThemeCssService.js +12 -71
- package/dist/services/BrandingThemeTokens.d.ts.map +1 -1
- package/dist/services/BrandingThemeTokens.js +2 -1
- package/dist/services/DashboardConfigService.d.ts +54 -214
- package/dist/services/DashboardConfigService.d.ts.map +1 -1
- package/dist/services/DashboardConfigService.js +261 -829
- package/dist/services/DashboardTypesService.d.ts +4 -15
- package/dist/services/DashboardTypesService.d.ts.map +1 -1
- package/dist/services/DashboardTypesService.js +139 -72
- package/dist/services/DoiService.d.ts +1 -1
- package/dist/services/DoiService.d.ts.map +1 -1
- package/dist/services/DoiService.js +45 -71
- package/dist/services/FigshareService.d.ts +15 -10
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +82 -583
- package/dist/services/FormRecordConsistencyService.d.ts +23 -8
- package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
- package/dist/services/FormRecordConsistencyService.js +70 -54
- package/dist/services/FormsService.d.ts +2 -91
- package/dist/services/FormsService.d.ts.map +1 -1
- package/dist/services/FormsService.js +64 -324
- package/dist/services/HarvestRunService.d.ts +3 -6
- package/dist/services/HarvestRunService.d.ts.map +1 -1
- package/dist/services/HarvestRunService.js +97 -161
- package/dist/services/I18nEntriesService.d.ts +2 -1
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +45 -30
- package/dist/services/OniService.d.ts +62 -19
- package/dist/services/OniService.d.ts.map +1 -1
- package/dist/services/OniService.js +691 -223
- package/dist/services/RDMPService.d.ts +1 -1
- package/dist/services/RDMPService.d.ts.map +1 -1
- package/dist/services/RDMPService.js +5 -5
- package/dist/services/RaidService.d.ts +61 -19
- package/dist/services/RaidService.d.ts.map +1 -1
- package/dist/services/RaidService.js +530 -191
- package/dist/services/RecordTypesService.d.ts +0 -29
- package/dist/services/RecordTypesService.d.ts.map +1 -1
- package/dist/services/RecordTypesService.js +11 -106
- package/dist/services/RecordsService.d.ts +26 -313
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +763 -5089
- package/dist/services/SolrSearchService.d.ts +1 -1
- package/dist/services/SolrSearchService.d.ts.map +1 -1
- package/dist/services/SolrSearchService.js +12 -42
- package/dist/services/StandardDatastreamService.d.ts +5 -4
- package/dist/services/StandardDatastreamService.d.ts.map +1 -1
- package/dist/services/StandardDatastreamService.js +61 -106
- package/dist/services/TriggerService.d.ts.map +1 -1
- package/dist/services/TriggerService.js +30 -54
- package/dist/services/UsersService.d.ts +1 -2
- package/dist/services/UsersService.d.ts.map +1 -1
- package/dist/services/UsersService.js +283 -364
- package/dist/services/VocabularyService.d.ts +0 -2
- package/dist/services/VocabularyService.d.ts.map +1 -1
- package/dist/services/VocabularyService.js +2 -61
- package/dist/services/WorkflowStepsService.d.ts +0 -11
- package/dist/services/WorkflowStepsService.d.ts.map +1 -1
- package/dist/services/WorkflowStepsService.js +3 -32
- package/dist/services/WorkspaceService.d.ts +2 -2
- package/dist/services/WorkspaceService.d.ts.map +1 -1
- package/dist/services/WorkspaceService.js +5 -5
- package/dist/services/doi-v2/bindings.d.ts.map +1 -1
- package/dist/services/doi-v2/bindings.js +20 -3
- package/dist/services/doi-v2/config.d.ts +0 -1
- package/dist/services/doi-v2/config.d.ts.map +1 -1
- package/dist/services/doi-v2/config.js +5 -13
- package/dist/services/doi-v2/runtime.d.ts.map +1 -1
- package/dist/services/doi-v2/runtime.js +54 -14
- package/dist/services/figshare-v2/admin.d.ts +16 -0
- package/dist/services/figshare-v2/admin.d.ts.map +1 -0
- package/dist/services/figshare-v2/admin.js +283 -0
- package/dist/services/figshare-v2/assets.d.ts +20 -1
- package/dist/services/figshare-v2/assets.d.ts.map +1 -1
- package/dist/services/figshare-v2/assets.js +16 -1
- package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
- package/dist/services/figshare-v2/bindings.js +20 -3
- package/dist/services/figshare-v2/config.d.ts +8 -2
- package/dist/services/figshare-v2/config.d.ts.map +1 -1
- package/dist/services/figshare-v2/config.js +31 -3
- package/dist/services/figshare-v2/execution.d.ts +25 -0
- package/dist/services/figshare-v2/execution.d.ts.map +1 -0
- package/dist/services/figshare-v2/execution.js +49 -0
- package/dist/services/figshare-v2/http.d.ts +6 -1
- package/dist/services/figshare-v2/http.d.ts.map +1 -1
- package/dist/services/figshare-v2/http.js +69 -12
- package/dist/services/figshare-v2/identity.d.ts +12 -0
- package/dist/services/figshare-v2/identity.d.ts.map +1 -0
- package/dist/services/figshare-v2/identity.js +78 -0
- package/dist/services/figshare-v2/managed-assets.d.ts +9 -0
- package/dist/services/figshare-v2/managed-assets.d.ts.map +1 -0
- package/dist/services/figshare-v2/managed-assets.js +229 -0
- package/dist/services/figshare-v2/plan.d.ts.map +1 -1
- package/dist/services/figshare-v2/plan.js +2 -9
- package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
- package/dist/services/figshare-v2/runtime.js +58 -11
- package/dist/services/figshare-v2/source-intent.d.ts +9 -0
- package/dist/services/figshare-v2/source-intent.d.ts.map +1 -0
- package/dist/services/figshare-v2/source-intent.js +93 -0
- package/dist/services/figshare-v2/status.d.ts +4 -0
- package/dist/services/figshare-v2/status.d.ts.map +1 -0
- package/dist/services/figshare-v2/status.js +29 -0
- package/dist/services/figshare-v2/sync-store.d.ts +27 -0
- package/dist/services/figshare-v2/sync-store.d.ts.map +1 -0
- package/dist/services/figshare-v2/sync-store.js +139 -0
- package/dist/services/figshare-v2/types.d.ts +3 -0
- package/dist/services/figshare-v2/types.d.ts.map +1 -1
- package/dist/services/figshare-v2/types.js +1 -1
- package/dist/services/figshare-v2/worker.d.ts +16 -0
- package/dist/services/figshare-v2/worker.d.ts.map +1 -0
- package/dist/services/figshare-v2/worker.js +572 -0
- package/dist/services/index.d.ts +0 -9
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -45
- package/dist/utilities/TranslationHtml.d.ts +3 -0
- package/dist/utilities/TranslationHtml.d.ts.map +1 -0
- package/dist/utilities/TranslationHtml.js +46 -0
- package/dist/visitor/client.visitor.d.ts +0 -6
- package/dist/visitor/client.visitor.d.ts.map +1 -1
- package/dist/visitor/client.visitor.js +14 -59
- package/dist/visitor/construct.visitor.d.ts +1 -27
- package/dist/visitor/construct.visitor.d.ts.map +1 -1
- package/dist/visitor/construct.visitor.js +177 -265
- package/dist/visitor/context-variables.visitor.d.ts +1 -3
- package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
- package/dist/visitor/context-variables.visitor.js +1 -15
- package/dist/visitor/data-value.visitor.d.ts +0 -6
- package/dist/visitor/data-value.visitor.d.ts.map +1 -1
- package/dist/visitor/data-value.visitor.js +1 -10
- package/dist/visitor/json-type-def.visitor.d.ts +0 -6
- package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
- package/dist/visitor/json-type-def.visitor.js +1 -10
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +0 -11
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.js +133 -228
- package/dist/visitor/template.visitor.d.ts +2 -17
- package/dist/visitor/template.visitor.d.ts.map +1 -1
- package/dist/visitor/template.visitor.js +22 -60
- package/dist/visitor/validator.visitor.d.ts +7 -49
- package/dist/visitor/validator.visitor.d.ts.map +1 -1
- package/dist/visitor/validator.visitor.js +178 -275
- package/dist/waterline-models/AttachmentMetadata.d.ts +0 -22
- package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
- package/dist/waterline-models/AttachmentMetadata.js +3 -147
- package/dist/waterline-models/BrandingConfig.d.ts +0 -7
- package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfig.js +1 -16
- package/dist/waterline-models/BrandingConfigHistory.d.ts +2 -11
- package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfigHistory.js +1 -21
- package/dist/waterline-models/FigshareSync.d.ts +41 -0
- package/dist/waterline-models/FigshareSync.d.ts.map +1 -0
- package/dist/waterline-models/FigshareSync.js +168 -0
- package/dist/waterline-models/RecordType.d.ts +0 -9
- package/dist/waterline-models/RecordType.d.ts.map +1 -1
- package/dist/waterline-models/RecordType.js +1 -16
- package/dist/waterline-models/User.d.ts +2 -2
- package/dist/waterline-models/User.d.ts.map +1 -1
- package/dist/waterline-models/User.js +17 -12
- package/dist/waterline-models/index.d.ts +2 -2
- package/dist/waterline-models/index.d.ts.map +1 -1
- package/dist/waterline-models/index.js +4 -4
- package/package.json +46 -59
- package/dist/AttachmentStagingIdentity.d.ts +0 -3
- package/dist/AttachmentStagingIdentity.d.ts.map +0 -1
- package/dist/AttachmentStagingIdentity.js +0 -10
- package/dist/RecordConcurrencyObservability.d.ts +0 -51
- package/dist/RecordConcurrencyObservability.d.ts.map +0 -1
- package/dist/RecordConcurrencyObservability.js +0 -136
- package/dist/RecordEntityTag.d.ts +0 -31
- package/dist/RecordEntityTag.d.ts.map +0 -1
- package/dist/RecordEntityTag.js +0 -101
- package/dist/RecordFormFingerprint.d.ts +0 -7
- package/dist/RecordFormFingerprint.d.ts.map +0 -1
- package/dist/RecordFormFingerprint.js +0 -106
- package/dist/RecordHttpConcurrency.d.ts +0 -60
- package/dist/RecordHttpConcurrency.d.ts.map +0 -1
- package/dist/RecordHttpConcurrency.js +0 -181
- package/dist/RecordSaveResponse.d.ts +0 -219
- package/dist/RecordSaveResponse.d.ts.map +0 -1
- package/dist/RecordSaveResponse.js +0 -639
- package/dist/RecordStorageConcurrency.d.ts +0 -48
- package/dist/RecordStorageConcurrency.d.ts.map +0 -1
- package/dist/RecordStorageConcurrency.js +0 -103
- package/dist/RecordWriteClassification.d.ts +0 -12
- package/dist/RecordWriteClassification.d.ts.map +0 -1
- package/dist/RecordWriteClassification.js +0 -70
- package/dist/action-execution/audit.d.ts +0 -41
- package/dist/action-execution/audit.d.ts.map +0 -1
- package/dist/action-execution/audit.js +0 -122
- package/dist/action-execution/executor.d.ts +0 -24
- package/dist/action-execution/executor.d.ts.map +0 -1
- package/dist/action-execution/executor.js +0 -435
- package/dist/action-execution/failure.d.ts +0 -49
- package/dist/action-execution/failure.d.ts.map +0 -1
- package/dist/action-execution/failure.js +0 -129
- package/dist/action-execution/index.d.ts +0 -7
- package/dist/action-execution/index.d.ts.map +0 -1
- package/dist/action-execution/index.js +0 -23
- package/dist/action-execution/legacy-result.d.ts +0 -21
- package/dist/action-execution/legacy-result.d.ts.map +0 -1
- package/dist/action-execution/legacy-result.js +0 -70
- package/dist/action-execution/policy.d.ts +0 -12
- package/dist/action-execution/policy.d.ts.map +0 -1
- package/dist/action-execution/policy.js +0 -138
- package/dist/action-execution/types.d.ts +0 -121
- package/dist/action-execution/types.d.ts.map +0 -1
- package/dist/action-execution/types.js +0 -22
- package/dist/api-routes/groups/record-schemas.d.ts +0 -5
- package/dist/api-routes/groups/record-schemas.d.ts.map +0 -1
- package/dist/api-routes/groups/record-schemas.js +0 -181
- package/dist/api-routes/record-schema-openapi.d.ts +0 -26
- package/dist/api-routes/record-schema-openapi.d.ts.map +0 -1
- package/dist/api-routes/record-schema-openapi.js +0 -38
- package/dist/api-routes/record-schema-response.d.ts +0 -40
- package/dist/api-routes/record-schema-response.d.ts.map +0 -1
- package/dist/api-routes/record-schema-response.js +0 -89
- package/dist/config/recordSchema.config.d.ts +0 -68
- package/dist/config/recordSchema.config.d.ts.map +0 -1
- package/dist/config/recordSchema.config.js +0 -173
- package/dist/config/recordValidation.config.d.ts +0 -19
- package/dist/config/recordValidation.config.d.ts.map +0 -1
- package/dist/config/recordValidation.config.js +0 -10
- package/dist/configmodels/DashboardFieldCatalogue.d.ts +0 -67
- package/dist/configmodels/DashboardFieldCatalogue.d.ts.map +0 -1
- package/dist/configmodels/DashboardFieldCatalogue.js +0 -174
- package/dist/configmodels/DashboardSettings.d.ts +0 -191
- package/dist/configmodels/DashboardSettings.d.ts.map +0 -1
- package/dist/configmodels/DashboardSettings.js +0 -705
- package/dist/configmodels/OniPublishing.d.ts +0 -205
- package/dist/configmodels/OniPublishing.d.ts.map +0 -1
- package/dist/configmodels/OniPublishing.js +0 -335
- package/dist/configmodels/RaidPublishing.d.ts +0 -97
- package/dist/configmodels/RaidPublishing.d.ts.map +0 -1
- package/dist/configmodels/RaidPublishing.js +0 -35
- package/dist/configmodels/WebAnalytics.d.ts +0 -55
- package/dist/configmodels/WebAnalytics.d.ts.map +0 -1
- package/dist/configmodels/WebAnalytics.js +0 -61
- package/dist/controllers/BrandingControllerSupport.d.ts +0 -20
- package/dist/controllers/BrandingControllerSupport.d.ts.map +0 -1
- package/dist/controllers/BrandingControllerSupport.js +0 -80
- package/dist/controllers/webservice/RecordSchemaController.d.ts +0 -32
- package/dist/controllers/webservice/RecordSchemaController.d.ts.map +0 -1
- package/dist/controllers/webservice/RecordSchemaController.js +0 -356
- package/dist/model/BrandingTypeface.d.ts +0 -70
- package/dist/model/BrandingTypeface.d.ts.map +0 -1
- package/dist/model/BrandingTypeface.js +0 -116
- package/dist/model/record-contract.d.ts +0 -42
- package/dist/model/record-contract.d.ts.map +0 -1
- package/dist/model/record-contract.js +0 -3
- package/dist/model/storage/record-schema.d.ts +0 -115
- package/dist/model/storage/record-schema.d.ts.map +0 -1
- package/dist/model/storage/record-schema.js +0 -3
- package/dist/record-contract/ajv-error-mapper.d.ts +0 -34
- package/dist/record-contract/ajv-error-mapper.d.ts.map +0 -1
- package/dist/record-contract/ajv-error-mapper.js +0 -153
- package/dist/record-contract/canonical-json.d.ts +0 -20
- package/dist/record-contract/canonical-json.d.ts.map +0 -1
- package/dist/record-contract/canonical-json.js +0 -126
- package/dist/record-contract/codes.d.ts +0 -36
- package/dist/record-contract/codes.d.ts.map +0 -1
- package/dist/record-contract/codes.js +0 -38
- package/dist/record-contract/contributor-registry.d.ts +0 -76
- package/dist/record-contract/contributor-registry.d.ts.map +0 -1
- package/dist/record-contract/contributor-registry.js +0 -126
- package/dist/record-contract/core-contributors.d.ts +0 -44
- package/dist/record-contract/core-contributors.d.ts.map +0 -1
- package/dist/record-contract/core-contributors.js +0 -395
- package/dist/record-contract/deep-freeze.d.ts +0 -3
- package/dist/record-contract/deep-freeze.d.ts.map +0 -1
- package/dist/record-contract/deep-freeze.js +0 -23
- package/dist/record-contract/index.d.ts +0 -13
- package/dist/record-contract/index.d.ts.map +0 -1
- package/dist/record-contract/index.js +0 -29
- package/dist/record-contract/json-pointer.d.ts +0 -20
- package/dist/record-contract/json-pointer.d.ts.map +0 -1
- package/dist/record-contract/json-pointer.js +0 -70
- package/dist/record-contract/json-schema-renderer.d.ts +0 -51
- package/dist/record-contract/json-schema-renderer.d.ts.map +0 -1
- package/dist/record-contract/json-schema-renderer.js +0 -450
- package/dist/record-contract/record-contract-compiler.d.ts +0 -42
- package/dist/record-contract/record-contract-compiler.d.ts.map +0 -1
- package/dist/record-contract/record-contract-compiler.js +0 -775
- package/dist/record-contract/record-contract-context.d.ts +0 -91
- package/dist/record-contract/record-contract-context.d.ts.map +0 -1
- package/dist/record-contract/record-contract-context.js +0 -39
- package/dist/record-contract/record-json-schema-artifact.d.ts +0 -74
- package/dist/record-contract/record-json-schema-artifact.d.ts.map +0 -1
- package/dist/record-contract/record-json-schema-artifact.js +0 -309
- package/dist/record-contract/record-json-schema-etag.d.ts +0 -15
- package/dist/record-contract/record-json-schema-etag.d.ts.map +0 -1
- package/dist/record-contract/record-json-schema-etag.js +0 -41
- package/dist/record-contract/types.d.ts +0 -151
- package/dist/record-contract/types.d.ts.map +0 -1
- package/dist/record-contract/types.js +0 -6
- package/dist/services/BrandingTypefaceService.d.ts +0 -74
- package/dist/services/BrandingTypefaceService.d.ts.map +0 -1
- package/dist/services/BrandingTypefaceService.js +0 -359
- package/dist/services/BrandingWoff2Inspector.d.ts +0 -17
- package/dist/services/BrandingWoff2Inspector.d.ts.map +0 -1
- package/dist/services/BrandingWoff2Inspector.js +0 -402
- package/dist/services/DashboardLegacyConversion.d.ts +0 -82
- package/dist/services/DashboardLegacyConversion.d.ts.map +0 -1
- package/dist/services/DashboardLegacyConversion.js +0 -427
- package/dist/services/RecordSchemaService.d.ts +0 -440
- package/dist/services/RecordSchemaService.d.ts.map +0 -1
- package/dist/services/RecordSchemaService.js +0 -3061
- package/dist/services/RecordValidationService.d.ts +0 -340
- package/dist/services/RecordValidationService.d.ts.map +0 -1
- package/dist/services/RecordValidationService.js +0 -1898
- package/dist/services/form-record-access-user.d.ts +0 -3
- package/dist/services/form-record-access-user.d.ts.map +0 -1
- package/dist/services/form-record-access-user.js +0 -23
- package/dist/services/integration-v2/bindings.d.ts +0 -3
- package/dist/services/integration-v2/bindings.d.ts.map +0 -1
- package/dist/services/integration-v2/bindings.js +0 -91
- package/dist/services/integration-v2/runtime.d.ts +0 -3
- package/dist/services/integration-v2/runtime.d.ts.map +0 -1
- package/dist/services/integration-v2/runtime.js +0 -50
- package/dist/services/internal-record-schema-authorization.d.ts +0 -8
- package/dist/services/internal-record-schema-authorization.d.ts.map +0 -1
- package/dist/services/internal-record-schema-authorization.js +0 -16
- package/dist/services/oni-v2/audit.d.ts +0 -19
- package/dist/services/oni-v2/audit.d.ts.map +0 -1
- package/dist/services/oni-v2/audit.js +0 -50
- package/dist/services/oni-v2/bindings.d.ts +0 -7
- package/dist/services/oni-v2/bindings.d.ts.map +0 -1
- package/dist/services/oni-v2/bindings.js +0 -31
- package/dist/services/oni-v2/config.d.ts +0 -12
- package/dist/services/oni-v2/config.d.ts.map +0 -1
- package/dist/services/oni-v2/config.js +0 -134
- package/dist/services/oni-v2/context.d.ts +0 -3
- package/dist/services/oni-v2/context.d.ts.map +0 -1
- package/dist/services/oni-v2/context.js +0 -17
- package/dist/services/oni-v2/crate.d.ts +0 -17
- package/dist/services/oni-v2/crate.d.ts.map +0 -1
- package/dist/services/oni-v2/crate.js +0 -504
- package/dist/services/oni-v2/flydriveOcflStore.d.ts +0 -69
- package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +0 -1
- package/dist/services/oni-v2/flydriveOcflStore.js +0 -325
- package/dist/services/oni-v2/ingestion.d.ts +0 -37
- package/dist/services/oni-v2/ingestion.d.ts.map +0 -1
- package/dist/services/oni-v2/ingestion.js +0 -91
- package/dist/services/oni-v2/mapping.d.ts +0 -17
- package/dist/services/oni-v2/mapping.d.ts.map +0 -1
- package/dist/services/oni-v2/mapping.js +0 -137
- package/dist/services/oni-v2/repository.d.ts +0 -9
- package/dist/services/oni-v2/repository.d.ts.map +0 -1
- package/dist/services/oni-v2/repository.js +0 -180
- package/dist/services/oni-v2/runtime.d.ts +0 -23
- package/dist/services/oni-v2/runtime.d.ts.map +0 -1
- package/dist/services/oni-v2/runtime.js +0 -121
- package/dist/services/oni-v2/templating.d.ts +0 -11
- package/dist/services/oni-v2/templating.d.ts.map +0 -1
- package/dist/services/oni-v2/templating.js +0 -27
- package/dist/services/oni-v2/types.d.ts +0 -100
- package/dist/services/oni-v2/types.d.ts.map +0 -1
- package/dist/services/oni-v2/types.js +0 -3
- package/dist/services/raid-v2/audit.d.ts +0 -10
- package/dist/services/raid-v2/audit.d.ts.map +0 -1
- package/dist/services/raid-v2/audit.js +0 -29
- package/dist/services/raid-v2/errors.d.ts +0 -85
- package/dist/services/raid-v2/errors.d.ts.map +0 -1
- package/dist/services/raid-v2/errors.js +0 -36
- package/dist/services/raid-v2/http.d.ts +0 -4
- package/dist/services/raid-v2/http.d.ts.map +0 -1
- package/dist/services/raid-v2/http.js +0 -84
- package/dist/services/raid-v2/logger.d.ts +0 -8
- package/dist/services/raid-v2/logger.d.ts.map +0 -1
- package/dist/services/raid-v2/logger.js +0 -30
- package/dist/services/raid-v2/mapping.d.ts +0 -9
- package/dist/services/raid-v2/mapping.d.ts.map +0 -1
- package/dist/services/raid-v2/mapping.js +0 -168
- package/dist/services/raid-v2/runtime.d.ts +0 -5
- package/dist/services/raid-v2/runtime.d.ts.map +0 -1
- package/dist/services/raid-v2/runtime.js +0 -135
- package/dist/services/raid-v2/tags.d.ts +0 -11
- package/dist/services/raid-v2/tags.d.ts.map +0 -1
- package/dist/services/raid-v2/tags.js +0 -12
- package/dist/services/raid-v2/types.d.ts +0 -66
- package/dist/services/raid-v2/types.d.ts.map +0 -1
- package/dist/services/raid-v2/types.js +0 -3
- package/dist/services/record-hooks/coordinator.d.ts +0 -64
- package/dist/services/record-hooks/coordinator.d.ts.map +0 -1
- package/dist/services/record-hooks/coordinator.js +0 -276
- package/dist/visitor/related-object-data-inline.visitor.d.ts +0 -31
- package/dist/visitor/related-object-data-inline.visitor.d.ts.map +0 -1
- package/dist/visitor/related-object-data-inline.visitor.js +0 -96
- package/dist/waterline-models/DashboardConfiguration.d.ts +0 -29
- package/dist/waterline-models/DashboardConfiguration.d.ts.map +0 -1
- package/dist/waterline-models/DashboardConfiguration.js +0 -52
|
@@ -1,217 +1,556 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// Copyright (c) 2023 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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
21
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
22
|
+
};
|
|
2
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
24
|
exports.Services = void 0;
|
|
4
|
-
/* oxlint-disable typescript/no-explicit-any */
|
|
5
|
-
const effect_1 = require("effect");
|
|
6
25
|
const CoreService_1 = require("../CoreService");
|
|
7
26
|
const RBValidationError_1 = require("../model/RBValidationError");
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const runtime_1 = require("./raid-v2/runtime");
|
|
13
|
-
const tags_1 = require("./raid-v2/tags");
|
|
14
|
-
const errors_1 = require("./raid-v2/errors");
|
|
27
|
+
const momentShim_1 = require("../shims/momentShim");
|
|
28
|
+
const raido_openapi_generated_node_1 = require("@researchdatabox/raido-openapi-generated-node");
|
|
29
|
+
const numeral_1 = __importDefault(require("numeral"));
|
|
30
|
+
const axios_1 = __importDefault(require("axios"));
|
|
15
31
|
var Services;
|
|
16
32
|
(function (Services) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (/^\d+$/.test(part))
|
|
24
|
-
return `[${part}]`;
|
|
25
|
-
const segment = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(part)
|
|
26
|
-
? part
|
|
27
|
-
: `"${part.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
|
|
28
|
-
return index === 0 ? segment : `.${segment}`;
|
|
29
|
-
}).join('');
|
|
30
|
-
return /^(record|options|mappedData|types)(\.|\[|$)/.test(expression) ? expression : `record.${expression}`;
|
|
31
|
-
}
|
|
32
|
-
function normalizeLegacyMapping(mapping) {
|
|
33
|
-
return Object.fromEntries(Object.entries(mapping ?? {}).map(([profile, rawFields]) => [
|
|
34
|
-
profile,
|
|
35
|
-
Object.fromEntries(Object.entries(rawFields).map(([name, rawField]) => {
|
|
36
|
-
const field = rawField;
|
|
37
|
-
if (field.engine || typeof field.src !== 'string')
|
|
38
|
-
return [name, field];
|
|
39
|
-
const normalized = {
|
|
40
|
-
...field,
|
|
41
|
-
engine: 'jsonata',
|
|
42
|
-
expression: legacyPathToJsonata(field.src),
|
|
43
|
-
parseJson: undefined,
|
|
44
|
-
src: undefined,
|
|
45
|
-
};
|
|
46
|
-
return [name, normalized];
|
|
47
|
-
})),
|
|
48
|
-
]));
|
|
49
|
-
}
|
|
50
|
-
function legacyConfigToPublishing(raw) {
|
|
51
|
-
return {
|
|
52
|
-
enabled: raw.enabled !== false,
|
|
53
|
-
connection: {
|
|
54
|
-
baseUrl: String(raw.basePath ?? ''), token: String(raw.token ?? ''), timeoutMs: Number(raw.timeoutMs ?? 30000),
|
|
55
|
-
oauth: { url: String(raw.oauth?.url ?? ''), clientId: String(raw.oauth?.client_id ?? raw.oauth?.clientId ?? ''), username: String(raw.oauth?.username ?? ''), password: String(raw.oauth?.password ?? ''), timeoutMs: Number(raw.oauth?.timeoutMs ?? 10000), expirySkewMs: Number(raw.oauth?.expirySkewMs ?? 30000) },
|
|
56
|
-
retry: { maxAttempts: Number(raw.retry?.maxAttempts ?? 3), baseDelayMs: Number(raw.retry?.baseDelayMs ?? 500), maxDelayMs: Number(raw.retry?.maxDelayMs ?? 10000), jitter: raw.retry?.jitter !== false, retryOnStatusCodes: raw.retry?.retryOnStatusCodes ?? [408, 425, 429, 500, 502, 503, 504] }
|
|
57
|
-
},
|
|
58
|
-
durableRetry: { jobName: String(raw.retryJobName ?? 'RaidMintRetryJob'), schedule: String(raw.retryJobSchedule ?? 'in 5 minutes'), maxAttempts: Number(raw.retryJobMaxAttempts ?? 5) },
|
|
59
|
-
saveBodyInMeta: raw.saveBodyInMeta !== false, raidFieldName: String(raw.raidFieldName ?? 'raidUrl'), orcidBaseUrl: String(raw.orcidBaseUrl ?? 'https://orcid.org/'),
|
|
60
|
-
types: raw.types ?? {}, mapping: normalizeLegacyMapping(raw.mapping ?? {})
|
|
61
|
-
};
|
|
62
|
-
}
|
|
33
|
+
/**
|
|
34
|
+
* Uses `@researchdatabox/raido-openapi-generated-node` to interact with ARDC's RAID API.
|
|
35
|
+
*
|
|
36
|
+
* Author: <a href='https://github.com/shilob' target='_blank'>Shilo Banihit</a>
|
|
37
|
+
*
|
|
38
|
+
*/
|
|
63
39
|
class Raid extends CoreService_1.Services.Core.Service {
|
|
64
|
-
_exportedMethods = [
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (!role || typeof role !== 'object' || Array.isArray(role))
|
|
80
|
-
return [];
|
|
81
|
-
const roleRecord = role;
|
|
82
|
-
const id = typeof roleRecord.id === 'string' ? roleRecord.id.trim() : '';
|
|
83
|
-
const name = typeof roleRecord.name === 'string' ? roleRecord.name.trim() : '';
|
|
84
|
-
return id || name ? [{ ...(id ? { id } : {}), ...(name ? { name } : {}) }] : [];
|
|
85
|
-
});
|
|
86
|
-
return { username, roles };
|
|
87
|
-
}
|
|
88
|
-
resolveBrand(record) {
|
|
89
|
-
const brandId = String(getPath(record, 'metaMetadata.brandId') ?? '');
|
|
90
|
-
if (!brandId)
|
|
91
|
-
throw new RBValidationError_1.RBValidationError({ message: 'Brand id not found for RAiD record', displayErrors: [{ code: 'raid-mint-transform-validation-error' }] });
|
|
92
|
-
const brand = BrandingService.getBrandById(brandId) ?? BrandingService.getBrand(brandId);
|
|
93
|
-
if (!brand)
|
|
94
|
-
throw new RBValidationError_1.RBValidationError({ message: `Unknown brand '${brandId}' for RAiD record`, displayErrors: [{ code: 'raid-mint-transform-validation-error' }] });
|
|
95
|
-
return { id: String(brand.id), name: String(brand.name) };
|
|
96
|
-
}
|
|
97
|
-
resolveConfig(record) {
|
|
98
|
-
const brand = this.resolveBrand(record);
|
|
99
|
-
const branded = AppConfigService?.getAppConfigurationForBrand?.(brand.name)?.raidPublishing;
|
|
100
|
-
const config = branded ?? legacyConfigToPublishing(sails.config.raid);
|
|
101
|
-
if (!config?.connection?.baseUrl)
|
|
102
|
-
throw new RBValidationError_1.RBValidationError({ message: `RAiD base URL is not configured for brand '${brand.name}'`, displayErrors: [{ code: 'raid-mint-transform-validation-error' }] });
|
|
103
|
-
if (config.connection.retry.maxAttempts < 1 || config.connection.timeoutMs < 1)
|
|
104
|
-
throw new RBValidationError_1.RBValidationError({ message: `Invalid RAiD retry/timeout configuration for brand '${brand.name}'`, displayErrors: [{ code: 'raid-mint-transform-validation-error' }] });
|
|
105
|
-
for (const [profile, fields] of Object.entries(config.mapping))
|
|
106
|
-
for (const [name, field] of Object.entries(fields)) {
|
|
107
|
-
if ((field.expression ?? field.template ?? '').includes('<%'))
|
|
108
|
-
throw new RBValidationError_1.RBValidationError({ message: `Legacy lodash syntax is not supported in RAiD mapping '${profile}.${name}'`, displayErrors: [{ code: 'raid-mint-transform-validation-error' }] });
|
|
109
|
-
}
|
|
110
|
-
return { brand, config };
|
|
111
|
-
}
|
|
112
|
-
buildLayer(input) {
|
|
113
|
-
const base = effect_1.Layer.merge(effect_1.Layer.succeed(tags_1.RaidConfigTag, input.config), effect_1.Layer.succeed(tags_1.RaidRunContextTag, input.context));
|
|
114
|
-
const records = effect_1.Layer.succeed(tags_1.RaidRecordRepositoryTag, {
|
|
115
|
-
getMeta: (oid) => effect_1.Effect.tryPromise({ try: () => RecordsService.getMeta(oid), catch: cause => new errors_1.RaidSourceRecordError({ message: `Failed to load record '${oid}'`, cause }) }),
|
|
116
|
-
appendToRecord: (oid, value, path) => effect_1.Effect.tryPromise({ try: async () => {
|
|
117
|
-
const result = await RecordsService.appendToRecord(oid, value, path, undefined, undefined, input.context.initiatingActor);
|
|
118
|
-
if (!result?.isSuccessful?.())
|
|
119
|
-
throw new Error(String(result?.message ?? 'append failed'));
|
|
120
|
-
}, catch: cause => cause })
|
|
121
|
-
});
|
|
122
|
-
const queue = effect_1.Layer.succeed(tags_1.RaidQueueTag, {
|
|
123
|
-
schedule: (data) => effect_1.Effect.tryPromise({
|
|
124
|
-
try: async () => { await AgendaQueueService.schedule(input.config.durableRetry.jobName, input.config.durableRetry.schedule, data); },
|
|
125
|
-
catch: cause => new errors_1.RaidQueueError({ message: 'Failed to schedule RAiD retry', cause })
|
|
126
|
-
})
|
|
127
|
-
});
|
|
128
|
-
const servicesLayer = effect_1.Layer.mergeAll((0, mapping_1.makeMappingLayer)(), (0, http_1.makeHttpLayer)(), (0, audit_1.makeAuditLayer)(typeof IntegrationAuditService !== 'undefined' ? IntegrationAuditService : undefined)).pipe(effect_1.Layer.provide(base));
|
|
129
|
-
return effect_1.Layer.mergeAll(base, records, queue, servicesLayer, (0, logger_1.makeLoggerLayer)(sails.log));
|
|
130
|
-
}
|
|
131
|
-
async mintRaid(oid, record, options, attemptCount = 0, initiatingUser = {}) {
|
|
132
|
-
const { brand, config } = this.resolveConfig(record);
|
|
133
|
-
if (!config.enabled)
|
|
134
|
-
return record;
|
|
135
|
-
const initiatingActor = this.initiatingActor(initiatingUser);
|
|
136
|
-
const input = {
|
|
137
|
-
record,
|
|
138
|
-
options,
|
|
139
|
-
config,
|
|
140
|
-
context: {
|
|
141
|
-
oid,
|
|
142
|
-
brandId: brand.id,
|
|
143
|
-
brandName: brand.name,
|
|
144
|
-
triggerSource: String(options.triggerSource ?? 'mintTrigger'),
|
|
145
|
-
attemptCount,
|
|
146
|
-
...(initiatingActor ? { initiatingActor } : {}),
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
const program = (0, runtime_1.mintRaidProgram)(input).pipe(effect_1.Effect.provide(this.buildLayer(input)));
|
|
150
|
-
try {
|
|
151
|
-
return await (0, runtime_1.runRaidProgram)(program, options.signal);
|
|
152
|
-
}
|
|
153
|
-
catch (error) {
|
|
154
|
-
const status = typeof error === 'object' && error !== null && 'statusCode' in error ? String(error.statusCode ?? '') : '';
|
|
155
|
-
throw new RBValidationError_1.RBValidationError({ message: error instanceof Error ? error.message : String(error), options: { cause: error }, displayErrors: [{ code: error != null && typeof error === 'object' && String(error._tag).includes('Mapping') ? 'raid-mint-transform-validation-error' : 'raid-mint-server-error', status }] });
|
|
156
|
-
}
|
|
40
|
+
_exportedMethods = [
|
|
41
|
+
'mintTrigger',
|
|
42
|
+
'getContributors',
|
|
43
|
+
'buildContribVal',
|
|
44
|
+
'mintPostCreateRetryHandler',
|
|
45
|
+
'mintRetryJob'
|
|
46
|
+
];
|
|
47
|
+
oauthTokenData = {
|
|
48
|
+
accessTokenExpiryMillis: null,
|
|
49
|
+
accessToken: null,
|
|
50
|
+
responseData: null
|
|
51
|
+
};
|
|
52
|
+
constructor() {
|
|
53
|
+
super();
|
|
54
|
+
this.logHeader = "RaidService::";
|
|
157
55
|
}
|
|
158
|
-
async mintTrigger(oid, record, options
|
|
159
|
-
if (this.metTriggerCondition(oid, record, options) ===
|
|
160
|
-
await this.mintRaid(oid, record, options
|
|
56
|
+
async mintTrigger(oid, record, options) {
|
|
57
|
+
if (this.metTriggerCondition(oid, record, options) === "true") {
|
|
58
|
+
await this.mintRaid(oid, record, options);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
sails.log.debug(`${this.logHeader} mintTrigger()-> RAiD URL already minted.`);
|
|
161
62
|
}
|
|
162
63
|
return record;
|
|
163
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Light AgendaQueue wrapper for the main mint method.
|
|
67
|
+
*/
|
|
164
68
|
async mintRetryJob(job) {
|
|
165
69
|
const data = job.attrs.data;
|
|
166
70
|
const record = await RecordsService.getMeta(data.oid);
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
71
|
+
const attemptCount = data.attemptCount ?? 0;
|
|
72
|
+
const options = data.options ?? {};
|
|
73
|
+
await this.mintRaid(data.oid, record, options, attemptCount);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Light retry handler for preSave onCreate failures, when OID is still unknown.
|
|
77
|
+
*
|
|
78
|
+
* @param oid
|
|
79
|
+
* @param record
|
|
80
|
+
* @param options
|
|
81
|
+
*/
|
|
82
|
+
async mintPostCreateRetryHandler(oid, record, _options) {
|
|
83
|
+
const attemptCount = Number(_.get(record, 'metaMetadata.raid.attemptCount', 0));
|
|
84
|
+
if (!_.isEmpty(oid) && attemptCount > 0) {
|
|
85
|
+
sails.log.verbose(`${this.logHeader} mintPostCreateRetryHandler() -> Scheduled for ${oid} `);
|
|
86
|
+
const raidOptions = _.get(record, 'metaMetadata.raid.options', {});
|
|
87
|
+
this.scheduleMintRetry({ oid: oid, options: raidOptions, attemptCount: attemptCount });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Returns `sails.config.raid.token`
|
|
92
|
+
*
|
|
93
|
+
* If not set, retrieves an access token using `sails.config.raid.username` and `sails.config.raid.password`
|
|
94
|
+
*
|
|
95
|
+
* Access tokens have 24 hour validity
|
|
96
|
+
*
|
|
97
|
+
* @returns access token
|
|
98
|
+
*/
|
|
99
|
+
async getToken() {
|
|
100
|
+
if (!_.isEmpty(_.trim(sails.config.raid.token))) {
|
|
101
|
+
sails.log.verbose(`${this.logHeader} getToken() -> Using 'sails.config.raid.token'`);
|
|
102
|
+
return sails.config.raid.token;
|
|
103
|
+
}
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
if (this.oauthTokenData.accessTokenExpiryMillis && now < this.oauthTokenData.accessTokenExpiryMillis) {
|
|
106
|
+
sails.log.verbose(`${this.logHeader} getToken() -> Using cached accessToken`);
|
|
107
|
+
return this.oauthTokenData.accessToken;
|
|
108
|
+
}
|
|
109
|
+
const oauthUrl = sails.config.raid.oauth.url;
|
|
110
|
+
const oauthClientId = sails.config.raid.oauth.client_id;
|
|
111
|
+
const username = sails.config.raid.oauth.username;
|
|
112
|
+
const password = sails.config.raid.oauth.password;
|
|
113
|
+
// FYI: as of 03 October 2024, the staging environment's `refresh_expires_in` has the same value as `expires_in` rendering it useless
|
|
114
|
+
if (_.isEmpty(username) || _.isEmpty(password)) {
|
|
115
|
+
throw new RBValidationError_1.RBValidationError({
|
|
116
|
+
message: "Username and/or Password not configured",
|
|
117
|
+
displayErrors: [{ code: 'raid-mint-transform-validation-error' }],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
sails.log.verbose(`${this.logHeader} getToken() -> Getting new access token...`);
|
|
122
|
+
const oauthConfig = {
|
|
123
|
+
url: oauthUrl,
|
|
124
|
+
grant_type: 'password',
|
|
125
|
+
username: username,
|
|
126
|
+
password: password,
|
|
127
|
+
client_id: oauthClientId
|
|
128
|
+
};
|
|
129
|
+
const auth1 = await this.fetchAuthToken(oauthConfig);
|
|
130
|
+
sails.log.verbose(`${this.logHeader} getToken() -> Got new token!`);
|
|
131
|
+
if (auth1) {
|
|
132
|
+
this.oauthTokenData.responseData = auth1;
|
|
133
|
+
this.oauthTokenData.accessTokenExpiryMillis = Date.now() + ((auth1.expires_in ?? 0) * 1000);
|
|
134
|
+
this.oauthTokenData.accessToken = auth1.access_token ?? null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
throw new RBValidationError_1.RBValidationError({
|
|
139
|
+
message: "Failed to get token",
|
|
140
|
+
options: { cause: err },
|
|
141
|
+
displayErrors: [{ code: 'raid-mint-transform-validation-error' }],
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return this.oauthTokenData.accessToken;
|
|
145
|
+
}
|
|
146
|
+
async fetchAuthToken(oauthConfig) {
|
|
147
|
+
try {
|
|
148
|
+
const params = new URLSearchParams({
|
|
149
|
+
'grant_type': String(oauthConfig.grantType ?? oauthConfig.grant_type ?? ''),
|
|
150
|
+
'client_id': String(oauthConfig.clientId ?? oauthConfig.client_id ?? ''),
|
|
151
|
+
'username': String(oauthConfig.username ?? ''),
|
|
152
|
+
'password': String(oauthConfig.password ?? '')
|
|
153
|
+
});
|
|
154
|
+
const response = await axios_1.default.post(oauthConfig.url, params, {
|
|
155
|
+
headers: {
|
|
156
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
const tokenData = response.data;
|
|
160
|
+
return tokenData;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
throw new RBValidationError_1.RBValidationError({
|
|
164
|
+
message: "Error fetching the token",
|
|
165
|
+
options: { cause: error },
|
|
166
|
+
displayErrors: [{ code: 'raid-mint-server-error' }],
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async mintRaid(oid, record, options, attemptCount = 0) {
|
|
171
|
+
const basePath = sails.config.raid.basePath;
|
|
172
|
+
const apiToken = await this.getToken();
|
|
173
|
+
const configuration = new raido_openapi_generated_node_1.Configuration({
|
|
174
|
+
basePath: basePath,
|
|
175
|
+
accessToken: apiToken || undefined
|
|
176
|
+
});
|
|
177
|
+
const api = new raido_openapi_generated_node_1.RaidApi(configuration);
|
|
178
|
+
const request = {};
|
|
179
|
+
try {
|
|
180
|
+
let srcRecord = record;
|
|
181
|
+
const srcRecField = String(_.get(options, 'request.sourceOidField', ''));
|
|
182
|
+
if (!_.isEmpty(srcRecField)) {
|
|
183
|
+
let srcRecVal = null;
|
|
184
|
+
const srcRecOid = String(_.get(record, srcRecField, ''));
|
|
185
|
+
if (!_.isEmpty(srcRecOid)) {
|
|
186
|
+
srcRecVal = await RecordsService.getMeta(srcRecOid);
|
|
187
|
+
if (!_.isEmpty(srcRecVal)) {
|
|
188
|
+
srcRecord = srcRecVal;
|
|
189
|
+
// process any overrides to the source record
|
|
190
|
+
const recordOverrides = _.get(options, 'request.recordOverrides', []);
|
|
191
|
+
if (!_.isEmpty(recordOverrides) && _.isArray(recordOverrides)) {
|
|
192
|
+
for (const recOverride of recordOverrides) {
|
|
193
|
+
const fieldPath = String(recOverride.field ?? '');
|
|
194
|
+
const valuePath = String(recOverride.value ?? '');
|
|
195
|
+
if (!_.isEmpty(fieldPath) && !_.isEmpty(valuePath)) {
|
|
196
|
+
_.set(srcRecord, fieldPath, _.get(record, valuePath));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (_.isEmpty(srcRecVal)) {
|
|
203
|
+
throw new RBValidationError_1.RBValidationError({
|
|
204
|
+
message: `Failed to retrieve the source record: ${srcRecOid}, using path: ${srcRecField}, please check your recordtype configuration.`,
|
|
205
|
+
displayErrors: [{ code: 'raid-mint-transform-validation-error' }],
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
let mintRequestFields = _.get(options, 'request.mint.fields');
|
|
210
|
+
if (_.isString(mintRequestFields)) {
|
|
211
|
+
// allows to DRYer config
|
|
212
|
+
mintRequestFields = _.get(sails.config, mintRequestFields);
|
|
213
|
+
}
|
|
214
|
+
const mappedData = this.getMappedData(srcRecord, mintRequestFields ?? {}, options);
|
|
215
|
+
request.title = _.get(mappedData, 'title');
|
|
216
|
+
request.date = _.get(mappedData, 'date');
|
|
217
|
+
request.description = _.get(mappedData, 'description');
|
|
218
|
+
request.access = _.get(mappedData, 'access');
|
|
219
|
+
request.alternateUrl = _.get(mappedData, 'alternateUrl');
|
|
220
|
+
request.contributor = _.get(mappedData, 'contributor');
|
|
221
|
+
request.organisation = _.get(mappedData, 'organisation');
|
|
222
|
+
request.subject = _.get(mappedData, 'subject');
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
throw new RBValidationError_1.RBValidationError({
|
|
226
|
+
options: { cause: error },
|
|
227
|
+
displayErrors: [{ code: 'raid-mint-transform-validation-error' }],
|
|
182
228
|
});
|
|
183
229
|
}
|
|
230
|
+
let raid = undefined;
|
|
231
|
+
let metaMetadataInfo = undefined;
|
|
232
|
+
let responseStatus = undefined;
|
|
233
|
+
let responseBody = undefined;
|
|
234
|
+
try {
|
|
235
|
+
sails.log.verbose(`${this.logHeader} mintRaid() ${oid} -> Sending data::`);
|
|
236
|
+
sails.log.verbose(JSON.stringify(request));
|
|
237
|
+
const axiosResponse = await api.mintRaid(request);
|
|
238
|
+
_.set(axiosResponse, 'config.headers.Authorization', '-redacted-');
|
|
239
|
+
responseStatus = axiosResponse.status;
|
|
240
|
+
responseBody = axiosResponse.data;
|
|
241
|
+
sails.log.verbose(JSON.stringify(responseStatus));
|
|
242
|
+
sails.log.verbose(`${this.logHeader} mintRaid() ${oid} -> Body::`);
|
|
243
|
+
sails.log.verbose(JSON.stringify(responseBody));
|
|
244
|
+
if (responseStatus == 201) {
|
|
245
|
+
raid = _.get(responseBody, 'identifier');
|
|
246
|
+
if (sails.config.raid.saveBodyInMeta) {
|
|
247
|
+
metaMetadataInfo = responseBody;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Note: if there's any 'notSet' validation errors, these will have to be hashed out during development,
|
|
252
|
+
// with the specific fields set to 'required' and not treat these as runtime errors
|
|
253
|
+
throw new RBValidationError_1.RBValidationError({
|
|
254
|
+
message: `Failed to mint RAiD for oid ${oid} statusCode ${responseStatus} body ${JSON.stringify(responseBody)}`,
|
|
255
|
+
displayErrors: [{ code: 'raid-mint-server-error', status: String(responseStatus ?? '') }],
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
const errObj = error;
|
|
261
|
+
_.set(errObj, 'response.request.headers.Authorization', '-redacted-');
|
|
262
|
+
const statusCode = _.get(errObj, 'statusCode');
|
|
263
|
+
const msgs = [];
|
|
264
|
+
if (statusCode == 401 || statusCode == 403 || statusCode == 400) {
|
|
265
|
+
msgs.push(`Authentication failed for oid ${oid}, check if the auth token is properly configured.`);
|
|
266
|
+
if (statusCode == 400) {
|
|
267
|
+
msgs.push(`Possible validation issues for oid ${oid}!`);
|
|
268
|
+
}
|
|
269
|
+
throw new RBValidationError_1.RBValidationError({
|
|
270
|
+
message: msgs.join(' '),
|
|
271
|
+
options: { cause: error },
|
|
272
|
+
displayErrors: [{ code: 'raid-mint-server-error', status: String(statusCode ?? ''), meta: { oid } }],
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
// This is the generic handler for when the API call itself throws an exception, e.g. 404, 5xx status code that can possibly be resolved by retrying the request
|
|
276
|
+
sails.log.error(`${this.logHeader} mintRaid() ${oid} -> API error, Status Code: '${errObj.statusCode}'`);
|
|
277
|
+
sails.log.error(`${this.logHeader} mintRaid() ${oid} -> Error: ${JSON.stringify(errObj)}`);
|
|
278
|
+
// set response as the error so it can be saved in the retry block
|
|
279
|
+
responseStatus = statusCode;
|
|
280
|
+
// saving as much info by setting the body to either the actual return value or the entire error object
|
|
281
|
+
responseBody = !_.isEmpty(errObj.body) ? errObj.body : JSON.stringify(errObj);
|
|
282
|
+
// swallow as this will be handled after this block
|
|
283
|
+
}
|
|
284
|
+
if (!_.isEmpty(raid)) {
|
|
285
|
+
await this.saveRaid(raid, record, options, metaMetadataInfo);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
sails.log.error(`${this.logHeader} mintRaid() ${oid} -> Failed to mint raid!`);
|
|
289
|
+
if (!_.isEmpty(sails.config.raid.retryJobName)) {
|
|
290
|
+
// a generic/comms error, so we put this in the queue so we can retry later
|
|
291
|
+
attemptCount++;
|
|
292
|
+
if (attemptCount <= sails.config.raid.retryJobMaxAttempts) {
|
|
293
|
+
// set the flag for post-save processor to add the job
|
|
294
|
+
_.set(record, 'metaMetadata.raid.attemptCount', attemptCount);
|
|
295
|
+
_.set(record, 'metaMetadata.raid.options', options);
|
|
296
|
+
_.set(record, 'metaMetadata.raid.attemptResponse', { statusCode: responseStatus, body: responseBody });
|
|
297
|
+
if (!_.isEmpty(oid)) {
|
|
298
|
+
// same as above but directly schedule as we know the oid
|
|
299
|
+
this.scheduleMintRetry({ oid: oid, options: options, attemptCount: attemptCount });
|
|
300
|
+
}
|
|
301
|
+
// we let the process proceed so the record is saved
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
sails.log.error(`${this.logHeader} mintRaid() -> Max retry attempts reached, giving up: ${oid}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
sails.log.debug(`${this.logHeader} mintRaid() -> Retries not configured, please set 'sails.config.raid.retryJobName'`);
|
|
309
|
+
// we fail fast if retries aren't supported
|
|
310
|
+
throw new RBValidationError_1.RBValidationError({
|
|
311
|
+
message: "Retries not configured, please set 'sails.config.raid.retryJobName'",
|
|
312
|
+
displayErrors: [{ code: 'raid-mint-server-error' }],
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return record;
|
|
317
|
+
}
|
|
318
|
+
scheduleMintRetry(data) {
|
|
319
|
+
AgendaQueueService.schedule(sails.config.raid.retryJobName, sails.config.raid.retryJobSchedule, data);
|
|
184
320
|
}
|
|
185
321
|
getContributors(record, options, fieldConfig, mappedData) {
|
|
186
|
-
|
|
187
|
-
|
|
322
|
+
// start with a map to simplify uniqueness guarantees
|
|
323
|
+
const contributors = {};
|
|
324
|
+
const contributorMapConfig = _.get(fieldConfig, 'contributorMap', {});
|
|
325
|
+
const startDate = String(_.get(mappedData, 'date.startDate', ''));
|
|
326
|
+
const endDateRaw = _.get(mappedData, 'date.endDate', '');
|
|
327
|
+
const endDate = !_.isEmpty(endDateRaw) ? String(endDateRaw) : undefined;
|
|
328
|
+
for (const fieldName in contributorMapConfig) {
|
|
329
|
+
const contribVal = _.get(record, `metadata.${fieldName}`);
|
|
330
|
+
const contribConfig = contributorMapConfig[fieldName];
|
|
331
|
+
if (Array.isArray(contribVal)) {
|
|
332
|
+
for (const entry of contribVal) {
|
|
333
|
+
this.buildContribVal(contributors, entry, contribConfig, startDate, endDate);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
this.buildContribVal(contributors, contribVal, contribConfig, startDate, endDate);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// convert to array for the API
|
|
341
|
+
return _.map(contributors, (val) => { return val; });
|
|
188
342
|
}
|
|
189
343
|
buildContribVal(contributors, contribVal, contribConfig, startDate, endDate) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
344
|
+
if (!contribVal || typeof contribVal !== 'object') {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (_.isEmpty(_.get(contribVal, 'text_full_name'))) {
|
|
348
|
+
sails.log.verbose(`${this.logHeader} buildContribVal() -> Ignoring blank record.`);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
const id = this.getContributorId(contribVal, contribConfig);
|
|
352
|
+
if (!_.isEmpty(id)) {
|
|
353
|
+
if (_.isUndefined(contributors[id])) {
|
|
354
|
+
// this the first entry to the map, successive updates will only be appending the incoming position & role
|
|
355
|
+
const positionType = String(_.get(contribConfig, 'position', ''));
|
|
356
|
+
const roleType = String(_.get(contribConfig, 'role', ''));
|
|
357
|
+
const contrib = {
|
|
358
|
+
id: id,
|
|
359
|
+
schemaUri: sails.config.raid.orcidBaseUrl,
|
|
360
|
+
position: [
|
|
361
|
+
this.getContributorPosition(positionType, startDate, endDate)
|
|
362
|
+
],
|
|
363
|
+
role: [
|
|
364
|
+
this.getContributorRole(roleType)
|
|
365
|
+
]
|
|
366
|
+
};
|
|
367
|
+
this.setContributorFlags(contrib, contribConfig);
|
|
368
|
+
contributors[id] = contrib;
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
const positionType = String(_.get(contribConfig, 'position', ''));
|
|
372
|
+
const roleType = String(_.get(contribConfig, 'role', ''));
|
|
373
|
+
const position = this.getContributorPosition(positionType, startDate, endDate);
|
|
374
|
+
const existingContributor = contributors[id];
|
|
375
|
+
if (!_.find(existingContributor.position, { id: position.id })) {
|
|
376
|
+
// as per https://metadata.raid.org/en/latest/core/contributors.html#contributor-position
|
|
377
|
+
// contributors can only have one position for a certain time (unsupported by RB) period so only use the 'highest'
|
|
378
|
+
const curPosIdx = _.findIndex(sails.config.raid.types.contributor.hiearchy.position, (lbl) => { return lbl == positionType; });
|
|
379
|
+
const existPosLabel = _.findKey(sails.config.raid.types.contributor.position, { id: existingContributor.position?.[0]?.id });
|
|
380
|
+
const existPosIdx = _.findIndex(sails.config.raid.types.contributor.hiearchy.position, (lbl) => { return lbl == existPosLabel; });
|
|
381
|
+
if (curPosIdx < existPosIdx) {
|
|
382
|
+
// the current position is higher, overwrite existing
|
|
383
|
+
if (existingContributor.position) {
|
|
384
|
+
existingContributor.position[0] = position;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// if the incoming incoming position is the same or lower hiearchy, ignore...
|
|
388
|
+
}
|
|
389
|
+
const role = this.getContributorRole(roleType);
|
|
390
|
+
if (!_.find(existingContributor.role, { id: role.id })) {
|
|
391
|
+
if (existingContributor.role) {
|
|
392
|
+
existingContributor.role.push(role);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
this.setContributorFlags(existingContributor, contribConfig);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
sails.log.verbose(`${this.logHeader} buildContribVal() -> Missing/invalid identifier for: ${JSON.stringify(contribVal)}`);
|
|
400
|
+
// we ignore records that don't have a valid ORCID, otherwise we reject the RAiD creation
|
|
401
|
+
if (_.get(contribConfig, 'requireOrcid', false) == true) {
|
|
402
|
+
// reject mint as we have a missing ORCID
|
|
403
|
+
throw new RBValidationError_1.RBValidationError({
|
|
404
|
+
message: `Missing ORCID and requireOrcid is true for ${JSON.stringify(contribVal)}`,
|
|
405
|
+
displayErrors: [{ code: 'raid-mint-transform-missing-contributorid-error', meta: { fullName: _.get(contribVal, 'text_full_name') } }],
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
setContributorFlags(contrib, contribConfig) {
|
|
411
|
+
// setting the required flags: https://metadata.raid.org/en/latest/core/contributors.html
|
|
412
|
+
const configFlags = sails.config.raid.types.contributor.flags;
|
|
413
|
+
for (const configFlagName in configFlags) {
|
|
414
|
+
if (_.includes(configFlags[configFlagName], contribConfig.position)) {
|
|
415
|
+
_.set(contrib, configFlagName, true);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* As per https://support.orcid.org/hc/en-us/articles/360006897674-Structure-of-the-ORCID-Identifier
|
|
421
|
+
*
|
|
422
|
+
* orcid must be a 0-9,X
|
|
423
|
+
*
|
|
424
|
+
* @param contribVal
|
|
425
|
+
* @param contribConfig
|
|
426
|
+
* @returns
|
|
427
|
+
*/
|
|
428
|
+
getContributorId(contribVal, contribConfig) {
|
|
429
|
+
const idField = String(_.get(contribConfig, 'fieldMap.id', ''));
|
|
430
|
+
const rawId = idField ? _.get(contribVal, idField) : '';
|
|
431
|
+
const rawIdStr = String(rawId ?? '');
|
|
432
|
+
const strippedId = _.replace(rawIdStr, sails.config.raid.orcidBaseUrl, '');
|
|
433
|
+
const regex = /(\d{4}-){3}\d{3}(\d|X)/;
|
|
434
|
+
if (_.isEmpty(strippedId) || _.size(strippedId) !== 19 || regex.test(strippedId) === false) {
|
|
435
|
+
return '';
|
|
436
|
+
}
|
|
437
|
+
// ID now should be the full ORCID Url
|
|
438
|
+
let id = rawIdStr;
|
|
439
|
+
if (!_.startsWith(id, sails.config.raid.orcidBaseUrl)) {
|
|
440
|
+
id = `${sails.config.raid.orcidBaseUrl}${id}`;
|
|
441
|
+
}
|
|
442
|
+
return id;
|
|
443
|
+
}
|
|
444
|
+
getContributorPosition(type, startDate, endDate) {
|
|
445
|
+
return {
|
|
446
|
+
schemaUri: sails.config.raid.types.contributor.position[type].schemaUri,
|
|
447
|
+
id: sails.config.raid.types.contributor.position[type].id,
|
|
448
|
+
startDate: startDate,
|
|
449
|
+
endDate: endDate
|
|
450
|
+
}; // not currently matching to any generated class so returning as POJO
|
|
451
|
+
}
|
|
452
|
+
getContributorRole(type) {
|
|
453
|
+
return {
|
|
454
|
+
schemaUri: sails.config.raid.types.contributor.roles.schemaUri,
|
|
455
|
+
id: `${sails.config.raid.types.contributor.roles.schemaUri}contributor-roles/${sails.config.raid.types.contributor.roles.types[type]}/`
|
|
456
|
+
}; // not currently matching to any generated class so returning as POJO
|
|
457
|
+
}
|
|
458
|
+
getMappedData(record, fields, options) {
|
|
459
|
+
const mappedData = {};
|
|
460
|
+
for (const fieldName in fields) {
|
|
461
|
+
try {
|
|
462
|
+
const fieldConfig = _.get(fields, fieldName, {});
|
|
463
|
+
const src = String(_.get(fieldConfig, 'src', ''));
|
|
464
|
+
const dest = _.get(fieldConfig, 'dest');
|
|
465
|
+
let data = undefined;
|
|
466
|
+
if (src && src.indexOf('<%') != -1) {
|
|
467
|
+
const that = this;
|
|
468
|
+
const imports = _.extend({
|
|
469
|
+
record: record,
|
|
470
|
+
options: options,
|
|
471
|
+
moment: momentShim_1.momentShim,
|
|
472
|
+
numeral: numeral_1.default,
|
|
473
|
+
mappedData: mappedData,
|
|
474
|
+
fieldConfig: fieldConfig,
|
|
475
|
+
types: sails.config.raid.types,
|
|
476
|
+
that: that
|
|
477
|
+
}, this);
|
|
478
|
+
const templateData = {
|
|
479
|
+
imports: imports
|
|
480
|
+
};
|
|
481
|
+
data = _.template(src, templateData)();
|
|
482
|
+
if (_.get(fieldConfig, 'parseJson', false)) {
|
|
483
|
+
data = JSON.parse(data);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
data = _.get(record, src);
|
|
488
|
+
}
|
|
489
|
+
const destPath = dest != null ? String(dest) : '';
|
|
490
|
+
if (!_.isEmpty(destPath)) {
|
|
491
|
+
_.set(mappedData, destPath, data);
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
sails.log.warn(`${this.logHeader} getMappedData() -> Destination field is empty for ${fieldName}, if there is a missing mapped value, check if the template/fn call is setting the destination value.`);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
catch (fieldErr) {
|
|
498
|
+
throw new RBValidationError_1.RBValidationError({
|
|
499
|
+
message: `Failed to process field: ${fieldName}`,
|
|
500
|
+
options: { cause: fieldErr },
|
|
501
|
+
displayErrors: [{ code: 'raid-mint-transform-validation-error' }],
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return mappedData;
|
|
506
|
+
}
|
|
507
|
+
getSubject(record, options, fieldConfig, subjects = [], subjectType = '', subjectData) {
|
|
508
|
+
if (_.isArray(subjectData) && !_.isEmpty(subjectData) && !_.isEmpty(subjectType)) {
|
|
509
|
+
for (const subject of subjectData) {
|
|
510
|
+
const notation = String(_.get(subject, 'notation', ''));
|
|
511
|
+
const label = String(_.get(subject, 'label', ''));
|
|
512
|
+
subjects.push({
|
|
513
|
+
id: `${sails.config.raid.types.subject[subjectType].id}${notation}`,
|
|
514
|
+
schemaUri: sails.config.raid.types.subject[subjectType].schemaUri,
|
|
515
|
+
keyword: [
|
|
516
|
+
{
|
|
517
|
+
text: label
|
|
518
|
+
}
|
|
519
|
+
]
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
sails.log.warn(`${this.logHeader} getSubject() -> Missing subject source data: ${String(_.get(fieldConfig, 'dest', ''))}`);
|
|
525
|
+
}
|
|
212
526
|
return subjects;
|
|
213
527
|
}
|
|
528
|
+
async saveRaid(raid, record, options, metaMetadataInfo) {
|
|
529
|
+
// add raid to record, defaults to 'raidUrl'
|
|
530
|
+
const raidFieldName = String(_.get(sails.config.raid, 'raidFieldName', 'raidUrl'));
|
|
531
|
+
_.set(record, `metadata.${raidFieldName}`, raid.id);
|
|
532
|
+
if (sails.config.raid.saveBodyInMeta) {
|
|
533
|
+
// don't save the response object as it contains the auth token
|
|
534
|
+
_.set(record, 'metaMetadata.raid.response', metaMetadataInfo);
|
|
535
|
+
}
|
|
536
|
+
const alsoSaveRaidToOid = _.get(options, 'request.alsoSaveRaidToOid', []);
|
|
537
|
+
if (!_.isEmpty(alsoSaveRaidToOid)) {
|
|
538
|
+
sails.log.verbose(`${this.logHeader} saveRaid() -> Configured to save to associated records, config: ${JSON.stringify(alsoSaveRaidToOid)}`);
|
|
539
|
+
for (const saveOidConfig of alsoSaveRaidToOid) {
|
|
540
|
+
const oidPath = String(saveOidConfig.oidPath ?? '');
|
|
541
|
+
const raidPath = String(saveOidConfig.raidPath ?? '');
|
|
542
|
+
const optOid = _.get(record, oidPath);
|
|
543
|
+
if (!_.isEmpty(optOid)) {
|
|
544
|
+
sails.log.verbose(`${this.logHeader} saveRaid() -> Saving to associated record: ${optOid}`);
|
|
545
|
+
const updateResp = await RecordsService.appendToRecord(String(optOid), raid.id, raidPath);
|
|
546
|
+
if (!updateResp.isSuccessful()) {
|
|
547
|
+
sails.log.error(`${this.logHeader} saveRaid() -> Failed to save to record: ${optOid}, reason: ${updateResp.message}`);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
214
553
|
}
|
|
215
554
|
Services.Raid = Raid;
|
|
216
555
|
})(Services || (exports.Services = Services = {}));
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFpZFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvUmFpZFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQStDO0FBQy9DLG1DQUF1QztBQUN2QyxnREFBc0Q7QUFDdEQsa0VBQStEO0FBRy9ELCtDQUF1RjtBQUN2Rix5Q0FBK0M7QUFDL0MsMkNBQWlEO0FBQ2pELDZDQUFtRDtBQUNuRCwrQ0FBb0U7QUFDcEUseUNBQXlHO0FBQ3pHLDZDQUF5RTtBQVF6RSxJQUFpQixRQUFRLENBc1B4QjtBQXRQRCxXQUFpQixRQUFRO0lBZ0J2QixTQUFTLE9BQU8sQ0FBQyxLQUFjLEVBQUUsSUFBWTtRQUMzQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLEdBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6TCxDQUFDO0lBRUQsU0FBUyxtQkFBbUIsQ0FBQyxJQUFZO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMzQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxJQUFJLEdBQUcsQ0FBQztZQUMzQyxNQUFNLE9BQU8sR0FBRyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxD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
|
|
556
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFpZFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvUmFpZFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7Ozs7QUFFOUQsZ0RBQXNEO0FBQ3RELGtFQUErRDtBQUMvRCxvREFBMkQ7QUFDM0QsZ0dBV3VEO0FBRXZELHNEQUE4QjtBQUM5QixrREFBMEI7QUFLMUIsSUFBaUIsUUFBUSxDQXloQnhCO0FBemhCRCxXQUFpQixRQUFRO0lBTXZCOzs7OztPQUtHO0lBQ0gsTUFBYSxJQUFLLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUMxQixnQkFBZ0IsR0FBYTtZQUM5QyxhQUFhO1lBQ2IsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQiw0QkFBNEI7WUFDNUIsY0FBYztTQUNmLENBQUM7UUFFUSxjQUFjLEdBSXBCO1lBQ0YsdUJBQXVCLEVBQUUsSUFBSTtZQUM3QixXQUFXLEVBQUUsSUFBSTtZQUNqQixZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUFDO1FBRUY7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO1FBQ25DLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVcsRUFBRSxNQUFrQixFQUFFLE9BQW9CO1lBQzVFLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFpQyxFQUFFLE9BQU8sQ0FBQyxL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
|