diff --git a/Cargo.lock b/Cargo.lock index 6f084c8..e879a3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3114,6 +3114,7 @@ dependencies = [ "quick-xml", "rustical_dav", "rustical_dav_push", + "rustical_ical", "rustical_store", "rustical_xml", "serde", @@ -3198,6 +3199,7 @@ dependencies = [ name = "rustical_ical" version = "0.1.0" dependencies = [ + "actix-web", "chrono", "chrono-tz", "derive_more 2.0.1", @@ -3206,6 +3208,8 @@ dependencies = [ "regex", "rrule", "rustical_xml", + "serde", + "sha2", "strum", "strum_macros", "thiserror 2.0.12", diff --git a/Cargo.toml b/Cargo.toml index 7e9ae6c..8e1edf9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,7 +103,7 @@ rustical_carddav = { path = "./crates/carddav/" } rustical_frontend = { path = "./crates/frontend/" } rustical_xml = { path = "./crates/xml/" } rustical_oidc = { path = "./crates/oidc/" } -rustical_ical = { path = "./crates/ical/" } +rustical_ical = { path = "./crates/ical/", features = ["actix"] } chrono-tz = "0.10" chrono-humanize = "0.2" rand = "0.8" diff --git a/crates/caldav/src/calendar/methods/mkcalendar.rs b/crates/caldav/src/calendar/methods/mkcalendar.rs index 7d0a185..d113cc4 100644 --- a/crates/caldav/src/calendar/methods/mkcalendar.rs +++ b/crates/caldav/src/calendar/methods/mkcalendar.rs @@ -2,8 +2,8 @@ use crate::Error; use crate::calendar::prop::SupportedCalendarComponentSet; use actix_web::HttpResponse; use actix_web::web::{Data, Path}; +use rustical_ical::CalendarObjectType; use rustical_store::auth::User; -use rustical_store::calendar::CalendarObjectType; use rustical_store::{Calendar, CalendarStore}; use rustical_xml::{Unparsed, XmlDeserialize, XmlDocument, XmlRootTag}; use tracing::instrument; diff --git a/crates/caldav/src/calendar/methods/report/calendar_multiget.rs b/crates/caldav/src/calendar/methods/report/calendar_multiget.rs index 3540db9..a62334a 100644 --- a/crates/caldav/src/calendar/methods/report/calendar_multiget.rs +++ b/crates/caldav/src/calendar/methods/report/calendar_multiget.rs @@ -11,7 +11,8 @@ use rustical_dav::{ resource::{PrincipalUri, Resource}, xml::{MultistatusElement, PropfindType, multistatus::ResponseElement}, }; -use rustical_store::{CalendarObject, CalendarStore, auth::User}; +use rustical_ical::CalendarObject; +use rustical_store::{CalendarStore, auth::User}; use rustical_xml::XmlDeserialize; #[derive(XmlDeserialize, Clone, Debug, PartialEq)] diff --git a/crates/caldav/src/calendar/methods/report/calendar_query.rs b/crates/caldav/src/calendar/methods/report/calendar_query.rs index 28c6a3e..18802bd 100644 --- a/crates/caldav/src/calendar/methods/report/calendar_query.rs +++ b/crates/caldav/src/calendar/methods/report/calendar_query.rs @@ -2,8 +2,8 @@ use rustical_dav::{ resource::{PrincipalUri, Resource}, xml::{MultistatusElement, PropfindType}, }; -use rustical_ical::UtcDateTime; -use rustical_store::{CalendarObject, CalendarStore, auth::User, calendar_store::CalendarQuery}; +use rustical_ical::{CalendarObject, UtcDateTime}; +use rustical_store::{CalendarStore, auth::User, calendar_store::CalendarQuery}; use rustical_xml::XmlDeserialize; use std::ops::Deref; diff --git a/crates/caldav/src/calendar/prop.rs b/crates/caldav/src/calendar/prop.rs index 0292847..306786e 100644 --- a/crates/caldav/src/calendar/prop.rs +++ b/crates/caldav/src/calendar/prop.rs @@ -1,5 +1,5 @@ use derive_more::derive::{From, Into}; -use rustical_store::calendar::CalendarObjectType; +use rustical_ical::CalendarObjectType; use rustical_xml::{XmlDeserialize, XmlSerialize}; #[derive(Debug, Clone, XmlSerialize, XmlDeserialize, PartialEq, From, Into)] diff --git a/crates/caldav/src/calendar_object/methods.rs b/crates/caldav/src/calendar_object/methods.rs index df09328..c2dfec6 100644 --- a/crates/caldav/src/calendar_object/methods.rs +++ b/crates/caldav/src/calendar_object/methods.rs @@ -4,8 +4,9 @@ use actix_web::HttpResponse; use actix_web::http::header; use actix_web::http::header::HeaderValue; use actix_web::web::{Data, Path}; +use rustical_ical::CalendarObject; +use rustical_store::CalendarStore; use rustical_store::auth::User; -use rustical_store::{CalendarObject, CalendarStore}; use tracing::instrument; use tracing_actix_web::RootSpan; diff --git a/crates/caldav/src/calendar_object/resource.rs b/crates/caldav/src/calendar_object/resource.rs index abf94b3..7bfc9d7 100644 --- a/crates/caldav/src/calendar_object/resource.rs +++ b/crates/caldav/src/calendar_object/resource.rs @@ -9,7 +9,8 @@ use rustical_dav::{ resource::{PrincipalUri, Resource, ResourceService}, xml::Resourcetype, }; -use rustical_store::{CalendarObject, CalendarStore, auth::User}; +use rustical_ical::CalendarObject; +use rustical_store::{CalendarStore, auth::User}; use rustical_xml::{EnumUnitVariants, EnumVariants, XmlDeserialize, XmlSerialize}; use serde::Deserialize; use std::sync::Arc; diff --git a/crates/caldav/src/error.rs b/crates/caldav/src/error.rs index 3b4ffc1..8bce2c6 100644 --- a/crates/caldav/src/error.rs +++ b/crates/caldav/src/error.rs @@ -23,6 +23,9 @@ pub enum Error { #[error(transparent)] XmlDecodeError(#[from] rustical_xml::XmlError), + + #[error(transparent)] + IcalError(#[from] rustical_ical::Error), } impl actix_web::ResponseError for Error { @@ -30,9 +33,7 @@ impl actix_web::ResponseError for Error { match self { Error::StoreError(err) => match err { rustical_store::Error::NotFound => StatusCode::NOT_FOUND, - rustical_store::Error::InvalidData(_) => StatusCode::BAD_REQUEST, rustical_store::Error::AlreadyExists => StatusCode::CONFLICT, - rustical_store::Error::ParserError(_) => StatusCode::BAD_REQUEST, rustical_store::Error::ReadOnly => StatusCode::FORBIDDEN, _ => StatusCode::INTERNAL_SERVER_ERROR, }, @@ -42,12 +43,14 @@ impl actix_web::ResponseError for Error { Error::XmlDecodeError(_) => StatusCode::BAD_REQUEST, Error::NotImplemented => StatusCode::INTERNAL_SERVER_ERROR, Error::NotFound => StatusCode::NOT_FOUND, + Error::IcalError(err) => err.status_code(), } } fn error_response(&self) -> actix_web::HttpResponse { error!("Error: {self}"); match self { Error::DavError(err) => err.error_response(), + Error::IcalError(err) => err.error_response(), _ => HttpResponse::build(self.status_code()).body(self.to_string()), } } diff --git a/crates/carddav/Cargo.toml b/crates/carddav/Cargo.toml index 1a785d2..9afad59 100644 --- a/crates/carddav/Cargo.toml +++ b/crates/carddav/Cargo.toml @@ -26,3 +26,4 @@ chrono = { workspace = true } rustical_xml.workspace = true uuid.workspace = true rustical_dav_push.workspace = true +rustical_ical.workspace = true diff --git a/crates/carddav/src/address_object/methods.rs b/crates/carddav/src/address_object/methods.rs index 6a4cd77..0e48563 100644 --- a/crates/carddav/src/address_object/methods.rs +++ b/crates/carddav/src/address_object/methods.rs @@ -8,8 +8,9 @@ use actix_web::http::header::HeaderValue; use actix_web::web::{Data, Path}; use rustical_dav::privileges::UserPrivilege; use rustical_dav::resource::Resource; +use rustical_ical::AddressObject; +use rustical_store::AddressbookStore; use rustical_store::auth::User; -use rustical_store::{AddressObject, AddressbookStore}; use tracing::instrument; use tracing_actix_web::RootSpan; diff --git a/crates/carddav/src/address_object/resource.rs b/crates/carddav/src/address_object/resource.rs index e364731..b27a882 100644 --- a/crates/carddav/src/address_object/resource.rs +++ b/crates/carddav/src/address_object/resource.rs @@ -8,7 +8,8 @@ use rustical_dav::{ resource::{PrincipalUri, Resource, ResourceService}, xml::Resourcetype, }; -use rustical_store::{AddressObject, AddressbookStore, auth::User}; +use rustical_ical::AddressObject; +use rustical_store::{AddressbookStore, auth::User}; use rustical_xml::{EnumUnitVariants, EnumVariants, XmlDeserialize, XmlSerialize}; use serde::Deserialize; use std::sync::Arc; diff --git a/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs b/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs index c01f2eb..390e279 100644 --- a/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs +++ b/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs @@ -10,7 +10,8 @@ use rustical_dav::{ resource::{PrincipalUri, Resource}, xml::{MultistatusElement, PropfindType, multistatus::ResponseElement}, }; -use rustical_store::{AddressObject, AddressbookStore, auth::User}; +use rustical_ical::AddressObject; +use rustical_store::{AddressbookStore, auth::User}; use rustical_xml::XmlDeserialize; #[derive(XmlDeserialize, Clone, Debug, PartialEq)] diff --git a/crates/carddav/src/error.rs b/crates/carddav/src/error.rs index 3b4ffc1..c60689e 100644 --- a/crates/carddav/src/error.rs +++ b/crates/carddav/src/error.rs @@ -23,6 +23,9 @@ pub enum Error { #[error(transparent)] XmlDecodeError(#[from] rustical_xml::XmlError), + + #[error(transparent)] + IcalError(#[from] rustical_ical::Error), } impl actix_web::ResponseError for Error { @@ -30,9 +33,7 @@ impl actix_web::ResponseError for Error { match self { Error::StoreError(err) => match err { rustical_store::Error::NotFound => StatusCode::NOT_FOUND, - rustical_store::Error::InvalidData(_) => StatusCode::BAD_REQUEST, rustical_store::Error::AlreadyExists => StatusCode::CONFLICT, - rustical_store::Error::ParserError(_) => StatusCode::BAD_REQUEST, rustical_store::Error::ReadOnly => StatusCode::FORBIDDEN, _ => StatusCode::INTERNAL_SERVER_ERROR, }, @@ -42,12 +43,14 @@ impl actix_web::ResponseError for Error { Error::XmlDecodeError(_) => StatusCode::BAD_REQUEST, Error::NotImplemented => StatusCode::INTERNAL_SERVER_ERROR, Error::NotFound => StatusCode::NOT_FOUND, + Self::IcalError(err) => err.status_code(), } } fn error_response(&self) -> actix_web::HttpResponse { error!("Error: {self}"); match self { Error::DavError(err) => err.error_response(), + Error::IcalError(err) => err.error_response(), _ => HttpResponse::build(self.status_code()).body(self.to_string()), } } diff --git a/crates/ical/Cargo.toml b/crates/ical/Cargo.toml index d4215c8..68916cb 100644 --- a/crates/ical/Cargo.toml +++ b/crates/ical/Cargo.toml @@ -5,6 +5,9 @@ edition.workspace = true description.workspace = true repository.workspace = true +[features] +actix = ["dep:actix-web"] + [dependencies] chrono.workspace = true chrono-tz.workspace = true @@ -17,3 +20,6 @@ regex.workspace = true strum.workspace = true strum_macros.workspace = true rrule = "0.14" +serde.workspace = true +sha2.workspace = true +actix-web = { workspace = true, optional = true } diff --git a/crates/store/src/addressbook/address_object.rs b/crates/ical/src/address_object.rs similarity index 97% rename from crates/store/src/addressbook/address_object.rs rename to crates/ical/src/address_object.rs index 851593c..eddf2e5 100644 --- a/crates/store/src/addressbook/address_object.rs +++ b/crates/ical/src/address_object.rs @@ -1,10 +1,10 @@ +use crate::{CalDateTime, LOCAL_DATE}; use crate::{CalendarObject, Error}; use chrono::Datelike; use ical::parser::{ Component, vcard::{self, component::VcardContact}, }; -use rustical_ical::{CalDateTime, LOCAL_DATE}; use sha2::{Digest, Sha256}; use std::{collections::HashMap, io::BufReader}; @@ -18,7 +18,7 @@ pub struct AddressObject { impl AddressObject { pub fn from_vcf(object_id: String, vcf: String) -> Result { let mut parser = vcard::VcardParser::new(BufReader::new(vcf.as_bytes())); - let vcard = parser.next().ok_or(Error::NotFound)??; + let vcard = parser.next().ok_or(Error::MissingContact)??; if parser.next().is_some() { return Err(Error::InvalidData( "multiple vcards, only one allowed".to_owned(), diff --git a/crates/ical/src/error.rs b/crates/ical/src/error.rs new file mode 100644 index 0000000..ebccf18 --- /dev/null +++ b/crates/ical/src/error.rs @@ -0,0 +1,35 @@ +use crate::CalDateTimeError; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("Invalid ics/vcf input: {0}")] + InvalidData(String), + + #[error("Missing calendar")] + MissingCalendar, + + #[error("Missing contact")] + MissingContact, + + #[error(transparent)] + ParserError(#[from] ical::parser::ParserError), + + #[error(transparent)] + CalDateTimeError(#[from] CalDateTimeError), + + #[error(transparent)] + RRuleError(#[from] rrule::RRuleError), +} + +#[cfg(feature = "actix")] +impl actix_web::ResponseError for Error { + fn status_code(&self) -> actix_web::http::StatusCode { + match self { + Self::InvalidData(_) => actix_web::http::StatusCode::BAD_REQUEST, + Self::MissingCalendar | Self::MissingContact => { + actix_web::http::StatusCode::BAD_REQUEST + } + _ => actix_web::http::StatusCode::INTERNAL_SERVER_ERROR, + } + } +} diff --git a/crates/store/src/calendar/event.rs b/crates/ical/src/icalendar/event.rs similarity index 99% rename from crates/store/src/calendar/event.rs rename to crates/ical/src/icalendar/event.rs index a237ae8..e529506 100644 --- a/crates/store/src/calendar/event.rs +++ b/crates/ical/src/icalendar/event.rs @@ -1,4 +1,5 @@ use crate::Error; +use crate::{CalDateTime, ComponentMut, parse_duration}; use chrono::{DateTime, Duration}; use ical::{ generator::IcalEvent, @@ -6,7 +7,6 @@ use ical::{ property::Property, }; use rrule::{RRule, RRuleSet}; -use rustical_ical::{CalDateTime, ComponentMut, parse_duration}; use std::{collections::HashMap, str::FromStr}; #[derive(Debug, Clone)] diff --git a/crates/store/src/calendar/journal.rs b/crates/ical/src/icalendar/journal.rs similarity index 100% rename from crates/store/src/calendar/journal.rs rename to crates/ical/src/icalendar/journal.rs diff --git a/crates/store/src/calendar/mod.rs b/crates/ical/src/icalendar/mod.rs similarity index 77% rename from crates/store/src/calendar/mod.rs rename to crates/ical/src/icalendar/mod.rs index 81c2d9a..484aa2b 100644 --- a/crates/store/src/calendar/mod.rs +++ b/crates/ical/src/icalendar/mod.rs @@ -1,10 +1,8 @@ -mod calendar; mod event; mod journal; mod object; mod todo; -pub use calendar::*; pub use event::*; pub use journal::*; pub use object::*; diff --git a/crates/store/src/calendar/object.rs b/crates/ical/src/icalendar/object.rs similarity index 98% rename from crates/store/src/calendar/object.rs rename to crates/ical/src/icalendar/object.rs index 78f5dfd..f8be8c3 100644 --- a/crates/store/src/calendar/object.rs +++ b/crates/ical/src/icalendar/object.rs @@ -1,10 +1,10 @@ use super::{EventObject, JournalObject, TodoObject}; +use crate::CalDateTime; use crate::Error; use ical::{ generator::{Emitter, IcalCalendar}, parser::{Component, ical::component::IcalTimeZone}, }; -use rustical_ical::CalDateTime; use serde::Serialize; use sha2::{Digest, Sha256}; use std::{collections::HashMap, io::BufReader}; @@ -66,7 +66,7 @@ pub struct CalendarObject { impl CalendarObject { pub fn from_ics(object_id: String, ics: String) -> Result { let mut parser = ical::IcalParser::new(BufReader::new(ics.as_bytes())); - let cal = parser.next().ok_or(Error::NotFound)??; + let cal = parser.next().ok_or(Error::MissingCalendar)??; if parser.next().is_some() { return Err(Error::InvalidData( "multiple calendars, only one allowed".to_owned(), diff --git a/crates/store/src/calendar/todo.rs b/crates/ical/src/icalendar/todo.rs similarity index 100% rename from crates/store/src/calendar/todo.rs rename to crates/ical/src/icalendar/todo.rs diff --git a/crates/ical/src/lib.rs b/crates/ical/src/lib.rs index f75f94d..32d7221 100644 --- a/crates/ical/src/lib.rs +++ b/crates/ical/src/lib.rs @@ -8,3 +8,12 @@ pub use timezone::*; mod duration; pub use duration::parse_duration; + +mod icalendar; +pub use icalendar::*; + +mod error; +pub use error::Error; + +mod address_object; +pub use address_object::AddressObject; diff --git a/crates/store/src/addressbook/addressbook.rs b/crates/store/src/addressbook.rs similarity index 100% rename from crates/store/src/addressbook/addressbook.rs rename to crates/store/src/addressbook.rs diff --git a/crates/store/src/addressbook/mod.rs b/crates/store/src/addressbook/mod.rs deleted file mode 100644 index dcb0549..0000000 --- a/crates/store/src/addressbook/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod address_object; -pub mod addressbook; - -pub use address_object::*; -pub use addressbook::*; diff --git a/crates/store/src/addressbook_store.rs b/crates/store/src/addressbook_store.rs index 54f182c..0d936dd 100644 --- a/crates/store/src/addressbook_store.rs +++ b/crates/store/src/addressbook_store.rs @@ -1,8 +1,6 @@ -use crate::{ - Error, - addressbook::{AddressObject, Addressbook}, -}; +use crate::{Error, addressbook::Addressbook}; use async_trait::async_trait; +use rustical_ical::AddressObject; #[async_trait] pub trait AddressbookStore: Send + Sync + 'static { diff --git a/crates/store/src/auth/user.rs b/crates/store/src/auth/user.rs index 2602da8..2d160fa 100644 --- a/crates/store/src/auth/user.rs +++ b/crates/store/src/auth/user.rs @@ -38,7 +38,7 @@ impl TryFrom<&str> for PrincipalType { "ROOM" => Self::Room, "UNKNOWN" => Self::Unknown, _ => { - return Err(crate::Error::InvalidData( + return Err(crate::Error::InvalidPrincipalType( "Invalid principal type".to_owned(), )); } diff --git a/crates/store/src/calendar/calendar.rs b/crates/store/src/calendar.rs similarity index 94% rename from crates/store/src/calendar/calendar.rs rename to crates/store/src/calendar.rs index 2bba2c2..96645d7 100644 --- a/crates/store/src/calendar/calendar.rs +++ b/crates/store/src/calendar.rs @@ -1,6 +1,6 @@ -use super::CalendarObjectType; use crate::synctoken::format_synctoken; use chrono::NaiveDateTime; +use rustical_ical::CalendarObjectType; use serde::Serialize; #[derive(Debug, Default, Clone, Serialize)] diff --git a/crates/store/src/calendar_store.rs b/crates/store/src/calendar_store.rs index 8200dd1..aabaf07 100644 --- a/crates/store/src/calendar_store.rs +++ b/crates/store/src/calendar_store.rs @@ -1,7 +1,7 @@ -use crate::calendar::{Calendar, CalendarObject}; -use crate::error::Error; +use crate::{Calendar, error::Error}; use async_trait::async_trait; use chrono::NaiveDate; +use rustical_ical::CalendarObject; #[derive(Default, Debug, Clone)] pub struct CalendarQuery { diff --git a/crates/store/src/contact_birthday_store.rs b/crates/store/src/contact_birthday_store.rs index 347f676..7d7d881 100644 --- a/crates/store/src/contact_birthday_store.rs +++ b/crates/store/src/contact_birthday_store.rs @@ -1,12 +1,9 @@ -use std::{collections::HashMap, sync::Arc}; - -use crate::{ - AddressObject, Addressbook, AddressbookStore, Calendar, CalendarObject, CalendarStore, Error, - calendar::CalendarObjectType, -}; +use crate::{Addressbook, AddressbookStore, Calendar, CalendarStore, Error}; use async_trait::async_trait; use derive_more::derive::Constructor; +use rustical_ical::{AddressObject, CalendarObject, CalendarObjectType}; use sha2::{Digest, Sha256}; +use std::{collections::HashMap, sync::Arc}; #[derive(Constructor, Clone)] pub struct ContactBirthdayStore(Arc); @@ -85,7 +82,7 @@ impl CalendarStore for ContactBirthdayStore { ) -> Result<(Vec, Vec, i64), Error> { let (objects, deleted_objects, new_synctoken) = self.0.sync_changes(principal, cal_id, synctoken).await?; - let objects: Result>, Error> = objects + let objects: Result>, rustical_ical::Error> = objects .iter() .map(AddressObject::get_birthday_object) .collect(); @@ -99,13 +96,13 @@ impl CalendarStore for ContactBirthdayStore { principal: &str, cal_id: &str, ) -> Result, Error> { - let objects: Result>, Error> = self - .0 - .get_objects(principal, cal_id) - .await? - .iter() - .map(AddressObject::get_significant_dates) - .collect(); + let objects: Result>, rustical_ical::Error> = + self.0 + .get_objects(principal, cal_id) + .await? + .iter() + .map(AddressObject::get_significant_dates) + .collect(); let objects = objects? .into_iter() .flat_map(HashMap::into_values) diff --git a/crates/store/src/error.rs b/crates/store/src/error.rs index 0721f5f..b338b43 100644 --- a/crates/store/src/error.rs +++ b/crates/store/src/error.rs @@ -1,5 +1,4 @@ use actix_web::{ResponseError, http::StatusCode}; -use rustical_ical::CalDateTimeError; #[derive(Debug, thiserror::Error)] pub enum Error { @@ -9,8 +8,8 @@ pub enum Error { #[error("Resource already exists and overwrite=false")] AlreadyExists, - #[error("Invalid ics/vcf input: {0}")] - InvalidData(String), + #[error("Invalid principal type: {0}")] + InvalidPrincipalType(String), #[error("Read-only")] ReadOnly, @@ -21,17 +20,11 @@ pub enum Error { #[error(transparent)] IO(#[from] std::io::Error), - #[error(transparent)] - ParserError(#[from] ical::parser::ParserError), - #[error(transparent)] Other(#[from] anyhow::Error), #[error(transparent)] - CalDateTimeError(#[from] CalDateTimeError), - - #[error(transparent)] - RRuleError(#[from] rrule::RRuleError), + IcalError(#[from] rustical_ical::Error), } impl ResponseError for Error { @@ -39,8 +32,9 @@ impl ResponseError for Error { match self { Self::NotFound => StatusCode::NOT_FOUND, Self::AlreadyExists => StatusCode::CONFLICT, - Self::InvalidData(_) => StatusCode::BAD_REQUEST, Self::ReadOnly => StatusCode::FORBIDDEN, + Self::IcalError(err) => err.status_code(), + Self::InvalidPrincipalType(_) => StatusCode::BAD_REQUEST, _ => StatusCode::INTERNAL_SERVER_ERROR, } } diff --git a/crates/store/src/lib.rs b/crates/store/src/lib.rs index fa64f0e..9259fcf 100644 --- a/crates/store/src/lib.rs +++ b/crates/store/src/lib.rs @@ -4,7 +4,7 @@ pub mod calendar_store; pub mod error; pub use error::Error; pub mod auth; -pub mod calendar; +mod calendar; mod contact_birthday_store; mod secret; mod subscription_store; @@ -16,8 +16,8 @@ pub use contact_birthday_store::ContactBirthdayStore; pub use secret::Secret; pub use subscription_store::*; -pub use addressbook::{AddressObject, Addressbook}; -pub use calendar::{Calendar, CalendarObject}; +pub use addressbook::Addressbook; +pub use calendar::Calendar; #[derive(Debug, Clone)] pub enum CollectionOperationType { diff --git a/crates/store_sqlite/src/addressbook_store.rs b/crates/store_sqlite/src/addressbook_store.rs index 36729b1..0645420 100644 --- a/crates/store_sqlite/src/addressbook_store.rs +++ b/crates/store_sqlite/src/addressbook_store.rs @@ -1,8 +1,9 @@ use super::ChangeOperation; use async_trait::async_trait; use derive_more::derive::Constructor; +use rustical_ical::AddressObject; use rustical_store::{ - AddressObject, Addressbook, AddressbookStore, CollectionOperation, CollectionOperationDomain, + Addressbook, AddressbookStore, CollectionOperation, CollectionOperationDomain, CollectionOperationType, Error, synctoken::format_synctoken, }; use sqlx::{Acquire, Executor, Sqlite, SqlitePool, Transaction}; diff --git a/crates/store_sqlite/src/calendar_store.rs b/crates/store_sqlite/src/calendar_store.rs index a608b01..04d89a7 100644 --- a/crates/store_sqlite/src/calendar_store.rs +++ b/crates/store_sqlite/src/calendar_store.rs @@ -2,11 +2,10 @@ use super::ChangeOperation; use async_trait::async_trait; use chrono::TimeDelta; use derive_more::derive::Constructor; -use rustical_ical::CalDateTime; -use rustical_store::calendar::CalendarObjectType; +use rustical_ical::{CalDateTime, CalendarObject, CalendarObjectType}; use rustical_store::calendar_store::CalendarQuery; use rustical_store::synctoken::format_synctoken; -use rustical_store::{Calendar, CalendarObject, CalendarStore, Error}; +use rustical_store::{Calendar, CalendarStore, Error}; use rustical_store::{CollectionOperation, CollectionOperationType}; use sqlx::types::chrono::NaiveDateTime; use sqlx::{Acquire, Executor, Sqlite, SqlitePool, Transaction}; @@ -23,7 +22,7 @@ impl TryFrom for CalendarObject { type Error = rustical_store::Error; fn try_from(value: CalendarObjectRow) -> Result { - CalendarObject::from_ics(value.id, value.ics) + Ok(CalendarObject::from_ics(value.id, value.ics)?) } } diff --git a/crates/store_sqlite/src/error.rs b/crates/store_sqlite/src/error.rs index b372696..121bf0c 100644 --- a/crates/store_sqlite/src/error.rs +++ b/crates/store_sqlite/src/error.rs @@ -5,6 +5,9 @@ pub enum Error { #[error(transparent)] StoreError(rustical_store::Error), + + #[error(transparent)] + IcalError(#[from] rustical_ical::Error), } impl From for Error { @@ -27,6 +30,7 @@ impl From for rustical_store::Error { fn from(value: Error) -> Self { match value { Error::SqlxError(err) => Self::Other(err.into()), + Error::IcalError(err) => Self::Other(err.into()), Error::StoreError(err) => err, } }