use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
config::Config,
constants::AccessTokenType,
http::Transport,
req_option::RequestOption,
SDKResult,
},
impl_executable_builder_owned,
};
pub struct FolderService {
config: Config,
}
impl FolderService {
pub fn new(config: Config) -> Self {
Self { config }
}
pub async fn get_root_folder_meta(
&self,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<GetRootFolderMetaRespData>> {
let api_req = ApiRequest {
http_method: Method::GET,
api_path: "/open-apis/drive/v1/folders/root_folder_meta".to_string(),
supported_access_token_types: vec![AccessTokenType::User],
..Default::default()
};
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn list_files(
&self,
request: ListFilesRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ListFilesRespData>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: format!(
"/open-apis/drive/v1/folders/{}/children",
request.folder_token
),
..Default::default()
};
api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
if let Some(page_token) = request.page_token {
api_req
.query_params
.insert("page_token".to_string(), page_token);
}
if let Some(page_size) = request.page_size {
api_req
.query_params
.insert("page_size".to_string(), page_size.to_string());
}
if let Some(order_by) = request.order_by {
api_req
.query_params
.insert("order_by".to_string(), order_by);
}
if let Some(direction) = request.direction {
api_req
.query_params
.insert("direction".to_string(), direction);
}
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn get_folder_meta(
&self,
request: GetFolderMetaRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<GetFolderMetaRespData>> {
let api_req = ApiRequest {
http_method: Method::GET,
api_path: format!("/open-apis/drive/v1/folders/{}", request.folder_token),
supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
..Default::default()
};
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn create_folder(
&self,
request: CreateFolderRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<CreateFolderRespData>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: "/open-apis/drive/v1/folders".to_string(),
supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
body: serde_json::to_vec(&request)?,
..Default::default()
};
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn move_or_delete_folder(
&self,
request: MoveOrDeleteFolderRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<MoveOrDeleteFolderRespData>> {
let mut api_req = ApiRequest {
http_method: Method::POST,
api_path: format!("/open-apis/drive/v1/folders/{}/move", request.folder_token),
supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
..Default::default()
};
let body = serde_json::json!({
"type": request.operation_type,
"parent_token": request.parent_token
});
api_req.body = serde_json::to_vec(&body)?;
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn check_async_task(
&self,
request: CheckAsyncTaskRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<CheckAsyncTaskRespData>> {
let api_req = ApiRequest {
http_method: Method::GET,
api_path: format!("/open-apis/drive/v1/tasks/{}", request.task_id),
supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
..Default::default()
};
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetRootFolderMetaRespData {
pub token: String,
pub user_id: String,
}
impl ApiResponseTrait for GetRootFolderMetaRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ListFilesRequest {
pub folder_token: String,
pub page_token: Option<String>,
pub page_size: Option<i32>,
pub order_by: Option<String>,
pub direction: Option<String>,
}
impl ListFilesRequest {
pub fn new(folder_token: impl Into<String>) -> Self {
Self {
folder_token: folder_token.into(),
..Default::default()
}
}
pub fn builder() -> ListFilesRequestBuilder {
ListFilesRequestBuilder::default()
}
}
#[derive(Debug, Clone, Default)]
pub struct ListFilesRequestBuilder {
request: ListFilesRequest,
}
impl ListFilesRequestBuilder {
pub fn folder_token(mut self, folder_token: impl Into<String>) -> Self {
self.request.folder_token = folder_token.into();
self
}
pub fn page_token(mut self, page_token: impl Into<String>) -> Self {
self.request.page_token = Some(page_token.into());
self
}
pub fn page_size(mut self, page_size: i32) -> Self {
self.request.page_size = Some(page_size);
self
}
pub fn order_by(mut self, order_by: impl Into<String>) -> Self {
self.request.order_by = Some(order_by.into());
self
}
pub fn direction(mut self, direction: impl Into<String>) -> Self {
self.request.direction = Some(direction.into());
self
}
pub fn build(self) -> ListFilesRequest {
self.request
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListFilesRespData {
pub has_more: bool,
pub page_token: Option<String>,
pub files: Vec<DriveFile>,
}
impl ApiResponseTrait for ListFilesRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriveFile {
pub token: String,
pub name: String,
#[serde(rename = "type")]
pub file_type: String,
pub parent_token: Option<String>,
pub url: Option<String>,
pub short_url: Option<String>,
pub size: Option<i64>,
pub mime_type: Option<String>,
pub created_time: Option<String>,
pub modified_time: Option<String>,
pub owner_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetFolderMetaRequest {
pub folder_token: String,
}
impl GetFolderMetaRequest {
pub fn new(folder_token: impl Into<String>) -> Self {
Self {
folder_token: folder_token.into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetFolderMetaRespData {
pub token: String,
pub id: String,
pub name: String,
pub parent_token: Option<String>,
pub owner_id: String,
pub creator_id: Option<String>,
pub create_time: String,
pub edit_time: String,
pub description: Option<String>,
pub url: String,
}
impl ApiResponseTrait for GetFolderMetaRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateFolderRequest {
pub name: String,
pub parent_token: String,
}
impl CreateFolderRequest {
pub fn new(name: impl Into<String>, parent_token: impl Into<String>) -> Self {
Self {
name: name.into(),
parent_token: parent_token.into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateFolderRespData {
pub token: String,
pub url: String,
}
impl ApiResponseTrait for CreateFolderRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MoveOrDeleteFolderRequest {
pub folder_token: String,
#[serde(rename = "type")]
pub operation_type: String,
pub parent_token: Option<String>,
}
impl MoveOrDeleteFolderRequest {
pub fn move_folder(folder_token: impl Into<String>, parent_token: impl Into<String>) -> Self {
Self {
folder_token: folder_token.into(),
operation_type: "move".to_string(),
parent_token: Some(parent_token.into()),
}
}
pub fn delete_folder(folder_token: impl Into<String>) -> Self {
Self {
folder_token: folder_token.into(),
operation_type: "delete".to_string(),
parent_token: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MoveOrDeleteFolderRespData {
pub task_id: Option<String>,
}
impl ApiResponseTrait for MoveOrDeleteFolderRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckAsyncTaskRequest {
pub task_id: String,
}
impl CheckAsyncTaskRequest {
pub fn new(task_id: impl Into<String>) -> Self {
Self {
task_id: task_id.into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckAsyncTaskRespData {
pub status: String,
pub error_msg: Option<String>,
}
impl ApiResponseTrait for CheckAsyncTaskRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl_executable_builder_owned!(
ListFilesRequestBuilder,
FolderService,
ListFilesRequest,
BaseResponse<ListFilesRespData>,
list_files
);