feat: Reporting
This commit is contained in:
33
src/api.rs
33
src/api.rs
@@ -1,3 +1,5 @@
|
||||
use serde::Deserialize;
|
||||
|
||||
use crate::models::{ApiResponse, SuplError};
|
||||
|
||||
pub fn fetch_api(provider_url: &str) -> Result<ApiResponse, SuplError> {
|
||||
@@ -14,3 +16,34 @@ pub fn fetch_api(provider_url: &str) -> Result<ApiResponse, SuplError> {
|
||||
reason: e.to_string(),
|
||||
})
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct StatusResponse {
|
||||
working: bool,
|
||||
message: Option<String>,
|
||||
}
|
||||
|
||||
pub fn test_api(provider_url: &str) -> Result<(), SuplError> {
|
||||
let trimmed = provider_url.trim_end_matches('/');
|
||||
let url = format!("{}/status", trimmed);
|
||||
|
||||
let status: StatusResponse = minreq::get(&url)
|
||||
.send()
|
||||
.map_err(|e| SuplError::NetworkError {
|
||||
reason: e.to_string(),
|
||||
})?
|
||||
.json()
|
||||
.map_err(|e| SuplError::ParseError {
|
||||
reason: e.to_string(),
|
||||
})?;
|
||||
|
||||
if status.working {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(SuplError::ParseError {
|
||||
reason: status
|
||||
.message
|
||||
.unwrap_or_else(|| "Provider reported not working".to_string()),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,21 +34,29 @@ impl JecnaSuplClient {
|
||||
|
||||
pub fn get_schedule(&self, class_name: String) -> Result<SuplResult, SuplError> {
|
||||
let provider = self.provider_url.read().unwrap();
|
||||
|
||||
api::test_api(&provider)?;
|
||||
schedule::get_schedule_impl(&provider, class_name)
|
||||
}
|
||||
|
||||
pub fn get_teacher_absence(&self) -> Result<TeacherAbsenceResult, SuplError> {
|
||||
let provider = self.provider_url.read().unwrap();
|
||||
|
||||
api::test_api(&provider)?;
|
||||
teacher_absence::get_teacher_absence_impl(&provider)
|
||||
}
|
||||
|
||||
pub fn get_all(&self) -> Result<ApiResponse, SuplError> {
|
||||
let provider = self.provider_url.read().unwrap();
|
||||
|
||||
api::test_api(&provider)?;
|
||||
all::get_all_impl(&provider)
|
||||
}
|
||||
|
||||
pub fn report(&self, content: String, class: String, report_location: ReportLocation) -> Result<(), SuplError> {
|
||||
let provider = self.provider_url.read().unwrap();
|
||||
|
||||
api::test_api(&provider)?;
|
||||
report_impl(&provider, content, class, report_location)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user