1#![warn(missing_docs)]
10pub mod providers;
11
12use serde::{Deserialize, Serialize};
13pub use wae_types::{WaeError, WaeResult};
14
15use url::Url;
16
17pub type StorageResult<T> = WaeResult<T>;
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
22pub enum StorageProviderType {
23 Cos,
25 Oss,
27 Local,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct StorageConfig {
34 pub provider: StorageProviderType,
36 pub secret_id: String,
38 pub secret_key: String,
40 pub bucket: String,
42 pub region: String,
44 pub endpoint: Option<String>,
46 pub cdn_url: Option<String>,
48}
49
50pub trait StorageProvider: Send + Sync {
54 fn get_presigned_put_url(&self, key: &str, config: &StorageConfig) -> StorageResult<Url>;
56
57 fn sign_url(&self, path: &str, config: &StorageConfig) -> StorageResult<Url>;
59}
60
61pub use providers::{cos::CosProvider, local::LocalStorageProvider, oss::OssProvider};
62
63pub struct StorageService;
67
68impl StorageService {
69 pub fn get_provider(provider_type: &StorageProviderType) -> Box<dyn StorageProvider> {
71 match provider_type {
72 StorageProviderType::Cos => Box::new(CosProvider),
73 StorageProviderType::Oss => Box::new(OssProvider),
74 StorageProviderType::Local => Box::new(LocalStorageProvider),
75 }
76 }
77
78 pub fn sign_url(path: &str, config: &StorageConfig) -> StorageResult<Url> {
80 let provider = Self::get_provider(&config.provider);
81 provider.sign_url(path, config)
82 }
83
84 pub fn get_presigned_put_url(key: &str, config: &StorageConfig) -> StorageResult<Url> {
86 let provider = Self::get_provider(&config.provider);
87 provider.get_presigned_put_url(key, config)
88 }
89}