revolt_database/models/server_bans/ops/
reference.rs

1use revolt_result::Result;
2
3use crate::ReferenceDb;
4use crate::{MemberCompositeKey, ServerBan};
5
6use super::AbstractServerBans;
7
8#[async_trait]
9impl AbstractServerBans for ReferenceDb {
10    /// Insert new ban into database
11    async fn insert_ban(&self, ban: &ServerBan) -> Result<()> {
12        let mut server_bans = self.server_bans.lock().await;
13        if server_bans.contains_key(&ban.id) {
14            Err(create_database_error!("insert", "ban"))
15        } else {
16            server_bans.insert(ban.id.clone(), ban.clone());
17            Ok(())
18        }
19    }
20
21    /// Fetch a server ban by server and user id
22    async fn fetch_ban(&self, server_id: &str, user_id: &str) -> Result<ServerBan> {
23        let server_bans = self.server_bans.lock().await;
24        server_bans
25            .get(&MemberCompositeKey {
26                server: server_id.to_string(),
27                user: user_id.to_string(),
28            })
29            .cloned()
30            .ok_or_else(|| create_error!(NotFound))
31    }
32
33    /// Fetch all bans in a server
34    async fn fetch_bans(&self, server_id: &str) -> Result<Vec<ServerBan>> {
35        let server_bans = self.server_bans.lock().await;
36        Ok(server_bans
37            .values()
38            .filter(|member| member.id.server == server_id)
39            .cloned()
40            .collect())
41    }
42
43    /// Delete a ban from the database
44    async fn delete_ban(&self, id: &MemberCompositeKey) -> Result<()> {
45        let mut server_bans = self.server_bans.lock().await;
46        if server_bans.remove(id).is_some() {
47            Ok(())
48        } else {
49            Err(create_error!(NotFound))
50        }
51    }
52}