rustical_store/
calendar_store.rs

1use crate::{Calendar, CollectionMetadata, error::Error};
2use async_trait::async_trait;
3use chrono::NaiveDate;
4use rustical_ical::CalendarObject;
5
6#[derive(Default, Debug, Clone, PartialEq, Eq)]
7pub struct CalendarQuery {
8    pub time_start: Option<NaiveDate>,
9    pub time_end: Option<NaiveDate>,
10}
11
12#[async_trait]
13pub trait CalendarStore: Send + Sync + 'static {
14    async fn get_calendar(
15        &self,
16        principal: &str,
17        id: &str,
18        show_deleted: bool,
19    ) -> Result<Calendar, Error>;
20    async fn get_calendars(&self, principal: &str) -> Result<Vec<Calendar>, Error>;
21    async fn get_deleted_calendars(&self, principal: &str) -> Result<Vec<Calendar>, Error>;
22
23    async fn update_calendar(
24        &self,
25        principal: &str,
26        id: &str,
27        calendar: Calendar,
28    ) -> Result<(), Error>;
29    async fn insert_calendar(&self, calendar: Calendar) -> Result<(), Error>;
30    async fn delete_calendar(
31        &self,
32        principal: &str,
33        name: &str,
34        use_trashbin: bool,
35    ) -> Result<(), Error>;
36    async fn restore_calendar(&self, principal: &str, name: &str) -> Result<(), Error>;
37    async fn import_calendar(
38        &self,
39        calendar: Calendar,
40        objects: Vec<CalendarObject>,
41        merge_existing: bool,
42    ) -> Result<(), Error>;
43
44    async fn sync_changes(
45        &self,
46        principal: &str,
47        cal_id: &str,
48        synctoken: i64,
49    ) -> Result<(Vec<(String, CalendarObject)>, Vec<String>, i64), Error>;
50
51    /// Since the <calendar-query> rules are rather complex this function
52    /// is only meant to do some prefiltering
53    async fn calendar_query(
54        &self,
55        principal: &str,
56        cal_id: &str,
57        _query: CalendarQuery,
58    ) -> Result<Vec<(String, CalendarObject)>, Error> {
59        self.get_objects(principal, cal_id).await
60    }
61
62    async fn calendar_metadata(
63        &self,
64        principal: &str,
65        cal_id: &str,
66    ) -> Result<CollectionMetadata, Error>;
67
68    async fn get_objects(
69        &self,
70        principal: &str,
71        cal_id: &str,
72    ) -> Result<Vec<(String, CalendarObject)>, Error>;
73    async fn get_object(
74        &self,
75        principal: &str,
76        cal_id: &str,
77        object_id: &str,
78        show_deleted: bool,
79    ) -> Result<CalendarObject, Error>;
80    async fn put_objects(
81        &self,
82        principal: &str,
83        cal_id: &str,
84        objects: Vec<(String, CalendarObject)>,
85        overwrite: bool,
86    ) -> Result<(), Error>;
87    async fn put_object(
88        &self,
89        principal: &str,
90        cal_id: &str,
91        object_id: &str,
92        object: CalendarObject,
93        overwrite: bool,
94    ) -> Result<(), Error> {
95        self.put_objects(
96            principal,
97            cal_id,
98            vec![(object_id.to_owned(), object)],
99            overwrite,
100        )
101        .await
102    }
103    async fn delete_object(
104        &self,
105        principal: &str,
106        cal_id: &str,
107        object_id: &str,
108        use_trashbin: bool,
109    ) -> Result<(), Error>;
110    async fn restore_object(
111        &self,
112        principal: &str,
113        cal_id: &str,
114        object_id: &str,
115    ) -> Result<(), Error>;
116
117    // read_only refers to objects, metadata may still be updated
118    fn is_read_only(&self, cal_id: &str) -> bool;
119}