|
| 1 | +mod types; |
| 2 | + |
| 3 | +pub use types::*; |
| 4 | + |
| 5 | +use crate::http::HttpClient; |
| 6 | + |
| 7 | +/// 스토리지 서비스 |
| 8 | +#[derive(Clone)] |
| 9 | +pub struct StorageService { |
| 10 | + client: HttpClient, |
| 11 | +} |
| 12 | + |
| 13 | +impl StorageService { |
| 14 | + pub(crate) fn new(api_key: &str, api_secret: &str) -> Self { |
| 15 | + Self { |
| 16 | + client: HttpClient::new(api_key, api_secret), |
| 17 | + } |
| 18 | + } |
| 19 | + |
| 20 | + /// 파일 업로드 (비동기) |
| 21 | + /// |
| 22 | + /// # Examples |
| 23 | + /// |
| 24 | + /// ```no_run |
| 25 | + /// use solapi::SolapiClient; |
| 26 | + /// use solapi::storage::{UploadFileRequest, FileType}; |
| 27 | + /// |
| 28 | + /// # async fn example() -> Result<(), Box<dyn std::error::Error>> { |
| 29 | + /// let client = SolapiClient::new("api_key", "api_secret"); |
| 30 | + /// let storage = client.storage_service(); |
| 31 | + /// |
| 32 | + /// let request = UploadFileRequest { |
| 33 | + /// file: "base64_encoded_content".to_string(), |
| 34 | + /// name: Some("test.jpg".to_string()), |
| 35 | + /// file_type: Some(FileType::Mms), |
| 36 | + /// link: None, |
| 37 | + /// }; |
| 38 | + /// |
| 39 | + /// let response = storage.upload(request).await?; |
| 40 | + /// println!("File uploaded: {}", response.url); |
| 41 | + /// # Ok(()) |
| 42 | + /// # } |
| 43 | + /// ``` |
| 44 | + pub async fn upload( |
| 45 | + &self, |
| 46 | + request: UploadFileRequest, |
| 47 | + ) -> Result<UploadFileResponse, crate::http::HttpError> { |
| 48 | + self.client.post("/storage/v1/files", &request).await |
| 49 | + } |
| 50 | + |
| 51 | + /// 파일 업로드 (동기) |
| 52 | + /// |
| 53 | + /// 내부적으로 tokio runtime을 생성하여 비동기 upload 메서드를 호출합니다. |
| 54 | + /// |
| 55 | + /// # Examples |
| 56 | + /// |
| 57 | + /// ```no_run |
| 58 | + /// use solapi::SolapiClient; |
| 59 | + /// use solapi::storage::{UploadFileRequest, FileType}; |
| 60 | + /// |
| 61 | + /// let client = SolapiClient::new("api_key", "api_secret"); |
| 62 | + /// let storage = client.storage_service(); |
| 63 | + /// |
| 64 | + /// let request = UploadFileRequest { |
| 65 | + /// file: "base64_encoded_content".to_string(), |
| 66 | + /// name: Some("test.jpg".to_string()), |
| 67 | + /// file_type: Some(FileType::Mms), |
| 68 | + /// link: None, |
| 69 | + /// }; |
| 70 | + /// |
| 71 | + /// let response = storage.upload_blocking(request)?; |
| 72 | + /// println!("File uploaded: {}", response.url); |
| 73 | + /// # Ok::<(), Box<dyn std::error::Error>>(()) |
| 74 | + /// ``` |
| 75 | + pub fn upload_blocking( |
| 76 | + &self, |
| 77 | + request: UploadFileRequest, |
| 78 | + ) -> Result<UploadFileResponse, crate::http::HttpError> { |
| 79 | + tokio::runtime::Runtime::new() |
| 80 | + .map_err(|e| crate::http::HttpError::ValidationError { |
| 81 | + message: format!("Failed to create tokio runtime: {}", e), |
| 82 | + })? |
| 83 | + .block_on(self.upload(request)) |
| 84 | + } |
| 85 | +} |
| 86 | + |
| 87 | +#[cfg(test)] |
| 88 | +mod tests { |
| 89 | + use super::*; |
| 90 | + |
| 91 | + #[test] |
| 92 | + fn should_create_storage_service() { |
| 93 | + let _service = StorageService::new("test_key", "test_secret"); |
| 94 | + } |
| 95 | + |
| 96 | + #[tokio::test] |
| 97 | + async fn should_have_upload_method() { |
| 98 | + let service = StorageService::new("test_key", "test_secret"); |
| 99 | + let request = UploadFileRequest { |
| 100 | + file: "base64string".to_string(), |
| 101 | + name: Some("test.jpg".to_string()), |
| 102 | + file_type: Some(FileType::Mms), |
| 103 | + link: None, |
| 104 | + }; |
| 105 | + |
| 106 | + let _ = service.upload(request).await; |
| 107 | + } |
| 108 | + |
| 109 | + #[test] |
| 110 | + fn should_have_upload_blocking_method() { |
| 111 | + let service = StorageService::new("test_key", "test_secret"); |
| 112 | + let request = UploadFileRequest { |
| 113 | + file: "base64string".to_string(), |
| 114 | + name: Some("test.jpg".to_string()), |
| 115 | + file_type: Some(FileType::Mms), |
| 116 | + link: None, |
| 117 | + }; |
| 118 | + |
| 119 | + let _ = service.upload_blocking(request); |
| 120 | + } |
| 121 | +} |
0 commit comments