1use 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    AssignDashboardFolderRequest,
33    AssignDashboardFolderResponse,
34    CreateDashboardRequest,
35    CreateDashboardResponse,
36    DeleteDashboardRequest,
37    DeleteDashboardResponse,
38    GetDashboardCatalogRequest,
39    GetDashboardCatalogResponse,
40    GetDashboardRequest,
41    GetDashboardResponse,
42    PinDashboardRequest,
43    PinDashboardResponse,
44    ReplaceDashboardRequest,
45    ReplaceDashboardResponse,
46    UnpinDashboardRequest,
47    UnpinDashboardResponse,
48    dashboard_catalog_service_client::DashboardCatalogServiceClient,
49    dashboards_service_client::DashboardsServiceClient,
50};
51use tokio::sync::Mutex;
52use tonic::{
53    Request,
54    metadata::MetadataMap,
55    transport::{
56        Channel,
57        ClientTlsConfig,
58        Endpoint,
59    },
60};
61
62const DASHBOARDS_FEATURE_GROUP_ID: &str = "dashboards";
63
64use crate::CoralogixRegion;
65
66pub struct DashboardsClient {
69    teams_level_metadata_map: MetadataMap,
70    user_level_metadata_map: MetadataMap,
71    service_client: Mutex<DashboardsServiceClient<Channel>>,
72    catalog_client: Mutex<DashboardCatalogServiceClient<Channel>>,
73}
74
75impl DashboardsClient {
76    pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
82        let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
83            .tls_config(ClientTlsConfig::new().with_native_roots())?
84            .connect_lazy();
85        let teams_level_auth_data: CallProperties = (&auth_context.team_level_api_key).into();
86        let user_level_auth_data: CallProperties = (&auth_context.user_level_api_key).into();
87        Ok(Self {
88            teams_level_metadata_map: teams_level_auth_data.to_metadata_map(),
89            user_level_metadata_map: user_level_auth_data.to_metadata_map(),
90            service_client: Mutex::new(DashboardsServiceClient::new(channel.clone())),
91            catalog_client: Mutex::new(DashboardCatalogServiceClient::new(channel)),
92        })
93    }
94
95    pub async fn create(
100        &self,
101        dashboard: Dashboard,
102        is_locked: bool,
103    ) -> Result<CreateDashboardResponse> {
104        let request: Request<CreateDashboardRequest> = make_request_with_metadata(
105            CreateDashboardRequest {
106                request_id: None,
107                dashboard: Some(dashboard),
108                is_locked: Some(is_locked),
109            },
110            &self.teams_level_metadata_map,
111        );
112        {
113            let mut client = self.service_client.lock().await.clone();
114
115            client
116                .create_dashboard(request)
117                .await
118                .map(|r| r.into_inner())
119                .map_err(|status| {
120                    SdkError::ApiError(SdkApiError {
121                        status,
122                        endpoint:
123                            "/com.coralogixapis.dashboards.v1.DashboardsService/CreateDashboard"
124                                .into(),
125                        feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
126                    })
127                })
128        }
129    }
130
131    pub async fn replace(
136        &self,
137        dashboard: Dashboard,
138        is_locked: bool,
139    ) -> Result<ReplaceDashboardResponse> {
140        let request: Request<ReplaceDashboardRequest> = make_request_with_metadata(
141            ReplaceDashboardRequest {
142                request_id: None,
143                dashboard: Some(dashboard),
144                is_locked: Some(is_locked),
145            },
146            &self.teams_level_metadata_map,
147        );
148        {
149            let mut client = self.service_client.lock().await.clone();
150
151            client
152                .replace_dashboard(request)
153                .await
154                .map(|r| r.into_inner())
155                .map_err(|status| {
156                    SdkError::ApiError(SdkApiError {
157                        status,
158                        endpoint:
159                            "/com.coralogixapis.dashboards.v1.DashboardsService/ReplaceDashboard"
160                                .into(),
161                        feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
162                    })
163                })
164        }
165    }
166
167    pub async fn get(&self, dashboard_id: String) -> Result<GetDashboardResponse> {
172        let request: Request<GetDashboardRequest> = make_request_with_metadata(
173            GetDashboardRequest {
174                dashboard_id: Some(dashboard_id),
175            },
176            &self.teams_level_metadata_map,
177        );
178        {
179            let mut client = self.service_client.lock().await.clone();
180
181            client
182                .get_dashboard(request)
183                .await
184                .map(|r| r.into_inner())
185                .map_err(|status| {
186                    SdkError::ApiError(SdkApiError {
187                        status,
188                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardsService/GetDashboard"
189                            .into(),
190                        feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
191                    })
192                })
193        }
194    }
195
196    pub async fn list(&self) -> Result<GetDashboardCatalogResponse> {
198        let mut client = self.catalog_client.lock().await.clone();
199
200        client
201            .get_dashboard_catalog(make_request_with_metadata(
202                GetDashboardCatalogRequest {},
203                &self.user_level_metadata_map,
204            ))
205            .await
206            .map(|r| r.into_inner())
207            .map_err(
208                |status| SdkError::ApiError(SdkApiError {
209                    status,
210                    endpoint: "/com.coralogixapis.dashboards.v1.DashboardCatalogService/GetDashboardCatalog".into(),
211                    feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
212                },
213            ))
214    }
215
216    pub async fn delete(&self, dashboard_id: String) -> Result<DeleteDashboardResponse> {
221        let request: Request<DeleteDashboardRequest> = make_request_with_metadata(
222            DeleteDashboardRequest {
223                request_id: None,
224                dashboard_id: Some(dashboard_id),
225            },
226            &self.teams_level_metadata_map,
227        );
228        {
229            let mut client = self.service_client.lock().await.clone();
230
231            client
232                .delete_dashboard(request)
233                .await
234                .map(|r| r.into_inner())
235                .map_err(|status| {
236                    SdkError::ApiError(SdkApiError {
237                        status,
238                        endpoint:
239                            "/com.coralogixapis.dashboards.v1.DashboardsService/DeleteDashboard"
240                                .into(),
241                        feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
242                    })
243                })
244        }
245    }
246
247    pub async fn pin(&self, dashboard_id: String) -> Result<PinDashboardResponse> {
252        let request: Request<PinDashboardRequest> = make_request_with_metadata(
253            PinDashboardRequest {
254                request_id: None,
255                dashboard_id: Some(dashboard_id),
256            },
257            &self.user_level_metadata_map,
258        );
259        {
260            let mut client = self.service_client.lock().await.clone();
261
262            client
263                .pin_dashboard(request)
264                .await
265                .map(|r| r.into_inner())
266                .map_err(|status| {
267                    SdkError::ApiError(SdkApiError {
268                        status,
269                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardsService/PinDashboard"
270                            .into(),
271                        feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
272                    })
273                })
274        }
275    }
276
277    pub async fn unpin(&self, dashboard_id: String) -> Result<UnpinDashboardResponse> {
282        let request: Request<UnpinDashboardRequest> = make_request_with_metadata(
283            UnpinDashboardRequest {
284                request_id: None,
285                dashboard_id: Some(dashboard_id),
286            },
287            &self.user_level_metadata_map,
288        );
289        {
290            let mut client = self.service_client.lock().await.clone();
291
292            client
293                .unpin_dashboard(request)
294                .await
295                .map(|r| r.into_inner())
296                .map_err(|status| {
297                    SdkError::ApiError(SdkApiError {
298                        status,
299                        endpoint:
300                            "/com.coralogixapis.dashboards.v1.DashboardsService/UnpinDashboard"
301                                .into(),
302                        feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
303                    })
304                })
305        }
306    }
307
308    pub async fn assign_to_folder(
314        &self,
315        dashboard_id: String,
316        folder_id: String,
317    ) -> Result<AssignDashboardFolderResponse> {
318        let request: Request<AssignDashboardFolderRequest> = make_request_with_metadata(
319            AssignDashboardFolderRequest {
320                request_id: None,
321                dashboard_id: Some(dashboard_id),
322                folder_id: Some(folder_id),
323            },
324            &self.teams_level_metadata_map,
325        );
326        {
327            let mut client = self.service_client.lock().await.clone();
328
329            client
330                .assign_dashboard_folder(request)
331                .await
332                .map(|r| r.into_inner())
333                .map_err(
334                    |status| SdkError::ApiError(SdkApiError {
335                        status,
336                        endpoint: "/com.coralogixapis.dashboards.v1.DashboardsService/AssignDashboardFolder".into(),
337                        feature_group: DASHBOARDS_FEATURE_GROUP_ID.into(),
338                    },
339                ))
340        }
341    }
342}