// file: kb_lib/src/db/dtos/db_metadata.rs //! Metadata DTOs. /// Metadata DTO used by the application layer. #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct KbDbMetadataDto { /// Metadata key. pub key: std::string::String, /// Metadata value. pub value: std::string::String, /// Last update timestamp. pub updated_at: chrono::DateTime, } impl KbDbMetadataDto { /// Creates a new metadata DTO with the current UTC timestamp. pub fn new(key: std::string::String, value: std::string::String) -> Self { Self { key, value, updated_at: chrono::Utc::now(), } } } impl TryFrom for KbDbMetadataDto { type Error = crate::KbError; fn try_from(entity: crate::KbDbMetadataEntity) -> Result { let parsed_result = chrono::DateTime::parse_from_rfc3339(&entity.updated_at); let parsed = match parsed_result { Ok(parsed) => parsed, Err(error) => { return Err(crate::KbError::Db(format!( "cannot parse db metadata timestamp '{}': {}", entity.updated_at, error ))); } }; Ok(Self { key: entity.key, value: entity.value, updated_at: parsed.with_timezone(&chrono::Utc), }) } } impl From for crate::KbDbMetadataEntity { fn from(dto: KbDbMetadataDto) -> Self { Self { key: dto.key, value: dto.value, updated_at: dto.updated_at.to_rfc3339(), } } }