よしなに
This commit is contained in:
@ -1,12 +1,13 @@
|
|||||||
use anyhow::Ok;
|
use anyhow::Ok;
|
||||||
use reqwest::StatusCode;
|
use reqwest::StatusCode;
|
||||||
|
use tokio::sync::RwLock;
|
||||||
|
|
||||||
use crate::types;
|
use crate::types;
|
||||||
|
|
||||||
pub struct Client {
|
pub struct Client {
|
||||||
pub token: String,
|
pub token: RwLock<String>,
|
||||||
pub refresh_token: String,
|
pub refresh_token: String,
|
||||||
pub last_refresh: std::time::Instant,
|
pub last_refresh: RwLock<std::time::Instant>,
|
||||||
pub host_id: String,
|
pub host_id: String,
|
||||||
token_valid_time: u32,
|
token_valid_time: u32,
|
||||||
}
|
}
|
||||||
@ -19,32 +20,32 @@ impl Client {
|
|||||||
let token = refresh_token(refresh_token_req).await.unwrap();
|
let token = refresh_token(refresh_token_req).await.unwrap();
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
refresh_token: token.refresh_token,
|
refresh_token: token.refresh_token,
|
||||||
token: token.id_token,
|
token: RwLock::new(token.id_token),
|
||||||
last_refresh: std::time::Instant::now(),
|
last_refresh: RwLock::new(std::time::Instant::now()),
|
||||||
host_id: token.uid,
|
host_id: token.uid,
|
||||||
token_valid_time: 3600,
|
token_valid_time: 3600,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
pub async fn refresh_token(&mut self) -> anyhow::Result<()> {
|
pub async fn refresh_token(&self) -> anyhow::Result<()> {
|
||||||
let refresh_token_req = types::request::RefreshTokenRequest {
|
let refresh_token_req = types::request::RefreshTokenRequest {
|
||||||
refresh_token: self.refresh_token.clone(),
|
refresh_token: self.refresh_token.clone(),
|
||||||
};
|
};
|
||||||
let token = refresh_token(refresh_token_req).await.unwrap();
|
let token = refresh_token(refresh_token_req).await.unwrap();
|
||||||
self.token = token.id_token;
|
*self.token.write().await = token.id_token;
|
||||||
self.last_refresh = std::time::Instant::now();
|
*self.last_refresh.write().await = std::time::Instant::now();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
pub async fn list_files(
|
pub async fn list_files(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::ListFilesRequest,
|
req: types::request::ListFilesRequest,
|
||||||
) -> anyhow::Result<types::response::ListFilesResponse> {
|
) -> anyhow::Result<types::response::ListFilesResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.post("https://forest.sendy.jp/cloud/service/file/v1/files")
|
.post("https://forest.sendy.jp/cloud/service/file/v1/files")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -57,16 +58,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn check_upload(
|
pub async fn check_upload(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::CheckUploadRequest,
|
req: types::request::CheckUploadRequest,
|
||||||
) -> anyhow::Result<types::response::CheckUploadResponse> {
|
) -> anyhow::Result<types::response::CheckUploadResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.post("https://forest.sendy.jp/cloud/service/file/v1/check/upload")
|
.post("https://forest.sendy.jp/cloud/service/file/v1/check/upload")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -78,8 +79,8 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_upload_token(&mut self) -> anyhow::Result<types::response::GetFileLinkTokenResponse> {
|
pub async fn get_upload_token(&self) -> anyhow::Result<types::response::GetFileLinkTokenResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
@ -88,7 +89,7 @@ impl Client {
|
|||||||
"https://forest.sendy.jp/cloud/service/file/v1/filelink/token?host_id={}&path={}",
|
"https://forest.sendy.jp/cloud/service/file/v1/filelink/token?host_id={}&path={}",
|
||||||
self.host_id, "hello"
|
self.host_id, "hello"
|
||||||
))
|
))
|
||||||
.bearer_auth(&self.token);
|
.bearer_auth(&self.token.read().await);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
let text = response.text().await?;
|
let text = response.text().await?;
|
||||||
@ -100,16 +101,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_download_link(
|
pub async fn get_download_link(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::GetFileLinkRequest,
|
req: types::request::GetFileLinkRequest,
|
||||||
) -> anyhow::Result<types::response::GetFileLinkResponse> {
|
) -> anyhow::Result<types::response::GetFileLinkResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.post("https://forest.sendy.jp/cloud/service/file/v1/filelink/download")
|
.post("https://forest.sendy.jp/cloud/service/file/v1/filelink/download")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -122,16 +123,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn check_action(
|
pub async fn check_action(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::CheckActionRequest,
|
req: types::request::CheckActionRequest,
|
||||||
) -> anyhow::Result<types::response::CheckActionResponse> {
|
) -> anyhow::Result<types::response::CheckActionResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.post("https://forest.sendy.jp/cloud/service/file/v3/files/check")
|
.post("https://forest.sendy.jp/cloud/service/file/v3/files/check")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -144,16 +145,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn file_detail(
|
pub async fn file_detail(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::FileDetailRequest,
|
req: types::request::FileDetailRequest,
|
||||||
) -> anyhow::Result<types::response::FileDetailResponse> {
|
) -> anyhow::Result<types::response::FileDetailResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.post("https://forest.sendy.jp/cloud/service/file/v1/file")
|
.post("https://forest.sendy.jp/cloud/service/file/v1/file")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -166,16 +167,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn delete_file(
|
pub async fn delete_file(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::DeleteFileRequest,
|
req: types::request::DeleteFileRequest,
|
||||||
) -> anyhow::Result<types::response::JobKeyResponse> {
|
) -> anyhow::Result<types::response::JobKeyResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.delete("https://forest.sendy.jp/cloud/service/file/v3/files")
|
.delete("https://forest.sendy.jp/cloud/service/file/v3/files")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -187,14 +188,14 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn mkdir(&mut self, req: types::request::CreateFolderRequest) -> anyhow::Result<()> {
|
pub async fn mkdir(&self, req: types::request::CreateFolderRequest) -> anyhow::Result<()> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.post("https://forest.sendy.jp/cloud/service/file/v1/files/create")
|
.post("https://forest.sendy.jp/cloud/service/file/v1/files/create")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -208,16 +209,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn copy_file(
|
pub async fn copy_file(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::CopyFileRequest,
|
req: types::request::CopyFileRequest,
|
||||||
) -> anyhow::Result<types::response::JobKeyResponse> {
|
) -> anyhow::Result<types::response::JobKeyResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.post("https://forest.sendy.jp/cloud/service/file/v3/files/copy")
|
.post("https://forest.sendy.jp/cloud/service/file/v3/files/copy")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -230,16 +231,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn rename_file(
|
pub async fn rename_file(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::RenameFileRequest,
|
req: types::request::RenameFileRequest,
|
||||||
) -> anyhow::Result<types::response::JobKeyResponse> {
|
) -> anyhow::Result<types::response::JobKeyResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.put("https://forest.sendy.jp/cloud/service/file/v3/files/rename")
|
.put("https://forest.sendy.jp/cloud/service/file/v3/files/rename")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
@ -252,16 +253,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn move_file(
|
pub async fn move_file(
|
||||||
&mut self,
|
&self,
|
||||||
req: types::request::MoveFileRequest,
|
req: types::request::MoveFileRequest,
|
||||||
) -> anyhow::Result<types::response::JobKeyResponse> {
|
) -> anyhow::Result<types::response::JobKeyResponse> {
|
||||||
if self.last_refresh.elapsed().as_secs() > self.token_valid_time.into() {
|
if self.last_refresh.read().await.elapsed().as_secs() > self.token_valid_time.into() {
|
||||||
self.refresh_token().await?;
|
self.refresh_token().await?;
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let request = client
|
let request = client
|
||||||
.put("https://forest.sendy.jp/cloud/service/file/v3/files/move")
|
.put("https://forest.sendy.jp/cloud/service/file/v3/files/move")
|
||||||
.bearer_auth(&self.token)
|
.bearer_auth(&self.token.read().await)
|
||||||
.json(&req);
|
.json(&req);
|
||||||
|
|
||||||
let response = request.send().await?;
|
let response = request.send().await?;
|
||||||
|
@ -17,17 +17,17 @@ impl RakutenDriveClient {
|
|||||||
Ok(Self { client })
|
Ok(Self { client })
|
||||||
}
|
}
|
||||||
pub async fn list(
|
pub async fn list(
|
||||||
&mut self,
|
&self,
|
||||||
prefix: &Option<String>,
|
prefix: &Option<String>,
|
||||||
) -> anyhow::Result<types::response::ListFilesResponse> {
|
) -> anyhow::Result<types::response::ListFilesResponse> {
|
||||||
list_files(
|
list_files(
|
||||||
Some(&prefix.clone().unwrap_or("".to_string())),
|
Some(&prefix.clone().unwrap_or("".to_string())),
|
||||||
&mut self.client,
|
&self.client,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
pub async fn info(
|
pub async fn info(
|
||||||
&mut self,
|
&self,
|
||||||
path: &str,
|
path: &str,
|
||||||
) -> anyhow::Result<types::response::FileDetailResponse> {
|
) -> anyhow::Result<types::response::FileDetailResponse> {
|
||||||
let req = types::request::FileDetailRequest {
|
let req = types::request::FileDetailRequest {
|
||||||
|
@ -188,7 +188,7 @@ pub async fn multipart_upload(
|
|||||||
|
|
||||||
pub async fn file_detail(
|
pub async fn file_detail(
|
||||||
path: &str,
|
path: &str,
|
||||||
client: &mut client::Client,
|
client: &client::Client,
|
||||||
) -> anyhow::Result<types::response::FileDetailResponseFile> {
|
) -> anyhow::Result<types::response::FileDetailResponseFile> {
|
||||||
let req = types::request::FileDetailRequest {
|
let req = types::request::FileDetailRequest {
|
||||||
host_id: client.host_id.clone(),
|
host_id: client.host_id.clone(),
|
||||||
@ -201,7 +201,7 @@ pub async fn file_detail(
|
|||||||
|
|
||||||
pub async fn list_files(
|
pub async fn list_files(
|
||||||
prefix: Option<&str>,
|
prefix: Option<&str>,
|
||||||
client: &mut client::Client,
|
client: &client::Client,
|
||||||
) -> anyhow::Result<types::response::ListFilesResponse> {
|
) -> anyhow::Result<types::response::ListFilesResponse> {
|
||||||
let pagination_size = 40;
|
let pagination_size = 40;
|
||||||
let mut files = Vec::<ListFilesResponseFile>::new();
|
let mut files = Vec::<ListFilesResponseFile>::new();
|
||||||
@ -248,7 +248,7 @@ pub async fn list_files(
|
|||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn check_job(key: &str, client: &mut client::Client) -> anyhow::Result<()> {
|
pub async fn check_job(key: &str, client: &client::Client) -> anyhow::Result<()> {
|
||||||
loop {
|
loop {
|
||||||
let req = types::request::CheckActionRequest {
|
let req = types::request::CheckActionRequest {
|
||||||
key: key.to_string(),
|
key: key.to_string(),
|
||||||
|
Reference in New Issue
Block a user