cx_sdk/client/
archive_retentions.rs1use cx_api::proto::com::coralogix::archive::v1::{
16    ActivateRetentionsRequest,
17    ActivateRetentionsResponse,
18    GetRetentionsEnabledRequest,
19    GetRetentionsEnabledResponse,
20    GetRetentionsRequest,
21    GetRetentionsResponse,
22    UpdateRetentionsRequest,
23    UpdateRetentionsResponse,
24    retentions_service_client::RetentionsServiceClient,
25};
26use std::str::FromStr;
27use tokio::sync::Mutex;
28use tonic::{
29    metadata::MetadataMap,
30    transport::{
31        Channel,
32        ClientTlsConfig,
33        Endpoint,
34    },
35};
36
37use crate::{
38    CoralogixRegion,
39    auth::AuthContext,
40    error::{
41        Result,
42        SdkApiError,
43        SdkError,
44    },
45    metadata::CallProperties,
46    util::make_request_with_metadata,
47};
48
49pub use cx_api::proto::com::coralogix::archive::v1::RetentionUpdateElement;
50
51const ARCHIVE_FEATURE_GROUP_ID: &str = "archive";
52
53pub struct ArchiveRetentionClient {
56    metadata_map: MetadataMap,
57    service_client: Mutex<RetentionsServiceClient<Channel>>,
58}
59
60impl ArchiveRetentionClient {
61    pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
67        let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
68            .tls_config(ClientTlsConfig::new().with_native_roots())?
69            .connect_lazy();
70        let request_metadata: CallProperties = (&auth_context.team_level_api_key).into();
71        Ok(Self {
72            metadata_map: request_metadata.to_metadata_map(),
73            service_client: Mutex::new(RetentionsServiceClient::new(channel)),
74        })
75    }
76
77    pub async fn get(&self) -> Result<GetRetentionsResponse> {
79        Ok(self
80            .service_client
81            .lock()
82            .await
83            .get_retentions(make_request_with_metadata(
84                GetRetentionsRequest {},
85                &self.metadata_map,
86            ))
87            .await
88            .map_err(|status| {
89                SdkError::ApiError(SdkApiError {
90                    status,
91                    endpoint: "/com.coralogix.archive.v1.RetentionsService/GetRetentions"
92                        .to_string(),
93                    feature_group: ARCHIVE_FEATURE_GROUP_ID.to_string(),
94                })
95            })?
96            .into_inner())
97    }
98
99    pub async fn get_enabled(&self) -> Result<GetRetentionsEnabledResponse> {
101        Ok(self
102            .service_client
103            .lock()
104            .await
105            .get_retentions_enabled(make_request_with_metadata(
106                GetRetentionsEnabledRequest {},
107                &self.metadata_map,
108            ))
109            .await
110            .map_err(|status| {
111                SdkError::ApiError(SdkApiError {
112                    status,
113                    endpoint: "/com.coralogix.archive.v1.RetentionsService/GetEnabled".to_string(),
114                    feature_group: ARCHIVE_FEATURE_GROUP_ID.to_string(),
115                })
116            })?
117            .into_inner())
118    }
119
120    pub async fn update(
122        &self,
123        retention_update_elements: Vec<RetentionUpdateElement>,
124    ) -> Result<UpdateRetentionsResponse> {
125        let response = {
126            let mut client = self.service_client.lock().await;
127            let update_response = client
128                .update_retentions(make_request_with_metadata(
129                    UpdateRetentionsRequest {
130                        retention_update_elements,
131                    },
132                    &self.metadata_map,
133                ))
134                .await;
135            match update_response.map_err(|status| {
136                SdkError::ApiError(SdkApiError {
137                    status,
138                    endpoint: "/com.coralogix.archive.v1.RetentionsService/UpdateRetentions"
139                        .to_string(),
140                    feature_group: ARCHIVE_FEATURE_GROUP_ID.to_string(),
141                })
142            }) {
143                Ok(output) => {
144                    let _ = client
145                        .activate_retentions(ActivateRetentionsRequest {})
146                        .await
147                        .map_err(|status| {
148                            SdkError::ApiError(SdkApiError {
149                                status,
150                                endpoint:
151                                    "/com.coralogix.archive.v1.RetentionsService/ActivateRetentions"
152                                        .to_string(),
153                                feature_group: ARCHIVE_FEATURE_GROUP_ID.to_string(),
154                            })
155                        })?;
156                    output.into_inner()
157                }
158                Err(error) => return Err(error),
159            }
160        };
161        Ok(response)
162    }
163
164    #[deprecated(since = "1.8.0", note = "Update activates automatically")]
166    pub async fn activate(&self) -> Result<ActivateRetentionsResponse> {
167        Ok(self
168            .service_client
169            .lock()
170            .await
171            .activate_retentions(make_request_with_metadata(
172                ActivateRetentionsRequest {},
173                &self.metadata_map,
174            ))
175            .await
176            .map_err(|status| {
177                SdkError::ApiError(SdkApiError {
178                    status,
179                    endpoint: "/com.coralogix.archive.v1.RetentionsService/ActivateRetentions"
180                        .to_string(),
181                    feature_group: ARCHIVE_FEATURE_GROUP_ID.to_string(),
182                })
183            })?
184            .into_inner())
185    }
186}