@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
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Services = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
4
5
|
const CoreService_1 = require("../CoreService");
|
|
6
|
+
const AttachmentStagingIdentity_1 = require("../AttachmentStagingIdentity");
|
|
5
7
|
var Services;
|
|
6
8
|
(function (Services) {
|
|
9
|
+
const STAGING_COORDINATOR_OID = '__global_attachment_staging__';
|
|
10
|
+
const STAGING_COORDINATOR_LEASE_MS = 5 * 60 * 1000;
|
|
7
11
|
class AttachmentMetadataService extends CoreService_1.Services.Core.Service {
|
|
8
12
|
_exportedMethods = [
|
|
9
13
|
'upsert',
|
|
10
14
|
'findByOid',
|
|
15
|
+
'findUnresolvedByOid',
|
|
16
|
+
'findUnresolvedByStagingFileId',
|
|
11
17
|
'findOneByStorageKey',
|
|
18
|
+
'prepareMutations',
|
|
19
|
+
'markMutation',
|
|
20
|
+
'hasCleanupClaim',
|
|
21
|
+
'claimExpiredStagingCleanup',
|
|
22
|
+
'beginStagingCleanup',
|
|
23
|
+
'authorizeStagingCleanup',
|
|
24
|
+
'releaseStagingCleanup',
|
|
25
|
+
'completeStagingCleanup',
|
|
26
|
+
'recoverStagingCleanup',
|
|
27
|
+
'rebindOid',
|
|
28
|
+
'markDeleted',
|
|
12
29
|
'deleteByStorageKey',
|
|
13
30
|
'recordAccess',
|
|
14
31
|
];
|
|
@@ -21,10 +38,26 @@ var Services;
|
|
|
21
38
|
const payload = this.normalizeMetadataRow(row);
|
|
22
39
|
const oid = String(payload.oid ?? '').trim();
|
|
23
40
|
const fileId = String(payload.fileId ?? '').trim();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
41
|
+
let existing = (await AttachmentMetadata.findOne({ storageKey }));
|
|
42
|
+
// A journal key may be upgraded from the original attachment-only form
|
|
43
|
+
// to the mutation-specific form. Reuse that row when its mutation
|
|
44
|
+
// identity is otherwise unchanged instead of leaving an unresolved
|
|
45
|
+
// legacy row behind on the next retry.
|
|
46
|
+
if (!existing && payload.isJournal === true && payload.attachmentId && payload.generation && payload.mutationFileId) {
|
|
47
|
+
existing = (await AttachmentMetadata.findOne({
|
|
48
|
+
oid,
|
|
49
|
+
attachmentId: payload.attachmentId,
|
|
50
|
+
generation: payload.generation,
|
|
51
|
+
mutationFileId: payload.mutationFileId,
|
|
52
|
+
isJournal: true,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
// A physical row may retain its identity if a storage prefix changes,
|
|
56
|
+
// but journal rows must never claim the physical {oid,fileId} row.
|
|
57
|
+
if (!existing && payload.isJournal !== true && oid && fileId) {
|
|
58
|
+
const sameFileRows = (await AttachmentMetadata.find({ oid, fileId }));
|
|
59
|
+
existing = (sameFileRows ?? []).find(candidate => candidate.isJournal !== true) ?? null;
|
|
60
|
+
}
|
|
28
61
|
if (existing?.id) {
|
|
29
62
|
await AttachmentMetadata.updateOne({ id: existing.id }).set(payload);
|
|
30
63
|
return;
|
|
@@ -36,14 +69,377 @@ var Services;
|
|
|
36
69
|
if (!normalizedOid) {
|
|
37
70
|
return [];
|
|
38
71
|
}
|
|
39
|
-
|
|
72
|
+
const rows = (await AttachmentMetadata.find({ oid: normalizedOid }).sort([
|
|
73
|
+
{ createdAt: 'ASC' },
|
|
74
|
+
]));
|
|
75
|
+
// Journal rows are retained for reconciliation, but prepared/pending
|
|
76
|
+
// work is not a confirmed physical attachment and must not appear in
|
|
77
|
+
// the listing API. Legacy rows without a mutationState remain visible.
|
|
78
|
+
return rows.filter(row => {
|
|
79
|
+
const mutationState = String(row.mutationState ?? '').trim();
|
|
80
|
+
return (row.isJournal !== true &&
|
|
81
|
+
row.operation !== 'delete' &&
|
|
82
|
+
mutationState !== 'cancelled' &&
|
|
83
|
+
(!mutationState || mutationState === 'applied'));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async findUnresolvedByOid(oid) {
|
|
87
|
+
const normalizedOid = String(oid ?? '').trim();
|
|
88
|
+
if (!normalizedOid) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
const rows = (await AttachmentMetadata.find({ oid: normalizedOid }).sort([
|
|
92
|
+
{ createdAt: 'ASC' },
|
|
93
|
+
]));
|
|
94
|
+
return rows.filter(row => row.isJournal === true &&
|
|
95
|
+
(row.mutationState === 'prepared' ||
|
|
96
|
+
row.mutationState === 'pending' ||
|
|
97
|
+
row.mutationState === 'incomplete' ||
|
|
98
|
+
row.mutationState === 'unknown'));
|
|
99
|
+
}
|
|
100
|
+
async findUnresolvedByStagingFileId(fileId) {
|
|
101
|
+
const normalizedFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(fileId);
|
|
102
|
+
if (!normalizedFileId)
|
|
103
|
+
return [];
|
|
104
|
+
return (await AttachmentMetadata.find({
|
|
105
|
+
mutationFileId: normalizedFileId,
|
|
106
|
+
isJournal: true,
|
|
107
|
+
mutationState: { in: ['prepared', 'pending', 'incomplete', 'unknown'] },
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
async prepareMutations(rows) {
|
|
111
|
+
for (const row of rows) {
|
|
112
|
+
const attachmentId = String(row.attachmentId ?? '').trim();
|
|
113
|
+
const generation = String(row.generation ?? '').trim();
|
|
114
|
+
const oid = String(row.oid ?? '').trim();
|
|
115
|
+
const mutationFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId ?? row.fileId);
|
|
116
|
+
if (!oid || !attachmentId || !generation || !mutationFileId) {
|
|
117
|
+
throw new Error('Attachment mutation preparation requires bounded journal identity.');
|
|
118
|
+
}
|
|
119
|
+
if (await this.hasCleanupClaim(oid, mutationFileId)) {
|
|
120
|
+
throw new Error('Attachment staging cleanup already owns this mutation.');
|
|
121
|
+
}
|
|
122
|
+
const token = (0, node_crypto_1.randomUUID)();
|
|
123
|
+
if (!(await this.acquireStagingCoordinator(oid, mutationFileId, attachmentId, generation, token, 'staging-preparing'))) {
|
|
124
|
+
throw new Error('Attachment staging identity is already reserved.');
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
// The coordinator is held until the prepared row is durable. Cleanup
|
|
128
|
+
// must acquire the same row before its reference scan, so it cannot
|
|
129
|
+
// pass that scan and remove the blob during this preparation window.
|
|
130
|
+
if (await this.hasCleanupClaim(oid, mutationFileId)) {
|
|
131
|
+
throw new Error('Attachment staging cleanup already owns this mutation.');
|
|
132
|
+
}
|
|
133
|
+
const storageKey = String(row.storageKey ?? '').trim();
|
|
134
|
+
const existing = (await AttachmentMetadata.findOne({ storageKey }));
|
|
135
|
+
if (existing) {
|
|
136
|
+
throw new Error('Attachment mutation generation already exists.');
|
|
137
|
+
}
|
|
138
|
+
if (!(await this.acquireStagingCoordinator(oid, mutationFileId, attachmentId, generation, token, 'staging-preparing'))) {
|
|
139
|
+
throw new Error('Attachment staging preparation lease was lost.');
|
|
140
|
+
}
|
|
141
|
+
await this.upsert({
|
|
142
|
+
...row,
|
|
143
|
+
fileId: this.journalFileId(attachmentId, generation, mutationFileId),
|
|
144
|
+
mutationFileId,
|
|
145
|
+
isJournal: true,
|
|
146
|
+
mutationState: 'prepared',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
if (!(await this.releaseStagingCoordinator(mutationFileId, attachmentId, generation, token, 'staging-preparing'))) {
|
|
151
|
+
throw new Error('Attachment staging preparation ownership could not be released safely.');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async markMutation(oid, attachmentId, generation, mutationState, codeOrMutationFileId, legacyMutationFileId) {
|
|
157
|
+
const mutationFileId = legacyMutationFileId ??
|
|
158
|
+
(mutationState === 'pending' || mutationState === 'applied' ? codeOrMutationFileId : undefined);
|
|
159
|
+
const lastSafeErrorCode = legacyMutationFileId === undefined && mutationFileId !== undefined
|
|
160
|
+
? undefined
|
|
161
|
+
: codeOrMutationFileId;
|
|
162
|
+
const criteria = {
|
|
163
|
+
oid: String(oid ?? '').trim(),
|
|
164
|
+
attachmentId: String(attachmentId ?? '').trim(),
|
|
165
|
+
generation: String(generation ?? '').trim(),
|
|
166
|
+
isJournal: true,
|
|
167
|
+
...(String(mutationFileId ?? '').trim()
|
|
168
|
+
? { mutationFileId: String(mutationFileId).trim() }
|
|
169
|
+
: {}),
|
|
170
|
+
};
|
|
171
|
+
if (!criteria.oid || !criteria.attachmentId || !criteria.generation) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
const existing = (await AttachmentMetadata.findOne(criteria));
|
|
175
|
+
if (!existing?.id) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
const allowedSources = {
|
|
179
|
+
prepared: [],
|
|
180
|
+
pending: ['prepared'],
|
|
181
|
+
applied: ['pending'],
|
|
182
|
+
incomplete: ['applied', 'unknown'],
|
|
183
|
+
unknown: ['prepared', 'pending', 'applied'],
|
|
184
|
+
cancelled: ['prepared', 'incomplete'],
|
|
185
|
+
'cleanup-pending': ['cancelled'],
|
|
186
|
+
'cleanup-removing': [],
|
|
187
|
+
cleaned: [],
|
|
188
|
+
};
|
|
189
|
+
const existingState = existing.mutationState;
|
|
190
|
+
if (!existingState || !allowedSources[mutationState].includes(existingState)) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
const updated = await AttachmentMetadata.updateOne({
|
|
194
|
+
id: existing.id,
|
|
195
|
+
mutationState: existing.mutationState,
|
|
196
|
+
}).set({
|
|
197
|
+
mutationState,
|
|
198
|
+
attemptCount: mutationState === 'pending' ? Number(existing.attemptCount ?? 0) + 1 : Number(existing.attemptCount ?? 0),
|
|
199
|
+
lastAttemptAt: new Date().toISOString(),
|
|
200
|
+
...(lastSafeErrorCode
|
|
201
|
+
? { lastSafeErrorCode }
|
|
202
|
+
: mutationState === 'applied'
|
|
203
|
+
? { lastSafeErrorCode: undefined }
|
|
204
|
+
: {}),
|
|
205
|
+
});
|
|
206
|
+
return Boolean(updated);
|
|
207
|
+
}
|
|
208
|
+
async hasCleanupClaim(oid, fileId) {
|
|
209
|
+
const normalizedFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(fileId);
|
|
210
|
+
if (!String(oid ?? '').trim() || !normalizedFileId)
|
|
211
|
+
return false;
|
|
212
|
+
return Boolean(await AttachmentMetadata.findOne({
|
|
213
|
+
mutationFileId: normalizedFileId,
|
|
214
|
+
isJournal: true,
|
|
215
|
+
mutationState: { in: ['cleanup-pending', 'cleanup-checking', 'cleanup-removing', 'cleaned'] },
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
async claimExpiredStagingCleanup(before, limit = 100) {
|
|
219
|
+
const beforeDate = new Date(before);
|
|
220
|
+
if (Number.isNaN(beforeDate.getTime()))
|
|
221
|
+
return [];
|
|
222
|
+
const boundedLimit = Number.isSafeInteger(limit) ? Math.min(1000, Math.max(1, limit)) : 100;
|
|
223
|
+
const beforeIso = beforeDate.toISOString();
|
|
224
|
+
const query = AttachmentMetadata.find({
|
|
225
|
+
isJournal: true,
|
|
226
|
+
mutationState: 'cancelled',
|
|
227
|
+
updatedAt: { '<': beforeIso },
|
|
228
|
+
});
|
|
229
|
+
const rows = await query.sort([{ updatedAt: 'ASC' }]).limit(boundedLimit);
|
|
230
|
+
const claims = [];
|
|
231
|
+
for (const row of rows) {
|
|
232
|
+
const oid = String(row.oid ?? '').trim();
|
|
233
|
+
const attachmentId = String(row.attachmentId ?? '').trim();
|
|
234
|
+
const fileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId);
|
|
235
|
+
const generation = String(row.generation ?? '').trim();
|
|
236
|
+
if (!row.id || !oid || !attachmentId || !fileId || !generation)
|
|
237
|
+
continue;
|
|
238
|
+
const token = (0, node_crypto_1.randomUUID)();
|
|
239
|
+
const claimed = await AttachmentMetadata.updateOne({
|
|
240
|
+
id: row.id,
|
|
241
|
+
mutationState: 'cancelled',
|
|
242
|
+
updatedAt: { '<': beforeIso },
|
|
243
|
+
}).set({
|
|
244
|
+
mutationState: 'cleanup-pending',
|
|
245
|
+
coordinationToken: token,
|
|
246
|
+
coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
|
|
247
|
+
lastAttemptAt: new Date().toISOString(),
|
|
248
|
+
lastSafeErrorCode: undefined,
|
|
249
|
+
});
|
|
250
|
+
if (claimed)
|
|
251
|
+
claims.push({ oid, attachmentId, fileId, generation, token, phase: 'checking' });
|
|
252
|
+
}
|
|
253
|
+
const staleQuery = AttachmentMetadata.find({
|
|
254
|
+
isJournal: true,
|
|
255
|
+
mutationState: { in: ['cleanup-pending', 'cleanup-checking', 'cleanup-removing'] },
|
|
256
|
+
coordinationLeaseExpiresAt: { '<': new Date().toISOString() },
|
|
257
|
+
});
|
|
258
|
+
const staleRows = await staleQuery.sort([{ coordinationLeaseExpiresAt: 'ASC' }]).limit(boundedLimit);
|
|
259
|
+
for (const row of staleRows) {
|
|
260
|
+
if (claims.length >= boundedLimit)
|
|
261
|
+
break;
|
|
262
|
+
const oid = String(row.oid ?? '').trim();
|
|
263
|
+
const attachmentId = String(row.attachmentId ?? '').trim();
|
|
264
|
+
const fileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId);
|
|
265
|
+
const generation = String(row.generation ?? '').trim();
|
|
266
|
+
const previousToken = String(row.coordinationToken ?? '').trim();
|
|
267
|
+
const previousLease = row.coordinationLeaseExpiresAt
|
|
268
|
+
? new Date(row.coordinationLeaseExpiresAt).toISOString()
|
|
269
|
+
: undefined;
|
|
270
|
+
if (!row.id || !oid || !attachmentId || !fileId || !generation || !previousToken || !previousLease)
|
|
271
|
+
continue;
|
|
272
|
+
const token = (0, node_crypto_1.randomUUID)();
|
|
273
|
+
const phase = row.mutationState === 'cleanup-removing' ? 'removing' : 'checking';
|
|
274
|
+
const reclaimed = await AttachmentMetadata.updateOne({
|
|
275
|
+
id: row.id,
|
|
276
|
+
mutationState: row.mutationState,
|
|
277
|
+
coordinationToken: previousToken,
|
|
278
|
+
coordinationLeaseExpiresAt: previousLease,
|
|
279
|
+
}).set({
|
|
280
|
+
mutationState: phase === 'removing' ? 'cleanup-removing' : 'cleanup-pending',
|
|
281
|
+
coordinationToken: token,
|
|
282
|
+
coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
|
|
283
|
+
lastAttemptAt: new Date().toISOString(),
|
|
284
|
+
});
|
|
285
|
+
if (reclaimed)
|
|
286
|
+
claims.push({ oid, attachmentId, fileId, generation, token, phase });
|
|
287
|
+
}
|
|
288
|
+
return claims;
|
|
289
|
+
}
|
|
290
|
+
async beginStagingCleanup(claim) {
|
|
291
|
+
const normalized = this.normalizeCleanupClaim(claim);
|
|
292
|
+
if (!normalized)
|
|
293
|
+
return false;
|
|
294
|
+
if (!(await this.acquireStagingCoordinator(normalized.oid, normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup'))) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
const updated = await AttachmentMetadata.updateOne({
|
|
298
|
+
...this.cleanupClaimCriteria(normalized),
|
|
299
|
+
isJournal: true,
|
|
300
|
+
mutationState: 'cleanup-pending',
|
|
301
|
+
}).set({
|
|
302
|
+
mutationState: 'cleanup-checking',
|
|
303
|
+
coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
|
|
304
|
+
lastAttemptAt: new Date().toISOString(),
|
|
305
|
+
});
|
|
306
|
+
if (updated)
|
|
307
|
+
return true;
|
|
308
|
+
const alreadyBegun = await AttachmentMetadata.findOne({
|
|
309
|
+
...this.cleanupClaimCriteria(normalized),
|
|
310
|
+
isJournal: true,
|
|
311
|
+
mutationState: { in: ['cleanup-checking', 'cleanup-removing'] },
|
|
312
|
+
});
|
|
313
|
+
if (alreadyBegun)
|
|
314
|
+
return true;
|
|
315
|
+
await this.releaseStagingCoordinator(normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup');
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
async authorizeStagingCleanup(claim) {
|
|
319
|
+
const normalized = this.normalizeCleanupClaim(claim);
|
|
320
|
+
if (!normalized ||
|
|
321
|
+
!(await this.acquireStagingCoordinator(normalized.oid, normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup'))) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
const updated = await AttachmentMetadata.updateOne({
|
|
325
|
+
...this.cleanupClaimCriteria(normalized),
|
|
326
|
+
isJournal: true,
|
|
327
|
+
mutationState: 'cleanup-checking',
|
|
328
|
+
}).set({
|
|
329
|
+
mutationState: 'cleanup-removing',
|
|
330
|
+
coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
|
|
331
|
+
lastAttemptAt: new Date().toISOString(),
|
|
332
|
+
});
|
|
333
|
+
if (updated)
|
|
334
|
+
return true;
|
|
335
|
+
return Boolean(await AttachmentMetadata.findOne({
|
|
336
|
+
...this.cleanupClaimCriteria(normalized),
|
|
337
|
+
isJournal: true,
|
|
338
|
+
mutationState: 'cleanup-removing',
|
|
339
|
+
}));
|
|
340
|
+
}
|
|
341
|
+
async releaseStagingCleanup(claim, code) {
|
|
342
|
+
const normalized = this.normalizeCleanupClaim(claim);
|
|
343
|
+
if (!normalized)
|
|
344
|
+
return false;
|
|
345
|
+
const safeCode = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(code) ? code : 'attachment-cleanup-failed';
|
|
346
|
+
const updated = await AttachmentMetadata.updateOne({
|
|
347
|
+
...this.cleanupClaimCriteria(normalized),
|
|
348
|
+
isJournal: true,
|
|
349
|
+
mutationState: { in: ['cleanup-pending', 'cleanup-checking'] },
|
|
350
|
+
}).set({
|
|
351
|
+
mutationState: 'cancelled',
|
|
352
|
+
coordinationLeaseExpiresAt: undefined,
|
|
353
|
+
lastAttemptAt: new Date().toISOString(),
|
|
354
|
+
lastSafeErrorCode: safeCode,
|
|
355
|
+
});
|
|
356
|
+
const claimReleased = Boolean(updated) ||
|
|
357
|
+
Boolean(await AttachmentMetadata.findOne({
|
|
358
|
+
...this.cleanupClaimCriteria(normalized),
|
|
359
|
+
isJournal: true,
|
|
360
|
+
mutationState: 'cancelled',
|
|
361
|
+
}));
|
|
362
|
+
if (!claimReleased)
|
|
363
|
+
return false;
|
|
364
|
+
return this.releaseStagingCoordinator(normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup');
|
|
365
|
+
}
|
|
366
|
+
async completeStagingCleanup(claim) {
|
|
367
|
+
const normalized = this.normalizeCleanupClaim(claim);
|
|
368
|
+
if (!normalized)
|
|
369
|
+
return false;
|
|
370
|
+
const completed = await AttachmentMetadata.updateOne({
|
|
371
|
+
...this.cleanupClaimCriteria(normalized),
|
|
372
|
+
isJournal: true,
|
|
373
|
+
mutationState: 'cleanup-removing',
|
|
374
|
+
}).set({
|
|
375
|
+
mutationState: 'cleaned',
|
|
376
|
+
coordinationLeaseExpiresAt: undefined,
|
|
377
|
+
lastAttemptAt: new Date().toISOString(),
|
|
378
|
+
lastSafeErrorCode: 'attachment-cleanup-completed',
|
|
379
|
+
});
|
|
380
|
+
const claimCompleted = Boolean(completed) ||
|
|
381
|
+
Boolean(await AttachmentMetadata.findOne({
|
|
382
|
+
...this.cleanupClaimCriteria(normalized),
|
|
383
|
+
isJournal: true,
|
|
384
|
+
mutationState: 'cleaned',
|
|
385
|
+
}));
|
|
386
|
+
if (!claimCompleted)
|
|
387
|
+
return false;
|
|
388
|
+
return this.releaseStagingCoordinator(normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup');
|
|
389
|
+
}
|
|
390
|
+
async recoverStagingCleanup(claim, stagedObjectExists) {
|
|
391
|
+
const normalized = this.normalizeCleanupClaim(claim);
|
|
392
|
+
if (!normalized ||
|
|
393
|
+
!(await this.acquireStagingCoordinator(normalized.oid, normalized.fileId, normalized.attachmentId, normalized.generation, normalized.token, 'staging-cleanup'))) {
|
|
394
|
+
return 'lost';
|
|
395
|
+
}
|
|
396
|
+
if (!stagedObjectExists) {
|
|
397
|
+
return (await this.completeStagingCleanup(normalized)) ? 'completed' : 'lost';
|
|
398
|
+
}
|
|
399
|
+
// Presence is ambiguous after a crash: it may be the old object or a
|
|
400
|
+
// newly uploaded object using the same key. Never delete or release the
|
|
401
|
+
// global identity in that state. The bounded lease allows another
|
|
402
|
+
// worker to reconcile it later, while hasCleanupClaim keeps preparation
|
|
403
|
+
// fail-closed until absence is observed.
|
|
404
|
+
const retained = await AttachmentMetadata.updateOne({
|
|
405
|
+
...this.cleanupClaimCriteria(normalized),
|
|
406
|
+
isJournal: true,
|
|
407
|
+
mutationState: 'cleanup-removing',
|
|
408
|
+
}).set({
|
|
409
|
+
coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
|
|
410
|
+
lastAttemptAt: new Date().toISOString(),
|
|
411
|
+
lastSafeErrorCode: 'attachment-cleanup-removal-unconfirmed',
|
|
412
|
+
});
|
|
413
|
+
return retained ? 'retained' : 'lost';
|
|
414
|
+
}
|
|
415
|
+
journalFileId(attachmentId, generation, mutationFileId) {
|
|
416
|
+
const identity = `${attachmentId}\u0000${generation}\u0000${mutationFileId}`;
|
|
417
|
+
const suffix = (0, node_crypto_1.createHash)('sha256').update(identity).digest('hex').slice(0, 32);
|
|
418
|
+
return `journal-${attachmentId}-${generation}-${suffix}`;
|
|
419
|
+
}
|
|
420
|
+
async rebindOid(fromOid, toOid) {
|
|
421
|
+
const from = String(fromOid ?? '').trim();
|
|
422
|
+
const to = String(toOid ?? '').trim();
|
|
423
|
+
if (!from || !to || from === to) {
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
await AttachmentMetadata.update({ oid: from }).set({ oid: to });
|
|
427
|
+
}
|
|
428
|
+
async markDeleted(row) {
|
|
429
|
+
await this.upsert({
|
|
430
|
+
...row,
|
|
431
|
+
isJournal: false,
|
|
432
|
+
operation: 'delete',
|
|
433
|
+
mutationState: 'applied',
|
|
434
|
+
lastAttemptAt: new Date().toISOString(),
|
|
435
|
+
});
|
|
40
436
|
}
|
|
41
437
|
async findOneByStorageKey(storageKey) {
|
|
42
438
|
const normalizedStorageKey = String(storageKey ?? '').trim();
|
|
43
439
|
if (!normalizedStorageKey) {
|
|
44
440
|
return undefined;
|
|
45
441
|
}
|
|
46
|
-
return await AttachmentMetadata.findOne({ storageKey: normalizedStorageKey });
|
|
442
|
+
return (await AttachmentMetadata.findOne({ storageKey: normalizedStorageKey }));
|
|
47
443
|
}
|
|
48
444
|
async deleteByStorageKey(storageKey) {
|
|
49
445
|
const normalizedStorageKey = String(storageKey ?? '').trim();
|
|
@@ -59,7 +455,9 @@ var Services;
|
|
|
59
455
|
return;
|
|
60
456
|
}
|
|
61
457
|
if (normalizedEvent.storageKey && normalizedEvent.action !== 'list') {
|
|
62
|
-
const existing = await AttachmentMetadata.findOne({
|
|
458
|
+
const existing = (await AttachmentMetadata.findOne({
|
|
459
|
+
storageKey: normalizedEvent.storageKey,
|
|
460
|
+
}));
|
|
63
461
|
if (existing?.id) {
|
|
64
462
|
const currentCount = Number(existing.accessCount ?? 0);
|
|
65
463
|
const nextCount = this.shouldIncrementAccessCount(normalizedEvent.action) ? currentCount + 1 : currentCount;
|
|
@@ -77,6 +475,175 @@ var Services;
|
|
|
77
475
|
throw err;
|
|
78
476
|
}
|
|
79
477
|
}
|
|
478
|
+
async acquireStagingCoordinator(oid, fileId, attachmentId, generation, token, ownerState) {
|
|
479
|
+
const identity = this.stagingCoordinatorIdentity(fileId);
|
|
480
|
+
const coordinator = await this.ensureStagingCoordinator(fileId, identity);
|
|
481
|
+
if (coordinator.mutationState === ownerState &&
|
|
482
|
+
coordinator.coordinationToken === token &&
|
|
483
|
+
coordinator.attachmentId === attachmentId &&
|
|
484
|
+
coordinator.generation === generation) {
|
|
485
|
+
return this.renewStagingCoordinator(coordinator, token, ownerState);
|
|
486
|
+
}
|
|
487
|
+
const reclaiming = coordinator.mutationState !== 'staging-available';
|
|
488
|
+
if (reclaiming && !this.coordinationLeaseExpired(coordinator.coordinationLeaseExpiresAt))
|
|
489
|
+
return false;
|
|
490
|
+
const updated = await AttachmentMetadata.updateOne({
|
|
491
|
+
id: coordinator.id,
|
|
492
|
+
oid: STAGING_COORDINATOR_OID,
|
|
493
|
+
fileId: identity.fileId,
|
|
494
|
+
storageKey: identity.storageKey,
|
|
495
|
+
mutationFileId: fileId,
|
|
496
|
+
isJournal: true,
|
|
497
|
+
mutationState: coordinator.mutationState,
|
|
498
|
+
...(reclaiming
|
|
499
|
+
? {
|
|
500
|
+
coordinationToken: coordinator.coordinationToken,
|
|
501
|
+
coordinationLeaseExpiresAt: coordinator.coordinationLeaseExpiresAt,
|
|
502
|
+
}
|
|
503
|
+
: {}),
|
|
504
|
+
}).set({
|
|
505
|
+
mutationState: ownerState,
|
|
506
|
+
attachmentId,
|
|
507
|
+
generation,
|
|
508
|
+
coordinationToken: token,
|
|
509
|
+
coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
|
|
510
|
+
lastAttemptAt: new Date().toISOString(),
|
|
511
|
+
});
|
|
512
|
+
if (updated)
|
|
513
|
+
return true;
|
|
514
|
+
const raced = (await AttachmentMetadata.findOne({ storageKey: identity.storageKey }));
|
|
515
|
+
return Boolean(this.isExpectedStagingCoordinator(raced, fileId, identity) &&
|
|
516
|
+
raced?.mutationState === ownerState &&
|
|
517
|
+
raced.coordinationToken === token &&
|
|
518
|
+
raced.attachmentId === attachmentId &&
|
|
519
|
+
raced.generation === generation);
|
|
520
|
+
}
|
|
521
|
+
async ensureStagingCoordinator(fileId, identity) {
|
|
522
|
+
let coordinator = (await AttachmentMetadata.findOne({
|
|
523
|
+
storageKey: identity.storageKey,
|
|
524
|
+
}));
|
|
525
|
+
if (!coordinator) {
|
|
526
|
+
try {
|
|
527
|
+
coordinator = (await AttachmentMetadata.create({
|
|
528
|
+
oid: STAGING_COORDINATOR_OID,
|
|
529
|
+
fileId: identity.fileId,
|
|
530
|
+
storageKey: identity.storageKey,
|
|
531
|
+
mutationFileId: fileId,
|
|
532
|
+
isJournal: true,
|
|
533
|
+
mutationState: 'staging-available',
|
|
534
|
+
}).fetch());
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
if (!this.isUniqueConstraintError(error))
|
|
538
|
+
throw error;
|
|
539
|
+
coordinator = (await AttachmentMetadata.findOne({
|
|
540
|
+
storageKey: identity.storageKey,
|
|
541
|
+
}));
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
if (!coordinator || !this.isExpectedStagingCoordinator(coordinator, fileId, identity)) {
|
|
545
|
+
throw new Error('Attachment staging coordinator is unavailable or malformed.');
|
|
546
|
+
}
|
|
547
|
+
return coordinator;
|
|
548
|
+
}
|
|
549
|
+
async releaseStagingCoordinator(fileId, attachmentId, generation, token, ownerState) {
|
|
550
|
+
const identity = this.stagingCoordinatorIdentity(fileId);
|
|
551
|
+
const coordinator = (await AttachmentMetadata.findOne({
|
|
552
|
+
storageKey: identity.storageKey,
|
|
553
|
+
}));
|
|
554
|
+
if (!coordinator || !this.isExpectedStagingCoordinator(coordinator, fileId, identity))
|
|
555
|
+
return false;
|
|
556
|
+
const leaseExpiresAt = coordinator.coordinationLeaseExpiresAt;
|
|
557
|
+
if (coordinator.mutationState !== ownerState ||
|
|
558
|
+
coordinator.coordinationToken !== token ||
|
|
559
|
+
coordinator.attachmentId !== attachmentId ||
|
|
560
|
+
coordinator.generation !== generation ||
|
|
561
|
+
!leaseExpiresAt ||
|
|
562
|
+
this.coordinationLeaseExpired(leaseExpiresAt)) {
|
|
563
|
+
return false;
|
|
564
|
+
}
|
|
565
|
+
const released = await AttachmentMetadata.updateOne({
|
|
566
|
+
id: coordinator.id,
|
|
567
|
+
oid: STAGING_COORDINATOR_OID,
|
|
568
|
+
fileId: identity.fileId,
|
|
569
|
+
storageKey: identity.storageKey,
|
|
570
|
+
mutationFileId: fileId,
|
|
571
|
+
isJournal: true,
|
|
572
|
+
mutationState: ownerState,
|
|
573
|
+
coordinationToken: token,
|
|
574
|
+
coordinationLeaseExpiresAt: leaseExpiresAt,
|
|
575
|
+
attachmentId,
|
|
576
|
+
generation,
|
|
577
|
+
}).set({
|
|
578
|
+
mutationState: 'staging-available',
|
|
579
|
+
coordinationToken: undefined,
|
|
580
|
+
coordinationLeaseExpiresAt: undefined,
|
|
581
|
+
lastAttemptAt: new Date().toISOString(),
|
|
582
|
+
});
|
|
583
|
+
return Boolean(released);
|
|
584
|
+
}
|
|
585
|
+
stagingCoordinatorIdentity(fileId) {
|
|
586
|
+
const digest = (0, node_crypto_1.createHash)('sha256').update(fileId).digest('hex');
|
|
587
|
+
return {
|
|
588
|
+
fileId: `staging-coordinator-${digest}`,
|
|
589
|
+
storageKey: `journal/staging-coordinator/${digest}`,
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
isExpectedStagingCoordinator(row, fileId, identity) {
|
|
593
|
+
return Boolean(row?.id &&
|
|
594
|
+
row.oid === STAGING_COORDINATOR_OID &&
|
|
595
|
+
row.fileId === identity.fileId &&
|
|
596
|
+
row.storageKey === identity.storageKey &&
|
|
597
|
+
row.mutationFileId === fileId &&
|
|
598
|
+
row.isJournal === true &&
|
|
599
|
+
(row.mutationState === 'staging-available' ||
|
|
600
|
+
row.mutationState === 'staging-preparing' ||
|
|
601
|
+
row.mutationState === 'staging-cleanup'));
|
|
602
|
+
}
|
|
603
|
+
coordinationLeaseExpiresAt() {
|
|
604
|
+
return new Date(Date.now() + STAGING_COORDINATOR_LEASE_MS).toISOString();
|
|
605
|
+
}
|
|
606
|
+
coordinationLeaseExpired(value) {
|
|
607
|
+
const expiresAt = new Date(value).getTime();
|
|
608
|
+
return !Number.isFinite(expiresAt) || expiresAt <= Date.now();
|
|
609
|
+
}
|
|
610
|
+
async renewStagingCoordinator(coordinator, token, ownerState) {
|
|
611
|
+
const currentExpiry = new Date(coordinator.coordinationLeaseExpiresAt).getTime();
|
|
612
|
+
if (Number.isFinite(currentExpiry) && currentExpiry > Date.now() + 60_000)
|
|
613
|
+
return true;
|
|
614
|
+
return Boolean(await AttachmentMetadata.updateOne({
|
|
615
|
+
id: coordinator.id,
|
|
616
|
+
mutationState: ownerState,
|
|
617
|
+
coordinationToken: token,
|
|
618
|
+
coordinationLeaseExpiresAt: coordinator.coordinationLeaseExpiresAt,
|
|
619
|
+
}).set({
|
|
620
|
+
coordinationLeaseExpiresAt: this.coordinationLeaseExpiresAt(),
|
|
621
|
+
lastAttemptAt: new Date().toISOString(),
|
|
622
|
+
}));
|
|
623
|
+
}
|
|
624
|
+
isUniqueConstraintError(error) {
|
|
625
|
+
const details = error;
|
|
626
|
+
return details?.code === 'E_UNIQUE' || details?.raw?.code === 11000 || details?.cause?.code === 11000;
|
|
627
|
+
}
|
|
628
|
+
normalizeCleanupClaim(claim) {
|
|
629
|
+
const oid = String(claim?.oid ?? '').trim();
|
|
630
|
+
const attachmentId = this.optionalIdentifier(claim?.attachmentId);
|
|
631
|
+
const fileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(claim?.fileId);
|
|
632
|
+
const generation = this.optionalIdentifier(claim?.generation);
|
|
633
|
+
const token = this.optionalIdentifier(claim?.token);
|
|
634
|
+
if (!oid || !attachmentId || !fileId || !generation || !token)
|
|
635
|
+
return undefined;
|
|
636
|
+
return { oid, attachmentId, fileId, generation, token, phase: claim.phase };
|
|
637
|
+
}
|
|
638
|
+
cleanupClaimCriteria(claim) {
|
|
639
|
+
return {
|
|
640
|
+
oid: claim.oid,
|
|
641
|
+
attachmentId: claim.attachmentId,
|
|
642
|
+
generation: claim.generation,
|
|
643
|
+
mutationFileId: claim.fileId,
|
|
644
|
+
coordinationToken: claim.token,
|
|
645
|
+
};
|
|
646
|
+
}
|
|
80
647
|
shouldIncrementAccessCount(action) {
|
|
81
648
|
return action === 'download' || action === 'access';
|
|
82
649
|
}
|
|
@@ -85,6 +652,10 @@ var Services;
|
|
|
85
652
|
oid: String(row.oid ?? '').trim(),
|
|
86
653
|
fileId: String(row.fileId ?? '').trim(),
|
|
87
654
|
storageKey: String(row.storageKey ?? '').trim(),
|
|
655
|
+
isJournal: row.isJournal === true,
|
|
656
|
+
// Journal fields are only written when the caller supplies them, so an
|
|
657
|
+
// ordinary metadata upsert cannot silently reset reconciliation state.
|
|
658
|
+
...this.journalRow(row),
|
|
88
659
|
contentType: this.optionalString(row.contentType),
|
|
89
660
|
contentLength: this.optionalNumber(row.contentLength),
|
|
90
661
|
etag: this.optionalString(row.etag),
|
|
@@ -98,6 +669,70 @@ var Services;
|
|
|
98
669
|
accessCount: this.optionalNumber(row.accessCount) ?? 0,
|
|
99
670
|
};
|
|
100
671
|
}
|
|
672
|
+
journalRow(row) {
|
|
673
|
+
const journal = {};
|
|
674
|
+
const attachmentId = this.optionalIdentifier(row.attachmentId);
|
|
675
|
+
if (attachmentId) {
|
|
676
|
+
journal.attachmentId = attachmentId;
|
|
677
|
+
}
|
|
678
|
+
const operation = this.optionalOperation(row.operation);
|
|
679
|
+
if (operation) {
|
|
680
|
+
journal.operation = operation;
|
|
681
|
+
}
|
|
682
|
+
const mutationState = this.optionalMutationState(row.mutationState);
|
|
683
|
+
if (mutationState) {
|
|
684
|
+
journal.mutationState = mutationState;
|
|
685
|
+
}
|
|
686
|
+
const generation = this.optionalIdentifier(row.generation);
|
|
687
|
+
if (generation) {
|
|
688
|
+
journal.generation = generation;
|
|
689
|
+
}
|
|
690
|
+
const mutationFileId = (0, AttachmentStagingIdentity_1.normalizeAttachmentStagingFileId)(row.mutationFileId);
|
|
691
|
+
if (mutationFileId) {
|
|
692
|
+
journal.mutationFileId = mutationFileId;
|
|
693
|
+
}
|
|
694
|
+
const coordinationToken = this.optionalIdentifier(row.coordinationToken);
|
|
695
|
+
if (coordinationToken) {
|
|
696
|
+
journal.coordinationToken = coordinationToken;
|
|
697
|
+
}
|
|
698
|
+
const attemptCount = this.optionalNumber(row.attemptCount);
|
|
699
|
+
if (attemptCount !== undefined) {
|
|
700
|
+
journal.attemptCount = attemptCount;
|
|
701
|
+
}
|
|
702
|
+
const lastAttemptAt = this.optionalDateString(row.lastAttemptAt);
|
|
703
|
+
if (lastAttemptAt) {
|
|
704
|
+
journal.lastAttemptAt = lastAttemptAt;
|
|
705
|
+
}
|
|
706
|
+
const lastSafeErrorCode = this.optionalIdentifier(row.lastSafeErrorCode);
|
|
707
|
+
if (lastSafeErrorCode) {
|
|
708
|
+
journal.lastSafeErrorCode = lastSafeErrorCode;
|
|
709
|
+
}
|
|
710
|
+
return journal;
|
|
711
|
+
}
|
|
712
|
+
optionalIdentifier(value) {
|
|
713
|
+
const normalized = String(value ?? '').trim();
|
|
714
|
+
return normalized && /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(normalized) ? normalized : undefined;
|
|
715
|
+
}
|
|
716
|
+
optionalOperation(value) {
|
|
717
|
+
return value === 'add' || value === 'finalize' || value === 'delete' ? value : undefined;
|
|
718
|
+
}
|
|
719
|
+
optionalMutationState(value) {
|
|
720
|
+
return value === 'prepared' ||
|
|
721
|
+
value === 'pending' ||
|
|
722
|
+
value === 'applied' ||
|
|
723
|
+
value === 'incomplete' ||
|
|
724
|
+
value === 'unknown' ||
|
|
725
|
+
value === 'cancelled' ||
|
|
726
|
+
value === 'cleanup-pending' ||
|
|
727
|
+
value === 'cleanup-checking' ||
|
|
728
|
+
value === 'cleanup-removing' ||
|
|
729
|
+
value === 'cleaned' ||
|
|
730
|
+
value === 'staging-available' ||
|
|
731
|
+
value === 'staging-preparing' ||
|
|
732
|
+
value === 'staging-cleanup'
|
|
733
|
+
? value
|
|
734
|
+
: undefined;
|
|
735
|
+
}
|
|
101
736
|
normalizeAccessEvent(event) {
|
|
102
737
|
return {
|
|
103
738
|
oid: String(event.oid ?? '').trim(),
|
|
@@ -130,4 +765,4 @@ var Services;
|
|
|
130
765
|
}
|
|
131
766
|
Services.AttachmentMetadataService = AttachmentMetadataService;
|
|
132
767
|
})(Services || (exports.Services = Services = {}));
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudE1ldGFkYXRhU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9BdHRhY2htZW50TWV0YWRhdGFTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUFzRDtBQUd0RCxJQUFpQixRQUFRLENBdUp4QjtBQXZKRCxXQUFpQixRQUFRO0lBYXZCLE1BQWEseUJBQTBCLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUMvQyxnQkFBZ0IsR0FBYTtZQUM5QyxRQUFRO1lBQ1IsV0FBVztZQUNYLHFCQUFxQjtZQUNyQixvQkFBb0I7WUFDcEIsY0FBYztTQUNmLENBQUM7UUFFaUIsU0FBUyxHQUFXLDZCQUE2QixDQUFDO1FBRTlELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBNEI7WUFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUF3QzttQkFDbkcsQ0FBQyxHQUFHLElBQUksTUFBTTtvQkFDZixDQUFDLENBQUMs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
|
|
768
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudE1ldGFkYXRhU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9BdHRhY2htZW50TWV0YWRhdGFTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFxRDtBQUNyRCxnREFBc0Q7QUFFdEQsNEVBQWdGO0FBRWhGLElBQWlCLFFBQVEsQ0EwOEJ4QjtBQTE4QkQsV0FBaUIsUUFBUTtJQUN2QixNQUFNLHVCQUF1QixHQUFHLCtCQUErQixDQUFDO0lBQ2hFLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUF1RG5ELE1BQWEseUJBQTBCLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUMvQyxnQkFBZ0IsR0FBYTtZQUM5QyxRQUFRO1lBQ1IsV0FBVztZQUNYLHFCQUFxQjtZQUNyQiwrQkFBK0I7WUFDL0IscUJBQXFCO1lBQ3JCLGtCQUFrQjtZQUNsQixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLDRCQUE0QjtZQUM1QixxQkFBcUI7WUFDckIseUJBQXlCO1lBQ3pCLHVCQUF1QjtZQUN2Qix3QkFBd0I7WUFDeEIsdUJBQXVCO1lBQ3ZCLFdBQVc7WUFDWCxhQUFhO1lBQ2Isb0JBQW9CO1lBQ3BCLGNBQWM7U0FDZixDQUFDO1FBRWlCLFNBQVMsR0FBVyw2QkFBNkIsQ0FBQztRQUU5RCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQTRCO1lBQzlDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENB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
|