From 97367cb105d252a7aab949f34498209a56f6ad62 Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Tue, 16 Jul 2024 22:44:45 +0200 Subject: [PATCH] feat: allow json export --- src/endpoints/export/get_availability.rs | 2 +- src/endpoints/export/get_availability_data.rs | 23 ++++++++++++------- ...availabilityxml.html => availability.html} | 12 ++++++++++ 3 files changed, 28 insertions(+), 9 deletions(-) rename templates/export/{availabilityxml.html => availability.html} (78%) diff --git a/src/endpoints/export/get_availability.rs b/src/endpoints/export/get_availability.rs index 6b4207f8..89ed014a 100644 --- a/src/endpoints/export/get_availability.rs +++ b/src/endpoints/export/get_availability.rs @@ -6,7 +6,7 @@ use sqlx::PgPool; use crate::models::{Area, User, Role}; #[derive(Template)] -#[template(path = "export/availabilityxml.html")] +#[template(path = "export/availability.html")] struct AvailabilityExportTemplate { user: User, areas: Option> diff --git a/src/endpoints/export/get_availability_data.rs b/src/endpoints/export/get_availability_data.rs index 0f65af4d..bfa3aaa7 100644 --- a/src/endpoints/export/get_availability_data.rs +++ b/src/endpoints/export/get_availability_data.rs @@ -11,18 +11,19 @@ struct ExportQuery { year: u16, month: u8, area_id: Option, + format: String } #[derive(Serialize)] -struct ExportXml { +struct Export { year: u16, month: u8, area: String, - availabillities: Vec, + availabillities: Vec, } #[derive(Serialize)] -struct ExportAvailabillityXml { +struct ExportAvailabillity { name: String, area: String, function: Function, @@ -68,7 +69,7 @@ pub async fn get( let export_availabillities = availabillities .into_iter() - .map(|a| ExportAvailabillityXml { + .map(|a| ExportAvailabillity { name: a.user.as_ref().unwrap().name.clone(), area: a.user.as_ref().unwrap().area.as_ref().unwrap().name.clone(), function: a.user.unwrap().function, @@ -84,18 +85,24 @@ pub async fn get( }) .collect(); - let out = ExportXml { + let export = Export { year: query.year, month: query.month, area: area_id.to_string(), availabillities: export_availabillities, }; - if let Ok(xml) = quick_xml::se::to_string(&out) { + let out = match query.format.as_str() { + "xml" => quick_xml::se::to_string(&export).unwrap_or(String::new()), + "json" => serde_json::to_string(&export).unwrap_or(String::new()), + _ => return HttpResponse::BadRequest().finish() + }; + + if !out.is_empty() { return HttpResponse::Ok() .content_type(ContentType::xml()) - .insert_header((CONTENT_DISPOSITION, ContentDisposition::attachment("export.xml"))) - .body(xml); + .insert_header((CONTENT_DISPOSITION, ContentDisposition::attachment(format!("export.{}", query.format)))) + .body(out); } HttpResponse::BadRequest().finish() diff --git a/templates/export/availabilityxml.html b/templates/export/availability.html similarity index 78% rename from templates/export/availabilityxml.html rename to templates/export/availability.html index 3494a2b7..0d9c6223 100644 --- a/templates/export/availabilityxml.html +++ b/templates/export/availability.html @@ -21,6 +21,18 @@ +
+ +
+
+ +
+
+
+ {% if user.role == Role::Admin %}