@researchdatabox/redbox-core 5.0.4-beta.12498 → 5.0.4
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/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/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 +9 -71
- 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.map +1 -1
- package/dist/waterline-models/User.js +15 -10
- 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,639 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isCanonicalSaveRequestId = exports.RecordSaveTracker = exports.RecordSaveResponse = exports.RECORD_VALIDATION_REQUEST_FACT_NAMES = exports.RECORD_VALIDATION_BYPASS_REASONS = void 0;
|
|
4
|
-
exports.isRecordValidationBypassReason = isRecordValidationBypassReason;
|
|
5
|
-
exports.isInternalRecordValidationBypass = isInternalRecordValidationBypass;
|
|
6
|
-
exports.isRecordSaveContext = isRecordSaveContext;
|
|
7
|
-
exports.createRecordSaveSchemaOutcomeMetadata = createRecordSaveSchemaOutcomeMetadata;
|
|
8
|
-
exports.normalizeRecordValidationRequestFacts = normalizeRecordValidationRequestFacts;
|
|
9
|
-
exports.recordValidationRuntimeFacts = recordValidationRuntimeFacts;
|
|
10
|
-
exports.parsePublicValidationOperation = parsePublicValidationOperation;
|
|
11
|
-
exports.normalizeRecordConcurrencyContext = normalizeRecordConcurrencyContext;
|
|
12
|
-
exports.createRecordSaveContext = createRecordSaveContext;
|
|
13
|
-
exports.readSaveRequestId = readSaveRequestId;
|
|
14
|
-
exports.isRecordConflictStatus = isRecordConflictStatus;
|
|
15
|
-
exports.recordSaveFailureStatus = recordSaveFailureStatus;
|
|
16
|
-
exports.recordSaveDisplayErrors = recordSaveDisplayErrors;
|
|
17
|
-
exports.resolveStorageMutationState = resolveStorageMutationState;
|
|
18
|
-
exports.recordSaveProblem = recordSaveProblem;
|
|
19
|
-
const node_crypto_1 = require("node:crypto");
|
|
20
|
-
const lodash_1 = require("lodash");
|
|
21
|
-
const sails_ng_common_1 = require("@researchdatabox/sails-ng-common");
|
|
22
|
-
const codes_1 = require("./record-contract/codes");
|
|
23
|
-
const canonical_json_1 = require("./record-contract/canonical-json");
|
|
24
|
-
const StorageServiceResponse_1 = require("./StorageServiceResponse");
|
|
25
|
-
/** Reasons approved for the narrowly scoped internal validation bypass. */
|
|
26
|
-
exports.RECORD_VALIDATION_BYPASS_REASONS = [
|
|
27
|
-
'historical-record-repair',
|
|
28
|
-
'trusted-data-migration',
|
|
29
|
-
'configuration-recovery',
|
|
30
|
-
];
|
|
31
|
-
const SAFE_VALIDATION_BYPASS_SERVICE_ID = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;
|
|
32
|
-
function isRecordValidationBypassReason(value) {
|
|
33
|
-
return typeof value === 'string' && exports.RECORD_VALIDATION_BYPASS_REASONS.includes(value);
|
|
34
|
-
}
|
|
35
|
-
/** Runtime guard for JavaScript callers crossing the internal capability boundary. */
|
|
36
|
-
function isInternalRecordValidationBypass(value) {
|
|
37
|
-
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
38
|
-
return false;
|
|
39
|
-
const candidate = value;
|
|
40
|
-
const actor = candidate.actor;
|
|
41
|
-
if (!actor || typeof actor !== 'object' || Array.isArray(actor))
|
|
42
|
-
return false;
|
|
43
|
-
const actorCandidate = actor;
|
|
44
|
-
return (candidate.mode === 'bypass' &&
|
|
45
|
-
isRecordValidationBypassReason(candidate.reason) &&
|
|
46
|
-
actorCandidate.kind === 'service' &&
|
|
47
|
-
typeof actorCandidate.id === 'string' &&
|
|
48
|
-
SAFE_VALIDATION_BYPASS_SERVICE_ID.test(actorCandidate.id.trim()));
|
|
49
|
-
}
|
|
50
|
-
const trustedRecordSaveContexts = new WeakSet();
|
|
51
|
-
const RECORD_SCHEMA_DIGEST_PATTERN = /^[0-9a-f]{64}$/;
|
|
52
|
-
const RECORD_SCHEMA_IMMUTABLE_URL_PATTERN = /^\/([^/?#]+)\/([^/?#]+)\/api\/records\/schemas\/([0-9a-f]{64})$/;
|
|
53
|
-
function invalidNestedRecordSaveContext(name) {
|
|
54
|
-
return new TypeError(`${name} must contain only acyclic JSON values.`);
|
|
55
|
-
}
|
|
56
|
-
/** Materialize caller-controlled accessors and proxies exactly once at the trust boundary. */
|
|
57
|
-
function materializeRecordSaveContextJSONValue(value, name, ancestors) {
|
|
58
|
-
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
59
|
-
return value;
|
|
60
|
-
if (typeof value === 'number') {
|
|
61
|
-
if (Number.isFinite(value))
|
|
62
|
-
return value;
|
|
63
|
-
throw invalidNestedRecordSaveContext(name);
|
|
64
|
-
}
|
|
65
|
-
if (typeof value !== 'object' || ancestors.has(value)) {
|
|
66
|
-
throw invalidNestedRecordSaveContext(name);
|
|
67
|
-
}
|
|
68
|
-
ancestors.add(value);
|
|
69
|
-
try {
|
|
70
|
-
if (Array.isArray(value)) {
|
|
71
|
-
const snapshot = [];
|
|
72
|
-
const length = value.length;
|
|
73
|
-
for (let index = 0; index < length; index += 1) {
|
|
74
|
-
snapshot.push(materializeRecordSaveContextJSONValue(value[index], name, ancestors));
|
|
75
|
-
}
|
|
76
|
-
return snapshot;
|
|
77
|
-
}
|
|
78
|
-
const prototype = Object.getPrototypeOf(value);
|
|
79
|
-
if (prototype !== Object.prototype && prototype !== null) {
|
|
80
|
-
throw invalidNestedRecordSaveContext(name);
|
|
81
|
-
}
|
|
82
|
-
const source = value;
|
|
83
|
-
const snapshot = {};
|
|
84
|
-
for (const key of Object.keys(source)) {
|
|
85
|
-
snapshot[key] = materializeRecordSaveContextJSONValue(source[key], name, ancestors);
|
|
86
|
-
}
|
|
87
|
-
return snapshot;
|
|
88
|
-
}
|
|
89
|
-
finally {
|
|
90
|
-
ancestors.delete(value);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
function snapshotRecordSaveContextJSONValue(value, name) {
|
|
94
|
-
try {
|
|
95
|
-
const materialized = materializeRecordSaveContextJSONValue(value, name, new WeakSet());
|
|
96
|
-
return (0, canonical_json_1.normalizeRedboxCanonicalJsonV1)(materialized);
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
throw invalidNestedRecordSaveContext(name);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function snapshotRecordSaveContextObject(value, name) {
|
|
103
|
-
if (value === undefined)
|
|
104
|
-
return undefined;
|
|
105
|
-
const snapshot = snapshotRecordSaveContextJSONValue(value, name);
|
|
106
|
-
if (!snapshot || typeof snapshot !== 'object' || Array.isArray(snapshot)) {
|
|
107
|
-
throw invalidNestedRecordSaveContext(name);
|
|
108
|
-
}
|
|
109
|
-
return snapshot;
|
|
110
|
-
}
|
|
111
|
-
function snapshotRecordValidationBypass(value) {
|
|
112
|
-
if (value === undefined)
|
|
113
|
-
return undefined;
|
|
114
|
-
return snapshotRecordSaveContextJSONValue(value, 'validationBypass');
|
|
115
|
-
}
|
|
116
|
-
/** Runtime counterpart to the nominal context type for JavaScript/service boundaries. */
|
|
117
|
-
function isRecordSaveContext(value) {
|
|
118
|
-
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
119
|
-
return false;
|
|
120
|
-
return trustedRecordSaveContexts.has(value);
|
|
121
|
-
}
|
|
122
|
-
function isCanonicalEncodedRouteSegment(value) {
|
|
123
|
-
try {
|
|
124
|
-
const decoded = decodeURIComponent(value);
|
|
125
|
-
return decoded.length > 0 && decoded !== '.' && decoded !== '..' && encodeURIComponent(decoded) === value;
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/** Validate and brand the schema identity exposed by a completed save. */
|
|
132
|
-
function createRecordSaveSchemaOutcomeMetadata(metadata) {
|
|
133
|
-
if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
|
|
134
|
-
throw new TypeError('Record save schema outcome metadata must be an object.');
|
|
135
|
-
}
|
|
136
|
-
const candidate = metadata;
|
|
137
|
-
const digest = candidate.digest;
|
|
138
|
-
const immutableUrl = candidate.immutableUrl;
|
|
139
|
-
const completeness = candidate.completeness;
|
|
140
|
-
const enforcement = candidate.enforcement;
|
|
141
|
-
if (typeof digest !== 'string' || !RECORD_SCHEMA_DIGEST_PATTERN.test(digest)) {
|
|
142
|
-
throw new TypeError('Record save schema outcome digest must be a lowercase SHA-256 hexadecimal value.');
|
|
143
|
-
}
|
|
144
|
-
const matchedUrl = typeof immutableUrl === 'string' ? RECORD_SCHEMA_IMMUTABLE_URL_PATTERN.exec(immutableUrl) : null;
|
|
145
|
-
if (!matchedUrl || !isCanonicalEncodedRouteSegment(matchedUrl[1]) || !isCanonicalEncodedRouteSegment(matchedUrl[2])) {
|
|
146
|
-
throw new TypeError('Record save schema outcome immutable URL must be a canonical origin-relative schema URL.');
|
|
147
|
-
}
|
|
148
|
-
if (matchedUrl[3] !== digest) {
|
|
149
|
-
throw new TypeError('Record save schema outcome immutable URL must identify its digest.');
|
|
150
|
-
}
|
|
151
|
-
if (completeness !== 'complete' && completeness !== 'partial') {
|
|
152
|
-
throw new TypeError('Record save schema outcome completeness is invalid.');
|
|
153
|
-
}
|
|
154
|
-
if (enforcement !== 'shadow' && enforcement !== 'enforce') {
|
|
155
|
-
throw new TypeError('Record save schema outcome enforcement is invalid.');
|
|
156
|
-
}
|
|
157
|
-
return Object.freeze({
|
|
158
|
-
digest,
|
|
159
|
-
immutableUrl,
|
|
160
|
-
completeness,
|
|
161
|
-
enforcement,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
exports.RECORD_VALIDATION_REQUEST_FACT_NAMES = ['recordType', 'targetStep', 'merge', 'datastreams'];
|
|
165
|
-
/**
|
|
166
|
-
* Project the same bounded request facts for browser and API transports.
|
|
167
|
-
* Sources are checked in order and accessors are never invoked.
|
|
168
|
-
*/
|
|
169
|
-
function normalizeRecordValidationRequestFacts(...sources) {
|
|
170
|
-
const result = {};
|
|
171
|
-
for (const name of exports.RECORD_VALIDATION_REQUEST_FACT_NAMES) {
|
|
172
|
-
for (const source of sources) {
|
|
173
|
-
if (!source || typeof source !== 'object' || Array.isArray(source))
|
|
174
|
-
continue;
|
|
175
|
-
const descriptor = Object.getOwnPropertyDescriptor(source, name);
|
|
176
|
-
if (!descriptor || !('value' in descriptor) || descriptor.value === undefined)
|
|
177
|
-
continue;
|
|
178
|
-
const value = descriptor.value;
|
|
179
|
-
if (name === 'recordType' || name === 'targetStep') {
|
|
180
|
-
const normalized = typeof value === 'string' ? value.trim() : '';
|
|
181
|
-
if (sails_ng_common_1.RECORD_VALIDATION_REFERENCE_PATTERN.test(normalized)) {
|
|
182
|
-
result[name] = normalized;
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
else if (value === true || value === false) {
|
|
187
|
-
result[name] = value;
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
else if (value === 'true' || value === 'false') {
|
|
191
|
-
result[name] = value === 'true';
|
|
192
|
-
break;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return result;
|
|
197
|
-
}
|
|
198
|
-
/** Shared transport-neutral runtime facts; public callers cannot add objects. */
|
|
199
|
-
function recordValidationRuntimeFacts(context, writeKind) {
|
|
200
|
-
const routeFamily = context.routeFamily ?? 'internal';
|
|
201
|
-
return {
|
|
202
|
-
...(routeFamily === 'internal' ? (context.validationRuntimeContext ?? {}) : {}),
|
|
203
|
-
routeFamily,
|
|
204
|
-
writeKind,
|
|
205
|
-
saveOperation: context.operation ?? writeKind,
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
/** Narrow and trim the public operation field before it enters save context. */
|
|
209
|
-
function parsePublicValidationOperation(value) {
|
|
210
|
-
if (value === undefined || value === null)
|
|
211
|
-
return { valid: true };
|
|
212
|
-
if (typeof value !== 'string')
|
|
213
|
-
return { valid: false };
|
|
214
|
-
const normalized = value.trim();
|
|
215
|
-
return sails_ng_common_1.VALIDATION_OPERATION_NAME_PATTERN.test(normalized) ? { valid: true, value: normalized } : { valid: false };
|
|
216
|
-
}
|
|
217
|
-
/** A typed response for record metadata save operations. */
|
|
218
|
-
class RecordSaveResponse extends StorageServiceResponse_1.StorageServiceResponse {
|
|
219
|
-
outcome = 'not-saved';
|
|
220
|
-
problems = [];
|
|
221
|
-
completion = (0, sails_ng_common_1.emptyRecordSaveCompletion)();
|
|
222
|
-
requestId;
|
|
223
|
-
context;
|
|
224
|
-
concurrency;
|
|
225
|
-
#schemaOutcome;
|
|
226
|
-
/** Legacy API v1 fields populated by the RDMP workspace post-save hook. */
|
|
227
|
-
workspaceOid;
|
|
228
|
-
workspaceData;
|
|
229
|
-
constructor(context = createRecordSaveContext()) {
|
|
230
|
-
super();
|
|
231
|
-
this.context = typeof context === 'string' ? createRecordSaveContext({ requestId: context }) : context;
|
|
232
|
-
this.requestId = this.context.requestId;
|
|
233
|
-
Object.defineProperty(this, 'schemaOutcome', {
|
|
234
|
-
configurable: false,
|
|
235
|
-
enumerable: true,
|
|
236
|
-
get: () => this.#schemaOutcome,
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
/** True when the primary metadata mutation is known to have been applied. */
|
|
240
|
-
wasPersisted() {
|
|
241
|
-
return this.outcome === 'saved' || this.outcome === 'saved-with-warnings';
|
|
242
|
-
}
|
|
243
|
-
/** True only when all required awaited save phases completed. */
|
|
244
|
-
isComplete() {
|
|
245
|
-
return (0, sails_ng_common_1.isRecordSaveComplete)(this);
|
|
246
|
-
}
|
|
247
|
-
addProblem(problem) {
|
|
248
|
-
this.problems.push(cloneProblem(problem));
|
|
249
|
-
if (problem.source !== 'advisory') {
|
|
250
|
-
this.downgradeCompleteSave();
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
setAttachmentItems(items) {
|
|
254
|
-
const copiedItems = (0, lodash_1.cloneDeep)(items);
|
|
255
|
-
this.completion = {
|
|
256
|
-
attachments: {
|
|
257
|
-
status: (0, sails_ng_common_1.reduceAttachmentStatus)(copiedItems),
|
|
258
|
-
items: copiedItems,
|
|
259
|
-
},
|
|
260
|
-
};
|
|
261
|
-
if (this.completion.attachments.status === 'incomplete' || this.completion.attachments.status === 'unknown') {
|
|
262
|
-
this.downgradeCompleteSave();
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
setProjectedMetadata(metadata) {
|
|
266
|
-
this.metadata = (0, lodash_1.cloneDeep)(metadata);
|
|
267
|
-
}
|
|
268
|
-
/** Retain only bounded server-owned concurrency diagnostics. */
|
|
269
|
-
setConcurrencyMetadata(metadata) {
|
|
270
|
-
this.concurrency = (0, sails_ng_common_1.sanitizeRecordConcurrencyMetadata)(metadata);
|
|
271
|
-
}
|
|
272
|
-
/** Compatibility view used by save-pipeline code while the response owns its state directly. */
|
|
273
|
-
get result() {
|
|
274
|
-
return this;
|
|
275
|
-
}
|
|
276
|
-
confirmPrimaryPersistence(oid, source) {
|
|
277
|
-
if (this.outcome === 'unknown')
|
|
278
|
-
return;
|
|
279
|
-
this.oid = oid ?? '';
|
|
280
|
-
if (source) {
|
|
281
|
-
this.message = typeof source.message === 'string' ? source.message : '';
|
|
282
|
-
this.data = (0, lodash_1.cloneDeep)(source.data);
|
|
283
|
-
this.metadata = (0, lodash_1.cloneDeep)(source.metadata ?? null);
|
|
284
|
-
this.totalItems = source.totalItems;
|
|
285
|
-
this.items = Array.isArray(source.items) ? (0, lodash_1.cloneDeep)(source.items) : [];
|
|
286
|
-
}
|
|
287
|
-
this.outcome = this.problems.some(problem => problem.source !== 'advisory')
|
|
288
|
-
? 'saved-with-warnings'
|
|
289
|
-
: 'saved';
|
|
290
|
-
this.success = true;
|
|
291
|
-
}
|
|
292
|
-
recordPrimaryNotApplied(problem) {
|
|
293
|
-
this.recordPrimaryFailure('not-saved', problem);
|
|
294
|
-
}
|
|
295
|
-
recordPrimaryUnknown(problem) {
|
|
296
|
-
this.recordPrimaryFailure('unknown', problem);
|
|
297
|
-
}
|
|
298
|
-
recordPostPersistenceProblem(problem) {
|
|
299
|
-
this.addProblem(problem);
|
|
300
|
-
}
|
|
301
|
-
recordWarning(problem) {
|
|
302
|
-
this.addProblem(problem);
|
|
303
|
-
}
|
|
304
|
-
mergeLegacyHookFields(source) {
|
|
305
|
-
if (!source || typeof source !== 'object')
|
|
306
|
-
return;
|
|
307
|
-
const fields = source;
|
|
308
|
-
if (typeof fields.workspaceOid === 'string' && fields.workspaceOid.trim())
|
|
309
|
-
this.workspaceOid = fields.workspaceOid;
|
|
310
|
-
if (Object.hasOwn(fields, 'workspaceData'))
|
|
311
|
-
this.workspaceData = (0, lodash_1.cloneDeep)(fields.workspaceData);
|
|
312
|
-
}
|
|
313
|
-
toResponse() {
|
|
314
|
-
const copy = new RecordSaveResponse(this.context);
|
|
315
|
-
copy.success = this.success;
|
|
316
|
-
copy.oid = this.oid;
|
|
317
|
-
copy.message = this.message;
|
|
318
|
-
copy.data = (0, lodash_1.cloneDeep)(this.data);
|
|
319
|
-
copy.metadata = (0, lodash_1.cloneDeep)(this.metadata);
|
|
320
|
-
copy.details = (0, lodash_1.cloneDeep)(this.details);
|
|
321
|
-
copy.totalItems = this.totalItems;
|
|
322
|
-
copy.items = (0, lodash_1.cloneDeep)(this.items);
|
|
323
|
-
copy.outcome = this.outcome;
|
|
324
|
-
copy.problems = this.problems.map(cloneProblem);
|
|
325
|
-
copy.completion = (0, lodash_1.cloneDeep)(this.completion);
|
|
326
|
-
copy.setConcurrencyMetadata(this.concurrency);
|
|
327
|
-
copy.workspaceOid = this.workspaceOid;
|
|
328
|
-
copy.workspaceData = (0, lodash_1.cloneDeep)(this.workspaceData);
|
|
329
|
-
if (this.schemaOutcome)
|
|
330
|
-
copy.setSchemaOutcome(this.schemaOutcome);
|
|
331
|
-
return copy;
|
|
332
|
-
}
|
|
333
|
-
setSchemaOutcome(metadata) {
|
|
334
|
-
this.#schemaOutcome = createRecordSaveSchemaOutcomeMetadata(metadata);
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* A persisted save can only ever move from `saved` to `saved-with-warnings`.
|
|
338
|
-
* Non-persisted outcomes are left untouched so a later warning cannot
|
|
339
|
-
* manufacture a commit that never happened.
|
|
340
|
-
*/
|
|
341
|
-
downgradeCompleteSave() {
|
|
342
|
-
if (this.outcome === 'saved') {
|
|
343
|
-
this.outcome = 'saved-with-warnings';
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
recordPrimaryFailure(outcome, problem) {
|
|
347
|
-
if (this.wasPersisted())
|
|
348
|
-
return;
|
|
349
|
-
this.outcome = outcome;
|
|
350
|
-
this.success = false;
|
|
351
|
-
if (problem)
|
|
352
|
-
this.addProblem(problem);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
exports.RecordSaveResponse = RecordSaveResponse;
|
|
356
|
-
/**
|
|
357
|
-
* Small state owner used by RecordsService. Callers cannot accidentally
|
|
358
|
-
* downgrade a confirmed commit while handling a later warning.
|
|
359
|
-
*/
|
|
360
|
-
class RecordSaveTracker {
|
|
361
|
-
context;
|
|
362
|
-
response;
|
|
363
|
-
constructor(context) {
|
|
364
|
-
this.context = context;
|
|
365
|
-
if (!isRecordSaveContext(context)) {
|
|
366
|
-
throw new TypeError('Record save contexts must be created by createRecordSaveContext().');
|
|
367
|
-
}
|
|
368
|
-
this.response = new RecordSaveResponse(context.requestId);
|
|
369
|
-
}
|
|
370
|
-
get result() {
|
|
371
|
-
return this.response;
|
|
372
|
-
}
|
|
373
|
-
confirmPrimaryPersistence(oid, source) {
|
|
374
|
-
if (this.response.outcome === 'unknown') {
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
this.response.oid = oid ?? '';
|
|
378
|
-
if (source) {
|
|
379
|
-
// Preserve only compatibility-safe action fields. Adapter diagnostics
|
|
380
|
-
// stay in logs rather than crossing the save-result boundary.
|
|
381
|
-
this.response.message = typeof source.message === 'string' ? source.message : '';
|
|
382
|
-
this.response.data = (0, lodash_1.cloneDeep)(source.data);
|
|
383
|
-
this.response.metadata = (0, lodash_1.cloneDeep)(source.metadata ?? null);
|
|
384
|
-
this.response.totalItems = source.totalItems;
|
|
385
|
-
this.response.items = Array.isArray(source.items) ? (0, lodash_1.cloneDeep)(source.items) : [];
|
|
386
|
-
}
|
|
387
|
-
this.response.outcome = this.response.problems.some(problem => problem.source !== 'advisory')
|
|
388
|
-
? 'saved-with-warnings'
|
|
389
|
-
: 'saved';
|
|
390
|
-
this.response.success = true;
|
|
391
|
-
}
|
|
392
|
-
recordPrimaryNotApplied(problem) {
|
|
393
|
-
this.recordPrimaryFailure('not-saved', problem);
|
|
394
|
-
}
|
|
395
|
-
recordPrimaryUnknown(problem) {
|
|
396
|
-
this.recordPrimaryFailure('unknown', problem);
|
|
397
|
-
}
|
|
398
|
-
recordPostPersistenceProblem(problem) {
|
|
399
|
-
this.response.addProblem(problem);
|
|
400
|
-
}
|
|
401
|
-
/** Track a nonblocking warning before or after the primary commit. */
|
|
402
|
-
recordWarning(problem) {
|
|
403
|
-
this.response.addProblem(problem);
|
|
404
|
-
}
|
|
405
|
-
setAttachmentItems(items) {
|
|
406
|
-
this.response.setAttachmentItems(items);
|
|
407
|
-
}
|
|
408
|
-
setProjectedMetadata(metadata) {
|
|
409
|
-
this.response.setProjectedMetadata(metadata);
|
|
410
|
-
}
|
|
411
|
-
setConcurrencyMetadata(metadata) {
|
|
412
|
-
this.response.setConcurrencyMetadata(metadata);
|
|
413
|
-
}
|
|
414
|
-
setSchemaOutcome(metadata) {
|
|
415
|
-
this.response.setSchemaOutcome(metadata);
|
|
416
|
-
}
|
|
417
|
-
/** Preserve the narrowly scoped legacy fields without exposing tracked save state to hooks. */
|
|
418
|
-
mergeLegacyHookFields(source) {
|
|
419
|
-
if (!source || typeof source !== 'object') {
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
const hookFields = source;
|
|
423
|
-
if (typeof hookFields.workspaceOid === 'string' && hookFields.workspaceOid.trim()) {
|
|
424
|
-
this.response.workspaceOid = hookFields.workspaceOid;
|
|
425
|
-
}
|
|
426
|
-
if (Object.hasOwn(hookFields, 'workspaceData')) {
|
|
427
|
-
this.response.workspaceData = (0, lodash_1.cloneDeep)(hookFields.workspaceData);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
/** A detached copy, so callers cannot mutate tracked state after the fact. */
|
|
431
|
-
toResponse() {
|
|
432
|
-
const copy = new RecordSaveResponse(this.response.requestId);
|
|
433
|
-
copy.success = this.response.success;
|
|
434
|
-
copy.oid = this.response.oid;
|
|
435
|
-
copy.message = this.response.message;
|
|
436
|
-
copy.data = (0, lodash_1.cloneDeep)(this.response.data);
|
|
437
|
-
copy.metadata = (0, lodash_1.cloneDeep)(this.response.metadata);
|
|
438
|
-
copy.details = (0, lodash_1.cloneDeep)(this.response.details);
|
|
439
|
-
copy.totalItems = this.response.totalItems;
|
|
440
|
-
copy.items = (0, lodash_1.cloneDeep)(this.response.items);
|
|
441
|
-
copy.outcome = this.response.outcome;
|
|
442
|
-
copy.problems = this.response.problems.map(cloneProblem);
|
|
443
|
-
copy.completion = {
|
|
444
|
-
attachments: {
|
|
445
|
-
status: this.response.completion.attachments.status,
|
|
446
|
-
items: (0, lodash_1.cloneDeep)(this.response.completion.attachments.items),
|
|
447
|
-
},
|
|
448
|
-
};
|
|
449
|
-
copy.setConcurrencyMetadata(this.response.concurrency);
|
|
450
|
-
copy.workspaceOid = this.response.workspaceOid;
|
|
451
|
-
copy.workspaceData = (0, lodash_1.cloneDeep)(this.response.workspaceData);
|
|
452
|
-
if (this.response.schemaOutcome) {
|
|
453
|
-
copy.setSchemaOutcome(this.response.schemaOutcome);
|
|
454
|
-
}
|
|
455
|
-
return copy;
|
|
456
|
-
}
|
|
457
|
-
recordPrimaryFailure(outcome, problem) {
|
|
458
|
-
if (this.response.wasPersisted()) {
|
|
459
|
-
return;
|
|
460
|
-
}
|
|
461
|
-
this.response.outcome = outcome;
|
|
462
|
-
this.response.success = false;
|
|
463
|
-
if (problem) {
|
|
464
|
-
this.response.addProblem(problem);
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
exports.RecordSaveTracker = RecordSaveTracker;
|
|
469
|
-
function cloneProblem(problem) {
|
|
470
|
-
return { ...problem, issues: problem.issues.map(sails_ng_common_1.sanitizeRecordSaveIssue) };
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* One canonical save request-correlation UUID. The format lives in the shared
|
|
474
|
-
* package so browser, controller, and concurrency diagnostics agree.
|
|
475
|
-
*/
|
|
476
|
-
exports.isCanonicalSaveRequestId = sails_ng_common_1.isRecordSaveRequestId;
|
|
477
|
-
/** Drop every field outside the bounded server-owned concurrency allowlist. */
|
|
478
|
-
function normalizeRecordConcurrencyContext(value) {
|
|
479
|
-
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
480
|
-
return undefined;
|
|
481
|
-
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
482
|
-
const ownValue = (name) => {
|
|
483
|
-
const descriptor = descriptors[name];
|
|
484
|
-
return descriptor && 'value' in descriptor ? descriptor.value : undefined;
|
|
485
|
-
};
|
|
486
|
-
const expectedRevisionValue = ownValue('expectedRevision');
|
|
487
|
-
const formFingerprintValue = ownValue('formFingerprint');
|
|
488
|
-
const resolutionValue = ownValue('resolution');
|
|
489
|
-
const resolutionOfRequestIdValue = ownValue('resolutionOfRequestId');
|
|
490
|
-
const expectedRevision = (0, sails_ng_common_1.isRecordRevision)(expectedRevisionValue) ? expectedRevisionValue : undefined;
|
|
491
|
-
const formFingerprint = (0, sails_ng_common_1.isRecordFormFingerprint)(formFingerprintValue) ? formFingerprintValue : undefined;
|
|
492
|
-
const resolution = (0, sails_ng_common_1.isRecordConcurrencyResolution)(resolutionValue) ? resolutionValue : undefined;
|
|
493
|
-
const resolutionOfRequestId = (0, sails_ng_common_1.isRecordSaveRequestId)(resolutionOfRequestIdValue)
|
|
494
|
-
? resolutionOfRequestIdValue
|
|
495
|
-
: undefined;
|
|
496
|
-
return {
|
|
497
|
-
entityTagSupplied: ownValue('entityTagSupplied') === true,
|
|
498
|
-
...(expectedRevision !== undefined ? { expectedRevision } : {}),
|
|
499
|
-
...(formFingerprint ? { formFingerprint } : {}),
|
|
500
|
-
...(resolution ? { resolution } : {}),
|
|
501
|
-
...(resolutionOfRequestId ? { resolutionOfRequestId } : {}),
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
function createRecordSaveContext(context = {}) {
|
|
505
|
-
const { requestId, routeFamily, operation, portal, targetStep, validationOperation, validationRequestParameters, validationRuntimeContext, validationBypass, concurrency: concurrencyInput, recordSchemaIfMatch, } = context;
|
|
506
|
-
const parsedSchemaOperation = parsePublicValidationOperation(validationOperation);
|
|
507
|
-
const concurrency = normalizeRecordConcurrencyContext(concurrencyInput);
|
|
508
|
-
const trustedContext = Object.freeze({
|
|
509
|
-
requestId: (0, exports.isCanonicalSaveRequestId)(requestId) ? requestId : (0, node_crypto_1.randomUUID)(),
|
|
510
|
-
routeFamily,
|
|
511
|
-
operation,
|
|
512
|
-
portal: typeof portal === 'string' && sails_ng_common_1.RECORD_VALIDATION_REFERENCE_PATTERN.test(portal.trim()) ? portal.trim() : undefined,
|
|
513
|
-
targetStep,
|
|
514
|
-
validationOperation,
|
|
515
|
-
schemaOperation: parsedSchemaOperation.valid
|
|
516
|
-
? parsedSchemaOperation.value
|
|
517
|
-
: undefined,
|
|
518
|
-
ifMatch: typeof recordSchemaIfMatch === 'string' ? recordSchemaIfMatch : undefined,
|
|
519
|
-
validationRequestParameters: snapshotRecordSaveContextObject(validationRequestParameters, 'validationRequestParameters'),
|
|
520
|
-
validationRuntimeContext: snapshotRecordSaveContextObject(validationRuntimeContext, 'validationRuntimeContext'),
|
|
521
|
-
validationBypass: snapshotRecordValidationBypass(validationBypass),
|
|
522
|
-
...(concurrency ? { concurrency: Object.freeze(concurrency) } : {}),
|
|
523
|
-
});
|
|
524
|
-
trustedRecordSaveContexts.add(trustedContext);
|
|
525
|
-
return trustedContext;
|
|
526
|
-
}
|
|
527
|
-
/**
|
|
528
|
-
* Read the client-supplied save request ID from request headers. Node
|
|
529
|
-
* lower-cases incoming header names, and anything that is not a single
|
|
530
|
-
* canonical UUID is replaced by a server-generated value.
|
|
531
|
-
*/
|
|
532
|
-
function readSaveRequestId(headers) {
|
|
533
|
-
const header = headers?.['x-redbox-save-request-id'];
|
|
534
|
-
return (0, exports.isCanonicalSaveRequestId)(header) ? header : undefined;
|
|
535
|
-
}
|
|
536
|
-
/**
|
|
537
|
-
* Transport status for each certified concurrency failure, in the precedence
|
|
538
|
-
* the service resolves them. A conflict is a definitive non-write, so it must
|
|
539
|
-
* never be reported as a generic 500: the browser treats a 5xx as an ambiguous
|
|
540
|
-
* `unknown` result that may not be rebased or retried.
|
|
541
|
-
*/
|
|
542
|
-
const RECORD_CONFLICT_STATUS_PRECEDENCE = [
|
|
543
|
-
['record-precondition-required', 428],
|
|
544
|
-
['record-revision-stale', 412],
|
|
545
|
-
['record-deleted', 412],
|
|
546
|
-
['form-definition-changed', 409],
|
|
547
|
-
['record-lifecycle-operation-conflict', 409],
|
|
548
|
-
];
|
|
549
|
-
/** Generic conflict status for a conflict problem without a recognised code. */
|
|
550
|
-
const RECORD_CONFLICT_DEFAULT_STATUS = 409;
|
|
551
|
-
/**
|
|
552
|
-
* The statuses a certified concurrency refusal uses. API v1 keeps its legacy
|
|
553
|
-
* body but must not collapse these to 500: a strict record type is an
|
|
554
|
-
* intentional opt-in status change, and a 5xx would read as an ambiguous
|
|
555
|
-
* `unknown` result that a client may retry.
|
|
556
|
-
*/
|
|
557
|
-
const RECORD_CONFLICT_HTTP_STATUSES = new Set([409, 412, 428]);
|
|
558
|
-
function isRecordConflictStatus(status) {
|
|
559
|
-
return RECORD_CONFLICT_HTTP_STATUSES.has(status);
|
|
560
|
-
}
|
|
561
|
-
/** Kinds that certify no write occurred, and therefore map below a 5xx. */
|
|
562
|
-
const CERTIFIED_NON_WRITE_KINDS = new Set([
|
|
563
|
-
'validation',
|
|
564
|
-
'authorization',
|
|
565
|
-
'conflict',
|
|
566
|
-
]);
|
|
567
|
-
function conflictFailureStatus(problems) {
|
|
568
|
-
const conflicts = problems.filter(problem => problem.kind === 'conflict');
|
|
569
|
-
if (conflicts.length === 0) {
|
|
570
|
-
return undefined;
|
|
571
|
-
}
|
|
572
|
-
const codes = new Set(conflicts.flatMap(problem => problem.issues.map(issue => issue.code)));
|
|
573
|
-
const match = RECORD_CONFLICT_STATUS_PRECEDENCE.find(([code]) => codes.has(code));
|
|
574
|
-
return match ? match[1] : RECORD_CONFLICT_DEFAULT_STATUS;
|
|
575
|
-
}
|
|
576
|
-
/**
|
|
577
|
-
* HTTP status for a save that did not persist. Persisted outcomes never
|
|
578
|
-
* reach here: once primary metadata is applied the route family decides the
|
|
579
|
-
* success status and the warnings travel in the typed result.
|
|
580
|
-
*/
|
|
581
|
-
function recordSaveFailureStatus(result) {
|
|
582
|
-
if (result?.outcome !== 'not-saved') {
|
|
583
|
-
// `unknown` is deliberately a 5xx: the client must not assume a non-write.
|
|
584
|
-
return 500;
|
|
585
|
-
}
|
|
586
|
-
// Select the most severe transport classification independently of problem
|
|
587
|
-
// insertion order: system-like failures outrank authorization, which outranks
|
|
588
|
-
// a certified conflict, which outranks ordinary validation failures.
|
|
589
|
-
if (result.problems.some(problem => !CERTIFIED_NON_WRITE_KINDS.has(problem.kind)))
|
|
590
|
-
return 500;
|
|
591
|
-
if (result.problems.some(problem => problem.kind === 'authorization'))
|
|
592
|
-
return 403;
|
|
593
|
-
const conflictStatus = conflictFailureStatus(result.problems);
|
|
594
|
-
if (conflictStatus !== undefined)
|
|
595
|
-
return conflictStatus;
|
|
596
|
-
if (result.problems.some(problem => problem.kind === 'validation' &&
|
|
597
|
-
problem.issues.some(issue => issue.code === codes_1.RECORD_SCHEMA_PROBLEM_CODES.PRECONDITION_FAILED)))
|
|
598
|
-
return 412;
|
|
599
|
-
if (result.problems.some(problem => problem.kind === 'validation'))
|
|
600
|
-
return 400;
|
|
601
|
-
return 500;
|
|
602
|
-
}
|
|
603
|
-
/**
|
|
604
|
-
* Project only the safe issue contract into the v2 JSON:API error array. The
|
|
605
|
-
* complete typed result remains in `meta`; raw exceptions and candidates are
|
|
606
|
-
* never used to infer a conflict.
|
|
607
|
-
*/
|
|
608
|
-
function recordSaveDisplayErrors(result, fallbackDetail) {
|
|
609
|
-
const errors = (result?.problems ?? []).flatMap(problem => problem.issues.map(issue => ({
|
|
610
|
-
...(issue.code ? { code: issue.code } : {}),
|
|
611
|
-
title: issue.message,
|
|
612
|
-
...(issue.pointer ? { source: { pointer: issue.pointer } } : {}),
|
|
613
|
-
})));
|
|
614
|
-
return errors.length > 0 ? errors : [{ detail: fallbackDetail }];
|
|
615
|
-
}
|
|
616
|
-
/**
|
|
617
|
-
* Normalize old and new adapter responses at one boundary. Legacy success
|
|
618
|
-
* is trusted temporarily for compatibility; legacy false is ambiguous
|
|
619
|
-
* because a failed call is not proof that nothing was written.
|
|
620
|
-
*/
|
|
621
|
-
function resolveStorageMutationState(response, logDeprecation) {
|
|
622
|
-
const explicit = response?.applicationState;
|
|
623
|
-
if (explicit === 'applied' || explicit === 'not-applied' || explicit === 'unknown') {
|
|
624
|
-
return explicit;
|
|
625
|
-
}
|
|
626
|
-
if (response?.success === true) {
|
|
627
|
-
logDeprecation?.('Legacy storage mutation response omitted application state', { oid: response.oid });
|
|
628
|
-
return 'applied';
|
|
629
|
-
}
|
|
630
|
-
return 'unknown';
|
|
631
|
-
}
|
|
632
|
-
function recordSaveProblem(kind, phase, message, code, issue = {}) {
|
|
633
|
-
return {
|
|
634
|
-
kind,
|
|
635
|
-
phase,
|
|
636
|
-
issues: [(0, sails_ng_common_1.sanitizeRecordSaveIssue)({ ...issue, ...(code ? { code } : {}), message })],
|
|
637
|
-
};
|
|
638
|
-
}
|
|
639
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkU2F2ZVJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1JlY29yZFNhdmVSZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxREEsd0VBRUM7QUFpQkQsNEVBYUM7QUF3SUQsa0RBR0M7QUFZRCxzRkErQkM7QUFzQkQsc0ZBMEJDO0FBR0Qsb0VBV0M7QUFPRCx3RUFLQztBQXdTRCw4RUF3QkM7QUFFRCwwREFzQ0M7QUFPRCw4Q0FHQztBQTJCRCx3REFFQztBQXdCRCwwREF3QkM7QUFjRCwwREFZQztBQVNELGtFQWFDO0FBRUQsOENBWUM7QUFsMUJELDZDQUF5QztBQUN6QyxtQ0FBaUQ7QUFDakQsc0VBdUIwQztBQUUxQyxtREFBc0U7QUFDdEUscUVBQWtGO0FBQ2xGLHFFQUEyRjtBQWEzRiwyRUFBMkU7QUFDOUQsUUFBQSxnQ0FBZ0MsR0FBRztJQUM5QywwQkFBMEI7SUFDMUIsd0JBQXdCO0lBQ3hCLHdCQUF3QjtDQUNoQixDQUFDO0FBSVgsTUFBTSxpQ0FBaUMsR0FBRyxzQ0FBc0MsQ0FBQztBQUVqRixTQUFnQiw4QkFBOEIsQ0FBQyxLQUFjO0lBQzNELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFLLHdDQUFzRCxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RyxDQUFDO0FBZ0JELHNGQUFzRjtBQUN0RixTQUFnQixnQ0FBZ0MsQ0FBQyxLQUFjO0lBQzdELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUUsTUFBTSxTQUFTLEdBQUcsS0FBZ0MsQ0FBQztJQUNuRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQzlCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFP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
|