firebase_admin_sdk/storage/
mod.rs1pub mod bucket;
23pub mod file;
24
25use crate::core::middleware::AuthMiddleware;
26use bucket::Bucket;
27use reqwest::Client;
28use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
29use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware};
30use thiserror::Error;
31
32const STORAGE_V1_API: &str = "https://storage.googleapis.com/storage/v1";
33
34#[derive(Error, Debug)]
36pub enum StorageError {
37 #[error("HTTP Request failed: {0}")]
39 RequestError(#[from] reqwest::Error),
40 #[error("Middleware error: {0}")]
42 MiddlewareError(#[from] reqwest_middleware::Error),
43 #[error("API error: {0}")]
45 ApiError(String),
46 #[error("Serialization error: {0}")]
48 SerializationError(#[from] serde_json::Error),
49 #[error("Project ID is missing in service account key")]
51 ProjectIdMissing,
52}
53
54#[derive(Clone)]
56pub struct FirebaseStorage {
57 client: ClientWithMiddleware,
58 pub base_url: String,
59 pub project_id: String,
60 middleware: AuthMiddleware,
61}
62
63impl FirebaseStorage {
64 pub fn new(middleware: AuthMiddleware) -> Self {
68 let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3);
69
70 let client = ClientBuilder::new(Client::new())
71 .with(RetryTransientMiddleware::new_with_policy(retry_policy))
72 .with(middleware.clone())
73 .build();
74
75 let project_id = middleware.key.project_id.clone().unwrap_or_default();
76 let base_url = STORAGE_V1_API.to_string();
77
78 Self {
79 client,
80 base_url,
81 project_id,
82 middleware,
83 }
84 }
85
86 #[cfg(test)]
87 pub(crate) fn new_with_client(client: ClientWithMiddleware, base_url: String, middleware: AuthMiddleware) -> Self {
88 let project_id = middleware.key.project_id.clone().unwrap_or_default();
89 Self {
90 client,
91 base_url,
92 project_id,
93 middleware,
94 }
95 }
96
97 pub fn bucket(&self, name: Option<&str>) -> Bucket {
105 let bucket_name = match name {
106 Some(n) => n.to_string(),
107 None => format!("{}.appspot.com", self.project_id),
108 };
109
110 Bucket::new(self.client.clone(), self.base_url.clone(), bucket_name, self.middleware.clone())
111 }
112}
113
114#[cfg(test)]
115mod tests;