use openlark_core::{
api::{ApiRequest, ApiResponseTrait, ResponseFormat},
config::Config,
http::Transport,
validate_required, SDKResult,
};
use serde::Deserialize;
use crate::common::{
api_endpoints::{CcmDriveExplorerApiOld, DriveApi},
api_utils::*,
};
#[derive(Debug, Clone, Deserialize)]
struct DriveListFilesData {
files: Vec<DriveListFileItem>,
next_page_token: Option<String>,
has_more: bool,
}
#[derive(Debug, Clone, Deserialize)]
struct DriveListFileItem {
token: String,
name: String,
r#type: String,
created_time: Option<String>,
modified_time: Option<String>,
}
impl ApiResponseTrait for DriveListFilesData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
pub mod models;
impl ApiResponseTrait for FolderMetaResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl ApiResponseTrait for CreateFileResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl ApiResponseTrait for CopyFileResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl ApiResponseTrait for GetFolderChildrenResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl ApiResponseTrait for CreateFolderResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl ApiResponseTrait for DeleteFileResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
pub async fn get_root_folder_meta(config: &Config) -> SDKResult<FolderMetaResponse> {
let api_endpoint = CcmDriveExplorerApiOld::RootFolderMeta;
let api_request: ApiRequest<FolderMetaResponse> = ApiRequest::get(&api_endpoint.to_url());
let response = Transport::request(api_request, config, None).await?;
extract_response_data(response, "获取根文件夹元信息")
}
pub async fn get_folder_meta(config: &Config, folder_token: &str) -> SDKResult<FolderMetaResponse> {
validate_required!(folder_token.trim(), "文件夹Token不能为空");
let api_endpoint = CcmDriveExplorerApiOld::FolderMeta(folder_token.to_string());
let api_request: ApiRequest<FolderMetaResponse> = ApiRequest::get(&api_endpoint.to_url());
let response = Transport::request(api_request, config, None).await?;
extract_response_data(response, "获取文件夹元信息")
}
pub async fn create_file(
config: &Config,
folder_token: &str,
params: CreateFileParams,
) -> SDKResult<CreateFileResponse> {
validate_required!(folder_token.trim(), "文件夹Token不能为空");
validate_required!(params.title.trim(), "文件标题不能为空");
validate_required!(params.parent_type.trim(), "文件类型不能为空");
let api_endpoint = CcmDriveExplorerApiOld::File(folder_token.to_string());
let api_request: ApiRequest<CreateFileResponse> =
ApiRequest::post(&api_endpoint.to_url()).body(serialize_params(¶ms, "新建文件")?);
let response = Transport::request(api_request, config, None).await?;
extract_response_data(response, "新建文件")
}
pub async fn copy_file(
config: &Config,
file_token: &str,
params: CopyFileParams,
) -> SDKResult<CopyFileResponse> {
validate_required!(file_token.trim(), "文件Token不能为空");
validate_required!(params.folder_token.trim(), "目标文件夹Token不能为空");
let api_endpoint = CcmDriveExplorerApiOld::FileCopy(file_token.to_string());
let api_request: ApiRequest<CopyFileResponse> =
ApiRequest::post(&api_endpoint.to_url()).body(serialize_params(¶ms, "复制文档")?);
let response = Transport::request(api_request, config, None).await?;
extract_response_data(response, "复制文档")
}
pub async fn delete_doc(config: &Config, doc_token: &str) -> SDKResult<DeleteFileResponse> {
validate_required!(doc_token.trim(), "文档Token不能为空");
let api_endpoint = CcmDriveExplorerApiOld::FileDocs(doc_token.to_string());
let api_request: ApiRequest<DeleteFileResponse> = ApiRequest::delete(&api_endpoint.to_url());
let response = Transport::request(api_request, config, None).await?;
extract_response_data(response, "删除Doc")
}
pub async fn delete_sheet(
config: &Config,
spreadsheet_token: &str,
) -> SDKResult<DeleteFileResponse> {
validate_required!(spreadsheet_token.trim(), "表格Token不能为空");
let api_endpoint = CcmDriveExplorerApiOld::FileSpreadsheets(spreadsheet_token.to_string());
let api_request: ApiRequest<DeleteFileResponse> = ApiRequest::delete(&api_endpoint.to_url());
let response = Transport::request(api_request, config, None).await?;
extract_response_data(response, "删除Sheet")
}
pub async fn get_folder_children(
config: &Config,
folder_token: &str,
params: Option<GetFolderChildrenParams>,
) -> SDKResult<GetFolderChildrenResponse> {
validate_required!(folder_token.trim(), "文件夹Token不能为空");
let mut api_request: ApiRequest<DriveListFilesData> =
ApiRequest::get(&DriveApi::ListFiles.to_url()).query("folder_token", folder_token);
if let Some(params) = params {
api_request = api_request.query_opt("page_size", params.page_size.map(|v| v.to_string()));
api_request = api_request.query_opt("page_token", params.page_token);
if let Some(doc_type) = params.doc_type {
api_request = api_request.query("type", doc_type);
}
}
let response = Transport::request(api_request, config, None).await?;
let data: DriveListFilesData = extract_response_data(response, "获取文件夹子项")?;
let items = data
.files
.into_iter()
.map(|item| {
let doc_type = item.r#type;
let is_folder = doc_type == "folder";
FileItem {
file_token: item.token,
title: item.name,
doc_type,
is_folder,
create_time: item
.created_time
.as_deref()
.unwrap_or("0")
.parse::<i64>()
.unwrap_or(0),
update_time: item
.modified_time
.as_deref()
.unwrap_or("0")
.parse::<i64>()
.unwrap_or(0),
}
})
.collect::<Vec<_>>();
Ok(GetFolderChildrenResponse {
data: Some(FolderChildrenData {
items,
has_more: data.has_more,
page_token: data.next_page_token,
}),
})
}
pub async fn create_folder(
config: &Config,
folder_token: &str,
params: CreateFolderParams,
) -> SDKResult<CreateFolderResponse> {
validate_required!(folder_token.trim(), "父文件夹Token不能为空");
validate_required!(params.title.trim(), "文件夹标题不能为空");
let api_endpoint = CcmDriveExplorerApiOld::Folder(folder_token.to_string());
let api_request: ApiRequest<CreateFolderResponse> =
ApiRequest::post(&api_endpoint.to_url()).body(serialize_params(¶ms, "新建文件夹")?);
let response = Transport::request(api_request, config, None).await?;
extract_response_data(response, "新建文件夹")
}
pub use models::{
CopyFileParams, CopyFileResponse, CopyResult, CreateFileParams, CreateFileResponse,
CreateFolderParams, CreateFolderResponse, DeleteFileResponse, DeleteResult, FileInfo, FileItem,
FolderChildrenData, FolderMeta, FolderMetaResponse, GetFolderChildrenParams,
GetFolderChildrenResponse, NewFolderInfo, UserInfo,
};