Skip to main content

revolt_database/models/audit_logs/ops/
reference.rs

1use revolt_result::Result;
2
3use crate::{AuditLogEntry, AuditLogQuery, ReferenceDb};
4
5use super::AbstractAuditLogs;
6
7#[async_trait]
8impl AbstractAuditLogs for ReferenceDb {
9    /// Inserts an entry into the server's audit log
10    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    /// Fetches a server's audit logs using the provided query options
20    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}