Skip to main content

busbar_sf_tooling/client/
logs.rs

1use 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    /// Get recent Apex logs.
9    ///
10    /// # Arguments
11    /// * `limit` - Maximum number of logs to return (defaults to 20)
12    #[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    /// Get the body of a specific Apex log.
23    #[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    /// Delete an Apex log.
44    #[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    /// Delete all Apex logs for the current user.
73    #[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}