use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Serialize, Deserialize)]
pub struct ApiResponse<T> {
pub code: i32,
pub msg: String,
pub data: Option<T>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct User {
pub id: String,
pub user_name: String,
pub nickname: String,
#[serde(default)]
pub status: i32,
#[serde(default)]
pub avatar: String,
pub created_at: String,
#[serde(default)]
pub preferred_theme: String,
#[serde(default)]
pub anonymous: bool,
pub group: UserGroup,
#[serde(default)]
pub tags: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct UserGroup {
#[serde(default)]
pub id: i32,
#[serde(default)]
pub name: String,
#[serde(default)]
pub allow_share: bool,
#[serde(default)]
pub allow_remote_download: bool,
#[serde(default)]
pub allow_archive_download: bool,
#[serde(default)]
pub share_download: bool,
#[serde(default)]
pub compress: bool,
#[serde(default)]
pub webdav: bool,
#[serde(default)]
pub source_batch: i32,
#[serde(default)]
pub advance_delete: bool,
#[serde(default)]
pub allow_web_dav_proxy: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Object {
pub id: String,
pub name: String,
pub path: String,
pub thumb: bool,
pub size: i64,
#[serde(rename = "type")]
pub object_type: String,
pub date: String,
pub create_date: String,
pub source_enabled: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct Policy {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(rename = "type")]
#[serde(default)]
pub policy_type: String,
#[serde(default)]
pub max_size: i64,
#[serde(default)]
pub file_type: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Property {
pub created_at: String,
pub updated_at: String,
pub policy: String,
pub size: i64,
pub child_folder_num: i32,
pub child_file_num: i32,
pub path: String,
pub query_date: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DirectoryList {
#[serde(default)]
pub parent: String,
#[serde(default)]
pub objects: Vec<Object>,
#[serde(default)]
pub policy: Policy,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UploadSession {
#[serde(rename = "sessionID")]
pub session_id: String,
#[serde(rename = "chunkSize")]
pub chunk_size: i64,
pub expires: i64,
}
#[derive(Debug, Serialize)]
pub struct UploadFileRequest<'a> {
pub path: &'a str,
pub size: i64,
pub name: &'a str,
pub policy_id: &'a str,
pub last_modified: i64,
pub mime_type: &'a str,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DownloadUrl {
pub url: String,
}
#[derive(Debug, Deserialize)]
pub struct FileSource {
pub url: String,
pub name: String,
pub parent: i64,
}
#[derive(Debug, Serialize, Deserialize, Default)]
#[serde(default)]
pub struct UserSetting {
pub uid: i64,
pub homepage: bool,
pub two_factor: bool,
pub prefer_theme: String,
pub themes: String,
pub authn: Vec<WebAuthnCredential>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
#[serde(default)]
pub struct WebAuthnCredential {
pub id: String,
pub fingerprint: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct StorageInfo {
pub used: i64,
pub free: i64,
pub total: i64,
}
#[derive(Debug, Deserialize, Default)]
pub struct Share {
#[serde(default)]
pub key: String,
#[serde(default)]
pub password: String,
#[serde(default)]
pub is_dir: bool,
#[serde(default)]
pub downloads: i64,
#[serde(default)]
pub remain_downloads: i64,
#[serde(default)]
pub expire: i64,
#[serde(default)]
pub preview: bool,
#[serde(default)]
pub owner_id: String,
#[serde(default)]
pub owner_nick: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Serialize)]
pub struct ShareRequest {
pub id: String,
pub is_dir: bool,
pub password: String,
pub downloads: i32,
pub expire: i32,
pub preview: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SiteConfig {
#[serde(default)]
pub title: String,
#[serde(default)]
pub login_captcha: bool,
#[serde(default)]
pub reg_captcha: bool,
#[serde(default)]
pub forget_captcha: bool,
#[serde(default)]
pub email_active: bool,
#[serde(default)]
pub themes: String,
#[serde(default)]
pub default_theme: String,
#[serde(default)]
pub home_view_method: String,
#[serde(default)]
pub share_view_method: String,
#[serde(default)]
pub authn: bool,
#[serde(default)]
pub user: Option<User>,
#[serde(default)]
pub captcha_recaptcha_key: String,
#[serde(default)]
pub captcha_type: String,
#[serde(default)]
pub tcaptcha_captcha_app_id: String,
#[serde(default)]
pub register_enabled: bool,
#[serde(default)]
pub app_promotion: bool,
#[serde(default)]
pub wopi_exts: Option<Value>,
#[serde(default)]
pub direct_link_batch_size: i64,
}
#[derive(Debug, Serialize)]
pub struct LoginRequest<'a> {
#[serde(rename = "userName")]
pub user_name: &'a str,
#[serde(rename = "Password")]
pub password: &'a str,
#[serde(rename = "captchaCode")]
pub captcha_code: Option<&'a str>,
}
#[derive(Debug, Deserialize)]
pub struct CaptchaResponse {
pub image: String,
pub ticket: String,
}
#[derive(Debug, Serialize)]
pub struct OtpLoginRequest {
pub code: String,
}
#[derive(Debug, Serialize)]
pub struct CreateDirectoryRequest<'a> {
pub path: &'a str,
}
#[derive(Debug, Serialize)]
pub struct CreateFileRequest<'a> {
pub path: &'a str,
}
#[derive(Debug, Serialize)]
pub struct FileSourceRequest {
pub items: Vec<String>,
}
#[derive(Debug, Serialize)]
pub struct RenameObjectRequest<'a> {
pub action: &'a str,
pub src: SourceItems<'a>,
pub new_name: &'a str,
}
#[derive(Debug, Serialize)]
pub struct SourceItems<'a> {
pub dirs: Vec<&'a str>,
pub items: Vec<&'a str>,
}
#[derive(Debug, Serialize)]
pub struct MoveObjectRequest<'a> {
pub action: &'a str,
pub src_dir: &'a str,
pub src: SourceItems<'a>,
pub dst: &'a str,
}
#[derive(Debug, Serialize)]
pub struct CopyObjectRequest<'a> {
pub src_dir: &'a str,
pub src: SourceItems<'a>,
pub dst: &'a str,
}
#[derive(Debug, Serialize)]
pub struct DeleteObjectRequest<'a> {
pub items: Vec<&'a str>,
pub dirs: Vec<&'a str>,
pub force: bool,
pub unlink: bool,
}
pub struct ObjectPropertyRequest<'a> {
pub id: &'a str,
pub is_folder: Option<bool>,
pub trace_root: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct Aria2DownloadInfo {
#[serde(default)]
pub gid: String,
#[serde(default)]
pub status: String,
#[serde(default, rename = "totalLength")]
pub total_length: String,
#[serde(default, rename = "completedLength")]
pub completed_length: String,
#[serde(default, rename = "uploadLength")]
pub upload_length: String,
#[serde(default)]
pub bitfield: String,
#[serde(default, rename = "downloadSpeed")]
pub download_speed: String,
#[serde(default, rename = "uploadSpeed")]
pub upload_speed: String,
#[serde(default, rename = "infoHash")]
pub info_hash: String,
#[serde(default, rename = "numSeeders")]
pub num_seeders: String,
#[serde(default)]
pub seeder: String,
#[serde(default, rename = "pieceLength")]
pub piece_length: String,
#[serde(default, rename = "numPieces")]
pub num_pieces: String,
#[serde(default)]
pub connections: String,
#[serde(default, rename = "errorCode")]
pub error_code: String,
#[serde(default, rename = "errorMessage")]
pub error_message: String,
#[serde(default, rename = "belongsTo")]
pub belongs_to: String,
#[serde(default)]
pub dir: String,
#[serde(default)]
pub files: Vec<Aria2File>,
#[serde(default)]
pub bittorrent: Option<serde_json::Value>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct Aria2FileUri {
#[serde(default)]
pub uri: String,
#[serde(default)]
pub status: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct Aria2File {
#[serde(default)]
pub index: String,
#[serde(default)]
pub path: String,
#[serde(default)]
pub length: String,
#[serde(default, rename = "completedLength")]
pub completed_length: String,
#[serde(default, deserialize_with = "deserialize_loose_bool")]
pub selected: bool,
#[serde(default)]
pub uris: Vec<Aria2FileUri>,
}
fn deserialize_loose_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de::{Error, Unexpected};
let value = Option::<serde_json::Value>::deserialize(deserializer)?;
match value {
None | Some(serde_json::Value::Null) => Ok(false),
Some(serde_json::Value::Bool(b)) => Ok(b),
Some(serde_json::Value::String(s)) => match s.trim().to_ascii_lowercase().as_str() {
"true" | "1" | "yes" => Ok(true),
"false" | "0" | "no" | "" => Ok(false),
other => Err(D::Error::invalid_value(
Unexpected::Str(other),
&"a boolean or boolean-like string",
)),
},
Some(serde_json::Value::Number(n)) => Ok(n.as_i64().map(|x| x != 0).unwrap_or(false)),
Some(other) => Err(D::Error::invalid_type(
Unexpected::Other(&other.to_string()),
&"a boolean",
)),
}
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct Aria2DownloadingTask {
#[serde(default)]
pub update: String,
#[serde(default)]
pub interval: i64,
#[serde(default)]
pub name: String,
#[serde(default)]
pub status: i32,
#[serde(default)]
pub dst: String,
#[serde(default)]
pub total: i64,
#[serde(default)]
pub downloaded: i64,
#[serde(default)]
pub speed: i64,
#[serde(default)]
pub info: Aria2DownloadInfo,
#[serde(default)]
pub node: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct Aria2FinishedTask {
#[serde(default)]
pub name: String,
#[serde(default)]
pub gid: String,
#[serde(default)]
pub status: i32,
#[serde(default)]
pub dst: String,
#[serde(default)]
pub error: String,
#[serde(default)]
pub total: i64,
#[serde(default)]
pub files: Vec<Aria2File>,
#[serde(default)]
pub task_status: i32,
#[serde(default)]
pub task_error: String,
#[serde(default)]
pub create: String,
#[serde(default)]
pub update: String,
#[serde(default)]
pub node: String,
}
#[derive(Debug, Serialize)]
pub struct Aria2CreateRequest<'a> {
pub dst: &'a str,
pub url: Vec<&'a str>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct UserTask {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub status: i32,
#[serde(default, rename = "type")]
pub task_type: i32,
#[serde(default)]
pub create_date: String,
#[serde(default)]
pub progress: i64,
#[serde(default)]
pub error: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct UserTaskList {
#[serde(default)]
pub tasks: Vec<UserTask>,
#[serde(default)]
pub total: i64,
}
#[derive(Debug, Deserialize)]
pub struct WebdavAccount {
#[serde(rename = "ID")]
pub id: i32,
#[serde(rename = "Name")]
pub name: String,
#[serde(rename = "Root")]
pub uri: String,
#[serde(rename = "Password")]
pub password: String,
#[serde(rename = "CreatedAt")]
pub created_at: String,
}