diff --git a/Cargo.toml b/Cargo.toml index 2d51d6e..1b6b274 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dco3" -version = "0.17.0" +version = "0.17.1" edition = "2021" authors = ["Octavio Simone"] repository = "https://github.com/unbekanntes-pferd/dco3" @@ -16,8 +16,8 @@ description = "Async API wrapper for DRACOON in Rust." [dependencies] # http reqwest = {version = "0.12", features = ["json", "stream"]} -reqwest-middleware = {version = "0.3", features = ["json"]} -reqwest-retry = "0.6" +reqwest-middleware = {version = "0.4", features = ["json"]} +reqwest-retry = "0.7" # crypto dco3_crypto = "0.7" @@ -51,6 +51,6 @@ secrecy = {version = "0.10", features = ["serde"]} [dev-dependencies] -mockito = "1.5" +mockito = "1" tracing-subscriber = {version = "0.3", features = ["env-filter"]} diff --git a/src/client/models.rs b/src/client/models.rs index 0829fcf..ab7caea 100644 --- a/src/client/models.rs +++ b/src/client/models.rs @@ -218,7 +218,7 @@ impl DracoonErrorResponse { } /// DRACOON `OAuth2` error response -#[derive(Deserialize, Debug, PartialEq)] +#[derive(Deserialize, Debug, PartialEq, Clone)] #[serde(rename_all = "camelCase")] pub struct DracoonAuthErrorResponse { error: String, diff --git a/src/nodes/models/filters.rs b/src/nodes/models/filters.rs index 7e56a53..c477d06 100644 --- a/src/nodes/models/filters.rs +++ b/src/nodes/models/filters.rs @@ -5,7 +5,7 @@ use super::NodeType; #[derive(Debug, Clone)] pub enum NodesFilter { Name(FilterOperator, String), - Type(FilterOperator, NodeType), + Type(FilterOperator, NodeTypes), Encrypted(FilterOperator, bool), BranchVersion(FilterOperator, u64), TimestampCreation(FilterOperator, String), @@ -15,6 +15,26 @@ pub enum NodesFilter { // TODO: add permission model enum in api/models.rs } +#[derive(Debug, Clone)] +pub struct NodeTypes(Vec); + +impl From<&NodeTypes> for String { + fn from(node_types: &NodeTypes) -> Self { + node_types + .0 + .iter() + .map(String::from) + .collect::>() + .join(":") + } +} + +impl From> for NodeTypes { + fn from(node_types: Vec) -> Self { + NodeTypes(node_types) + } +} + impl FilterQuery for NodesFilter { fn to_filter_string(&self) -> String { match self { @@ -93,15 +113,20 @@ impl NodesFilter { } pub fn is_file() -> Self { - NodesFilter::Type(FilterOperator::Eq, NodeType::File) + NodesFilter::Type(FilterOperator::Eq, vec![NodeType::File].into()) } pub fn is_folder() -> Self { - NodesFilter::Type(FilterOperator::Eq, NodeType::Folder) + NodesFilter::Type(FilterOperator::Eq, vec![NodeType::Folder].into()) } pub fn is_room() -> Self { - NodesFilter::Type(FilterOperator::Eq, NodeType::Room) + NodesFilter::Type(FilterOperator::Eq, vec![NodeType::Room].into()) + } + + pub fn is_types(val: Vec) -> Self { + let node_types = NodeTypes(val); + NodesFilter::Type(FilterOperator::Eq, node_types) } } @@ -113,7 +138,7 @@ impl From for Box { #[derive(Debug, Clone)] pub enum NodesSearchFilter { - Type(FilterOperator, NodeType), + Type(FilterOperator, NodeTypes), FileType(FilterOperator, String), Classification(FilterOperator, u8), CreatedBy(FilterOperator, String), @@ -134,15 +159,20 @@ pub enum NodesSearchFilter { impl NodesSearchFilter { pub fn is_file() -> Self { - NodesSearchFilter::Type(FilterOperator::Eq, NodeType::File) + NodesSearchFilter::Type(FilterOperator::Eq, vec![NodeType::File].into()) } pub fn is_folder() -> Self { - NodesSearchFilter::Type(FilterOperator::Eq, NodeType::Folder) + NodesSearchFilter::Type(FilterOperator::Eq, vec![NodeType::Folder].into()) } pub fn is_room() -> Self { - NodesSearchFilter::Type(FilterOperator::Eq, NodeType::Room) + NodesSearchFilter::Type(FilterOperator::Eq, vec![NodeType::Room].into()) + } + + pub fn is_types(val: Vec) -> Self { + let node_types = NodeTypes(val); + NodesSearchFilter::Type(FilterOperator::Eq, node_types) } pub fn is_favorite(val: bool) -> Self { @@ -315,6 +345,24 @@ mod tests { assert_eq!(filter.to_filter_string(), "type:eq:file"); } + #[test] + fn test_nodes_filter_is_room() { + let filter = NodesFilter::is_room(); + assert_eq!(filter.to_filter_string(), "type:eq:room"); + } + + #[test] + fn test_nodes_filter_is_folder() { + let filter = NodesFilter::is_folder(); + assert_eq!(filter.to_filter_string(), "type:eq:folder"); + } + + #[test] + fn test_nodes_filter_is_folder_room() { + let filter = NodesFilter::is_types(vec![NodeType::Folder, NodeType::Room]); + assert_eq!(filter.to_filter_string(), "type:eq:folder:room"); + } + #[test] fn test_nodes_filter_is_encrypted() { let filter = NodesFilter::is_encrypted(true); @@ -504,4 +552,10 @@ mod tests { let filter = NodesSearchFilter::file_type_contains("jpg"); assert_eq!(filter.to_filter_string(), "fileType:cn:jpg"); } + + #[test] + fn test_nodes_search_folder_room() { + let filter = NodesSearchFilter::is_types(vec![NodeType::Folder, NodeType::Room]); + assert_eq!(filter.to_filter_string(), "type:eq:folder:room"); + } } diff --git a/src/nodes/models/mod.rs b/src/nodes/models/mod.rs index 2506c34..94450c3 100644 --- a/src/nodes/models/mod.rs +++ b/src/nodes/models/mod.rs @@ -453,7 +453,7 @@ pub struct DownloadUrlResponse { } /// Error response for S3 requests (XML) -#[derive(Debug, Deserialize, PartialEq)] +#[derive(Debug, Deserialize, PartialEq, Clone)] #[serde(rename_all = "PascalCase")] pub struct S3XmlError { code: Option, @@ -464,7 +464,7 @@ pub struct S3XmlError { } /// Error response for S3 requests -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Clone)] pub struct S3ErrorResponse { pub status: StatusCode, pub error: S3XmlError,