cx_sdk/client/
contextual_data_integrations.rs

1// Copyright 2024 Coralogix Ltd.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::{
16    str::FromStr,
17    sync::Arc,
18};
19
20use tokio::sync::Mutex;
21use tonic::transport::{
22    Channel,
23    ClientTlsConfig,
24    Endpoint,
25};
26
27use crate::{
28    CoralogixRegion,
29    auth::AuthContext,
30    error::{
31        Result,
32        SdkApiError,
33        SdkError,
34    },
35    metadata::CallProperties,
36    util::make_request_with_metadata,
37};
38
39const CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID: &str = "contextual_data_integrations";
40
41use cx_api::proto::com::coralogix::integrations::v1::{
42    DeleteContextualDataIntegrationRequest,
43    DeleteContextualDataIntegrationResponse,
44    GetContextualDataIntegrationDefinitionRequest,
45    GetContextualDataIntegrationDefinitionResponse,
46    GetContextualDataIntegrationDetailsRequest,
47    GetContextualDataIntegrationDetailsResponse,
48    GetContextualDataIntegrationsRequest,
49    GetContextualDataIntegrationsResponse,
50    SaveContextualDataIntegrationRequest,
51    SaveContextualDataIntegrationResponse,
52    TestContextualDataIntegrationRequest,
53    TestContextualDataIntegrationResponse,
54    UpdateContextualDataIntegrationRequest,
55    UpdateContextualDataIntegrationResponse,
56    contextual_data_integration_service_client::ContextualDataIntegrationServiceClient,
57};
58
59pub use cx_api::proto::com::coralogix::integrations::v1::{
60    GenericIntegrationParameters,
61    IntegrationMetadata,
62    integration_metadata::SpecificData,
63};
64
65/// Client for managing Contextual Data Integrations.
66pub struct ContextualDataIntegrationsClient {
67    metadata_map: tonic::metadata::MetadataMap,
68    service_client: Arc<Mutex<ContextualDataIntegrationServiceClient<Channel>>>,
69}
70
71impl ContextualDataIntegrationsClient {
72    /// Creates a new client for the Contextual Data Integrations API.
73    pub fn new(region: CoralogixRegion, auth_context: AuthContext) -> Result<Self> {
74        let channel = Endpoint::from_str(&region.grpc_endpoint())?
75            .tls_config(ClientTlsConfig::new().with_native_roots())?
76            .connect_lazy();
77
78        let request_metadata: CallProperties = (&auth_context.team_level_api_key).into();
79        Ok(Self {
80            metadata_map: request_metadata.to_metadata_map(),
81            service_client: Arc::new(Mutex::new(ContextualDataIntegrationServiceClient::new(
82                channel,
83            ))),
84        })
85    }
86
87    /// Get all contextual data integrations
88    ///
89    /// # Arguments
90    /// * `include_testing_integrations` - Whether to include testing integrations.
91    pub async fn list(
92        &self,
93        include_testing_integrations: bool,
94    ) -> Result<GetContextualDataIntegrationsResponse> {
95        let request = make_request_with_metadata(
96            GetContextualDataIntegrationsRequest {
97                include_testing_integrations: Some(include_testing_integrations),
98            },
99            &self.metadata_map,
100        );
101
102        self.service_client
103            .lock()
104            .await
105            .get_contextual_data_integrations(request)
106            .await
107            .map(|r| r.into_inner())
108            .map_err(|status| SdkError::ApiError(SdkApiError {
109                status,
110                endpoint: "/com.coralogix.integrations.v1.ContextualDataIntegrationService/GetContextualDataIntegrations".into(),
111                feature_group: CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID.into(),
112            }))
113    }
114
115    /// Get contextual data integration definition
116    ///
117    /// # Arguments
118    /// * `id` - The id of the integration to get the definition for.
119    /// * `include_testing_integrations` - Whether to include testing integrations.
120    pub async fn get_definition(
121        &self,
122        id: String,
123        include_testing_integrations: bool,
124    ) -> Result<GetContextualDataIntegrationDefinitionResponse> {
125        let request = make_request_with_metadata(
126            GetContextualDataIntegrationDefinitionRequest {
127                id: Some(id),
128                include_testing_integrations: Some(include_testing_integrations),
129            },
130            &self.metadata_map,
131        );
132
133        self.service_client
134            .lock()
135            .await
136            .get_contextual_data_integration_definition(request)
137            .await
138            .map(|r| r.into_inner())
139            .map_err(|status| SdkError::ApiError(SdkApiError {
140                status,
141                endpoint: "/com.coralogix.integrations.v1.ContextualDataIntegrationService/GetContextualDataIntegrationDefinition".into(),
142                feature_group: CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID.into(),
143            }))
144    }
145
146    /// Get contextual data integration details
147    ///
148    /// # Arguments
149    /// * `id` - The id of the integration to get the details for.
150    /// * `include_testing_revisions` - Whether to include testing revisions.
151    pub async fn get_details(
152        &self,
153        id: String,
154        include_testing_revisions: bool,
155    ) -> Result<GetContextualDataIntegrationDetailsResponse> {
156        let request = make_request_with_metadata(
157            GetContextualDataIntegrationDetailsRequest {
158                id: Some(id),
159                include_testing_revisions: Some(include_testing_revisions),
160            },
161            &self.metadata_map,
162        );
163
164        self.service_client
165            .lock()
166            .await
167            .get_contextual_data_integration_details(request)
168            .await
169            .map(|r| r.into_inner())
170            .map_err(|status| SdkError::ApiError(SdkApiError {
171                status,
172                endpoint: "/com.coralogix.integrations.v1.ContextualDataIntegrationService/GetContextualDataIntegrationDetails".into(),
173                feature_group: CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID.into(),
174            }))
175    }
176
177    /// Test contextual data integration
178    pub async fn test(
179        &self,
180        integration_data: IntegrationMetadata,
181        integration_id: String,
182    ) -> Result<TestContextualDataIntegrationResponse> {
183        let request = make_request_with_metadata(
184            TestContextualDataIntegrationRequest {
185                integration_data: Some(integration_data),
186                integration_id: Some(integration_id),
187            },
188            &self.metadata_map,
189        );
190
191        self.service_client
192            .lock()
193            .await
194            .test_contextual_data_integration(request)
195            .await
196            .map(|r| r.into_inner())
197            .map_err(|status| SdkError::ApiError(SdkApiError {
198                status,
199                endpoint: "/com.coralogix.integrations.v1.ContextualDataIntegrationService/TestContextualDataIntegration".into(),
200                feature_group: CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID.into(),
201            }))
202    }
203
204    /// Save contextual data integration
205    ///
206    /// # Arguments
207    /// * `metadata` - The metadata of the integration to save.
208    pub async fn create(
209        &self,
210        metadata: IntegrationMetadata,
211    ) -> Result<SaveContextualDataIntegrationResponse> {
212        let request = make_request_with_metadata(
213            SaveContextualDataIntegrationRequest {
214                metadata: Some(metadata),
215            },
216            &self.metadata_map,
217        );
218
219        self.service_client
220            .lock()
221            .await
222            .save_contextual_data_integration(request)
223            .await
224            .map(|r| r.into_inner())
225            .map_err(|status| SdkError::ApiError(SdkApiError {
226                status,
227                endpoint: "/com.coralogix.integrations.v1.ContextualDataIntegrationService/SaveContextualDataIntegration".into(),
228                feature_group: CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID.into(),
229            }))
230    }
231
232    /// Update contextual data integration
233    ///
234    /// # Arguments
235    /// * `integration_id` - The id of the integration to update.
236    /// * `metadata` - The metadata of the integration to update.
237    pub async fn update(
238        &self,
239        integration_id: String,
240        metadata: IntegrationMetadata,
241    ) -> Result<UpdateContextualDataIntegrationResponse> {
242        let request = make_request_with_metadata(
243            UpdateContextualDataIntegrationRequest {
244                integration_id: Some(integration_id),
245                metadata: Some(metadata),
246            },
247            &self.metadata_map,
248        );
249
250        self.service_client
251            .lock()
252            .await
253            .update_contextual_data_integration(request)
254            .await
255            .map(|r| r.into_inner())
256            .map_err(|status| SdkError::ApiError(SdkApiError {
257                status,
258                endpoint: "/com.coralogix.integrations.v1.ContextualDataIntegrationService/UpdateContextualDataIntegration".into(),
259                feature_group: CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID.into(),
260            }))
261    }
262
263    /// Delete contextual data integration
264    pub async fn delete(
265        &self,
266        integration_id: String,
267    ) -> Result<DeleteContextualDataIntegrationResponse> {
268        let request = make_request_with_metadata(
269            DeleteContextualDataIntegrationRequest {
270                integration_id: Some(integration_id),
271            },
272            &self.metadata_map,
273        );
274
275        self.service_client
276            .lock()
277            .await
278            .delete_contextual_data_integration(request)
279            .await
280            .map(|r| r.into_inner())
281            .map_err(|status| SdkError::ApiError(SdkApiError {
282                status,
283                endpoint: "/com.coralogix.integrations.v1.ContextualDataIntegrationService/DeleteContextualDataIntegration".into(),
284                feature_group: CONTEXTUAL_DATA_INTEGRATIONS_FEATURE_GROUP_ID.into(),
285            }))
286    }
287}