use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Deserialize)]
pub struct ApiResponse<T> {
pub code: i32,
pub message: String,
pub data: Option<T>,
}
impl<T> ApiResponse<T> {
pub fn is_success(&self) -> bool {
self.code == 0
}
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SignInRequest {
pub passport: String,
pub password: String,
pub remember: bool,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct SignInData {
pub token: String,
pub expire: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct SignInResponse {
pub code: i32,
pub message: String,
pub data: Option<SignInData>,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FileInfo {
#[serde(alias = "FileId")]
pub file_id: i64,
#[serde(alias = "FileName")]
pub filename: String,
#[serde(rename = "type")]
#[serde(alias = "Type")]
pub file_type: i32, #[serde(alias = "Size")]
pub size: i64,
#[allow(dead_code)]
#[serde(alias = "ParentFileId")]
pub parent_file_id: i64,
#[serde(default, deserialize_with = "deserialize_trashed")]
pub trashed: i32, #[serde(alias = "Etag", default)]
pub etag: Option<String>,
#[serde(alias = "S3KeyFlag", default)]
pub s3_key_flag: Option<String>,
}
impl FileInfo {
pub fn is_folder(&self) -> bool {
self.file_type == 1
}
pub fn is_trashed(&self) -> bool {
self.trashed == 1
}
}
fn deserialize_trashed<'de, D>(deserializer: D) -> std::result::Result<i32, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum Trashed {
Int(i32),
Bool(bool),
}
let v = Option::<Trashed>::deserialize(deserializer)?;
Ok(match v {
Some(Trashed::Int(i)) => {
if i == 0 {
0
} else {
1
}
}
Some(Trashed::Bool(b)) => {
if b {
1
} else {
0
}
}
None => 0,
})
}
impl From<crate::pan123::entity::Model> for FileInfo {
fn from(model: crate::pan123::entity::Model) -> Self {
Self {
file_id: model.file_id,
filename: model.name,
file_type: if model.is_dir { 1 } else { 0 },
size: model.size,
parent_file_id: model.parent_id,
trashed: 0,
etag: model.etag,
s3_key_flag: None,
}
}
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FileListData {
#[serde(alias = "Next", default, deserialize_with = "deserialize_last_file_id")]
pub last_file_id: i64,
#[serde(alias = "InfoList", default)]
pub file_list: Vec<FileInfo>,
}
fn deserialize_last_file_id<'de, D>(deserializer: D) -> std::result::Result<i64, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum NextId {
Int(i64),
String(String),
}
let v = Option::<NextId>::deserialize(deserializer)?;
Ok(match v {
Some(NextId::Int(i)) => i,
Some(NextId::String(s)) => s.parse().unwrap_or(-1),
None => -1,
})
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateDirRequest {
pub name: String,
#[serde(rename = "parentID")]
pub parent_id: i64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateDirData {
#[serde(rename = "dirID")]
pub dir_id: i64,
}
#[derive(Debug, Deserialize, Clone)]
pub struct UploadRequestData {
#[serde(rename = "Key", default)]
pub key: String,
#[serde(rename = "Bucket", default)]
pub bucket: String,
#[serde(rename = "FileId", default)]
pub file_id: i64,
#[serde(rename = "Reuse", default)]
pub reuse: bool,
#[serde(rename = "Info", default)]
pub info: Option<FileInfo>,
#[serde(rename = "UploadId", default)]
pub upload_id: String,
#[serde(rename = "StorageNode", default)]
pub storage_node: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DownloadInfoData {
#[serde(alias = "DownloadUrl")]
pub download_url: String,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TrashRequest {
#[serde(rename = "fileIDs")]
pub file_ids: Vec<i64>,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteRequest {
#[serde(rename = "fileIDs")]
pub file_ids: Vec<i64>,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MoveRequest {
#[serde(rename = "fileIDs")]
pub file_ids: Vec<i64>,
#[serde(rename = "toParentFileID")]
pub to_parent_file_id: i64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SingleUploadData {
#[serde(rename = "fileID")]
pub file_id: i64,
pub completed: bool,
}
#[derive(Debug, Deserialize)]
pub struct S3AuthData {
#[serde(rename = "presignedUrls", default)]
pub presigned_urls: HashMap<String, String>,
}
#[derive(Debug, Deserialize)]
pub struct UploadCompleteV2Data {
#[serde(rename = "file_info")]
pub file_info: FileInfo,
}