Skip to main content

babelforce_manager_sdk/resources/
phonebook.rs

1use crate::error::{map_manager_err, ManagerError};
2use crate::gen::manager::apis::configuration::Configuration;
3use crate::gen::manager::apis::{manager_api, phonebook_entry_api as api};
4use crate::gen::manager::models;
5use crate::http::collect_all;
6use crate::retry::{with_retry, RetryPolicy};
7use crate::token::SharedCfg;
8use std::path::PathBuf;
9
10/// Phonebook entries — `/api/v2/phonebook`.
11pub struct PhonebookResource {
12    pub(crate) cfg: SharedCfg<Configuration>,
13    pub(crate) retry: RetryPolicy,
14}
15
16impl PhonebookResource {
17    /// List all phonebook entries (auto-paginated).
18    pub async fn list_all(&self) -> Result<Vec<models::PhonebookEntry>, ManagerError> {
19        let cfg = self.cfg.get().await?;
20        let cfg = cfg.as_ref();
21        collect_all(&self.retry, map_manager_err, |page| async move {
22            let r = api::list_phonebook_entrys(cfg, Some(page), None).await?;
23            Ok((
24                r.items,
25                r.pagination.pages.unwrap_or(1),
26                r.pagination.current.unwrap_or(1),
27            ))
28        })
29        .await
30    }
31
32    /// Create a phonebook entry.
33    pub async fn create(
34        &self,
35        body: models::RestCreatePhonebookEntry,
36    ) -> Result<models::PhonebookEntryItemResponse, ManagerError> {
37        let cfg = self.cfg.get().await?;
38        let cfg = cfg.as_ref();
39        with_retry(&self.retry, false, || {
40            api::create_phonebook_entry(cfg, body.clone())
41        })
42        .await
43        .map_err(map_manager_err)
44    }
45
46    /// Get a phonebook entry by id.
47    pub async fn get(&self, id: &str) -> Result<models::PhonebookEntryItemResponse, ManagerError> {
48        let cfg = self.cfg.get().await?;
49        let cfg = cfg.as_ref();
50        with_retry(&self.retry, true, || api::get_phonebook_entry(cfg, id))
51            .await
52            .map_err(map_manager_err)
53    }
54
55    /// Update a phonebook entry.
56    pub async fn update(
57        &self,
58        id: &str,
59        body: models::RestUpdatePhonebookEntry,
60    ) -> Result<models::PhonebookEntryItemResponse, ManagerError> {
61        let cfg = self.cfg.get().await?;
62        let cfg = cfg.as_ref();
63        with_retry(&self.retry, false, || {
64            api::update_phonebook_entry(cfg, id, body.clone())
65        })
66        .await
67        .map_err(map_manager_err)
68    }
69
70    /// Delete a phonebook entry.
71    pub async fn delete(&self, id: &str) -> Result<(), ManagerError> {
72        let cfg = self.cfg.get().await?;
73        let cfg = cfg.as_ref();
74        with_retry(&self.retry, false, || api::delete_phonebook_entry(cfg, id))
75            .await
76            .map_err(map_manager_err)?;
77        Ok(())
78    }
79
80    /// Download all phonebook entries as CSV text.
81    pub async fn download(&self) -> Result<String, ManagerError> {
82        let cfg = self.cfg.get().await?;
83        let cfg = cfg.as_ref();
84        with_retry(&self.retry, true, || {
85            manager_api::download_phonebook_entries(cfg)
86        })
87        .await
88        .map_err(map_manager_err)
89    }
90
91    /// Bulk-upload phonebook entries from a CSV file. `overwrite` replaces existing entries.
92    pub async fn upload(&self, file: PathBuf, overwrite: bool) -> Result<(), ManagerError> {
93        let cfg = self.cfg.get().await?;
94        let cfg = cfg.as_ref();
95        with_retry(&self.retry, false, || {
96            manager_api::upload_phonebook_entries(cfg, file.clone(), Some(overwrite))
97        })
98        .await
99        .map_err(map_manager_err)?;
100        Ok(())
101    }
102
103    /// Bulk-delete phonebook entries by id.
104    pub async fn bulk_delete(
105        &self,
106        ids: Vec<String>,
107    ) -> Result<models::DefaultV2MessageResponse, ManagerError> {
108        let cfg = self.cfg.get().await?;
109        let cfg = cfg.as_ref();
110        let ids = ids
111            .iter()
112            .map(|id| {
113                uuid::Uuid::parse_str(id)
114                    .map_err(|e| ManagerError::InvalidArgument(format!("ids: {e}")))
115            })
116            .collect::<Result<Vec<_>, _>>()?;
117        let body = models::BulkIdsRequest { ids };
118        with_retry(&self.retry, false, || {
119            manager_api::bulk_delete_phonebook_entries(cfg, body.clone())
120        })
121        .await
122        .map_err(map_manager_err)
123    }
124}