diff --git a/native/native_rust_library/Cargo.lock b/native/native_rust_library/Cargo.lock --- a/native/native_rust_library/Cargo.lock +++ b/native/native_rust_library/Cargo.lock @@ -298,6 +298,7 @@ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.52.5", ] diff --git a/services/backup/src/constants.rs b/services/backup/src/constants.rs --- a/services/backup/src/constants.rs +++ b/services/backup/src/constants.rs @@ -17,20 +17,8 @@ pub const COMM_SERVICES_USE_JSON_LOGS: &str = "COMM_SERVICES_USE_JSON_LOGS"; // DynamoDB constants -pub mod backup_table { - pub const TABLE_NAME: &str = "backup-service-backup"; - pub const CREATED_INDEX: &str = "userID-created-index"; - pub mod attr { - pub const USER_ID: &str = "userID"; - pub const BACKUP_ID: &str = "backupID"; - pub const CREATED: &str = "created"; - pub const USER_DATA: &str = "userData"; - pub const USER_KEYS: &str = "userKeys"; - pub const ATTACHMENTS: &str = "attachments"; - pub const SIWE_BACKUP_MSG: &str = "siweBackupMsg"; - } -} +pub use comm_lib::backup::database::backup_table; pub mod log_table { pub const TABLE_NAME: &str = "backup-service-log"; diff --git a/services/backup/src/database/backup_item.rs b/services/backup/src/database/backup_item.rs --- a/services/backup/src/database/backup_item.rs +++ b/services/backup/src/database/backup_item.rs @@ -2,181 +2,12 @@ use aws_sdk_dynamodb::types::AttributeValue; use chrono::{DateTime, Utc}; use comm_lib::{ - blob::{client::BlobServiceClient, types::BlobInfo}, - database::{ - AttributeExtractor, AttributeTryInto, DBItemError, TryFromAttribute, - }, + blob::types::BlobInfo, + database::{AttributeExtractor, DBItemError, TryFromAttribute}, }; use std::collections::HashMap; -#[derive(Clone, Debug)] -pub struct BackupItem { - pub user_id: String, - pub backup_id: String, - pub created: DateTime, - pub user_keys: BlobInfo, - pub user_data: Option, - pub attachments: Vec, - pub siwe_backup_msg: Option, -} - -impl BackupItem { - pub fn new( - user_id: String, - backup_id: String, - user_keys: BlobInfo, - user_data: Option, - attachments: Vec, - siwe_backup_msg: Option, - ) -> Self { - BackupItem { - user_id, - backup_id, - created: chrono::Utc::now(), - user_keys, - user_data, - attachments, - siwe_backup_msg, - } - } - - pub fn revoke_user_keys_holders(&self, blob_client: &BlobServiceClient) { - blob_client.schedule_revoke_holder( - &self.user_keys.blob_hash, - &self.user_keys.holder, - ); - } - - pub fn revoke_user_data_holders(&self, blob_client: &BlobServiceClient) { - if let Some(user_data) = &self.user_data { - blob_client - .schedule_revoke_holder(&user_data.blob_hash, &user_data.holder); - } - - for attachment_info in &self.attachments { - blob_client.schedule_revoke_holder( - &attachment_info.blob_hash, - &attachment_info.holder, - ); - } - } - - pub fn item_key( - user_id: &str, - backup_id: &str, - ) -> HashMap { - HashMap::from([ - ( - backup_table::attr::USER_ID.to_string(), - AttributeValue::S(user_id.to_string()), - ), - ( - backup_table::attr::BACKUP_ID.to_string(), - AttributeValue::S(backup_id.to_string()), - ), - ]) - } -} - -impl From for HashMap { - fn from(value: BackupItem) -> Self { - let mut attrs = HashMap::from([ - ( - backup_table::attr::USER_ID.to_string(), - AttributeValue::S(value.user_id), - ), - ( - backup_table::attr::BACKUP_ID.to_string(), - AttributeValue::S(value.backup_id), - ), - ( - backup_table::attr::CREATED.to_string(), - AttributeValue::S(value.created.to_rfc3339()), - ), - ( - backup_table::attr::USER_KEYS.to_string(), - value.user_keys.into(), - ), - ]); - - if let Some(user_data) = value.user_data { - attrs.insert(backup_table::attr::USER_DATA.to_string(), user_data.into()); - } - - if !value.attachments.is_empty() { - attrs.insert( - backup_table::attr::ATTACHMENTS.to_string(), - AttributeValue::L( - value - .attachments - .into_iter() - .map(AttributeValue::from) - .collect(), - ), - ); - } - - if let Some(siwe_backup_msg_value) = value.siwe_backup_msg { - attrs.insert( - backup_table::attr::SIWE_BACKUP_MSG.to_string(), - AttributeValue::S(siwe_backup_msg_value), - ); - } - attrs - } -} - -impl TryFrom> for BackupItem { - type Error = DBItemError; - - fn try_from( - mut value: HashMap, - ) -> Result { - let user_id = String::try_from_attr( - backup_table::attr::USER_ID, - value.remove(backup_table::attr::USER_ID), - )?; - let backup_id = String::try_from_attr( - backup_table::attr::BACKUP_ID, - value.remove(backup_table::attr::BACKUP_ID), - )?; - let created = DateTime::::try_from_attr( - backup_table::attr::CREATED, - value.remove(backup_table::attr::CREATED), - )?; - - let user_keys = BlobInfo::try_from_attr( - backup_table::attr::USER_KEYS, - value.remove(backup_table::attr::USER_KEYS), - )?; - let user_data = value - .remove(backup_table::attr::USER_DATA) - .map(|attr| { - BlobInfo::try_from_attr(backup_table::attr::USER_DATA, Some(attr)) - }) - .transpose()?; - - let attachments = value.remove(backup_table::attr::ATTACHMENTS); - let attachments = if attachments.is_some() { - attachments.attr_try_into(backup_table::attr::ATTACHMENTS)? - } else { - Vec::new() - }; - - let siwe_backup_msg: Option = - value.take_attr(backup_table::attr::SIWE_BACKUP_MSG)?; - - Ok(BackupItem { - user_id, - backup_id, - created, - user_keys, - user_data, - attachments, - siwe_backup_msg, - }) - } -} +pub use comm_lib::backup::database::BackupItem; /// Corresponds to the items in the [`crate::constants::BACKUP_TABLE_INDEX_USERID_CREATED`] /// global index diff --git a/shared/comm-lib/Cargo.toml b/shared/comm-lib/Cargo.toml --- a/shared/comm-lib/Cargo.toml +++ b/shared/comm-lib/Cargo.toml @@ -32,7 +32,7 @@ serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } base64 = { workspace = true } -chrono = { workspace = true } +chrono = { workspace = true, features = ["serde"] } constant_time_eq = "0.3" derive_more = { workspace = true } grpc_clients = { path = "../grpc_clients", optional = true } diff --git a/services/backup/src/database/backup_item.rs b/shared/comm-lib/src/backup/database.rs copy from services/backup/src/database/backup_item.rs copy to shared/comm-lib/src/backup/database.rs --- a/services/backup/src/database/backup_item.rs +++ b/shared/comm-lib/src/backup/database.rs @@ -1,15 +1,34 @@ -use crate::constants::backup_table; -use aws_sdk_dynamodb::types::AttributeValue; use chrono::{DateTime, Utc}; -use comm_lib::{ - blob::{client::BlobServiceClient, types::BlobInfo}, - database::{ - AttributeExtractor, AttributeTryInto, DBItemError, TryFromAttribute, - }, -}; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; -#[derive(Clone, Debug)] +use crate::blob::types::BlobInfo; + +#[cfg(feature = "blob-client")] +use crate::blob::client::BlobServiceClient; +#[cfg(feature = "aws")] +use crate::database::{ + AttributeExtractor, AttributeTryInto, DBItemError, TryFromAttribute, +}; +#[cfg(feature = "aws")] +use aws_sdk_dynamodb::types::AttributeValue; + +pub mod backup_table { + pub const TABLE_NAME: &str = "backup-service-backup"; + pub const CREATED_INDEX: &str = "userID-created-index"; + + pub mod attr { + pub const USER_ID: &str = "userID"; + pub const BACKUP_ID: &str = "backupID"; + pub const CREATED: &str = "created"; + pub const USER_DATA: &str = "userData"; + pub const USER_KEYS: &str = "userKeys"; + pub const ATTACHMENTS: &str = "attachments"; + pub const SIWE_BACKUP_MSG: &str = "siweBackupMsg"; + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct BackupItem { pub user_id: String, pub backup_id: String, @@ -40,6 +59,7 @@ } } + #[cfg(feature = "blob-client")] pub fn revoke_user_keys_holders(&self, blob_client: &BlobServiceClient) { blob_client.schedule_revoke_holder( &self.user_keys.blob_hash, @@ -47,6 +67,7 @@ ); } + #[cfg(feature = "blob-client")] pub fn revoke_user_data_holders(&self, blob_client: &BlobServiceClient) { if let Some(user_data) = &self.user_data { blob_client @@ -61,6 +82,7 @@ } } + #[cfg(feature = "aws")] pub fn item_key( user_id: &str, backup_id: &str, @@ -78,6 +100,7 @@ } } +#[cfg(feature = "aws")] impl From for HashMap { fn from(value: BackupItem) -> Self { let mut attrs = HashMap::from([ @@ -126,6 +149,7 @@ } } +#[cfg(feature = "aws")] impl TryFrom> for BackupItem { type Error = DBItemError; @@ -177,51 +201,3 @@ }) } } - -/// Corresponds to the items in the [`crate::constants::BACKUP_TABLE_INDEX_USERID_CREATED`] -/// global index -#[derive(Clone, Debug)] -pub struct OrderedBackupItem { - pub user_id: String, - pub created: DateTime, - pub backup_id: String, - pub user_keys: BlobInfo, - pub siwe_backup_msg: Option, -} - -impl TryFrom> for OrderedBackupItem { - type Error = DBItemError; - - fn try_from( - mut value: HashMap, - ) -> Result { - let user_id = String::try_from_attr( - backup_table::attr::USER_ID, - value.remove(backup_table::attr::USER_ID), - )?; - let created = DateTime::::try_from_attr( - backup_table::attr::CREATED, - value.remove(backup_table::attr::CREATED), - )?; - let backup_id = String::try_from_attr( - backup_table::attr::BACKUP_ID, - value.remove(backup_table::attr::BACKUP_ID), - )?; - - let user_keys = BlobInfo::try_from_attr( - backup_table::attr::USER_KEYS, - value.remove(backup_table::attr::USER_KEYS), - )?; - - let siwe_backup_msg: Option = - value.take_attr(backup_table::attr::SIWE_BACKUP_MSG)?; - - Ok(OrderedBackupItem { - user_id, - created, - backup_id, - user_keys, - siwe_backup_msg, - }) - } -} diff --git a/shared/comm-lib/src/backup/mod.rs b/shared/comm-lib/src/backup/mod.rs --- a/shared/comm-lib/src/backup/mod.rs +++ b/shared/comm-lib/src/backup/mod.rs @@ -1,6 +1,9 @@ use crate::auth::UserIdentity; use serde::{Deserialize, Serialize}; +/// shared database types and constants +pub mod database; + #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct LatestBackupInfoResponse { diff --git a/web/backup-client-wasm/Cargo.lock b/web/backup-client-wasm/Cargo.lock --- a/web/backup-client-wasm/Cargo.lock +++ b/web/backup-client-wasm/Cargo.lock @@ -191,6 +191,7 @@ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.52.3", ]