revolt_database/models/servers/ops/
reference.rs1use 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 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 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 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 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 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 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 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 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}