From eb732ca1254f823770c4cdc3198484d1307ae83a Mon Sep 17 00:00:00 2001 From: Astro Date: Thu, 18 May 2023 22:28:14 +0200 Subject: [PATCH] ticker-serve: add support for location, url defaults --- libticker/src/config.rs | 6 ++++++ ticker-serve/src/export.rs | 31 ++++++++++++++++++++++++++++--- ticker-serve/src/index.rs | 29 +++++++++++++++++++++++++++-- 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/libticker/src/config.rs b/libticker/src/config.rs index fdc3c18..57d482b 100644 --- a/libticker/src/config.rs +++ b/libticker/src/config.rs @@ -2,11 +2,17 @@ use std::fs::read_to_string; use std::collections::BTreeMap; use serde::{Serialize, Deserialize}; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct CalendarDefaults { + pub location: Option, + pub url: Option, +} #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct CalendarOptions { pub url: String, pub color: String, + pub defaults: Option, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] diff --git a/ticker-serve/src/export.rs b/ticker-serve/src/export.rs index f8397b0..298a379 100644 --- a/ticker-serve/src/export.rs +++ b/ticker-serve/src/export.rs @@ -32,10 +32,11 @@ where F: FnOnce(Vec) -> (T, &'static str), T: Template, { + let config = &app_state.config; let db = app_state.db.lock().unwrap(); let today = Local::now().date_naive().and_hms_opt(0, 0, 0).unwrap(); let limit = Local::now().date_naive().and_hms_opt(0, 0, 0).unwrap() + - Duration::days(app_state.config.upcoming_days.into()); + Duration::days(config.upcoming_days.into()); let es: Vec = events .filter(schema::events::dtend.ge(&today)) .or_filter(schema::events::dtstart.ge(&today)) @@ -43,8 +44,32 @@ where .order_by(schema::events::dtstart.asc()) .then_order_by(schema::events::dtend.desc()) .load::(&*db) - .unwrap(); - // .into_iter().collect::>(); + .unwrap() + .into_iter() + .map(|mut e| { + if e.location.as_ref().map_or(false, |s| s.is_empty()) { + e.location = None; + } + if e.url.as_ref().map_or(false, |s| s.is_empty()) { + e.url = None; + } + e + }) + .map(|mut e| { + let defaults = config.calendars.get(&e.calendar) + .and_then(|calendar| calendar.defaults.as_ref()); + let defaults = match defaults { + Some(defaults) => defaults, + None => return e, + }; + if e.location.is_none() { + e.location = defaults.location.clone(); + } + if e.url.is_none() { + e.url = defaults.url.clone(); + } + e + }).collect::>(); let (template, content_type) = f(es); match template.render() { Ok(rendered) => { diff --git a/ticker-serve/src/index.rs b/ticker-serve/src/index.rs index 8292411..e95505d 100644 --- a/ticker-serve/src/index.rs +++ b/ticker-serve/src/index.rs @@ -70,6 +70,7 @@ struct IndexTemplate<'a> { } pub async fn index(Extension(app_state): Extension) -> Response { + let config = &app_state.config; let db = app_state.db.lock().unwrap(); let today = Local::now().date_naive().and_hms_opt(0, 0, 0).unwrap(); let limit = Local::now().date_naive().and_hms_opt(0, 0, 0).unwrap() + @@ -84,8 +85,32 @@ pub async fn index(Extension(app_state): Extension) -> Response { .order_by(schema::events::dtstart.asc()) .then_order_by(schema::events::dtend.desc()) .load::(&*db) - .unwrap(); - let config = &app_state.config; + .unwrap() + .into_iter() + .map(|mut e| { + if e.location.as_ref().map_or(false, |s| s.is_empty()) { + e.location = None; + } + if e.url.as_ref().map_or(false, |s| s.is_empty()) { + e.url = None; + } + e + }) + .map(|mut e| { + let defaults = config.calendars.get(&e.calendar) + .and_then(|calendar| calendar.defaults.as_ref()); + let defaults = match defaults { + Some(defaults) => defaults, + None => return e, + }; + if e.location.is_none() { + e.location = defaults.location.clone(); + } + if e.url.is_none() { + e.url = defaults.url.clone(); + } + e + }).collect::>(); let days = group_by_day(config, &es); let template = IndexTemplate { days,