cx_sdk/client/
dashboard_folders.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::str::FromStr;
16
17use crate::{
18    auth::AuthContext,
19    error::{
20        Result,
21        SdkApiError,
22        SdkError,
23    },
24    metadata::CallProperties,
25    util::make_request_with_metadata,
26};
27
28pub use crate::com::coralogixapis::actions::v2::Action;
29
30pub use cx_api::proto::com::coralogixapis::dashboards::v1::ast::*;
31use cx_api::proto::com::coralogixapis::dashboards::v1::services::{
32    CreateDashboardFolderRequest,
33    CreateDashboardFolderResponse,
34    DeleteDashboardFolderRequest,
35    DeleteDashboardFolderResponse,
36    GetDashboardFolderRequest,
37    GetDashboardFolderResponse,
38    ListDashboardFoldersRequest,
39    ListDashboardFoldersResponse,
40    ReplaceDashboardFolderRequest,
41    ReplaceDashboardFolderResponse,
42    dashboard_folders_service_client::DashboardFoldersServiceClient,
43};
44use tokio::sync::Mutex;
45use tonic::{
46    Request,
47    metadata::MetadataMap,
48    transport::{
49        Channel,
50        ClientTlsConfig,
51        Endpoint,
52    },
53};
54
55pub use cx_api::proto::com::coralogixapis::dashboards::v1::common::DashboardFolder;
56
57use crate::CoralogixRegion;
58
59const DASHBOARD_FOLDERS_FEATURE_GROUP_ID: &str = "dashboards";
60
61/// The Dashboard Folders API client.
62/// Read more at <https://coralogix.com/docs/custom-dashboards/>
63pub struct DashboardFoldersClient {
64    teams_level_metadata_map: MetadataMap,
65    user_level_metadata_map: MetadataMap,
66    service_client: Mutex<DashboardFoldersServiceClient<Channel>>,
67}
68
69impl DashboardFoldersClient {
70    /// Creates a new client for the Dashboard Folders API.
71    ///
72    /// # Arguments
73    /// * `auth_context` - The [`AuthContext`] to use for authentication.
74    /// * `region` - The [`CoralogixRegion`] to connect to.
75    pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
76        let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
77            .tls_config(ClientTlsConfig::new().with_native_roots())?
78            .connect_lazy();
79        let teams_level_auth_data: CallProperties = (&auth_context.team_level_api_key).into();
80        let user_level_auth_data: CallProperties = (&auth_context.user_level_api_key).into();
81        Ok(Self {
82            teams_level_metadata_map: teams_level_auth_data.to_metadata_map(),
83            user_level_metadata_map: user_level_auth_data.to_metadata_map(),
84            service_client: Mutex::new(DashboardFoldersServiceClient::new(channel)),
85        })
86    }
87
88    /// Creates a new dashboard folder.
89    ///
90    /// # Arguments
91    /// * `folder` - The [`DashboardFolder`] to create.
92    pub async fn create(&self, folder: DashboardFolder) -> Result<CreateDashboardFolderResponse> {
93        let request: Request<CreateDashboardFolderRequest> = make_request_with_metadata(
94            CreateDashboardFolderRequest {
95                folder: Some(folder),
96                request_id: None,
97            },
98            &self.teams_level_metadata_map,
99        );
100        {
101            let mut client = self.service_client.lock().await.clone();
102
103            client
104                .create_dashboard_folder(request)
105                .await
106                .map(|r| r.into_inner())
107                .map_err(
108                    |status| SdkError::ApiError(SdkApiError {
109                        status,
110                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardFoldersService/CreateDashboardFolder".to_string(),
111                        feature_group: DASHBOARD_FOLDERS_FEATURE_GROUP_ID.to_string(),
112                    }),
113                )
114        }
115    }
116
117    /// Replaces a dashboard folder.
118    ///
119    /// # Arguments
120    /// * `folder` - The [`DashboardFolder`] to replace.
121    pub async fn replace(&self, folder: DashboardFolder) -> Result<ReplaceDashboardFolderResponse> {
122        let request: Request<ReplaceDashboardFolderRequest> = make_request_with_metadata(
123            ReplaceDashboardFolderRequest {
124                request_id: None,
125                folder: Some(folder),
126            },
127            &self.teams_level_metadata_map,
128        );
129        {
130            let mut client = self.service_client.lock().await.clone();
131
132            client
133                .replace_dashboard_folder(request)
134                .await
135                .map(|r| r.into_inner())
136                .map_err(
137                    |status| SdkError::ApiError(SdkApiError {
138                        status,
139                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardFoldersService/ReplaceDashboardFolder".to_string(),
140                        feature_group: DASHBOARD_FOLDERS_FEATURE_GROUP_ID.to_string(),
141                    }),
142                )
143        }
144    }
145
146    /// Gets a dashboard folder by its ID.
147    ///
148    /// # Arguments
149    /// * `folder_id` - The ID of the dashboard to get.
150    pub async fn get(&self, folder_id: String) -> Result<GetDashboardFolderResponse> {
151        let request: Request<GetDashboardFolderRequest> = make_request_with_metadata(
152            GetDashboardFolderRequest {
153                request_id: None,
154                folder_id: Some(folder_id),
155            },
156            &self.teams_level_metadata_map,
157        );
158        {
159            let mut client = self.service_client.lock().await.clone();
160
161            client
162                .get_dashboard_folder(request)
163                .await
164                .map(|r| r.into_inner())
165                .map_err(
166                    |status| SdkError::ApiError(SdkApiError {
167                        status,
168                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardFoldersService/GetDashboardFolder".to_string(),
169                        feature_group: DASHBOARD_FOLDERS_FEATURE_GROUP_ID.to_string(),
170                    }),
171                )
172        }
173    }
174
175    /// Deletes a dashboard folder by its ID.
176    ///
177    /// # Arguments
178    /// * `folder_id` - The ID of the [`DashboardFolder`] to delete.
179    pub async fn delete(&self, folder_id: String) -> Result<DeleteDashboardFolderResponse> {
180        let request: Request<DeleteDashboardFolderRequest> = make_request_with_metadata(
181            DeleteDashboardFolderRequest {
182                request_id: None,
183                folder_id: Some(folder_id),
184            },
185            &self.teams_level_metadata_map,
186        );
187        {
188            let mut client = self.service_client.lock().await.clone();
189
190            client
191                .delete_dashboard_folder(request)
192                .await
193                .map(|r| r.into_inner())
194                .map_err(
195                    |status| SdkError::ApiError(SdkApiError {
196                        status,
197                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardFoldersService/DeleteDashboardFolder".to_string(),
198                        feature_group: DASHBOARD_FOLDERS_FEATURE_GROUP_ID.to_string(),
199                    }),
200                )
201        }
202    }
203
204    /// Lists all dashboard folders.
205    pub async fn list(&self) -> Result<ListDashboardFoldersResponse> {
206        let request = make_request_with_metadata(
207            ListDashboardFoldersRequest {},
208            &self.user_level_metadata_map,
209        );
210        {
211            let mut client = self.service_client.lock().await.clone();
212
213            client
214                .list_dashboard_folders(request)
215                .await
216                .map(|r| r.into_inner())
217                .map_err(
218                    |status| SdkError::ApiError(SdkApiError {
219                        status,
220                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardFoldersService/ListDashboardFolders".to_string(),
221                        feature_group: DASHBOARD_FOLDERS_FEATURE_GROUP_ID.to_string(),
222                    }),
223                )
224        }
225    }
226}