Skip to main content

babelforce_manager_sdk/resources/
calendars.rs

1use crate::error::{map_manager_err, ManagerError};
2use crate::gen::manager::apis::configuration::Configuration;
3use crate::gen::manager::apis::{calendar_api as api, manager_api};
4use crate::gen::manager::models;
5use crate::http::collect_all;
6use crate::retry::{with_retry, RetryPolicy};
7use crate::token::SharedCfg;
8
9/// Calendars — `/api/v2/calendars`.
10pub struct CalendarsResource {
11    pub(crate) cfg: SharedCfg<Configuration>,
12    pub(crate) retry: RetryPolicy,
13}
14
15impl CalendarsResource {
16    /// List all calendars (auto-paginated).
17    pub async fn list_all(&self) -> Result<Vec<models::Calendar>, ManagerError> {
18        let cfg = self.cfg.get().await?;
19        let cfg = cfg.as_ref();
20        collect_all(&self.retry, map_manager_err, |page| async move {
21            let r = api::list_calendars(cfg, Some(page), None).await?;
22            Ok((r.items, r.pagination.pages, r.pagination.current))
23        })
24        .await
25    }
26
27    /// Create a calendar.
28    pub async fn create(
29        &self,
30        body: models::RestCreateCalendar,
31    ) -> Result<models::CalendarItemResponse, ManagerError> {
32        let cfg = self.cfg.get().await?;
33        let cfg = cfg.as_ref();
34        with_retry(&self.retry, false, || {
35            api::create_calendar(cfg, body.clone())
36        })
37        .await
38        .map_err(map_manager_err)
39    }
40
41    /// Get a calendar by id.
42    pub async fn get(&self, id: &str) -> Result<models::CalendarItemResponse, ManagerError> {
43        let cfg = self.cfg.get().await?;
44        let cfg = cfg.as_ref();
45        with_retry(&self.retry, true, || api::get_calendar(cfg, id))
46            .await
47            .map_err(map_manager_err)
48    }
49
50    /// Update a calendar.
51    pub async fn update(
52        &self,
53        id: &str,
54        body: models::RestUpdateCalendar,
55    ) -> Result<models::CalendarItemResponse, ManagerError> {
56        let cfg = self.cfg.get().await?;
57        let cfg = cfg.as_ref();
58        with_retry(&self.retry, false, || {
59            api::update_calendar(cfg, id, body.clone())
60        })
61        .await
62        .map_err(map_manager_err)
63    }
64
65    /// Delete a calendar.
66    pub async fn delete(&self, id: &str) -> Result<(), ManagerError> {
67        let cfg = self.cfg.get().await?;
68        let cfg = cfg.as_ref();
69        with_retry(&self.retry, false, || api::delete_calendar(cfg, id))
70            .await
71            .map_err(map_manager_err)?;
72        Ok(())
73    }
74
75    /// Get the dates configured on a calendar.
76    pub async fn get_dates(
77        &self,
78        id: &str,
79    ) -> Result<models::CalendarDateListResponse, ManagerError> {
80        let cfg = self.cfg.get().await?;
81        let cfg = cfg.as_ref();
82        with_retry(&self.retry, true, || {
83            manager_api::get_calender_dates(cfg, id)
84        })
85        .await
86        .map_err(map_manager_err)
87    }
88
89    /// Add a date to a calendar.
90    pub async fn add_date(
91        &self,
92        id: &str,
93        body: models::CalendarDateBody,
94    ) -> Result<models::CalendarDateItemResponse, ManagerError> {
95        let cfg = self.cfg.get().await?;
96        let cfg = cfg.as_ref();
97        with_retry(&self.retry, false, || {
98            manager_api::add_calendar_date(cfg, id, body.clone())
99        })
100        .await
101        .map_err(map_manager_err)
102    }
103
104    /// Get a single date from a calendar.
105    pub async fn get_date(
106        &self,
107        id: &str,
108        date_id: &str,
109    ) -> Result<models::CalendarDateItemResponse, ManagerError> {
110        let cfg = self.cfg.get().await?;
111        let cfg = cfg.as_ref();
112        with_retry(&self.retry, true, || {
113            api::get_calendar_date(cfg, id, date_id)
114        })
115        .await
116        .map_err(map_manager_err)
117    }
118
119    /// Update a date on a calendar.
120    pub async fn update_date(
121        &self,
122        id: &str,
123        date_id: &str,
124        body: models::CalendarDateBody,
125    ) -> Result<models::CalendarDateItemResponse, ManagerError> {
126        let cfg = self.cfg.get().await?;
127        let cfg = cfg.as_ref();
128        with_retry(&self.retry, false, || {
129            api::update_calendar_date(cfg, id, date_id, body.clone())
130        })
131        .await
132        .map_err(map_manager_err)
133    }
134
135    /// Remove a date from a calendar.
136    pub async fn remove_date(
137        &self,
138        id: &str,
139        date_id: &str,
140    ) -> Result<models::DefaultV2MessageResponse, ManagerError> {
141        let cfg = self.cfg.get().await?;
142        let cfg = cfg.as_ref();
143        with_retry(&self.retry, false, || {
144            api::remove_calendar_date(cfg, id, date_id)
145        })
146        .await
147        .map_err(map_manager_err)
148    }
149
150    /// Test whether a date is a holiday across the account's calendars.
151    pub async fn test_date(
152        &self,
153        date: Option<&str>,
154    ) -> Result<models::GenericItemResponse, ManagerError> {
155        let cfg = self.cfg.get().await?;
156        let cfg = cfg.as_ref();
157        with_retry(&self.retry, true, || api::test_calendar_date(cfg, date))
158            .await
159            .map_err(map_manager_err)
160    }
161
162    /// Bulk-delete calendars by id.
163    pub async fn bulk_delete(
164        &self,
165        ids: Vec<String>,
166    ) -> Result<models::DefaultV2MessageResponse, ManagerError> {
167        let cfg = self.cfg.get().await?;
168        let cfg = cfg.as_ref();
169        let ids = ids
170            .iter()
171            .map(|id| {
172                uuid::Uuid::parse_str(id)
173                    .map_err(|e| ManagerError::InvalidArgument(format!("ids: {e}")))
174            })
175            .collect::<Result<Vec<_>, _>>()?;
176        let body = models::BulkIdsRequest { ids };
177        with_retry(&self.retry, false, || {
178            api::bulk_delete_calendars(cfg, body.clone())
179        })
180        .await
181        .map_err(map_manager_err)
182    }
183
184    /// Bulk-update calendars.
185    pub async fn bulk_update(
186        &self,
187        body: models::CalendarBulkUpdateRequest,
188    ) -> Result<models::CalendarListResponse, ManagerError> {
189        let cfg = self.cfg.get().await?;
190        let cfg = cfg.as_ref();
191        with_retry(&self.retry, false, || {
192            api::bulk_update_calendars(cfg, body.clone())
193        })
194        .await
195        .map_err(map_manager_err)
196    }
197}