use firebase_app_sdk::App;
use api_request_utils_rs::{
Client,
RequestHandler,
RequestDefaults,
RequestBuilder,
ParameterHashMap,
StatusCode,
};
#[derive(serde::Deserialize)]
pub struct Bucket {
pub name : String
}
#[derive(serde::Deserialize)]
pub struct Buckets {
pub buckets : Vec<Bucket>,
#[serde(rename = "nextPageToken")]
pub next_page_token : Option<String>
}
pub struct Storage<'a> {
app : &'a App<'a>,
client : Client
}
impl RequestDefaults<'_> for Storage<'_> {
fn default_post_requestor(&self, endpoint : &str, _: &str) -> RequestBuilder {
self.client.post(Self::join_endpoints(&endpoint))
}
fn default_get_requestor(&self, _: &str, _: ParameterHashMap) -> RequestBuilder { panic!("GET METHOD SHOULD NOT BE USED FOR FIREBASE-Storage struct") }
}
impl RequestHandler<'_> for Storage<'_> {
const BASE_URL: &'static str = "https://firebasestorage.googleapis.com/v1beta";
}
impl<'a> Storage<'a> {
pub fn new(app : &'a App<'a>) -> Self {
let client = Client::new();
Storage { app, client }
}
pub async fn add_firebase(&self) -> std::result::Result<Bucket, StatusCode> {
let endpoint = format!("projects/{}/buckets/{}.appspot.com",self.app.name,self.app.name);
let request : RequestBuilder = self.default_post_requestor("addFirebase",&endpoint);
self.request::<Bucket>(request).await
}
pub async fn remove_firebase(&self) -> std::result::Result<(), StatusCode> {
let endpoint = format!("projects/{}/buckets/{}.appspot.com",self.app.name,self.app.name);
let request : RequestBuilder = self.default_post_requestor("removeFirebase",&endpoint);
self.request(request).await
}
pub async fn list(&self,page_token :&str,page_size : u8) -> std::result::Result<Buckets, StatusCode> {
let endpoint = format!("projects/{}/buckets",self.app.name);
let request : RequestBuilder = self.default_post_requestor("",&endpoint)
.query(
&[
("pageToken",page_token),
("pageSize",&page_size.to_string())
]
);
self.request(request).await
}
pub async fn get(&self,name : &str) -> std::result::Result<Buckets, StatusCode> {
let endpoint = format!("projects/{}/buckets/{}",self.app.name,self.app.name);
let request : RequestBuilder = self.default_post_requestor("",&endpoint)
.query(&[("name",name)]);
self.request(request).await
}
}