feat: Reporting

This commit is contained in:
2026-02-09 17:00:22 +01:00
parent 7090595505
commit 7738043a80
2 changed files with 41 additions and 0 deletions

View File

@@ -1,3 +1,5 @@
use serde::Deserialize;
use crate::models::{ApiResponse, SuplError}; use crate::models::{ApiResponse, SuplError};
pub fn fetch_api(provider_url: &str) -> Result<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(), 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()),
})
}
}

View File

@@ -34,21 +34,29 @@ impl JecnaSuplClient {
pub fn get_schedule(&self, class_name: String) -> Result<SuplResult, SuplError> { pub fn get_schedule(&self, class_name: String) -> Result<SuplResult, SuplError> {
let provider = self.provider_url.read().unwrap(); let provider = self.provider_url.read().unwrap();
api::test_api(&provider)?;
schedule::get_schedule_impl(&provider, class_name) schedule::get_schedule_impl(&provider, class_name)
} }
pub fn get_teacher_absence(&self) -> Result<TeacherAbsenceResult, SuplError> { pub fn get_teacher_absence(&self) -> Result<TeacherAbsenceResult, SuplError> {
let provider = self.provider_url.read().unwrap(); let provider = self.provider_url.read().unwrap();
api::test_api(&provider)?;
teacher_absence::get_teacher_absence_impl(&provider) teacher_absence::get_teacher_absence_impl(&provider)
} }
pub fn get_all(&self) -> Result<ApiResponse, SuplError> { pub fn get_all(&self) -> Result<ApiResponse, SuplError> {
let provider = self.provider_url.read().unwrap(); let provider = self.provider_url.read().unwrap();
api::test_api(&provider)?;
all::get_all_impl(&provider) all::get_all_impl(&provider)
} }
pub fn report(&self, content: String, class: String, report_location: ReportLocation) -> Result<(), SuplError> { pub fn report(&self, content: String, class: String, report_location: ReportLocation) -> Result<(), SuplError> {
let provider = self.provider_url.read().unwrap(); let provider = self.provider_url.read().unwrap();
api::test_api(&provider)?;
report_impl(&provider, content, class, report_location) report_impl(&provider, content, class, report_location)
} }
} }