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