diff --git a/README.md b/README.md index 6c6caae..9fd3983 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ a calendar server ## Todo - [ ] CalDAV - - [x] Support for VEVENT, VTODO + - [x] Support for VEVENT, VTODO, VJOURNAL - [ ] Proper filtering for REPORT method - [x] comp-filter - [x] time-range filter diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index 0975bb3..e062a86 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -143,6 +143,9 @@ impl Resource for CalendarResource { SupportedCalendarComponent { name: "VTODO".to_owned(), }, + SupportedCalendarComponent { + name: "VJOURNAL".to_owned(), + }, ], }) } diff --git a/crates/store/src/model/journal.rs b/crates/store/src/model/journal.rs new file mode 100644 index 0000000..394eae3 --- /dev/null +++ b/crates/store/src/model/journal.rs @@ -0,0 +1,6 @@ +use ical::parser::ical::component::IcalJournal; + +#[derive(Debug, Clone)] +pub struct JournalObject { + pub(crate) journal: IcalJournal, +} diff --git a/crates/store/src/model/mod.rs b/crates/store/src/model/mod.rs index 822227e..4ef96d8 100644 --- a/crates/store/src/model/mod.rs +++ b/crates/store/src/model/mod.rs @@ -1,5 +1,6 @@ pub mod calendar; pub mod event; +pub mod journal; pub mod object; pub mod todo; diff --git a/crates/store/src/model/object.rs b/crates/store/src/model/object.rs index 3ee3484..1e3fb0e 100644 --- a/crates/store/src/model/object.rs +++ b/crates/store/src/model/object.rs @@ -1,4 +1,4 @@ -use super::{event::EventObject, todo::TodoObject}; +use super::{event::EventObject, journal::JournalObject, todo::TodoObject}; use crate::{timestamp::CalDateTime, Error}; use anyhow::Result; use ical::parser::{ical::component::IcalTimeZone, Component}; @@ -18,6 +18,7 @@ pub enum CalendarObjectType { pub enum CalendarObjectComponent { Event(EventObject), Todo(TodoObject), + Journal(JournalObject), } #[derive(Debug, Clone)] @@ -113,6 +114,15 @@ impl CalendarObject { data: CalendarObjectComponent::Todo(TodoObject { todo: todo.clone() }), }); } + if let Some(journal) = cal.journals.first() { + return Ok(CalendarObject { + id: object_id, + ics, + data: CalendarObjectComponent::Journal(JournalObject { + journal: journal.clone(), + }), + }); + } Err(Error::InvalidData( "iCalendar component type not supported :(".to_owned(), @@ -137,6 +147,7 @@ impl CalendarObject { match self.data { CalendarObjectComponent::Todo(_) => "VTODO", CalendarObjectComponent::Event(_) => "VEVENT", + CalendarObjectComponent::Journal(_) => "VJOURNAL", } }