ticker-serve: add support for location, url defaults
This commit is contained in:
parent
b1ddc82c40
commit
eb732ca125
|
@ -2,11 +2,17 @@ use std::fs::read_to_string;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use serde::{Serialize, Deserialize};
|
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)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct CalendarOptions {
|
pub struct CalendarOptions {
|
||||||
pub url: String,
|
pub url: String,
|
||||||
pub color: String,
|
pub color: String,
|
||||||
|
pub defaults: Option<CalendarDefaults>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
|
|
@ -32,10 +32,11 @@ where
|
||||||
F: FnOnce(Vec<Event>) -> (T, &'static str),
|
F: FnOnce(Vec<Event>) -> (T, &'static str),
|
||||||
T: Template,
|
T: Template,
|
||||||
{
|
{
|
||||||
|
let config = &app_state.config;
|
||||||
let db = app_state.db.lock().unwrap();
|
let db = app_state.db.lock().unwrap();
|
||||||
let today = Local::now().date_naive().and_hms_opt(0, 0, 0).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() +
|
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
|
let es: Vec<Event> = events
|
||||||
.filter(schema::events::dtend.ge(&today))
|
.filter(schema::events::dtend.ge(&today))
|
||||||
.or_filter(schema::events::dtstart.ge(&today))
|
.or_filter(schema::events::dtstart.ge(&today))
|
||||||
|
@ -43,8 +44,32 @@ where
|
||||||
.order_by(schema::events::dtstart.asc())
|
.order_by(schema::events::dtstart.asc())
|
||||||
.then_order_by(schema::events::dtend.desc())
|
.then_order_by(schema::events::dtend.desc())
|
||||||
.load::<Event>(&*db)
|
.load::<Event>(&*db)
|
||||||
.unwrap();
|
.unwrap()
|
||||||
// .into_iter().collect::<Vec<Event>>();
|
.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);
|
let (template, content_type) = f(es);
|
||||||
match template.render() {
|
match template.render() {
|
||||||
Ok(rendered) => {
|
Ok(rendered) => {
|
||||||
|
|
|
@ -70,6 +70,7 @@ struct IndexTemplate<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn index(Extension(app_state): Extension<AppState>) -> Response {
|
pub async fn index(Extension(app_state): Extension<AppState>) -> Response {
|
||||||
|
let config = &app_state.config;
|
||||||
let db = app_state.db.lock().unwrap();
|
let db = app_state.db.lock().unwrap();
|
||||||
let today = Local::now().date_naive().and_hms_opt(0, 0, 0).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() +
|
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())
|
.order_by(schema::events::dtstart.asc())
|
||||||
.then_order_by(schema::events::dtend.desc())
|
.then_order_by(schema::events::dtend.desc())
|
||||||
.load::<Event>(&*db)
|
.load::<Event>(&*db)
|
||||||
.unwrap();
|
.unwrap()
|
||||||
let config = &app_state.config;
|
.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 days = group_by_day(config, &es);
|
||||||
let template = IndexTemplate {
|
let template = IndexTemplate {
|
||||||
days,
|
days,
|
||||||
|
|
Loading…
Reference in New Issue