alfresco_sdk/alfresco/core_api/audit/
mod.rs

1use reqwest::Client;
2use base64::{Engine as _, engine::general_purpose};
3use serde_json::json;
4use crate::models::structs::{AuditApp, AuditAppPagingList, AuditEntryEntry, AuditEntryPaging};
5
6use anyhow::Result;
7use crate::alfresco::params::QueryParamsBuilder;
8
9pub struct AuditApi {
10    pub base_url: String,
11    pub client: Client,
12}
13
14impl AuditApi {
15    pub fn new(base_url: &str, client: Client) -> Self {
16        AuditApi {
17            base_url: format!("{}/alfresco/api/-default-/public/alfresco/versions/1", base_url),
18            client,
19        }
20    }
21
22    pub async fn list_audit_applications(&self, ticket: &str, skip_count: Option<&u32>, max_items: Option<&u32>, fields: Option<&Vec<String>>) -> Result<AuditAppPagingList> {
23        let formatted_url = format!("{}/audit-applications", self.base_url);
24        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
25
26        let mut params_builder = QueryParamsBuilder::new()
27            .set_skip_count(skip_count)
28            .set_max_items(max_items);
29
30        if let Some(field_list) = fields {
31            for field in field_list {
32                params_builder = params_builder.push_field(Some(field));
33            }
34        }
35
36
37        let raw_response = self.client.get(&formatted_url)
38            .header("Authorization", format!("Basic {}", ticket_b64))
39            .query(&params_builder.build())
40            .send()
41            .await?;
42
43        let parsed = raw_response.json::<AuditAppPagingList>().await?;
44
45        Ok(parsed)
46    }
47
48    pub async fn get_audit_application_info(&self, ticket: &str, audit_application_id: &str, fields: Option<&Vec<String>>, include: Option<&Vec<String>>) -> Result<AuditApp> {
49        let formatted_url = format!("{}/audit-applications/{}", self.base_url, audit_application_id);
50        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
51
52        let mut params_builder = QueryParamsBuilder::new();
53
54        if let Some(field_list) = fields {
55            for field in field_list {
56                params_builder = params_builder.push_field(Some(field));
57            }
58        }
59
60        if let Some(include_list) = include {
61            for include_value in include_list {
62                params_builder = params_builder.push_field(Some(include_value));
63            }
64        }
65
66        let raw_response = self.client.get(&formatted_url)
67            .header("Authorization", format!("Basic {}", ticket_b64))
68            .query(&params_builder.build())
69            .send()
70            .await?;
71
72        let parsed = raw_response.json::<AuditApp>().await?;
73
74        Ok(parsed)
75    }
76
77    pub async fn update_audit_application_info(&self, ticket: &str, audit_application_id: &str, fields: Option<&Vec<String>>, is_enabled: &bool) -> Result<AuditApp> {
78        let formatted_url = format!("{}/audit-applications/{}", self.base_url, audit_application_id);
79        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
80
81        let mut params_builder = QueryParamsBuilder::new();
82
83        if let Some(field_list) = fields {
84            for field in field_list {
85                params_builder = params_builder.push_field(Some(field));
86            }
87        }
88
89        let body = json!({
90            "isEnabled": &is_enabled,
91        });
92
93        let raw_response = self.client.put(&formatted_url)
94            .header("Authorization", format!("Basic {}", ticket_b64))
95            .query(&params_builder.build())
96            .json(&body)
97            .send()
98            .await?;
99
100        let parsed = raw_response.json::<AuditApp>().await?;
101
102        Ok(parsed)
103    }
104
105    pub async fn list_audit_entries_for_audit_app(&self, ticket: &str,audit_application_id: &str, skip_count: Option<&u32>, omit_total_items: Option<&bool>, order_by: Option<&Vec<String>>, max_items: Option<&u32>, where_filter: Option<&String>, include: Option<&Vec<String>>, fields: Option<&Vec<String>>) -> Result<AuditEntryPaging> {
106        let formatted_url = format!("{}/audit-applications/{}/audit-entries", self.base_url, audit_application_id);
107        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
108
109        let mut params_builder = QueryParamsBuilder::new()
110            .set_skip_count(skip_count)
111            .set_omit_total_items(omit_total_items)
112            .set_max_items(max_items)
113            .set_where_filter(where_filter);
114
115        if let Some(order_list) = order_by {
116            for order_value in order_list {
117                params_builder = params_builder.push_order_by(Some(order_value));
118            }
119        }
120
121        if let Some(field_list) = fields {
122            for field in field_list {
123                params_builder = params_builder.push_field(Some(field));
124            }
125        }
126
127        if let Some(include_list) = include {
128            for include_value in include_list {
129                params_builder = params_builder.push_include(Some(include_value));
130            }
131        }
132
133        let raw_response = self.client.get(&formatted_url)
134            .header("Authorization", format!("Basic {}", ticket_b64))
135            .query(&params_builder.build())
136            .send()
137            .await?;
138
139        let parsed = raw_response.json::<AuditEntryPaging>().await?;
140
141        Ok(parsed)
142    }
143
144    pub async fn permanently_delete_audit_entries_for_audit_app(&self, ticket: &str, audit_application_id: &str, where_filter: &String, ) -> Result<AuditEntryPaging> {
145        let formatted_url = format!("{}/audit-applications/{}/audit-entries", self.base_url, audit_application_id);
146        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
147
148        let mut params_builder = QueryParamsBuilder::new()
149            .set_where_filter(Some(where_filter));
150
151        let raw_response = self.client.delete(&formatted_url)
152            .header("Authorization", format!("Basic {}", ticket_b64))
153            .query(&params_builder.build())
154            .send()
155            .await?;
156
157        let parsed = raw_response.json::<AuditEntryPaging>().await?;
158
159        Ok(parsed)
160    }
161
162    pub async fn get_audit_entry(&self, ticket: &str, audit_application_id: &str, audit_entry_id: &str, fields: Option<&Vec<String>>) -> Result<AuditEntryEntry> {
163        let formatted_url = format!("{}/audit-applications/{}/audit-entries/{}", self.base_url, audit_application_id, audit_entry_id);
164        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
165
166        let mut params_builder = QueryParamsBuilder::new();
167
168        if let Some(field_list) = fields {
169            for field in field_list {
170                params_builder = params_builder.push_field(Some(field));
171            }
172        }
173
174        let raw_response = self.client.get(&formatted_url)
175            .header("Authorization", format!("Basic {}", ticket_b64))
176            .query(&params_builder.build())
177            .send()
178            .await?;
179
180        let parsed = raw_response.json::<AuditEntryEntry>().await?;
181
182        Ok(parsed)
183    }
184
185    pub async fn permanently_delete_audit_entry(&self, ticket: &str, audit_application_id: &str, audit_entry_id: &str) -> Result<String> {
186        let formatted_url = format!("{}/audit-applications/{}/audit-entries/{}", self.base_url, audit_application_id, audit_entry_id);
187        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
188
189        let raw_response = self.client.delete(&formatted_url)
190            .header("Authorization", format!("Basic {}", ticket_b64))
191            .send()
192            .await?;
193
194        let status_code = raw_response.status().as_u16();
195
196        match status_code {
197            204 => Ok("Successfully deleted audit entry".to_string()),
198            400 => Ok("Invalid parameter: auditApplicationId  or auditEntryId is not a valid format".to_string()),
199            401 => Ok("Authentication failed".to_string()),
200            403 => Ok("Current user does not have permission to delete audit information".to_string()),
201            404 => Ok("auditApplicationId or auditEntryId does not exist".to_string()),
202            501 => Ok("Audit is disabled for the system".to_string()),
203            _ => Err(anyhow::Error::from(std::io::Error::new(std::io::ErrorKind::Other, "Something went wrong and I don't know what it is")))
204        }
205    }
206
207    pub async fn list_audit_entries_for_node(&self, ticket: &str, node_id: &str, skip_count: Option<&u32>, order_by: Option<&Vec<String>>, max_items: Option<&u32>, where_filter: Option<&String>, include: Option<&Vec<String>>, fields: Option<&Vec<String>>) -> Result<AuditEntryPaging> {
208        let formatted_url = format!("{}/nodes/{}/audit-entries", self.base_url, node_id);
209        let ticket_b64 = general_purpose::STANDARD.encode(ticket);
210
211        let mut params_builder = QueryParamsBuilder::new()
212            .set_skip_count(skip_count)
213            .set_max_items(max_items)
214            .set_where_filter(where_filter);
215
216
217        if let Some(order_list) = order_by {
218            for order_value in order_list {
219                params_builder = params_builder.push_order_by(Some(order_value));
220            }
221        }
222
223        if let Some(field_list) = fields {
224            for field in field_list {
225                params_builder = params_builder.push_field(Some(field));
226            }
227        }
228
229        if let Some(include_list) = include {
230            for include_value in include_list {
231                params_builder = params_builder.push_include(Some(include_value));
232            }
233        }
234
235        let raw_response = self.client.get(&formatted_url)
236            .header("Authorization", format!("Basic {}", ticket_b64))
237            .query(&params_builder.build())
238            .send()
239            .await?;
240
241        let parsed = raw_response.json::<AuditEntryPaging>().await?;
242
243        Ok(parsed)
244    }
245}