Source code for cadrumo.adapters.persistence.profile.review_package_recipient_registry
"""Secure-object adapter for the trusted recipient registry capability.The application layer owns recipient DTOs and registration policy. Thisadapter owns the bucket namespace and secure-object encoding, translatingstorage failures into the application's registered registry error before theycross the port boundary.Core types::class:`~cadrumo.adapters.persistence.storage.sql.secure_objects.SecureObjectRepository`."""from__future__importannotationsfromcollections.abcimportCallablefromtypingimportTypeVar,overridefrom....application.modelo.review_package_recipient_registryimport(RecipientFingerprintRegister,RecipientFingerprintRegistryError,)from....application.modelo.review_package_recipient_registry_portsimport(RecipientFingerprintRegistryPorts,RecipientFingerprintRegistryRepositoryPort,)from....core.external_constantsimportUTF_8_ENCODINGfrom....core.identity.bucketimportcanonical_bucket_idfrom....core.time.clockimportnowas_utc_nowfrom..storage.errorsimportStorageErrorfrom..storage.runtime_repositoryimportsecure_object_repository_for_bucketfrom..storage.secure_object_namespacesimport(MODELO_REVIEW_PACKAGE_RECIPIENT_FINGERPRINT_REGISTRY_NAMESPACEas_NAMESPACE,)from..storage.sql.secure_objectsimportSecureObjectRepositoryT=TypeVar("T")def_translate_registry_failure[T](operation:str,action:Callable[[],T])->T:"""Translate secure-object failures to the application registry contract."""try:returnaction()exceptRecipientFingerprintRegistryError:raiseexcept(StorageError,OSError,TypeError,ValueError,KeyError)asexc:raiseRecipientFingerprintRegistryError(f"recipient fingerprint registry {operation} failed",context={"operation":operation},translated_message="application.modelo.errors.recipient_registry_load_failed",)fromexc
[docs]classRecipientFingerprintRegistryAdapter(RecipientFingerprintRegistryRepositoryPort):"""Bind the trusted-recipient port to one bucket's encrypted object store."""def__init__(self,*,repository:SecureObjectRepository)->None:"""Bind the encrypted trusted-recipient repository."""self._repository=repository
[docs]@overridedefload(self)->RecipientFingerprintRegister:"""Load the register, preserving an absent row as an empty register."""def_load()->RecipientFingerprintRegister:record=self._repository.load(_NAMESPACE.namespace,self._object_key,expected_class=_NAMESPACE.sensitivity,max_supported_version=_NAMESPACE.schema_version,)ifrecordisNone:returnRecipientFingerprintRegister()returnRecipientFingerprintRegister.model_validate_json(record.payload.decode(UTF_8_ENCODING))return_translate_registry_failure("load",_load)
[docs]@overridedefsave(self,register:RecipientFingerprintRegister)->None:"""Persist one validated register as the bucket's encrypted singleton."""def_save()->None:self._repository.save(namespace=_NAMESPACE.namespace,object_key=self._object_key,classification=_NAMESPACE.sensitivity,schema_version=_NAMESPACE.schema_version,written_at=_utc_now(),payload=register.model_dump_json().encode(UTF_8_ENCODING),write_provenance="adapters.persistence.profile.review_package_recipient_registry",)_translate_registry_failure("save",_save)
[docs]defbuild_recipient_fingerprint_registry_ports(*,bucket_id:str)->RecipientFingerprintRegistryPorts:"""Bind the trusted-recipient registry to one profile bucket."""normalized_bucket_id=canonical_bucket_id(bucket_id)returnRecipientFingerprintRegistryPorts(registry_repository=RecipientFingerprintRegistryAdapter(repository=secure_object_repository_for_bucket(normalized_bucket_id),),)