Skip to main content

revolt_database/models/servers/ops/
reference.rs

1use revolt_result::Result;
2
3use crate::ReferenceDb;
4use crate::{FieldsRole, FieldsServer, PartialRole, PartialServer, Role, Server};
5
6use super::AbstractServers;
7
8#[async_trait]
9impl AbstractServers for ReferenceDb {
10    /// Insert a new server into database
11    async fn insert_server(&self, server: &Server) -> Result<()> {
12        let mut servers = self.servers.lock().await;
13        if servers.contains_key(&server.id) {
14            Err(create_database_error!("insert", "server"))
15        } else {
16            servers.insert(server.id.to_string(), server.clone());
17            Ok(())
18        }
19    }
20
21    /// Fetch a server by its id
22    async fn fetch_server(&self, id: &str) -> Result<Server> {
23        let servers = self.servers.lock().await;
24        servers
25            .get(id)
26            .cloned()
27            .ok_or_else(|| create_error!(NotFound))
28    }
29
30    /// Fetch a servers by their ids
31    async fn fetch_servers<'a>(&self, ids: &'a [String]) -> Result<Vec<Server>> {
32        let servers = self.servers.lock().await;
33        ids.iter()
34            .map(|id| {
35                servers
36                    .get(id)
37                    .cloned()
38                    .ok_or_else(|| create_error!(NotFound))
39            })
40            .collect()
41    }
42
43    async fn fetch_owned_servers(&self, user_id: &str) -> Result<Vec<Server>> {
44        let servers = self.servers.lock().await;
45
46        Ok(servers
47            .values()
48            .filter(|server| server.owner == user_id)
49            .cloned()
50            .collect())
51    }
52
53    /// Update a server with new information
54    async fn update_server(
55        &self,
56        id: &str,
57        partial: &PartialServer,
58        remove: Vec<FieldsServer>,
59    ) -> Result<()> {
60        let mut servers = self.servers.lock().await;
61        if let Some(server) = servers.get_mut(id) {
62            for field in remove {
63                #[allow(clippy::disallowed_methods)]
64                server.remove_field(&field);
65            }
66
67            server.apply_options(partial.clone());
68            Ok(())
69        } else {
70            Err(create_error!(NotFound))
71        }
72    }
73
74    /// Delete a server by its id
75    async fn delete_server(&self, id: &str) -> Result<()> {
76        let mut servers = self.servers.lock().await;
77        if servers.remove(id).is_some() {
78            Ok(())
79        } else {
80            Err(create_error!(NotFound))
81        }
82    }
83
84    /// Insert a new role into server object
85    async fn insert_role(&self, server_id: &str, role: &Role) -> Result<()> {
86        let mut servers = self.servers.lock().await;
87        if let Some(server) = servers.get_mut(server_id) {
88            server.roles.insert(role.id.clone(), role.clone());
89            Ok(())
90        } else {
91            Err(create_error!(NotFound))
92        }
93    }
94
95    /// Update an existing role on a server
96    async fn update_role(
97        &self,
98        server_id: &str,
99        role_id: &str,
100        partial: &PartialRole,
101        remove: Vec<FieldsRole>,
102    ) -> Result<()> {
103        let mut servers = self.servers.lock().await;
104        if let Some(server) = servers.get_mut(server_id) {
105            if let Some(role) = server.roles.get_mut(role_id) {
106                for field in remove {
107                    #[allow(clippy::disallowed_methods)]
108                    role.remove_field(&field);
109                }
110
111                role.apply_options(partial.clone());
112                Ok(())
113            } else {
114                Err(create_error!(NotFound))
115            }
116        } else {
117            Err(create_error!(NotFound))
118        }
119    }
120
121    /// Delete a role from a server
122    ///
123    /// Also updates channels and members.
124    async fn delete_role(&self, server_id: &str, role_id: &str) -> Result<()> {
125        let mut servers = self.servers.lock().await;
126        if let Some(server) = servers.get_mut(server_id) {
127            if server.roles.remove(role_id).is_some() {
128                Ok(())
129            } else {
130                Err(create_error!(NotFound))
131            }
132        } else {
133            Err(create_error!(NotFound))
134        }
135    }
136}