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((r.items, r.pagination.pages, r.pagination.current))
23        })
24        .await
25    }
26
27    /// Create a trigger.
28    pub async fn create(
29        &self,
30        body: models::RestCreateTrigger,
31    ) -> Result<models::TriggerItemResponse, ManagerError> {
32        let cfg = self.cfg.get().await?;
33        let cfg = cfg.as_ref();
34        with_retry(&self.retry, false, || {
35            api::create_trigger(cfg, body.clone())
36        })
37        .await
38        .map_err(map_manager_err)
39    }
40
41    /// Get a trigger by id.
42    pub async fn get(&self, id: &str) -> Result<models::TriggerItemResponse, ManagerError> {
43        let cfg = self.cfg.get().await?;
44        let cfg = cfg.as_ref();
45        with_retry(&self.retry, true, || api::get_trigger(cfg, id))
46            .await
47            .map_err(map_manager_err)
48    }
49
50    /// Update a trigger.
51    pub async fn update(
52        &self,
53        id: &str,
54        body: models::RestUpdateTrigger,
55    ) -> Result<models::TriggerItemResponse, ManagerError> {
56        let cfg = self.cfg.get().await?;
57        let cfg = cfg.as_ref();
58        with_retry(&self.retry, false, || {
59            api::update_trigger(cfg, id, body.clone())
60        })
61        .await
62        .map_err(map_manager_err)
63    }
64
65    /// Delete a trigger.
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_trigger(cfg, id))
70            .await
71            .map_err(map_manager_err)?;
72        Ok(())
73    }
74
75    /// Clone a trigger; returns the new trigger.
76    pub async fn clone(&self, id: &str) -> Result<models::TriggerItemResponse, ManagerError> {
77        let cfg = self.cfg.get().await?;
78        let cfg = cfg.as_ref();
79        with_retry(&self.retry, false, || api::clone_trigger(cfg, id))
80            .await
81            .map_err(map_manager_err)
82    }
83
84    /// Test trigger conditions against a sample payload. `test_mode` runs without side effects.
85    pub async fn test(
86        &self,
87        body: models::TestTriggersRequest,
88        test_mode: bool,
89    ) -> Result<models::TestTriggersResponse, ManagerError> {
90        let cfg = self.cfg.get().await?;
91        let cfg = cfg.as_ref();
92        with_retry(&self.retry, false, || {
93            manager_api::test_triggers(cfg, test_mode, Some(body.clone()))
94        })
95        .await
96        .map_err(map_manager_err)
97    }
98
99    /// Apply a bulk action (e.g. enable/disable/delete) to triggers by id.
100    pub async fn bulk_action(
101        &self,
102        action: &str,
103        ids: Vec<String>,
104    ) -> Result<models::BulkActionResponse, ManagerError> {
105        let cfg = self.cfg.get().await?;
106        let cfg = cfg.as_ref();
107        let ids = ids
108            .iter()
109            .map(|id| {
110                uuid::Uuid::parse_str(id)
111                    .map_err(|e| ManagerError::InvalidArgument(format!("id {id}: {e}")))
112            })
113            .collect::<Result<Vec<_>, _>>()?;
114        let body = models::BulkIdsRequest { ids };
115        with_retry(&self.retry, false, || {
116            api::bulk_trigger_action(cfg, action, body.clone())
117        })
118        .await
119        .map_err(map_manager_err)
120    }
121
122    /// List the available trigger expressions.
123    pub async fn expressions(&self) -> Result<models::ObjectListResponse, ManagerError> {
124        let cfg = self.cfg.get().await?;
125        let cfg = cfg.as_ref();
126        with_retry(&self.retry, true, || api::list_trigger_expressions(cfg))
127            .await
128            .map_err(map_manager_err)
129    }
130
131    /// List the available trigger operators.
132    pub async fn operators(&self) -> Result<models::ObjectListResponse, ManagerError> {
133        let cfg = self.cfg.get().await?;
134        let cfg = cfg.as_ref();
135        with_retry(&self.retry, true, || api::list_trigger_operators(cfg))
136            .await
137            .map_err(map_manager_err)
138    }
139
140    /// List the conditions configured on a trigger.
141    pub async fn conditions(
142        &self,
143        id: &str,
144    ) -> Result<models::TriggerConditionListResponse, ManagerError> {
145        let cfg = self.cfg.get().await?;
146        let cfg = cfg.as_ref();
147        with_retry(&self.retry, true, || api::list_trigger_conditions(cfg, id))
148            .await
149            .map_err(map_manager_err)
150    }
151
152    /// Replace the conditions on a trigger.
153    pub async fn set_conditions(
154        &self,
155        id: &str,
156        body: models::TriggerConditionsRequest,
157    ) -> Result<models::TriggerItemResponse, ManagerError> {
158        let cfg = self.cfg.get().await?;
159        let cfg = cfg.as_ref();
160        with_retry(&self.retry, false, || {
161            api::set_trigger_conditions(cfg, id, body.clone())
162        })
163        .await
164        .map_err(map_manager_err)
165    }
166
167    /// List where a trigger is used.
168    pub async fn uses(&self, id: &str) -> Result<models::TriggerUsesResponse, ManagerError> {
169        let cfg = self.cfg.get().await?;
170        let cfg = cfg.as_ref();
171        with_retry(&self.retry, true, || api::get_trigger_uses(cfg, id))
172            .await
173            .map_err(map_manager_err)
174    }
175}