feat(api): add api endpoint to retrieve teachers for a given class

This commit is contained in:
Mariano Riefolo 2024-09-02 11:29:22 +02:00
parent 8a553f2ebf
commit 85779086bb

View File

@ -20,7 +20,8 @@ pub fn get_routes() -> Router {
"/api",
Router::new()
.route("/pdf", get(pdf))
.route("/classi", get(get_classes)),
.route("/classi", get(get_classes))
.route("/professori", get(get_teachers)),
)
}
@ -118,6 +119,49 @@ pub async fn get_classes(Query(params): Query<FilterByTeacherQuery>) -> impl Int
)
}
#[derive(Deserialize)]
pub struct FilterByClassQuery {
id: u8,
classe: String,
}
pub async fn get_teachers(Query(params): Query<FilterByClassQuery>) -> impl IntoResponse {
let filename = download_pdf(params.id).await.unwrap();
let csv_content = fs::read_to_string(&filename).unwrap();
let mut rdr = csv::Reader::from_reader(csv_content.as_bytes());
let header = get_header(rdr.headers().unwrap());
let mut result: HashMap<String, Vec<String>> = HashMap::new();
for record in rdr.records() {
let record = record.unwrap();
for (i, cell) in record.iter().enumerate() {
if cell == params.classe {
for (day, range) in header.weekdays.clone() {
if range.contains(&i) {
let value = result.entry(day).or_insert_with(|| {
let mut v = Vec::new();
v.resize(range.end - range.start, String::new());
v
});
value[i - range.start] = record[header.teacher as usize].to_string();
}
}
}
}
}
if !result.is_empty() {
(StatusCode::OK, Json(json!(result)))
} else {
(
StatusCode::UNPROCESSABLE_ENTITY,
Json(json!({ "errore": "classe non trovata"})),
)
}
}
pub fn get_header(record: &StringRecord) -> Header {
let mut docente: u8 = 0;
let mut weekdays = HashMap::new();