diff --git a/src/azure.rs b/src/azure.rs index b697088..2951b8b 100644 --- a/src/azure.rs +++ b/src/azure.rs @@ -27,6 +27,9 @@ use std::sync::Arc; use tempfile::Builder; use toml::Table; use std::fs::read_to_string; +use futures::Stream; +use futures::stream::StreamExt; +use azure_storage_blobs::container::operations::BlobItem; #[derive(Deserialize)] struct AzureConfig { @@ -306,6 +309,33 @@ async fn azure_set_filename_tags(filename: String, user_tags: Vec<(String, Strin } } +async fn azure_list_files(directory: String) -> Vec { + let azure_cfg = Arc::new(get_azure_credentials("azure")); + let storage_account = azure_cfg.account.as_str(); + let storage_key = azure_cfg.key.clone(); + let storage_container = azure_cfg.container.as_str(); + let storage_credential = StorageCredentials::access_key(storage_account, storage_key); + let container_r = ClientBuilder::new(storage_account, storage_credential) + .container_client(storage_container); + let listbldr = container_r.list_blobs(); + let mut liststream = listbldr.into_stream(); + let mut listing = Vec::new(); + while let Some(Ok(page)) = liststream.next().await { + let blobs = page.blobs.items; + for blob in blobs { + let blob_name = match blob { + BlobItem::Blob(blob) => blob.name, + BlobItem::BlobPrefix(blob_prefix) => blob_prefix.name, + }; + listing.push(blob_name.clone()); + + } + println!("Listing count: {}", listing.len()); + } + //println!("Listing: {:?}", listing); + return listing; +} + /// Implement Driver trait for AzureDriver impl super::Driver for AzureDriver { fn write_file(&self, filename: String, data: Vec, cont_type: String) -> String { @@ -336,4 +366,12 @@ impl super::Driver for AzureDriver { }); return received_file; } + fn list_files(&self, directory: String) -> Vec { + let mut ret = Vec::new(); + tokio::task::block_in_place(|| { + let rt = tokio::runtime::Runtime::new().unwrap(); + ret = rt.block_on(azure_list_files(directory)); + }); + return ret; + } } diff --git a/src/main.rs b/src/main.rs index f13460f..7e9c4cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,6 +65,7 @@ trait Driver { fn write_file(&self, filename: String, data: Vec, cont_type: String) -> String; fn get_file(&self, filename: String) -> ReceivedFile; fn tag_file(&self, filename: String, user_tags: Vec<(String, String)>) -> Result; + fn list_files(&self, directory: String) -> Vec; } fn init_driver(driver_type: &str) -> Box { @@ -143,6 +144,7 @@ async fn main() { .route("/v1/file", post(ax_post_file)) .route("/upload", post(ax_post_file)) .route("/*filepath", get(ax_get_file)) + .route("/v1/list", get(ax_list_files)) .layer(ServiceBuilder::new().layer(DefaultBodyLimit::max(1024 * 1024 * 1024 * 4))); /* @@ -539,3 +541,12 @@ fn verify_auth_hdr(headers: &HeaderMap) -> Result> { return Err(None); } } + +async fn ax_list_files() -> (StatusCode, String) { + let driver_name = "azure"; + let driver = init_driver(driver_name); + let files = driver.list_files("/".to_string()); + // generate nice list of files, with one file per line + let files_str = files.join("\n"); + return (StatusCode::OK, files_str); +}