mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-13 22:52:22 +00:00
@@ -37,6 +37,7 @@ pub async fn route_get<C: CalendarStore, S: SubscriptionStore>(
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut timezones = HashMap::new();
|
let mut timezones = HashMap::new();
|
||||||
|
let mut vtimezones = HashMap::new();
|
||||||
let objects = cal_store.get_objects(&principal, &calendar_id).await?;
|
let objects = cal_store.get_objects(&principal, &calendar_id).await?;
|
||||||
|
|
||||||
let mut ical_calendar_builder = IcalCalendarBuilder::version("4.0")
|
let mut ical_calendar_builder = IcalCalendarBuilder::version("4.0")
|
||||||
@@ -65,6 +66,7 @@ pub async fn route_get<C: CalendarStore, S: SubscriptionStore>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for object in &objects {
|
for object in &objects {
|
||||||
|
vtimezones.extend(object.get_vtimezones());
|
||||||
match object.get_data() {
|
match object.get_data() {
|
||||||
CalendarObjectComponent::Event(EventObject {
|
CalendarObjectComponent::Event(EventObject {
|
||||||
event,
|
event,
|
||||||
@@ -83,6 +85,10 @@ pub async fn route_get<C: CalendarStore, S: SubscriptionStore>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for vtimezone in vtimezones.into_values() {
|
||||||
|
ical_calendar_builder = ical_calendar_builder.add_tz(vtimezone.to_owned());
|
||||||
|
}
|
||||||
|
|
||||||
let ical_calendar = ical_calendar_builder
|
let ical_calendar = ical_calendar_builder
|
||||||
.build()
|
.build()
|
||||||
.map_err(|parser_error| Error::IcalError(parser_error.into()))?;
|
.map_err(|parser_error| Error::IcalError(parser_error.into()))?;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ use chrono::DateTime;
|
|||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use derive_more::Display;
|
use derive_more::Display;
|
||||||
use ical::generator::{Emitter, IcalCalendar};
|
use ical::generator::{Emitter, IcalCalendar};
|
||||||
|
use ical::parser::ical::component::IcalTimeZone;
|
||||||
use ical::property::Property;
|
use ical::property::Property;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
@@ -71,6 +72,7 @@ pub struct CalendarObject {
|
|||||||
data: CalendarObjectComponent,
|
data: CalendarObjectComponent,
|
||||||
properties: Vec<Property>,
|
properties: Vec<Property>,
|
||||||
ics: String,
|
ics: String,
|
||||||
|
vtimezones: HashMap<String, IcalTimeZone>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CalendarObject {
|
impl CalendarObject {
|
||||||
@@ -102,6 +104,13 @@ impl CalendarObject {
|
|||||||
.map(|timezone| (timezone.get_tzid().to_owned(), (&timezone).try_into().ok()))
|
.map(|timezone| (timezone.get_tzid().to_owned(), (&timezone).try_into().ok()))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
let vtimezones = cal
|
||||||
|
.timezones
|
||||||
|
.clone()
|
||||||
|
.into_iter()
|
||||||
|
.map(|timezone| (timezone.get_tzid().to_owned(), timezone))
|
||||||
|
.collect();
|
||||||
|
|
||||||
let data = if let Some(event) = cal.events.into_iter().next() {
|
let data = if let Some(event) = cal.events.into_iter().next() {
|
||||||
CalendarObjectComponent::Event(EventObject { event, timezones })
|
CalendarObjectComponent::Event(EventObject { event, timezones })
|
||||||
} else if let Some(todo) = cal.todos.into_iter().next() {
|
} else if let Some(todo) = cal.todos.into_iter().next() {
|
||||||
@@ -118,9 +127,14 @@ impl CalendarObject {
|
|||||||
data,
|
data,
|
||||||
properties: cal.properties,
|
properties: cal.properties,
|
||||||
ics,
|
ics,
|
||||||
|
vtimezones,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_vtimezones(&self) -> &HashMap<String, IcalTimeZone> {
|
||||||
|
&self.vtimezones
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_data(&self) -> &CalendarObjectComponent {
|
pub fn get_data(&self) -> &CalendarObjectComponent {
|
||||||
&self.data
|
&self.data
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user