use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
api_resp::{ApiResponseTrait, BaseResponse, BinaryResponse, ResponseFormat},
config::Config,
constants::AccessTokenType,
http::Transport,
req_option::RequestOption,
SDKResult,
},
impl_executable_builder_owned,
};
pub struct MediaService {
config: Config,
}
impl MediaService {
pub fn new(config: Config) -> Self {
Self { config }
}
pub async fn upload_all(
&self,
request: UploadMediaRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<UploadMediaRespData>> {
let mut api_req = request.api_req;
api_req.http_method = Method::POST;
api_req.api_path = "/open-apis/drive/v1/medias/upload_all".to_string();
api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn upload_prepare(
&self,
request: UploadPrepareRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<UploadPrepareRespData>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: "/open-apis/drive/v1/medias/upload_prepare".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 upload_part(
&self,
request: UploadPartRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<UploadPartRespData>> {
let mut api_req = request.api_req;
api_req.http_method = Method::POST;
api_req.api_path = "/open-apis/drive/v1/medias/upload_part".to_string();
api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn upload_finish(
&self,
request: UploadFinishRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<UploadFinishRespData>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: "/open-apis/drive/v1/medias/upload_finish".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 download(
&self,
request: DownloadMediaRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<BinaryResponse>> {
let api_req = ApiRequest {
http_method: Method::GET,
api_path: format!("/open-apis/drive/v1/medias/{}/download", request.file_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 batch_get_tmp_download_url(
&self,
request: BatchGetTmpDownloadUrlRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<BatchGetTmpDownloadUrlRespData>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: "/open-apis/drive/v1/medias/batch_get_tmp_download_url".to_string(),
supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
..Default::default()
};
let file_tokens = request.file_tokens.join(",");
api_req
.query_params
.insert("file_tokens".to_string(), file_tokens);
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UploadMediaRequest {
#[serde(skip)]
pub api_req: ApiRequest,
file_name: String,
parent_token: String,
size: i32,
checksum: Option<String>,
}
impl UploadMediaRequest {
pub fn builder() -> UploadMediaRequestBuilder {
UploadMediaRequestBuilder::default()
}
}
#[derive(Default)]
pub struct UploadMediaRequestBuilder {
request: UploadMediaRequest,
}
impl UploadMediaRequestBuilder {
pub fn file_name(mut self, file_name: impl ToString) -> Self {
self.request.file_name = file_name.to_string();
self
}
pub fn parent_token(mut self, parent_token: impl ToString) -> Self {
self.request.parent_token = parent_token.to_string();
self
}
pub fn size(mut self, size: i32) -> Self {
self.request.size = size;
self
}
pub fn checksum(mut self, checksum: impl ToString) -> Self {
self.request.checksum = Some(checksum.to_string());
self
}
pub fn file(mut self, file: Vec<u8>) -> Self {
self.request.api_req.file = file;
self
}
pub fn build(mut self) -> UploadMediaRequest {
self.request.api_req.body = serde_json::to_vec(&self.request).unwrap();
self.request
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadMediaRespData {
pub file_token: String,
}
impl ApiResponseTrait for UploadMediaRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadPrepareRequest {
pub file_name: String,
pub parent_token: String,
pub size: i64,
pub block_size: Option<i32>,
pub checksum: Option<String>,
}
impl UploadPrepareRequest {
pub fn new(file_name: impl Into<String>, parent_token: impl Into<String>, size: i64) -> Self {
Self {
file_name: file_name.into(),
parent_token: parent_token.into(),
size,
block_size: None,
checksum: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadPrepareRespData {
pub upload_id: String,
pub block_size: i32,
pub block_num: i32,
}
impl ApiResponseTrait for UploadPrepareRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UploadPartRequest {
#[serde(skip)]
pub api_req: ApiRequest,
upload_id: String,
seq: i32,
size: i32,
checksum: Option<String>,
}
impl UploadPartRequest {
pub fn builder() -> UploadPartRequestBuilder {
UploadPartRequestBuilder::default()
}
}
#[derive(Default)]
pub struct UploadPartRequestBuilder {
request: UploadPartRequest,
}
impl UploadPartRequestBuilder {
pub fn upload_id(mut self, upload_id: impl ToString) -> Self {
self.request.upload_id = upload_id.to_string();
self
}
pub fn seq(mut self, seq: i32) -> Self {
self.request.seq = seq;
self
}
pub fn size(mut self, size: i32) -> Self {
self.request.size = size;
self
}
pub fn checksum(mut self, checksum: impl ToString) -> Self {
self.request.checksum = Some(checksum.to_string());
self
}
pub fn file_chunk(mut self, chunk: Vec<u8>) -> Self {
self.request.api_req.file = chunk;
self
}
pub fn build(mut self) -> UploadPartRequest {
self.request.api_req.body = serde_json::to_vec(&self.request).unwrap();
self.request
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadPartRespData {
pub etag: String,
}
impl ApiResponseTrait for UploadPartRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadFinishRequest {
pub upload_id: String,
pub block_infos: Vec<BlockInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlockInfo {
pub etag: String,
pub seq: i32,
}
impl UploadFinishRequest {
pub fn new(upload_id: impl Into<String>, block_infos: Vec<BlockInfo>) -> Self {
Self {
upload_id: upload_id.into(),
block_infos,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadFinishRespData {
pub file_token: String,
}
impl ApiResponseTrait for UploadFinishRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DownloadMediaRequest {
pub file_token: String,
}
impl DownloadMediaRequest {
pub fn new(file_token: impl Into<String>) -> Self {
Self {
file_token: file_token.into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchGetTmpDownloadUrlRequest {
pub file_tokens: Vec<String>,
}
impl BatchGetTmpDownloadUrlRequest {
pub fn new(file_tokens: Vec<String>) -> Self {
Self { file_tokens }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchGetTmpDownloadUrlRespData {
pub tmp_download_urls: Vec<TmpDownloadUrl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TmpDownloadUrl {
pub file_token: String,
pub tmp_download_url: String,
}
impl ApiResponseTrait for BatchGetTmpDownloadUrlRespData {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl_executable_builder_owned!(
UploadMediaRequestBuilder,
MediaService,
UploadMediaRequest,
BaseResponse<UploadMediaRespData>,
upload_all
);
impl_executable_builder_owned!(
UploadPartRequestBuilder,
MediaService,
UploadPartRequest,
BaseResponse<UploadPartRespData>,
upload_part
);