use crate::Error;
use crate::api::ApiVersion;
use crate::client::UnifiedClient;
use log::debug;
pub use auth::{CaptchaInfo, LoginResponse, TokenInfo, V3LoginResponse, V4LoginResponse};
pub use dav::{DavAccount, DavListResponse};
pub use file::{
DeleteFailure, DeleteResult, DeleteTarget, FileInfo, FileItem, FileList, FileListAll,
ItemFailure, SearchHit, TransferResult,
};
pub use share::{ShareItem, ShareUpdateProps};
pub use site::SiteConfigValue;
pub use user::{StorageQuota, UserInfo};
pub mod auth;
pub mod dav;
pub mod download;
pub mod file;
pub mod share;
pub mod site;
pub mod user;
pub struct CloudreveAPI {
inner: UnifiedClient,
base_url: String,
v4_session_id: Option<String>,
}
impl CloudreveAPI {
pub async fn new(base_url: &str) -> Result<Self, Error> {
let base_url = base_url.trim_end_matches('/').to_string();
debug!("Creating CloudreveAPI for {}", base_url);
let inner = UnifiedClient::new(&base_url).await?;
debug!("API version detected: {:?}", inner.api_version());
Ok(Self {
inner,
base_url,
v4_session_id: None,
})
}
pub fn with_version(base_url: &str, version: ApiVersion) -> Result<Self, Error> {
let base_url = base_url.trim_end_matches('/').to_string();
debug!(
"Creating CloudreveAPI for {} with version {:?}",
base_url, version
);
let inner = match version {
ApiVersion::V3 => UnifiedClient::V3(crate::api::v3::ApiV3Client::new(&base_url)),
ApiVersion::V4 => UnifiedClient::V4(crate::api::v4::ApiV4Client::new(&base_url)),
};
Ok(Self {
inner,
base_url,
v4_session_id: None,
})
}
pub fn api_version(&self) -> ApiVersion {
self.inner.api_version()
}
pub fn base_url(&self) -> &str {
&self.base_url
}
pub fn inner(&self) -> &UnifiedClient {
&self.inner
}
pub fn inner_mut(&mut self) -> &mut UnifiedClient {
&mut self.inner
}
pub async fn get_server_version(&self) -> Result<String, Error> {
match &self.inner {
UnifiedClient::V3(client) => client.ping().await,
UnifiedClient::V4(client) => client.ping().await,
}
}
pub async fn upload_file(
&self,
path: &str,
content: Vec<u8>,
policy_id: Option<&str>,
overwrite: bool,
last_modified_ms: Option<u64>,
) -> Result<(), Error> {
self.inner
.upload_file(path, content, policy_id, overwrite, last_modified_ms)
.await
}
}
impl Clone for CloudreveAPI {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
base_url: self.base_url.clone(),
v4_session_id: self.v4_session_id.clone(),
}
}
}