Skip to main content

babelforce_manager_sdk/resources/
businesshours.rs

1use crate::error::{map_manager_err, ManagerError};
2use crate::gen::manager::apis::business_hour_api as api;
3use crate::gen::manager::apis::configuration::Configuration;
4use crate::gen::manager::models;
5use crate::http::collect_all;
6use crate::retry::{with_retry, RetryPolicy};
7use crate::token::SharedCfg;
8
9/// Business hours — `/api/v2/business-hours`.
10pub struct BusinessHoursResource {
11    pub(crate) cfg: SharedCfg<Configuration>,
12    pub(crate) retry: RetryPolicy,
13}
14
15impl BusinessHoursResource {
16    /// List all business-hour profiles (auto-paginated).
17    pub async fn list_all(&self) -> Result<Vec<models::BusinessHour>, 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_business_hours(cfg, Some(page), None).await?;
22            Ok((
23                r.items,
24                r.pagination.pages.unwrap_or(1),
25                r.pagination.current.unwrap_or(1),
26            ))
27        })
28        .await
29    }
30
31    /// Create a business-hour profile.
32    pub async fn create(
33        &self,
34        body: models::RestCreateBusinessHour,
35    ) -> Result<models::BusinessHourItemResponse, ManagerError> {
36        let cfg = self.cfg.get().await?;
37        let cfg = cfg.as_ref();
38        with_retry(&self.retry, false, || {
39            api::create_business_hour(cfg, body.clone())
40        })
41        .await
42        .map_err(map_manager_err)
43    }
44
45    /// Get a business-hour profile by id.
46    pub async fn get(&self, id: &str) -> Result<models::BusinessHourItemResponse, ManagerError> {
47        let cfg = self.cfg.get().await?;
48        let cfg = cfg.as_ref();
49        with_retry(&self.retry, true, || api::get_business_hour(cfg, id))
50            .await
51            .map_err(map_manager_err)
52    }
53
54    /// Update a business-hour profile.
55    pub async fn update(
56        &self,
57        id: &str,
58        body: models::RestUpdateBusinessHour,
59    ) -> Result<models::BusinessHourItemResponse, ManagerError> {
60        let cfg = self.cfg.get().await?;
61        let cfg = cfg.as_ref();
62        with_retry(&self.retry, false, || {
63            api::update_business_hour(cfg, id, body.clone())
64        })
65        .await
66        .map_err(map_manager_err)
67    }
68
69    /// Delete a business-hour profile.
70    pub async fn delete(&self, id: &str) -> Result<(), ManagerError> {
71        let cfg = self.cfg.get().await?;
72        let cfg = cfg.as_ref();
73        with_retry(&self.retry, false, || api::delete_business_hour(cfg, id))
74            .await
75            .map_err(map_manager_err)?;
76        Ok(())
77    }
78
79    /// Add (replace) the time ranges of a business-hour profile.
80    pub async fn add_ranges(
81        &self,
82        id: &str,
83        body: models::BusinessHourRangesBody,
84    ) -> Result<models::BusinessHourItemResponse, ManagerError> {
85        let cfg = self.cfg.get().await?;
86        let cfg = cfg.as_ref();
87        with_retry(&self.retry, false, || {
88            api::add_business_hour_ranges(cfg, id, body.clone())
89        })
90        .await
91        .map_err(map_manager_err)
92    }
93
94    /// List a business-hour profile's time ranges.
95    pub async fn list_ranges(
96        &self,
97        id: &str,
98    ) -> Result<models::BusinessHourRangeListResponse, ManagerError> {
99        let cfg = self.cfg.get().await?;
100        let cfg = cfg.as_ref();
101        with_retry(&self.retry, true, || {
102            api::list_business_hour_ranges(cfg, id)
103        })
104        .await
105        .map_err(map_manager_err)
106    }
107
108    /// Get a single time range of a business-hour profile.
109    pub async fn get_range(
110        &self,
111        id: &str,
112        range_id: &str,
113    ) -> Result<models::BusinessHourRangeItemResponse, ManagerError> {
114        let cfg = self.cfg.get().await?;
115        let cfg = cfg.as_ref();
116        with_retry(&self.retry, true, || {
117            api::get_business_hour_range(cfg, id, range_id)
118        })
119        .await
120        .map_err(map_manager_err)
121    }
122
123    /// Remove a time range from a business-hour profile.
124    pub async fn remove_range(
125        &self,
126        id: &str,
127        range_id: &str,
128    ) -> Result<models::DefaultV2MessageResponse, ManagerError> {
129        let cfg = self.cfg.get().await?;
130        let cfg = cfg.as_ref();
131        with_retry(&self.retry, false, || {
132            api::remove_business_hour_range(cfg, id, range_id)
133        })
134        .await
135        .map_err(map_manager_err)
136    }
137
138    /// Bulk-delete business-hour profiles by id.
139    pub async fn bulk_delete(
140        &self,
141        ids: Vec<String>,
142    ) -> Result<models::DefaultV2MessageResponse, ManagerError> {
143        let cfg = self.cfg.get().await?;
144        let cfg = cfg.as_ref();
145        let ids = ids
146            .iter()
147            .map(|id| {
148                uuid::Uuid::parse_str(id)
149                    .map_err(|e| ManagerError::InvalidArgument(format!("ids: {e}")))
150            })
151            .collect::<Result<Vec<_>, _>>()?;
152        let body = models::BulkIdsRequest { ids };
153        with_retry(&self.retry, false, || {
154            api::bulk_delete_business_hours(cfg, body.clone())
155        })
156        .await
157        .map_err(map_manager_err)
158    }
159
160    /// Bulk-update business-hour profiles.
161    pub async fn bulk_update(
162        &self,
163        body: models::BusinessHourBulkUpdateRequest,
164    ) -> Result<models::BusinessHourListResponse, ManagerError> {
165        let cfg = self.cfg.get().await?;
166        let cfg = cfg.as_ref();
167        with_retry(&self.retry, false, || {
168            api::bulk_update_business_hours(cfg, body.clone())
169        })
170        .await
171        .map_err(map_manager_err)
172    }
173}