use crate::core::middleware::AuthMiddleware;
use reqwest::Client;
use reqwest::StatusCode;
use reqwest_middleware::ClientBuilder;
use reqwest_middleware::ClientWithMiddleware;
use reqwest_retry::policies::ExponentialBackoff;
use reqwest_retry::RetryTransientMiddleware;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("Request error: {0}")]
Reqwest(#[from] reqwest::Error),
#[error("Middleware error: {0}")]
Middleware(#[from] reqwest_middleware::Error),
#[error("API error: {0}")]
Api(StatusCode),
}
const CRASHLYTICS_V1_API: &str =
"https://firebasecrashlytics.googleapis.com/v1alpha/projects/{project_id}";
pub struct FirebaseCrashlytics {
client: ClientWithMiddleware,
base_url: String,
}
impl FirebaseCrashlytics {
pub fn new(middleware: AuthMiddleware) -> Self {
let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3);
let client = ClientBuilder::new(Client::new())
.with(RetryTransientMiddleware::new_with_policy(retry_policy))
.with(middleware.clone())
.build();
let project_id = middleware
.key
.project_id
.clone()
.unwrap_or_default();
let base_url = CRASHLYTICS_V1_API.replace("{project_id}", &project_id);
Self { client, base_url }
}
#[allow(dead_code)]
pub(crate) fn new_with_client(client: ClientWithMiddleware, base_url: String) -> Self {
Self { client, base_url }
}
pub async fn delete_crash_reports(&self, app_id: &str, user_id: &str) -> Result<(), Error> {
let url = format!(
"{}/apps/{}/users/{}/crashReports",
self.base_url, app_id, user_id
);
let response = self.client.delete(&url).send().await?;
if response.status().is_success() {
Ok(())
} else {
Err(Error::Api(response.status()))
}
}
}
#[cfg(test)]
mod tests;