cronback_client/
triggers.rs

1use cronback_api_model::{
2    Paginated,
3    Pagination,
4    Run,
5    RunMode,
6    RunTrigger,
7    TriggersFilter,
8};
9use http::Method;
10
11use crate::client::RequestRunner;
12use crate::{Response, Result, Trigger};
13
14/// Create a new trigger from JSON definition.
15///
16/// We intentionally don't accept [`Trigger`] here since API is designed to
17/// be more relaxed than the required fields in Trigger model. If we
18/// accepted [`Trigger`] as input, the trigger defaults will be set on
19/// the client side and not server side. To want to make it easy to
20/// change those defaults on the server side without having to release a
21/// new client version.
22pub async fn create_from_json(
23    client: &impl RequestRunner,
24    trigger_req: serde_json::Value,
25) -> Result<Response<Trigger>> {
26    let path = client.make_url("/v1/triggers")?;
27    client.run_with_body(Method::POST, path, trigger_req).await
28}
29/// Retrieve a trigger by name.
30pub async fn get<T>(
31    client: &impl RequestRunner,
32    name: T,
33) -> Result<Response<Trigger>>
34where
35    T: AsRef<str>,
36{
37    let path = client.make_url(&format!("/v1/triggers/{}", name.as_ref()))?;
38    client.run(Method::GET, path).await
39}
40
41/// Retrieve list of triggers for a project.
42pub async fn list(
43    client: &impl RequestRunner,
44    pagination: Option<Pagination>,
45    filter: Option<TriggersFilter>,
46) -> Result<Response<Paginated<Trigger>>> {
47    let mut path = client.make_url("/v1/triggers")?;
48    if let Some(pagination) = pagination {
49        if let Some(cursor) = pagination.cursor {
50            path.query_pairs_mut().append_pair("cursor", &cursor);
51        }
52        if let Some(limit) = pagination.limit {
53            path.query_pairs_mut()
54                .append_pair("limit", &limit.to_string());
55        }
56    }
57
58    if let Some(filter) = filter {
59        for status in filter.status {
60            path.query_pairs_mut()
61                .append_pair("status", &status.to_string());
62        }
63    }
64
65    client.run(Method::GET, path).await
66}
67
68/// Cancel a `scheduled` trigger.
69pub async fn cancel<T>(
70    client: &impl RequestRunner,
71    name: T,
72) -> Result<Response<Trigger>>
73where
74    T: AsRef<str>,
75{
76    let path = format!("/v1/triggers/{}/cancel", name.as_ref());
77    let path = client.make_url(&path)?;
78
79    client.run(Method::POST, path).await
80}
81
82/// Pause a `scheduled` trigger.
83pub async fn pause<T>(
84    client: &impl RequestRunner,
85    name: T,
86) -> Result<Response<Trigger>>
87where
88    T: AsRef<str>,
89{
90    let path = format!("/v1/triggers/{}/pause", name.as_ref());
91    let path = client.make_url(&path)?;
92
93    client.run(Method::POST, path).await
94}
95
96/// Resume a `paused` trigger.
97pub async fn resume<T>(
98    client: &impl RequestRunner,
99    name: T,
100) -> Result<Response<Trigger>>
101where
102    T: AsRef<str>,
103{
104    let path = format!("/v1/triggers/{}/resume", name.as_ref());
105    let path = client.make_url(&path)?;
106
107    client.run(Method::POST, path).await
108}
109
110/// Run the trigger immediately
111pub async fn run<T>(
112    client: &impl RequestRunner,
113    name: T,
114    mode: RunMode,
115) -> Result<Response<Run>>
116where
117    T: AsRef<str>,
118{
119    let path = format!("/v1/triggers/{}/run", name.as_ref());
120    let path = client.make_url(&path)?;
121
122    let body = RunTrigger { mode };
123
124    client.run_with_body(Method::POST, path, body).await
125}
126
127/// Permanently delete a trigger.
128pub async fn delete<T>(
129    client: &impl RequestRunner,
130    name: T,
131) -> Result<Response<()>>
132where
133    T: AsRef<str>,
134{
135    let path = format!("/v1/triggers/{}", name.as_ref());
136    let path = client.make_url(&path)?;
137
138    client.run(Method::DELETE, path).await
139}