diff --git a/cli/src/routes.rs b/cli/src/routes.rs index cb72027..6b278c6 100644 --- a/cli/src/routes.rs +++ b/cli/src/routes.rs @@ -673,10 +673,21 @@ pub async fn get_address( let (bytes, _) = web::block(|| fetch_external(url)).await??; let hash_result = hash(&bytes); (Address::Hash(hash_result), false) + } else if let Some(type_str) = query.get("type") { + match type_str.as_str() { + "Hash" => (upend::database::constants::TYPE_HASH_ADDRESS.clone(), true), + "Uuid" => (upend::database::constants::TYPE_UUID_ADDRESS.clone(), true), + "Attribute" => ( + upend::database::constants::TYPE_ATTRIBUTE_ADDRESS.clone(), + true, + ), + "Url" => (upend::database::constants::TYPE_URL_ADDRESS.clone(), true), + _ => return Err(ErrorBadRequest(format!("Unknown type: {type_str}"))), + } } else { - return Err(ErrorBadRequest(anyhow!( - "Specify one of: `attribute`, `url`, `url_content`." - ))); + return Err(ErrorBadRequest( + "Specify one of: `attribute`, `url`, `url_content`, `type`.", + )); }; let mut response = HttpResponse::Ok(); diff --git a/src/database/constants.rs b/src/database/constants.rs index 08cd6d7..ff51580 100644 --- a/src/database/constants.rs +++ b/src/database/constants.rs @@ -22,4 +22,8 @@ lazy_static! { value: "HIER_ROOT".into(), }; pub static ref HIER_ROOT_ADDR: Address = HIER_ROOT_INVARIANT.entity().unwrap(); + pub static ref TYPE_HASH_ADDRESS: Address = Address::Hash(crate::util::hash::Hash(vec![])); + pub static ref TYPE_UUID_ADDRESS: Address = Address::Uuid(uuid::Uuid::nil()); + pub static ref TYPE_ATTRIBUTE_ADDRESS: Address = Address::Attribute("".to_string()); + pub static ref TYPE_URL_ADDRESS: Address = Address::Url(url::Url::parse("up:").unwrap()); } diff --git a/src/database/stores/fs/mod.rs b/src/database/stores/fs/mod.rs index 456fb32..a42893f 100644 --- a/src/database/stores/fs/mod.rs +++ b/src/database/stores/fs/mod.rs @@ -2,7 +2,9 @@ use self::db::files; use super::{Blob, StoreError, UpStore, UpdatePathOutcome}; use crate::addressing::Address; -use crate::database::constants::{ADDED_ATTR, ATTR_BY_ATTR, IS_OF_ATTR, LABEL_ATTR}; +use crate::database::constants::{ + ADDED_ATTR, ATTR_BY_ATTR, IS_OF_ATTR, LABEL_ATTR, TYPE_HASH_ADDRESS, +}; use crate::database::entry::Entry; use crate::database::hierarchies::{ resolve_path, resolve_path_cached, ResolveCache, UHierPath, UNode, @@ -103,6 +105,21 @@ impl FsStore { let db = db.borrow(); let upconnection = db.connection()?; + // Initialize types, etc... + debug!("Initializing DB types."); + upend_insert_addr!( + upconnection, + Address::Attribute(FILE_SIZE_KEY.to_string()), + IS_OF_ATTR, + TYPE_HASH_ADDRESS + )?; + upend_insert_addr!( + upconnection, + Address::Attribute(FILE_MIME_KEY.to_string()), + IS_OF_ATTR, + TYPE_HASH_ADDRESS + )?; + // Walk through the vault, find all paths debug!("Traversing vault directory"); let absolute_dir_path = fs::canonicalize(&*self.path)?;