よしなに

This commit is contained in:
2024-07-19 14:12:59 +09:00
parent 456464ee0e
commit d9b587c0a5
3 changed files with 47 additions and 46 deletions

View File

@ -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?;

View File

@ -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 {

View File

@ -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(),