cx_sdk/client/
views_folders.rs

1// Copyright 2025 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::str::FromStr;
16
17use crate::{
18    auth::AuthContext,
19    com::coralogixapis::views::v1::services::{
20        CreateViewFolderRequest,
21        CreateViewFolderResponse,
22        DeleteViewFolderRequest,
23        DeleteViewFolderResponse,
24        GetViewFolderRequest,
25        ListViewFoldersRequest,
26        ReplaceViewFolderRequest,
27        ReplaceViewFolderResponse,
28        views_folders_service_client::ViewsFoldersServiceClient,
29    },
30    error::{
31        Result,
32        SdkApiError,
33    },
34    metadata::CallProperties,
35    util::make_request_with_metadata,
36};
37
38pub use crate::com::coralogixapis::views::v1::ViewFolder;
39
40use tokio::sync::Mutex;
41use tonic::{
42    metadata::MetadataMap,
43    transport::{
44        Channel,
45        ClientTlsConfig,
46        Endpoint,
47    },
48};
49
50use crate::CoralogixRegion;
51
52const FEATURE_GROUP_ID: &str = "data-exploration";
53
54/// The ViewFolders API client.
55/// Read more at <https://coralogix.com/docs/user-guides/monitoring-and-insights/explore-screen/custom-views/>
56pub struct ViewFoldersClient {
57    teams_level_metadata_map: MetadataMap,
58    service_client: Mutex<ViewsFoldersServiceClient<Channel>>,
59}
60
61impl ViewFoldersClient {
62    /// Creates a new client for the ViewFolders API.
63    ///
64    /// # Arguments
65    /// * `auth_context` - The [`AuthContext`] to use for authentication.
66    /// * `region` - The [`CoralogixRegion`] to connect to.
67    pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
68        let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
69            .tls_config(ClientTlsConfig::new().with_native_roots())?
70            .connect_lazy();
71        let request_metadata: CallProperties = (&auth_context.team_level_api_key).into();
72        Ok(Self {
73            teams_level_metadata_map: request_metadata.to_metadata_map(),
74            service_client: Mutex::new(ViewsFoldersServiceClient::new(channel)),
75        })
76    }
77
78    /// Creates a new ViewFolder
79    ///
80    /// # Arguments
81    /// * `folder` - The [`ViewFolder`] to create.
82    pub async fn create(&self, folder: ViewFolder) -> Result<CreateViewFolderResponse> {
83        let request = make_request_with_metadata(
84            CreateViewFolderRequest { name: folder.name },
85            &self.teams_level_metadata_map,
86        );
87        Ok(self
88            .service_client
89            .lock()
90            .await
91            .create_view_folder(request)
92            .await
93            .map_err(|status| SdkApiError {
94                status,
95                endpoint:
96                    "/com.coralogixapis.views.v1.services.ViewsFoldersService/CreateViewFolder"
97                        .into(),
98                feature_group: FEATURE_GROUP_ID.into(),
99            })?
100            .into_inner())
101    }
102
103    /// Replaces the existing [`ViewFolder`] identified by its id.
104    ///
105    /// # Arguments
106    /// * `folder` - The view folder to replace.
107    pub async fn replace(&self, folder: ViewFolder) -> Result<ReplaceViewFolderResponse> {
108        let request = make_request_with_metadata(
109            ReplaceViewFolderRequest {
110                folder: Some(folder),
111            },
112            &self.teams_level_metadata_map,
113        );
114        Ok(self
115            .service_client
116            .lock()
117            .await
118            .replace_view_folder(request)
119            .await
120            .map_err(|status| SdkApiError {
121                status,
122                endpoint: "/com.coralogixapis.views.v1.services.ViewFoldersService/ReplaceView"
123                    .to_string(),
124                feature_group: FEATURE_GROUP_ID.to_string(),
125            })?
126            .into_inner())
127    }
128
129    /// Deletes the [`ViewFolder`] identified by its id.
130    ///
131    /// # Arguments
132    /// * `id` - The id of the view folder to delete.
133    pub async fn delete(&self, id: String) -> Result<DeleteViewFolderResponse> {
134        let request = make_request_with_metadata(
135            DeleteViewFolderRequest { id: Some(id) },
136            &self.teams_level_metadata_map,
137        );
138        Ok(self
139            .service_client
140            .lock()
141            .await
142            .delete_view_folder(request)
143            .await
144            .map_err(|status| SdkApiError {
145                status,
146                endpoint:
147                    "/com.coralogixapis.views.v1.services.ViewsFoldersService/DeleteViewFolder"
148                        .to_string(),
149                feature_group: FEATURE_GROUP_ID.to_string(),
150            })?
151            .into_inner())
152    }
153
154    /// Retrieves the [`ViewFolder`] by id.
155    ///
156    /// # Arguments
157    /// * `id` - The id of the view folder to retrieve.
158    pub async fn get(&self, id: String) -> Result<Option<ViewFolder>> {
159        let request = make_request_with_metadata(
160            GetViewFolderRequest { id: Some(id) },
161            &self.teams_level_metadata_map,
162        );
163
164        Ok(self
165            .service_client
166            .lock()
167            .await
168            .get_view_folder(request)
169            .await
170            .map_err(|status| SdkApiError {
171                status,
172                endpoint: "/com.coralogixapis.views.v1.services.ViewsFoldersService/GetViewFolder"
173                    .to_string(),
174                feature_group: FEATURE_GROUP_ID.to_string(),
175            })?
176            .into_inner()
177            .folder)
178    }
179
180    /// Retrieves a list of all [`ViewFolder`]s.
181    ///     
182    /// # Returns
183    /// A list of all views.
184    pub async fn list(&self) -> Result<Vec<ViewFolder>> {
185        let request =
186            make_request_with_metadata(ListViewFoldersRequest {}, &self.teams_level_metadata_map);
187
188        Ok(self
189            .service_client
190            .lock()
191            .await
192            .list_view_folders(request)
193            .await
194            .map_err(|status| SdkApiError {
195                status,
196                endpoint:
197                    "/com.coralogixapis.views.v1.services.ViewsFoldersService/ListViewFolders"
198                        .to_string(),
199                feature_group: FEATURE_GROUP_ID.to_string(),
200            })?
201            .into_inner()
202            .folders)
203    }
204}