From 85779086bb995abf20a050ba29ad1eb2ed382224 Mon Sep 17 00:00:00 2001 From: Mariano Riefolo Date: Mon, 2 Sep 2024 11:29:22 +0200 Subject: [PATCH] feat(api): add api endpoint to retrieve teachers for a given class --- src/api/mod.rs | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/api/mod.rs b/src/api/mod.rs index 7a5971d..f72d633 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -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) -> impl Int ) } +#[derive(Deserialize)] +pub struct FilterByClassQuery { + id: u8, + classe: String, +} + +pub async fn get_teachers(Query(params): Query) -> 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> = 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();