busbar_sf_tooling/client/
logs.rs1use busbar_sf_client::security::url as url_security;
2use tracing::instrument;
3
4use crate::error::{Error, ErrorKind, Result};
5use crate::types::ApexLog;
6
7impl super::ToolingClient {
8 #[instrument(skip(self))]
13 pub async fn get_apex_logs(&self, limit: Option<u32>) -> Result<Vec<ApexLog>> {
14 let limit = limit.unwrap_or(20);
15 let soql = format!(
16 "SELECT Id, LogUserId, LogUser.Name, LogLength, LastModifiedDate, StartTime, Status, Operation, Request, Application, DurationMilliseconds, Location FROM ApexLog ORDER BY LastModifiedDate DESC LIMIT {}",
17 limit
18 );
19 self.query_all(&soql).await
20 }
21
22 #[instrument(skip(self))]
24 pub async fn get_apex_log_body(&self, log_id: &str) -> Result<String> {
25 if !url_security::is_valid_salesforce_id(log_id) {
26 return Err(Error::new(ErrorKind::Salesforce {
27 error_code: "INVALID_ID".to_string(),
28 message: "Invalid Salesforce ID format".to_string(),
29 }));
30 }
31 let url = format!(
32 "{}/services/data/v{}/tooling/sobjects/ApexLog/{}/Body",
33 self.client.instance_url(),
34 self.client.api_version(),
35 log_id
36 );
37
38 let request = self.client.get(&url);
39 let response = self.client.execute(request).await?;
40 response.text().await.map_err(Into::into)
41 }
42
43 #[instrument(skip(self))]
45 pub async fn delete_apex_log(&self, log_id: &str) -> Result<()> {
46 if !url_security::is_valid_salesforce_id(log_id) {
47 return Err(Error::new(ErrorKind::Salesforce {
48 error_code: "INVALID_ID".to_string(),
49 message: "Invalid Salesforce ID format".to_string(),
50 }));
51 }
52 let url = format!(
53 "{}/services/data/v{}/tooling/sobjects/ApexLog/{}",
54 self.client.instance_url(),
55 self.client.api_version(),
56 log_id
57 );
58
59 let request = self.client.delete(&url);
60 let response = self.client.execute(request).await?;
61
62 if response.status() == 204 || response.is_success() {
63 Ok(())
64 } else {
65 Err(Error::new(ErrorKind::Salesforce {
66 error_code: "DELETE_FAILED".to_string(),
67 message: format!("Failed to delete log: status {}", response.status()),
68 }))
69 }
70 }
71
72 #[instrument(skip(self))]
74 pub async fn delete_all_apex_logs(&self) -> Result<u32> {
75 let logs = self.get_apex_logs(Some(200)).await?;
76 let count = logs.len() as u32;
77
78 for log in logs {
79 self.delete_apex_log(&log.id).await?;
80 }
81
82 Ok(count)
83 }
84}