revolt_database/models/audit_logs/ops/
reference.rs1use revolt_result::Result;
2
3use crate::{AuditLogEntry, AuditLogQuery, ReferenceDb};
4
5use super::AbstractAuditLogs;
6
7#[async_trait]
8impl AbstractAuditLogs for ReferenceDb {
9 async fn insert_audit_log_entry(&self, entry: &AuditLogEntry) -> Result<()> {
11 self.audit_logs
12 .lock()
13 .await
14 .insert(entry.id.clone(), entry.clone());
15
16 Ok(())
17 }
18
19 async fn get_server_audit_logs(
21 &self,
22 server: &str,
23 query: AuditLogQuery,
24 ) -> Result<Vec<AuditLogEntry>> {
25 let lock = self.audit_logs.lock().await;
26
27 let mut logs = lock
28 .values()
29 .filter(|entry| {
30 if entry.server != server {
31 return false;
32 };
33
34 if let Some(user) = &query.user {
35 if &entry.user != user {
36 return false;
37 }
38 }
39
40 if query.target.is_some() && entry.target != query.target {
41 return false;
42 }
43
44 if let Some(before) = &query.before {
45 if &entry.id > before {
46 return false;
47 };
48 };
49
50 if let Some(after) = &query.after {
51 if &entry.id < after {
52 return false;
53 };
54 };
55
56 if let Some(action_types) = &query.r#type {
57 let entry_type = serde_json::to_value(entry.action.clone())
58 .unwrap()
59 .as_object()
60 .unwrap()
61 .get("type")
62 .unwrap()
63 .as_str()
64 .unwrap()
65 .to_string();
66
67 if !action_types.contains(&entry_type) {
68 return false;
69 }
70 };
71
72 true
73 })
74 .cloned()
75 .collect::<Vec<_>>();
76
77 logs.sort_by(|a, b| b.id.cmp(&a.id));
78 logs.truncate(query.limit as usize);
79 Ok(logs)
80 }
81}