@researchdatabox/redbox-core 5.0.4 → 5.1.0-beta.12573
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/AttachmentStagingIdentity.d.ts +3 -0
- package/dist/AttachmentStagingIdentity.d.ts.map +1 -0
- package/dist/AttachmentStagingIdentity.js +10 -0
- package/dist/CoreController.d.ts +7 -3
- package/dist/CoreController.d.ts.map +1 -1
- package/dist/CoreController.js +85 -3
- package/dist/DatastreamService.d.ts +5 -1
- package/dist/DatastreamService.d.ts.map +1 -1
- package/dist/HarvestRunService.d.ts +4 -3
- package/dist/HarvestRunService.d.ts.map +1 -1
- package/dist/HarvestRunService.js +1 -1
- package/dist/RecordConcurrencyObservability.d.ts +51 -0
- package/dist/RecordConcurrencyObservability.d.ts.map +1 -0
- package/dist/RecordConcurrencyObservability.js +136 -0
- package/dist/RecordEntityTag.d.ts +31 -0
- package/dist/RecordEntityTag.d.ts.map +1 -0
- package/dist/RecordEntityTag.js +101 -0
- package/dist/RecordFormFingerprint.d.ts +7 -0
- package/dist/RecordFormFingerprint.d.ts.map +1 -0
- package/dist/RecordFormFingerprint.js +106 -0
- package/dist/RecordHttpConcurrency.d.ts +60 -0
- package/dist/RecordHttpConcurrency.d.ts.map +1 -0
- package/dist/RecordHttpConcurrency.js +181 -0
- package/dist/RecordSaveResponse.d.ts +219 -0
- package/dist/RecordSaveResponse.d.ts.map +1 -0
- package/dist/RecordSaveResponse.js +639 -0
- package/dist/RecordStorageConcurrency.d.ts +49 -0
- package/dist/RecordStorageConcurrency.d.ts.map +1 -0
- package/dist/RecordStorageConcurrency.js +103 -0
- package/dist/RecordWriteClassification.d.ts +12 -0
- package/dist/RecordWriteClassification.d.ts.map +1 -0
- package/dist/RecordWriteClassification.js +70 -0
- package/dist/RecordsService.d.ts +109 -13
- package/dist/RecordsService.d.ts.map +1 -1
- package/dist/RecordsService.js +44 -1
- package/dist/SearchService.d.ts +2 -1
- package/dist/SearchService.d.ts.map +1 -1
- package/dist/StorageService.d.ts +49 -9
- package/dist/StorageService.d.ts.map +1 -1
- package/dist/StorageService.js +19 -1
- package/dist/StorageServiceResponse.d.ts +22 -1
- package/dist/StorageServiceResponse.d.ts.map +1 -1
- package/dist/StorageServiceResponse.js +22 -4
- package/dist/action-execution/audit.d.ts +41 -0
- package/dist/action-execution/audit.d.ts.map +1 -0
- package/dist/action-execution/audit.js +122 -0
- package/dist/action-execution/executor.d.ts +24 -0
- package/dist/action-execution/executor.d.ts.map +1 -0
- package/dist/action-execution/executor.js +435 -0
- package/dist/action-execution/failure.d.ts +49 -0
- package/dist/action-execution/failure.d.ts.map +1 -0
- package/dist/action-execution/failure.js +129 -0
- package/dist/action-execution/index.d.ts +7 -0
- package/dist/action-execution/index.d.ts.map +1 -0
- package/dist/action-execution/index.js +23 -0
- package/dist/action-execution/legacy-result.d.ts +21 -0
- package/dist/action-execution/legacy-result.d.ts.map +1 -0
- package/dist/action-execution/legacy-result.js +70 -0
- package/dist/action-execution/policy.d.ts +12 -0
- package/dist/action-execution/policy.d.ts.map +1 -0
- package/dist/action-execution/policy.js +138 -0
- package/dist/action-execution/types.d.ts +121 -0
- package/dist/action-execution/types.d.ts.map +1 -0
- package/dist/action-execution/types.js +22 -0
- package/dist/api-routes/groups/branding.d.ts +8 -0
- package/dist/api-routes/groups/branding.d.ts.map +1 -1
- package/dist/api-routes/groups/branding.js +86 -11
- package/dist/api-routes/groups/dashboard-config.d.ts +12 -9
- package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -1
- package/dist/api-routes/groups/dashboard-config.js +136 -73
- package/dist/api-routes/groups/forms.d.ts.map +1 -1
- package/dist/api-routes/groups/forms.js +10 -2
- package/dist/api-routes/groups/record-schemas.d.ts +5 -0
- package/dist/api-routes/groups/record-schemas.d.ts.map +1 -0
- package/dist/api-routes/groups/record-schemas.js +181 -0
- package/dist/api-routes/groups/records.d.ts +1 -0
- package/dist/api-routes/groups/records.d.ts.map +1 -1
- package/dist/api-routes/groups/records.js +141 -26
- package/dist/api-routes/index.d.ts +3 -0
- package/dist/api-routes/index.d.ts.map +1 -1
- package/dist/api-routes/index.js +4 -1
- package/dist/api-routes/openapi.d.ts.map +1 -1
- package/dist/api-routes/openapi.js +7 -5
- package/dist/api-routes/record-schema-openapi.d.ts +26 -0
- package/dist/api-routes/record-schema-openapi.d.ts.map +1 -0
- package/dist/api-routes/record-schema-openapi.js +38 -0
- package/dist/api-routes/record-schema-response.d.ts +40 -0
- package/dist/api-routes/record-schema-response.d.ts.map +1 -0
- package/dist/api-routes/record-schema-response.js +89 -0
- package/dist/api-routes/request-extraction.d.ts.map +1 -1
- package/dist/api-routes/request-extraction.js +10 -8
- package/dist/api-routes/route-factory.d.ts.map +1 -1
- package/dist/api-routes/route-factory.js +2 -1
- package/dist/api-routes/route-registry.d.ts.map +1 -1
- package/dist/api-routes/route-registry.js +3 -1
- package/dist/api-routes/schemas/common.d.ts +36 -0
- package/dist/api-routes/schemas/common.d.ts.map +1 -1
- package/dist/api-routes/schemas/common.js +95 -5
- package/dist/api-routes/schemas/responses.d.ts +1424 -1
- package/dist/api-routes/schemas/responses.d.ts.map +1 -1
- package/dist/api-routes/schemas/responses.js +382 -60
- package/dist/api-routes/types.d.ts +1 -0
- package/dist/api-routes/types.d.ts.map +1 -1
- package/dist/api-routes/validation.d.ts +5 -1
- package/dist/api-routes/validation.d.ts.map +1 -1
- package/dist/api-routes/validation.js +14 -15
- package/dist/bootstrap.d.ts +3 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +58 -41
- package/dist/config/agendaQueue.config.d.ts +3 -0
- package/dist/config/agendaQueue.config.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.js +29 -2
- package/dist/config/branding.config.d.ts +13 -0
- package/dist/config/branding.config.d.ts.map +1 -1
- package/dist/config/branding.config.js +34 -2
- package/dist/config/brandingConfigurationDefaults.config.d.ts +4 -0
- package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
- package/dist/config/brandingConfigurationDefaults.config.js +42 -3
- package/dist/config/index.d.ts +12 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +7 -4
- package/dist/config/policies.config.d.ts.map +1 -1
- package/dist/config/policies.config.js +37 -23
- package/dist/config/raid.config.d.ts +7 -4
- package/dist/config/raid.config.d.ts.map +1 -1
- package/dist/config/raid.config.js +21 -35
- package/dist/config/record.config.d.ts +3 -0
- package/dist/config/record.config.d.ts.map +1 -1
- package/dist/config/record.config.js +37 -35
- package/dist/config/recordSchema.config.d.ts +68 -0
- package/dist/config/recordSchema.config.d.ts.map +1 -0
- package/dist/config/recordSchema.config.js +173 -0
- package/dist/config/recordValidation.config.d.ts +19 -0
- package/dist/config/recordValidation.config.d.ts.map +1 -0
- package/dist/config/recordValidation.config.js +10 -0
- package/dist/config/recordtype.config.d.ts +32 -9
- package/dist/config/recordtype.config.d.ts.map +1 -1
- package/dist/config/recordtype.config.js +4 -7
- package/dist/config/routes.config.d.ts.map +1 -1
- package/dist/config/routes.config.js +135 -53
- package/dist/config/workflow.config.d.ts +6 -0
- 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 +4 -2
- package/dist/configmodels/ConfigModels.d.ts +1 -1
- package/dist/configmodels/ConfigModels.d.ts.map +1 -1
- package/dist/configmodels/ConfigModels.js +26 -9
- package/dist/configmodels/DashboardFieldCatalogue.d.ts +67 -0
- package/dist/configmodels/DashboardFieldCatalogue.d.ts.map +1 -0
- package/dist/configmodels/DashboardFieldCatalogue.js +174 -0
- package/dist/configmodels/DashboardSettings.d.ts +191 -0
- package/dist/configmodels/DashboardSettings.d.ts.map +1 -0
- package/dist/configmodels/DashboardSettings.js +705 -0
- package/dist/configmodels/FigsharePublishing.d.ts +1 -1
- package/dist/configmodels/OniPublishing.d.ts +205 -0
- package/dist/configmodels/OniPublishing.d.ts.map +1 -0
- package/dist/configmodels/OniPublishing.js +335 -0
- package/dist/configmodels/RaidPublishing.d.ts +97 -0
- package/dist/configmodels/RaidPublishing.d.ts.map +1 -0
- package/dist/configmodels/RaidPublishing.js +35 -0
- package/dist/configmodels/WebAnalytics.d.ts +55 -0
- package/dist/configmodels/WebAnalytics.d.ts.map +1 -0
- package/dist/configmodels/WebAnalytics.js +61 -0
- package/dist/controllers/AppConfigController.d.ts.map +1 -1
- package/dist/controllers/AppConfigController.js +4 -1
- package/dist/controllers/BrandingAppController.d.ts +29 -7
- package/dist/controllers/BrandingAppController.d.ts.map +1 -1
- package/dist/controllers/BrandingAppController.js +265 -69
- package/dist/controllers/BrandingController.d.ts +24 -1
- package/dist/controllers/BrandingController.d.ts.map +1 -1
- package/dist/controllers/BrandingController.js +173 -43
- package/dist/controllers/BrandingControllerSupport.d.ts +20 -0
- package/dist/controllers/BrandingControllerSupport.d.ts.map +1 -0
- package/dist/controllers/BrandingControllerSupport.js +80 -0
- package/dist/controllers/DashboardConfigController.d.ts +6 -2
- package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/DashboardConfigController.js +18 -4
- package/dist/controllers/DynamicAssetController.d.ts +7 -5
- package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
- package/dist/controllers/DynamicAssetController.js +21 -12
- package/dist/controllers/RecordController.d.ts +45 -4
- package/dist/controllers/RecordController.d.ts.map +1 -1
- package/dist/controllers/RecordController.js +778 -345
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +4 -1
- package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
- package/dist/controllers/webservice/AdminController.js +4 -3
- package/dist/controllers/webservice/BrandingController.d.ts +26 -1
- package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
- package/dist/controllers/webservice/BrandingController.js +292 -116
- package/dist/controllers/webservice/DashboardConfigController.d.ts +25 -17
- package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/webservice/DashboardConfigController.js +90 -205
- package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
- package/dist/controllers/webservice/FormManagementController.js +37 -3
- package/dist/controllers/webservice/RecordController.d.ts +15 -1
- package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordController.js +647 -267
- package/dist/controllers/webservice/RecordSchemaController.d.ts +32 -0
- package/dist/controllers/webservice/RecordSchemaController.d.ts.map +1 -0
- package/dist/controllers/webservice/RecordSchemaController.js +356 -0
- package/dist/controllers/webservice/RecordTypeController.d.ts +6 -1
- package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordTypeController.js +21 -3
- package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
- package/dist/controllers/webservice/SearchController.js +7 -3
- package/dist/hooks/defineRedboxHook.d.ts +3 -0
- package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
- package/dist/hooks/defineRedboxHook.js +4 -1
- package/dist/index.d.ts +50 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -2
- package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
- package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
- package/dist/loader/bootstrapShimRuntime.js +20 -12
- package/dist/loader/index.d.ts +9 -0
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +93 -4
- package/dist/model/BrandingTypeface.d.ts +70 -0
- package/dist/model/BrandingTypeface.d.ts.map +1 -0
- package/dist/model/BrandingTypeface.js +116 -0
- package/dist/model/BuildResponse.d.ts +25 -11
- package/dist/model/BuildResponse.d.ts.map +1 -1
- package/dist/model/BuildResponse.js +4 -3
- package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
- package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardTypeResponseModel.js +7 -1
- package/dist/model/DashboardViewResponseModel.d.ts +5 -1
- package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardViewResponseModel.js +6 -3
- package/dist/model/RBValidationError.d.ts +17 -0
- package/dist/model/RBValidationError.d.ts.map +1 -1
- package/dist/model/RBValidationError.js +37 -1
- package/dist/model/RecordTypeResponseModel.d.ts +12 -4
- package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
- package/dist/model/RecordTypeResponseModel.js +11 -2
- package/dist/model/index.d.ts +5 -1
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +5 -2
- package/dist/model/record-contract.d.ts +42 -0
- package/dist/model/record-contract.d.ts.map +1 -0
- package/dist/model/record-contract.js +3 -0
- package/dist/model/storage/BrandingModel.d.ts +7 -0
- package/dist/model/storage/BrandingModel.d.ts.map +1 -1
- package/dist/model/storage/BrandingModel.js +7 -1
- package/dist/model/storage/DeletedRecordModel.d.ts +35 -0
- package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
- package/dist/model/storage/DeletedRecordModel.js +62 -1
- package/dist/model/storage/IntegrationAuditModel.d.ts +16 -2
- package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
- package/dist/model/storage/IntegrationAuditModel.js +15 -1
- package/dist/model/storage/RecordAuditModel.d.ts +11 -1
- package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
- package/dist/model/storage/RecordAuditModel.js +8 -2
- package/dist/model/storage/RecordModel.d.ts +8 -2
- package/dist/model/storage/RecordModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.d.ts +6 -0
- package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.js +4 -1
- package/dist/model/storage/index.d.ts +12 -10
- package/dist/model/storage/index.d.ts.map +1 -1
- package/dist/model/storage/index.js +24 -2
- package/dist/model/storage/record-schema.d.ts +115 -0
- package/dist/model/storage/record-schema.d.ts.map +1 -0
- package/dist/model/storage/record-schema.js +3 -0
- package/dist/policies/checkAuth.d.ts +2 -6
- package/dist/policies/checkAuth.d.ts.map +1 -1
- package/dist/policies/checkAuth.js +32 -9
- package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
- package/dist/policies/contentSecurityPolicy.js +85 -2
- package/dist/policies/index.d.ts +3 -2
- package/dist/policies/index.d.ts.map +1 -1
- package/dist/policies/index.js +4 -2
- package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
- package/dist/policies/validateApiContractRequest.js +49 -11
- package/dist/record-contract/ajv-error-mapper.d.ts +34 -0
- package/dist/record-contract/ajv-error-mapper.d.ts.map +1 -0
- package/dist/record-contract/ajv-error-mapper.js +153 -0
- package/dist/record-contract/canonical-json.d.ts +20 -0
- package/dist/record-contract/canonical-json.d.ts.map +1 -0
- package/dist/record-contract/canonical-json.js +126 -0
- package/dist/record-contract/codes.d.ts +36 -0
- package/dist/record-contract/codes.d.ts.map +1 -0
- package/dist/record-contract/codes.js +38 -0
- package/dist/record-contract/contributor-registry.d.ts +76 -0
- package/dist/record-contract/contributor-registry.d.ts.map +1 -0
- package/dist/record-contract/contributor-registry.js +126 -0
- package/dist/record-contract/core-contributors.d.ts +44 -0
- package/dist/record-contract/core-contributors.d.ts.map +1 -0
- package/dist/record-contract/core-contributors.js +395 -0
- package/dist/record-contract/deep-freeze.d.ts +3 -0
- package/dist/record-contract/deep-freeze.d.ts.map +1 -0
- package/dist/record-contract/deep-freeze.js +23 -0
- package/dist/record-contract/index.d.ts +13 -0
- package/dist/record-contract/index.d.ts.map +1 -0
- package/dist/record-contract/index.js +29 -0
- package/dist/record-contract/json-pointer.d.ts +20 -0
- package/dist/record-contract/json-pointer.d.ts.map +1 -0
- package/dist/record-contract/json-pointer.js +70 -0
- package/dist/record-contract/json-schema-renderer.d.ts +51 -0
- package/dist/record-contract/json-schema-renderer.d.ts.map +1 -0
- package/dist/record-contract/json-schema-renderer.js +450 -0
- package/dist/record-contract/record-contract-compiler.d.ts +42 -0
- package/dist/record-contract/record-contract-compiler.d.ts.map +1 -0
- package/dist/record-contract/record-contract-compiler.js +775 -0
- package/dist/record-contract/record-contract-context.d.ts +91 -0
- package/dist/record-contract/record-contract-context.d.ts.map +1 -0
- package/dist/record-contract/record-contract-context.js +39 -0
- package/dist/record-contract/record-json-schema-artifact.d.ts +74 -0
- package/dist/record-contract/record-json-schema-artifact.d.ts.map +1 -0
- package/dist/record-contract/record-json-schema-artifact.js +309 -0
- package/dist/record-contract/record-json-schema-etag.d.ts +15 -0
- package/dist/record-contract/record-json-schema-etag.d.ts.map +1 -0
- package/dist/record-contract/record-json-schema-etag.js +41 -0
- package/dist/record-contract/types.d.ts +151 -0
- package/dist/record-contract/types.d.ts.map +1 -0
- package/dist/record-contract/types.js +6 -0
- package/dist/services/AppConfigService.d.ts +6 -0
- package/dist/services/AppConfigService.d.ts.map +1 -1
- package/dist/services/AppConfigService.js +23 -1
- package/dist/services/AttachmentMetadataService.d.ts +58 -0
- package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
- package/dist/services/AttachmentMetadataService.js +643 -8
- package/dist/services/BrandingLogoService.d.ts +6 -1
- package/dist/services/BrandingLogoService.d.ts.map +1 -1
- package/dist/services/BrandingLogoService.js +77 -9
- package/dist/services/BrandingService.d.ts +171 -9
- package/dist/services/BrandingService.d.ts.map +1 -1
- package/dist/services/BrandingService.js +572 -68
- package/dist/services/BrandingThemeCssService.d.ts +17 -1
- package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
- package/dist/services/BrandingThemeCssService.js +71 -9
- package/dist/services/BrandingTypefaceService.d.ts +74 -0
- package/dist/services/BrandingTypefaceService.d.ts.map +1 -0
- package/dist/services/BrandingTypefaceService.js +359 -0
- package/dist/services/BrandingWoff2Inspector.d.ts +17 -0
- package/dist/services/BrandingWoff2Inspector.d.ts.map +1 -0
- package/dist/services/BrandingWoff2Inspector.js +402 -0
- package/dist/services/DashboardConfigService.d.ts +214 -54
- package/dist/services/DashboardConfigService.d.ts.map +1 -1
- package/dist/services/DashboardConfigService.js +829 -261
- package/dist/services/DashboardLegacyConversion.d.ts +82 -0
- package/dist/services/DashboardLegacyConversion.d.ts.map +1 -0
- package/dist/services/DashboardLegacyConversion.js +427 -0
- package/dist/services/DashboardTypesService.d.ts +15 -4
- package/dist/services/DashboardTypesService.d.ts.map +1 -1
- package/dist/services/DashboardTypesService.js +72 -139
- package/dist/services/DoiService.d.ts +1 -1
- package/dist/services/DoiService.d.ts.map +1 -1
- package/dist/services/DoiService.js +71 -45
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +8 -7
- package/dist/services/FormRecordConsistencyService.d.ts +8 -23
- package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
- package/dist/services/FormRecordConsistencyService.js +54 -70
- package/dist/services/FormsService.d.ts +91 -2
- package/dist/services/FormsService.d.ts.map +1 -1
- package/dist/services/FormsService.js +324 -64
- package/dist/services/HarvestRunService.d.ts +6 -3
- package/dist/services/HarvestRunService.d.ts.map +1 -1
- package/dist/services/HarvestRunService.js +161 -97
- package/dist/services/I18nEntriesService.d.ts +11 -11
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +71 -48
- package/dist/services/OniService.d.ts +19 -62
- package/dist/services/OniService.d.ts.map +1 -1
- package/dist/services/OniService.js +223 -691
- 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 +19 -61
- package/dist/services/RaidService.d.ts.map +1 -1
- package/dist/services/RaidService.js +191 -530
- package/dist/services/RecordSchemaService.d.ts +440 -0
- package/dist/services/RecordSchemaService.d.ts.map +1 -0
- package/dist/services/RecordSchemaService.js +3061 -0
- package/dist/services/RecordTypesService.d.ts +29 -0
- package/dist/services/RecordTypesService.d.ts.map +1 -1
- package/dist/services/RecordTypesService.js +106 -11
- package/dist/services/RecordValidationService.d.ts +340 -0
- package/dist/services/RecordValidationService.d.ts.map +1 -0
- package/dist/services/RecordValidationService.js +1898 -0
- package/dist/services/RecordsService.d.ts +317 -26
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +5145 -765
- package/dist/services/SolrSearchService.d.ts +1 -1
- package/dist/services/SolrSearchService.d.ts.map +1 -1
- package/dist/services/SolrSearchService.js +42 -12
- package/dist/services/StandardDatastreamService.d.ts +4 -0
- package/dist/services/StandardDatastreamService.d.ts.map +1 -1
- package/dist/services/StandardDatastreamService.js +106 -44
- package/dist/services/TriggerService.d.ts.map +1 -1
- package/dist/services/TriggerService.js +54 -30
- package/dist/services/UsersService.d.ts +2 -1
- package/dist/services/UsersService.d.ts.map +1 -1
- package/dist/services/UsersService.js +364 -283
- package/dist/services/VocabularyService.d.ts +2 -0
- package/dist/services/VocabularyService.d.ts.map +1 -1
- package/dist/services/VocabularyService.js +61 -2
- package/dist/services/WorkflowStepsService.d.ts +11 -0
- package/dist/services/WorkflowStepsService.d.ts.map +1 -1
- package/dist/services/WorkflowStepsService.js +32 -3
- 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 +3 -20
- package/dist/services/doi-v2/config.d.ts +1 -0
- package/dist/services/doi-v2/config.d.ts.map +1 -1
- package/dist/services/doi-v2/config.js +13 -5
- package/dist/services/doi-v2/runtime.d.ts.map +1 -1
- package/dist/services/doi-v2/runtime.js +14 -54
- package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
- package/dist/services/figshare-v2/bindings.js +3 -20
- package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
- package/dist/services/figshare-v2/runtime.js +11 -58
- package/dist/services/figshare-v2/worker.d.ts.map +1 -1
- package/dist/services/figshare-v2/worker.js +254 -74
- package/dist/services/form-record-access-user.d.ts +3 -0
- package/dist/services/form-record-access-user.d.ts.map +1 -0
- package/dist/services/form-record-access-user.js +23 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +45 -3
- package/dist/services/integration-v2/bindings.d.ts +3 -0
- package/dist/services/integration-v2/bindings.d.ts.map +1 -0
- package/dist/services/integration-v2/bindings.js +91 -0
- package/dist/services/integration-v2/runtime.d.ts +3 -0
- package/dist/services/integration-v2/runtime.d.ts.map +1 -0
- package/dist/services/integration-v2/runtime.js +50 -0
- package/dist/services/internal-record-schema-authorization.d.ts +8 -0
- package/dist/services/internal-record-schema-authorization.d.ts.map +1 -0
- package/dist/services/internal-record-schema-authorization.js +16 -0
- package/dist/services/oni-v2/audit.d.ts +19 -0
- package/dist/services/oni-v2/audit.d.ts.map +1 -0
- package/dist/services/oni-v2/audit.js +50 -0
- package/dist/services/oni-v2/bindings.d.ts +7 -0
- package/dist/services/oni-v2/bindings.d.ts.map +1 -0
- package/dist/services/oni-v2/bindings.js +31 -0
- package/dist/services/oni-v2/config.d.ts +12 -0
- package/dist/services/oni-v2/config.d.ts.map +1 -0
- package/dist/services/oni-v2/config.js +134 -0
- package/dist/services/oni-v2/context.d.ts +3 -0
- package/dist/services/oni-v2/context.d.ts.map +1 -0
- package/dist/services/oni-v2/context.js +17 -0
- package/dist/services/oni-v2/crate.d.ts +17 -0
- package/dist/services/oni-v2/crate.d.ts.map +1 -0
- package/dist/services/oni-v2/crate.js +504 -0
- package/dist/services/oni-v2/flydriveOcflStore.d.ts +69 -0
- package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +1 -0
- package/dist/services/oni-v2/flydriveOcflStore.js +325 -0
- package/dist/services/oni-v2/ingestion.d.ts +37 -0
- package/dist/services/oni-v2/ingestion.d.ts.map +1 -0
- package/dist/services/oni-v2/ingestion.js +91 -0
- package/dist/services/oni-v2/mapping.d.ts +17 -0
- package/dist/services/oni-v2/mapping.d.ts.map +1 -0
- package/dist/services/oni-v2/mapping.js +137 -0
- package/dist/services/oni-v2/repository.d.ts +9 -0
- package/dist/services/oni-v2/repository.d.ts.map +1 -0
- package/dist/services/oni-v2/repository.js +180 -0
- package/dist/services/oni-v2/runtime.d.ts +23 -0
- package/dist/services/oni-v2/runtime.d.ts.map +1 -0
- package/dist/services/oni-v2/runtime.js +121 -0
- package/dist/services/oni-v2/templating.d.ts +11 -0
- package/dist/services/oni-v2/templating.d.ts.map +1 -0
- package/dist/services/oni-v2/templating.js +27 -0
- package/dist/services/oni-v2/types.d.ts +100 -0
- package/dist/services/oni-v2/types.d.ts.map +1 -0
- package/dist/services/oni-v2/types.js +3 -0
- package/dist/services/raid-v2/audit.d.ts +10 -0
- package/dist/services/raid-v2/audit.d.ts.map +1 -0
- package/dist/services/raid-v2/audit.js +29 -0
- package/dist/services/raid-v2/errors.d.ts +85 -0
- package/dist/services/raid-v2/errors.d.ts.map +1 -0
- package/dist/services/raid-v2/errors.js +36 -0
- package/dist/services/raid-v2/http.d.ts +4 -0
- package/dist/services/raid-v2/http.d.ts.map +1 -0
- package/dist/services/raid-v2/http.js +84 -0
- package/dist/services/raid-v2/logger.d.ts +8 -0
- package/dist/services/raid-v2/logger.d.ts.map +1 -0
- package/dist/services/raid-v2/logger.js +30 -0
- package/dist/services/raid-v2/mapping.d.ts +9 -0
- package/dist/services/raid-v2/mapping.d.ts.map +1 -0
- package/dist/services/raid-v2/mapping.js +168 -0
- package/dist/services/raid-v2/runtime.d.ts +5 -0
- package/dist/services/raid-v2/runtime.d.ts.map +1 -0
- package/dist/services/raid-v2/runtime.js +135 -0
- package/dist/services/raid-v2/tags.d.ts +11 -0
- package/dist/services/raid-v2/tags.d.ts.map +1 -0
- package/dist/services/raid-v2/tags.js +12 -0
- package/dist/services/raid-v2/types.d.ts +66 -0
- package/dist/services/raid-v2/types.d.ts.map +1 -0
- package/dist/services/raid-v2/types.js +3 -0
- package/dist/services/record-hooks/coordinator.d.ts +64 -0
- package/dist/services/record-hooks/coordinator.d.ts.map +1 -0
- package/dist/services/record-hooks/coordinator.js +276 -0
- package/dist/visitor/client.visitor.d.ts +6 -0
- package/dist/visitor/client.visitor.d.ts.map +1 -1
- package/dist/visitor/client.visitor.js +59 -14
- package/dist/visitor/construct.visitor.d.ts +27 -1
- package/dist/visitor/construct.visitor.d.ts.map +1 -1
- package/dist/visitor/construct.visitor.js +265 -177
- package/dist/visitor/context-variables.visitor.d.ts +3 -1
- package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
- package/dist/visitor/context-variables.visitor.js +15 -1
- package/dist/visitor/data-value.visitor.d.ts +6 -0
- package/dist/visitor/data-value.visitor.d.ts.map +1 -1
- package/dist/visitor/data-value.visitor.js +10 -1
- package/dist/visitor/json-type-def.visitor.d.ts +6 -0
- package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
- package/dist/visitor/json-type-def.visitor.js +10 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +11 -0
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.js +228 -133
- package/dist/visitor/related-object-data-inline.visitor.d.ts +31 -0
- package/dist/visitor/related-object-data-inline.visitor.d.ts.map +1 -0
- package/dist/visitor/related-object-data-inline.visitor.js +96 -0
- package/dist/visitor/template.visitor.d.ts +17 -2
- package/dist/visitor/template.visitor.d.ts.map +1 -1
- package/dist/visitor/template.visitor.js +60 -22
- package/dist/visitor/validator.visitor.d.ts +49 -7
- package/dist/visitor/validator.visitor.d.ts.map +1 -1
- package/dist/visitor/validator.visitor.js +275 -178
- package/dist/waterline-models/AttachmentMetadata.d.ts +22 -0
- package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
- package/dist/waterline-models/AttachmentMetadata.js +147 -3
- package/dist/waterline-models/BrandingConfig.d.ts +7 -0
- package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfig.js +16 -1
- package/dist/waterline-models/BrandingConfigHistory.d.ts +11 -2
- package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfigHistory.js +21 -1
- package/dist/waterline-models/DashboardConfiguration.d.ts +29 -0
- package/dist/waterline-models/DashboardConfiguration.d.ts.map +1 -0
- package/dist/waterline-models/DashboardConfiguration.js +52 -0
- package/dist/waterline-models/RecordType.d.ts +9 -0
- package/dist/waterline-models/RecordType.d.ts.map +1 -1
- package/dist/waterline-models/RecordType.js +16 -1
- package/dist/waterline-models/User.d.ts.map +1 -1
- package/dist/waterline-models/User.js +10 -15
- package/dist/waterline-models/index.d.ts +2 -0
- package/dist/waterline-models/index.d.ts.map +1 -1
- package/dist/waterline-models/index.js +4 -1
- package/package.json +59 -45
- package/dist/config/datapubs.config.d.ts +0 -72
- package/dist/config/datapubs.config.d.ts.map +0 -1
- package/dist/config/datapubs.config.js +0 -74
|
@@ -0,0 +1,639 @@
|
|
|
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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
|