From af239e34bf474d8fde8a29190ca9469432385c31 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Fri, 5 Dec 2025 14:49:09 +0100 Subject: [PATCH] birthday calendar store: Support manual birthday calendar creation --- .../addressbook_store/birthday_calendar.rs | 53 ++++++++++++++----- .../store_sqlite/src/addressbook_store/mod.rs | 3 +- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/crates/store_sqlite/src/addressbook_store/birthday_calendar.rs b/crates/store_sqlite/src/addressbook_store/birthday_calendar.rs index 5043e14..4ca06a5 100644 --- a/crates/store_sqlite/src/addressbook_store/birthday_calendar.rs +++ b/crates/store_sqlite/src/addressbook_store/birthday_calendar.rs @@ -115,11 +115,8 @@ impl SqliteAddressbookStore { .map_err(crate::Error::from).map(|cals| cals.into_iter().map(BirthdayCalendarJoinRow::into).collect())?) } - #[instrument] - pub async fn _insert_birthday_calendar<'e, E: Executor<'e, Database = Sqlite>>( - executor: E, - addressbook: &Addressbook, - ) -> Result<(), rustical_store::Error> { + #[must_use] + pub fn default_birthday_calendar(addressbook: Addressbook) -> Calendar { let birthday_name = addressbook .displayname .as_ref() @@ -130,14 +127,44 @@ impl SqliteAddressbookStore { hasher.update(&addressbook.push_topic); format!("{:x}", hasher.finalize()) }; + Calendar { + principal: addressbook.principal, + meta: CalendarMetadata { + displayname: birthday_name, + order: 0, + description: None, + color: None, + }, + id: format!("{}{}", Self::PREFIX, addressbook.id), + components: vec![CalendarObjectType::Event], + timezone_id: None, + deleted_at: None, + synctoken: Default::default(), + subscription_url: None, + push_topic: birthday_push_topic, + } + } + + #[instrument] + pub async fn _insert_birthday_calendar<'e, E: Executor<'e, Database = Sqlite>>( + executor: E, + calendar: &Calendar, + ) -> Result<(), rustical_store::Error> { + let id = calendar + .id + .strip_prefix(BIRTHDAYS_PREFIX) + .ok_or(Error::NotFound)?; sqlx::query!( - r#"INSERT INTO birthday_calendars (principal, id, displayname, push_topic) - VALUES (?, ?, ?, ?)"#, - addressbook.principal, - addressbook.id, - birthday_name, - birthday_push_topic, + r#"INSERT INTO birthday_calendars (principal, id, displayname, description, "order", color, push_topic) + VALUES (?, ?, ?, ?, ?, ?, ?)"#, + calendar.principal, + id, + calendar.meta.displayname, + calendar.meta.description, + calendar.meta.order, + calendar.meta.color, + calendar.push_topic, ) .execute(executor) .await @@ -256,8 +283,8 @@ impl CalendarStore for SqliteAddressbookStore { } #[instrument] - async fn insert_calendar(&self, _calendar: Calendar) -> Result<(), Error> { - Err(Error::ReadOnly) + async fn insert_calendar(&self, calendar: Calendar) -> Result<(), Error> { + Self::_insert_birthday_calendar(&self.db, &calendar).await } #[instrument] diff --git a/crates/store_sqlite/src/addressbook_store/mod.rs b/crates/store_sqlite/src/addressbook_store/mod.rs index 8d755d6..04e5730 100644 --- a/crates/store_sqlite/src/addressbook_store/mod.rs +++ b/crates/store_sqlite/src/addressbook_store/mod.rs @@ -467,7 +467,8 @@ impl AddressbookStore for SqliteAddressbookStore { .await .map_err(crate::Error::from)?; Self::_insert_addressbook(&mut *tx, &addressbook).await?; - Self::_insert_birthday_calendar(&mut *tx, &addressbook).await?; + let birthday_cal = Self::default_birthday_calendar(addressbook); + Self::_insert_birthday_calendar(&mut *tx, &birthday_cal).await?; tx.commit().await.map_err(crate::Error::from)?; Ok(()) }