"""Boundary DTO for one prepared secure-object upsert.:class:`SecureObjectWrite` is the persistence-boundary contract between a domainrepository port — which declares ``to_secure_object_write(...) -> SecureObjectWrite``in :mod:`~domain.modelos` — and the storage adapter that persists it. It is apure value object depending only on :mod:`~core`(:data:`~core.STRICT_FROZEN_CONFIG`,:class:`~core.classification.SensitivityClass`), so a domain port can name itin a method signature without importing the ``aeat.adapters`` layer. The storageadapter (:mod:`~adapters.persistence.storage`) re-exports it unchanged.See Also: :class:`~core.SecureObjectWrite` Public core facade export for this DTO. :class:`~core.classification.SensitivityClass` Classification carried by every prepared secure-object write. :class:`~domain.modelos.CalculationRevisionCatalogueRepositoryProtocol` Domain repository port that can prepare a calculation catalogue write without importing adapters. :class:`~domain.modelos.ModeloRecordCatalogueRepositoryProtocol` Domain repository port that can co-write filing records through the same DTO. :class:`~adapters.persistence.storage.SecureObjectRepository` Storage adapter that consumes these prepared writes. :meth:`~adapters.persistence.storage.SecureObjectRepository.save_many` Unit-of-work API that persists one or more prepared writes atomically."""from__future__importannotationsfromdatetimeimportdatetimefrompydanticimportBaseModel,Fieldfrom._modelsimportSTRICT_FROZEN_CONFIGas_STRICT_FROZENfrom.classificationimportSensitivityClassDEFAULT_WRITE_PROVENANCE="secure-object-repository"
[docs]classSecureObjectWrite(BaseModel):"""One encrypted secure-object upsert prepared for a unit of work."""model_config=_STRICT_FROZENnamespace:str=Field(min_length=1)object_key:str=Field(min_length=1)classification:SensitivityClassschema_version:int=Field(ge=1)written_at:datetimepayload:bytes=Field(min_length=1)write_provenance:str=Field(default=DEFAULT_WRITE_PROVENANCE,min_length=1,max_length=255)source_event_id:str|None=Field(default=None,min_length=1,max_length=128)expected_revision_id:str|None=Field(default=None,min_length=64,max_length=64)