1use std::str::FromStr;
16
17use cx_api::proto::com::coralogixapis::alerting::alert_scheduler_rule_protobuf::v1::{
18 AlertSchedulerRuleIds,
19 AlertSchedulerRuleWithActiveTimeframe,
20 CreateAlertSchedulerRuleRequest,
21 CreateBulkAlertSchedulerRuleRequest,
22 DeleteAlertSchedulerRuleRequest,
23 FilterByAlertSchedulerRuleIds,
24 GetAlertSchedulerRuleRequest,
25 GetBulkAlertSchedulerRuleRequest,
26 UpdateAlertSchedulerRuleRequest,
27 UpdateBulkAlertSchedulerRuleRequest,
28 alert_scheduler_rule_service_client::AlertSchedulerRuleServiceClient,
29 filter_by_alert_scheduler_rule_ids,
30};
31use tokio::sync::Mutex;
32use tonic::{
33 metadata::MetadataMap,
34 transport::{
35 Channel,
36 ClientTlsConfig,
37 Endpoint,
38 },
39};
40
41use crate::{
42 CoralogixRegion,
43 auth::AuthContext,
44 error::{
45 Result,
46 SdkApiError,
47 SdkError,
48 },
49 metadata::CallProperties,
50 util::make_request_with_metadata,
51};
52
53pub use cx_api::proto::com::coralogixapis::alerting::alert_scheduler_rule_protobuf::v1::{
54 ActiveTimeframe,
55 AlertSchedulerRule,
56 AlertUniqueIds,
57 Filter as AlertSchedulerFilter,
58 OneTime,
59 Schedule,
60 ScheduleOperation,
61 Timeframe,
62 filter::WhichAlerts,
63 schedule::Scheduler,
64 timeframe::Until,
65};
66
67const ALERT_SCHEDULER_FEATURE_GROUP_ID: &str = "alerts";
68
69pub struct AlertSchedulerClient {
72 metadata_map: MetadataMap,
73 service_client: Mutex<AlertSchedulerRuleServiceClient<Channel>>,
74}
75
76impl AlertSchedulerClient {
77 pub fn new(region: CoralogixRegion, auth_context: AuthContext) -> Result<Self> {
83 let channel: Channel = Endpoint::from_str(®ion.grpc_endpoint())?
84 .tls_config(ClientTlsConfig::new().with_native_roots())?
85 .connect_lazy();
86 let request_metadata: CallProperties = (&auth_context.team_level_api_key).into();
87 Ok(Self {
88 metadata_map: request_metadata.to_metadata_map(),
89 service_client: Mutex::new(AlertSchedulerRuleServiceClient::new(channel)),
90 })
91 }
92
93 pub async fn create(
98 &self,
99 alert_scheduler_rule: AlertSchedulerRule,
100 ) -> Result<AlertSchedulerRule> {
101 let request = make_request_with_metadata(
102 CreateAlertSchedulerRuleRequest {
103 alert_scheduler_rule: Some(alert_scheduler_rule),
104 },
105 &self.metadata_map,
106 );
107
108 self.service_client
109 .lock()
110 .await
111 .create_alert_scheduler_rule(request)
112 .await
113 .map(|r| r.into_inner().alert_scheduler_rule.unwrap()) .map_err(
115 |status| SdkError::ApiError(SdkApiError {
116 status,
117 endpoint: "/com.coralogixapis.alerting.alert_scheduler_rule_protobuf.v1.AlertSchedulerRuleService/CreateAlertSchedulerRule".into(),
118 feature_group: ALERT_SCHEDULER_FEATURE_GROUP_ID.into()
119 }),
120 )
121 }
122
123 pub async fn create_bulk(
128 &self,
129 alert_scheduler_rules: Vec<AlertSchedulerRule>,
130 ) -> Result<Vec<AlertSchedulerRule>> {
131 let request = make_request_with_metadata(
132 CreateBulkAlertSchedulerRuleRequest {
133 create_alert_scheduler_rule_requests: alert_scheduler_rules
134 .into_iter()
135 .map(|alert_scheduler_rule| CreateAlertSchedulerRuleRequest {
136 alert_scheduler_rule: Some(alert_scheduler_rule),
137 })
138 .collect(),
139 },
140 &self.metadata_map,
141 );
142
143 self.service_client
144 .lock()
145 .await
146 .create_bulk_alert_scheduler_rule(request)
147 .await
148 .map(|r| {
149 r.into_inner()
150 .create_suppression_responses
151 .into_iter()
152 .map(|response| response.alert_scheduler_rule.unwrap()) .collect()
154 })
155 .map_err(
156 |status| SdkError::ApiError(SdkApiError {
157 status,
158 endpoint: "/com.coralogixapis.alerting.alert_scheduler_rule_protobuf.v1.AlertSchedulerRuleService/CreateBulkAlertSchedulerRule".into(),
159 feature_group: ALERT_SCHEDULER_FEATURE_GROUP_ID.into()
160 }),
161 )
162 }
163
164 pub async fn update(
169 &self,
170 alert_scheduler_rule: AlertSchedulerRule,
171 ) -> Result<AlertSchedulerRule> {
172 let request = make_request_with_metadata(
173 UpdateAlertSchedulerRuleRequest {
174 alert_scheduler_rule: Some(alert_scheduler_rule),
175 },
176 &self.metadata_map,
177 );
178
179 self.service_client
180 .lock()
181 .await
182 .update_alert_scheduler_rule(request)
183 .await
184 .map(|r| r.into_inner().alert_scheduler_rule.unwrap()) .map_err(
186 |status| SdkError::ApiError(SdkApiError {
187 status,
188 endpoint: "/com.coralogixapis.alerting.alert_scheduler_rule_protobuf.v1.AlertSchedulerRuleService/UpdateAlertSchedulerRule".into(),
189 feature_group: ALERT_SCHEDULER_FEATURE_GROUP_ID.into()
190 }),
191 )
192 }
193
194 pub async fn update_bulk(
198 &self,
199 alert_scheduler_rules: Vec<AlertSchedulerRule>,
200 ) -> Result<Vec<AlertSchedulerRule>> {
201 let request = make_request_with_metadata(
202 UpdateBulkAlertSchedulerRuleRequest {
203 update_alert_scheduler_rule_requests: alert_scheduler_rules
204 .into_iter()
205 .map(|alert_scheduler_rule| UpdateAlertSchedulerRuleRequest {
206 alert_scheduler_rule: Some(alert_scheduler_rule),
207 })
208 .collect(),
209 },
210 &self.metadata_map,
211 );
212
213 self.service_client
214 .lock()
215 .await
216 .update_bulk_alert_scheduler_rule(request)
217 .await
218 .map(|r| {
219 r.into_inner()
220 .update_suppression_responses
221 .into_iter()
222 .map(|response| response.alert_scheduler_rule.unwrap()) .collect()
224 })
225 .map_err(
226 |status| SdkError::ApiError(SdkApiError {
227 status,
228 endpoint: "/com.coralogixapis.alerting.alert_scheduler_rule_protobuf.v1.AlertSchedulerRuleService/UpdateBulkAlertSchedulerRule".into(),
229 feature_group: ALERT_SCHEDULER_FEATURE_GROUP_ID.into()
230 }),
231 )
232 }
233
234 pub async fn get(&self, id: String) -> Result<AlertSchedulerRule> {
238 let request = make_request_with_metadata(
239 GetAlertSchedulerRuleRequest {
240 alert_scheduler_rule_id: id,
241 },
242 &self.metadata_map,
243 );
244
245 self.service_client
246 .lock()
247 .await
248 .get_alert_scheduler_rule(request)
249 .await
250 .map(|r| r.into_inner().alert_scheduler_rule.unwrap())
251 .map_err(
252 |status| SdkError::ApiError(SdkApiError {
253 status,
254 endpoint: "/com.coralogixapis.alerting.alert_scheduler_rule_protobuf.v1.AlertSchedulerRuleService/GetAlertSchedulerRule".into(),
255 feature_group: ALERT_SCHEDULER_FEATURE_GROUP_ID.into()
256 }),
257 )
258 }
259
260 pub async fn get_bulk(
264 &self,
265 active_time_frame: ActiveTimeframe,
266 alert_scheduler_rule_ids: Vec<String>,
267 enabled: bool,
268 ) -> Result<Vec<AlertSchedulerRuleWithActiveTimeframe>> {
269 let mut all_rules = Vec::new();
270 let mut next_page_token = Some("".to_string());
271 while let Some(token) = next_page_token {
272 let request = make_request_with_metadata(
273 GetBulkAlertSchedulerRuleRequest {
274 active_timeframe: Some(active_time_frame.clone()),
275 enabled: Some(enabled),
276 alert_scheduler_rules_ids: Some(FilterByAlertSchedulerRuleIds {
277 alert_scheduler_rule_ids: Some(filter_by_alert_scheduler_rule_ids::AlertSchedulerRuleIds::AlertSchedulerIds(
278 AlertSchedulerRuleIds {
279 alert_scheduler_rule_ids: alert_scheduler_rule_ids.clone(),
280 },
281 )),
282 }),
283 next_page_token: Some(token),
284 },
285 &self.metadata_map,
286 );
287
288 let (alert_scheduler_rules, new_token) = self
289 .service_client
290 .lock()
291 .await
292 .get_bulk_alert_scheduler_rule(request)
293 .await
294 .map(|r| {
295 let response = r.into_inner();
296 (response.alert_scheduler_rules, response.next_page_token)
297 })
298 .map_err(
299 |status| SdkError::ApiError(SdkApiError {
300 status,
301 endpoint: "/com.coralogixapis.alerting.alert_scheduler_rule_protobuf.v1.AlertSchedulerRuleService/GetBulkAlertSchedulerRule".into(),
302 feature_group: ALERT_SCHEDULER_FEATURE_GROUP_ID.into()
303 }),
304 )?;
305 all_rules.extend(alert_scheduler_rules);
306 if new_token.is_empty() {
307 next_page_token = None;
308 } else {
309 next_page_token = Some(new_token);
310 }
311 }
312 Ok(all_rules)
313 }
314
315 pub async fn delete(&self, id: String) -> Result<()> {
319 let request = make_request_with_metadata(
320 DeleteAlertSchedulerRuleRequest {
321 alert_scheduler_rule_id: id,
322 },
323 &self.metadata_map,
324 );
325
326 self.service_client
327 .lock()
328 .await
329 .delete_alert_scheduler_rule(request)
330 .await
331 .map(|_| ())
332 .map_err(
333 |status| SdkError::ApiError(SdkApiError {
334 status,
335 endpoint: "/com.coralogixapis.alerting.alert_scheduler_rule_protobuf.v1.AlertSchedulerRuleService/DeleteAlertSchedulerRule".into(),
336 feature_group: ALERT_SCHEDULER_FEATURE_GROUP_ID.into()
337 }),
338 )
339 }
340}