ticker-serve: add support for location, url defaults

This commit is contained in:
Astro 2023-05-18 22:28:14 +02:00
parent b1ddc82c40
commit eb732ca125
3 changed files with 61 additions and 5 deletions

View File

@ -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<String>,
pub url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CalendarOptions {
pub url: String,
pub color: String,
pub defaults: Option<CalendarDefaults>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]

View File

@ -32,10 +32,11 @@ where
F: FnOnce(Vec<Event>) -> (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<Event> = 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::<Event>(&*db)
.unwrap();
// .into_iter().collect::<Vec<Event>>();
.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::<Vec<_>>();
let (template, content_type) = f(es);
match template.render() {
Ok(rendered) => {

View File

@ -70,6 +70,7 @@ struct IndexTemplate<'a> {
}
pub async fn index(Extension(app_state): Extension<AppState>) -> 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<AppState>) -> Response {
.order_by(schema::events::dtstart.asc())
.then_order_by(schema::events::dtend.desc())
.load::<Event>(&*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::<Vec<_>>();
let days = group_by_day(config, &es);
let template = IndexTemplate {
days,