Skip to main content

babelforce_manager_sdk/resources/
triggers.rs

1use crate::error::{map_manager_err, ManagerError};
2use crate::gen::manager::apis::configuration::Configuration;
3use crate::gen::manager::apis::{manager_api, trigger_api as api};
4use crate::gen::manager::models;
5use crate::http::collect_all;
6use crate::retry::{with_retry, RetryPolicy};
7use crate::token::SharedCfg;
8
9/// Workflow triggers — `/api/v2/triggers`.
10pub struct TriggersResource {
11    pub(crate) cfg: SharedCfg<Configuration>,
12    pub(crate) retry: RetryPolicy,
13}
14
15impl TriggersResource {
16    /// List all triggers (auto-paginated).
17    pub async fn list_all(&self) -> Result<Vec<models::Trigger>, 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_triggers(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 trigger.
32    pub async fn create(
33        &self,
34        body: models::RestCreateTrigger,
35    ) -> Result<models::TriggerItemResponse, ManagerError> {
36        let cfg = self.cfg.get().await?;
37        let cfg = cfg.as_ref();
38        with_retry(&self.retry, false, || {
39            api::create_trigger(cfg, body.clone())
40        })
41        .await
42        .map_err(map_manager_err)
43    }
44
45    /// Get a trigger by id.
46    pub async fn get(&self, id: &str) -> Result<models::TriggerItemResponse, ManagerError> {
47        let cfg = self.cfg.get().await?;
48        let cfg = cfg.as_ref();
49        with_retry(&self.retry, true, || api::get_trigger(cfg, id))
50            .await
51            .map_err(map_manager_err)
52    }
53
54    /// Update a trigger.
55    pub async fn update(
56        &self,
57        id: &str,
58        body: models::RestUpdateTrigger,
59    ) -> Result<models::TriggerItemResponse, ManagerError> {
60        let cfg = self.cfg.get().await?;
61        let cfg = cfg.as_ref();
62        with_retry(&self.retry, false, || {
63            api::update_trigger(cfg, id, body.clone())
64        })
65        .await
66        .map_err(map_manager_err)
67    }
68
69    /// Delete a trigger.
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_trigger(cfg, id))
74            .await
75            .map_err(map_manager_err)?;
76        Ok(())
77    }
78
79    /// Clone a trigger; returns the new trigger.
80    pub async fn clone(&self, id: &str) -> Result<models::TriggerItemResponse, ManagerError> {
81        let cfg = self.cfg.get().await?;
82        let cfg = cfg.as_ref();
83        with_retry(&self.retry, false, || api::clone_trigger(cfg, id))
84            .await
85            .map_err(map_manager_err)
86    }
87
88    /// Test trigger conditions against a sample payload. `test_mode` runs without side effects.
89    pub async fn test(
90        &self,
91        body: models::TestTriggersRequest,
92        test_mode: bool,
93    ) -> Result<models::TestTriggersResponse, ManagerError> {
94        let cfg = self.cfg.get().await?;
95        let cfg = cfg.as_ref();
96        with_retry(&self.retry, false, || {
97            manager_api::test_triggers(cfg, test_mode, Some(body.clone()))
98        })
99        .await
100        .map_err(map_manager_err)
101    }
102
103    /// Apply a bulk action (e.g. enable/disable/delete) to triggers by id.
104    pub async fn bulk_action(
105        &self,
106        action: &str,
107        ids: Vec<String>,
108    ) -> Result<models::BulkActionResponse, ManagerError> {
109        let cfg = self.cfg.get().await?;
110        let cfg = cfg.as_ref();
111        let ids = ids
112            .iter()
113            .map(|id| {
114                uuid::Uuid::parse_str(id)
115                    .map_err(|e| ManagerError::InvalidArgument(format!("id {id}: {e}")))
116            })
117            .collect::<Result<Vec<_>, _>>()?;
118        let body = models::BulkIdsRequest { ids };
119        with_retry(&self.retry, false, || {
120            api::bulk_trigger_action(cfg, action, body.clone())
121        })
122        .await
123        .map_err(map_manager_err)
124    }
125
126    /// List the available trigger expressions.
127    pub async fn expressions(&self) -> Result<models::ObjectListResponse, ManagerError> {
128        let cfg = self.cfg.get().await?;
129        let cfg = cfg.as_ref();
130        with_retry(&self.retry, true, || api::list_trigger_expressions(cfg))
131            .await
132            .map_err(map_manager_err)
133    }
134
135    /// List the available trigger operators.
136    pub async fn operators(&self) -> Result<models::ObjectListResponse, ManagerError> {
137        let cfg = self.cfg.get().await?;
138        let cfg = cfg.as_ref();
139        with_retry(&self.retry, true, || api::list_trigger_operators(cfg))
140            .await
141            .map_err(map_manager_err)
142    }
143
144    /// List the conditions configured on a trigger.
145    pub async fn conditions(
146        &self,
147        id: &str,
148    ) -> Result<models::TriggerConditionListResponse, ManagerError> {
149        let cfg = self.cfg.get().await?;
150        let cfg = cfg.as_ref();
151        with_retry(&self.retry, true, || api::list_trigger_conditions(cfg, id))
152            .await
153            .map_err(map_manager_err)
154    }
155
156    /// Replace the conditions on a trigger.
157    pub async fn set_conditions(
158        &self,
159        id: &str,
160        body: models::TriggerConditionsRequest,
161    ) -> Result<models::TriggerItemResponse, ManagerError> {
162        let cfg = self.cfg.get().await?;
163        let cfg = cfg.as_ref();
164        with_retry(&self.retry, false, || {
165            api::set_trigger_conditions(cfg, id, body.clone())
166        })
167        .await
168        .map_err(map_manager_err)
169    }
170
171    /// List where a trigger is used.
172    pub async fn uses(&self, id: &str) -> Result<models::TriggerUsesResponse, ManagerError> {
173        let cfg = self.cfg.get().await?;
174        let cfg = cfg.as_ref();
175        with_retry(&self.retry, true, || api::get_trigger_uses(cfg, id))
176            .await
177            .map_err(map_manager_err)
178    }
179}