From 6c83d00c2c02692363ecbcdb08684400f04769a8 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Tue, 15 Apr 2025 20:33:13 +0200 Subject: [PATCH 1/6] have unique uid's, fixes error in some clients (e.g. sogo) --- src/model/event.rs | 6 +++++- src/model/trip.rs | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/model/event.rs b/src/model/event.rs index 5a640d4..c01c6c9 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -427,7 +427,10 @@ WHERE trip_details.id=? } pub(crate) async fn get_vevent(self, db: &SqlitePool) -> ics::Event { - let mut vevent = ics::Event::new(format!("{}@rudernlinz.at", self.id), "19900101T180000"); + let mut vevent = ics::Event::new( + format!("event-{}@rudernlinz.at", self.id), + "19900101T180000", + ); vevent.push(DtStart::new(format!( "{}T{}00", self.day.replace('-', ""), @@ -451,6 +454,7 @@ WHERE trip_details.id=? name.push_str(&format!("• {} ", triptype.name)) } vevent.push(Summary::new(name)); + println!("{:?}", vevent); vevent } diff --git a/src/model/trip.rs b/src/model/trip.rs index dd817a4..c7043c8 100644 --- a/src/model/trip.rs +++ b/src/model/trip.rs @@ -138,7 +138,8 @@ WHERE trip_details.id=? } pub(crate) async fn get_vevent(self, user: &User) -> ics::Event { - let mut vevent = ics::Event::new(format!("{}@rudernlinz.at", self.id), "19900101T180000"); + let mut vevent = + ics::Event::new(format!("trip-{}@rudernlinz.at", self.id), "19900101T180000"); vevent.push(DtStart::new(format!( "{}T{}00", self.day.replace('-', ""), From 9fcd5a1a8fe2341352cbd2f016d24eb7c17fa6a7 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Tue, 15 Apr 2025 20:52:06 +0200 Subject: [PATCH 2/6] also show cox_helps_at_event in cal --- src/model/event.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/model/event.rs b/src/model/event.rs index c01c6c9..381f3d8 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -191,7 +191,8 @@ INNER JOIN trip_details ON planned_event.trip_details_id = trip_details.id", let mut ret = Vec::new(); let events = Self::all(db).await; for event in events { - if event.is_rower_registered(db, user).await { + if event.is_rower_registered(db, user).await || event.is_cox_registered(db, user).await + { ret.push(event); } } @@ -215,6 +216,21 @@ INNER JOIN trip_details ON planned_event.trip_details_id = trip_details.id", is_rower.amount > 0 } + pub async fn is_cox_registered(&self, db: &SqlitePool, user: &User) -> bool { + let is_rower = sqlx::query!( + "SELECT count(*) as amount + FROM trip + WHERE planned_event_id = ? + AND cox_id = ?", + self.id, + user.id + ) + .fetch_one(db) + .await + .unwrap(); //Okay, bc planned_event can only be created with proper DB backing + is_rower.amount > 0 + } + pub async fn find_by_trip_details(db: &SqlitePool, tripdetails_id: i64) -> Option { sqlx::query_as!( Self, @@ -454,7 +470,6 @@ WHERE trip_details.id=? name.push_str(&format!("• {} ", triptype.name)) } vevent.push(Summary::new(name)); - println!("{:?}", vevent); vevent } From f42bf5ea3a08b23ef457f5a3307712ec808e191d Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Tue, 15 Apr 2025 22:11:29 +0200 Subject: [PATCH 3/6] fix ci --- src/model/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/event.rs b/src/model/event.rs index 381f3d8..9d102d3 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -534,6 +534,6 @@ mod test { let today = Local::now().date_naive().format("%Y%m%d").to_string(); let actual = Event::get_ics_feed(&pool).await; - assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:1@rudernlinz.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual); + assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:event-1@rudernlinz.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual); } } From eb9dd3f8649ff5a03ada07aece19d8bc7ae74505 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Tue, 15 Apr 2025 23:12:30 +0200 Subject: [PATCH 4/6] make default duration 3 hrs (to have a larger block in the cal) --- src/model/event.rs | 18 ++++++++++++++++-- src/model/trip.rs | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/model/event.rs b/src/model/event.rs index 9d102d3..62dfcf8 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -1,8 +1,8 @@ use std::io::Write; -use chrono::NaiveDate; +use chrono::{Duration, NaiveDate, NaiveTime}; use ics::{ - properties::{DtStart, Summary}, + properties::{DtEnd, DtStart, Summary}, ICalendar, }; use serde::Serialize; @@ -452,6 +452,20 @@ WHERE trip_details.id=? self.day.replace('-', ""), self.planned_starting_time.replace(':', "") ))); + + let original_time = NaiveTime::parse_from_str(&self.planned_starting_time, "%H:%M") + .expect("Failed to parse time"); + let later_time = original_time + Duration::hours(3); + if later_time > original_time { + // Check if no day-overflow + let time_three_hours_later = later_time.format("%H%M").to_string(); + vevent.push(DtEnd::new(format!( + "{}T{}00", + self.day.replace('-', ""), + time_three_hours_later + ))); + } + let tripdetails = self.trip_details(db).await; let mut name = String::new(); if self.is_cancelled() { diff --git a/src/model/trip.rs b/src/model/trip.rs index c7043c8..eb5f82f 100644 --- a/src/model/trip.rs +++ b/src/model/trip.rs @@ -1,5 +1,5 @@ -use chrono::{Local, NaiveDate}; -use ics::properties::{DtStart, Summary}; +use chrono::{Duration, Local, NaiveDate, NaiveTime}; +use ics::properties::{DtEnd, DtStart, Summary}; use serde::Serialize; use sqlx::SqlitePool; @@ -145,6 +145,20 @@ WHERE trip_details.id=? self.day.replace('-', ""), self.planned_starting_time.replace(':', "") ))); + + let original_time = NaiveTime::parse_from_str(&self.planned_starting_time, "%H:%M") + .expect("Failed to parse time"); + let later_time = original_time + Duration::hours(3); + if later_time > original_time { + // Check if no day-overflow + let time_three_hours_later = later_time.format("%H%M").to_string(); + vevent.push(DtEnd::new(format!( + "{}T{}00", + self.day.replace('-', ""), + time_three_hours_later + ))); + } + let mut name = String::new(); if self.is_cancelled() { name.push_str("ABGESAGT"); From 654674ce537b66e8bf234388c5783cce88032b81 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Tue, 15 Apr 2025 23:17:22 +0200 Subject: [PATCH 5/6] fix tests --- src/model/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/event.rs b/src/model/event.rs index 1d307f9..71a2c3c 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -543,6 +543,6 @@ mod test { let today = Local::now().date_naive().format("%Y%m%d").to_string(); let actual = Event::get_ics_feed(&pool).await; - assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:event-1@ruad.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual); + assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:event-1@ruad.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nDTEND:{today}T130000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual); } } From 5da4b592ea4e7bd57ae02925919b6c19c833fdd9 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Tue, 15 Apr 2025 23:17:57 +0200 Subject: [PATCH 6/6] fix tests --- src/model/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/event.rs b/src/model/event.rs index 62dfcf8..fe63998 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -548,6 +548,6 @@ mod test { let today = Local::now().date_naive().format("%Y%m%d").to_string(); let actual = Event::get_ics_feed(&pool).await; - assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:event-1@rudernlinz.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual); + assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:event-1@rudernlinz.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nDTEND:{today}T130000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual); } }