revolt_database/models/channel_invites/ops/
reference.rs1use revolt_result::Result;
2
3use crate::Invite;
4use crate::ReferenceDb;
5
6use super::AbstractChannelInvites;
7
8#[async_trait]
9impl AbstractChannelInvites for ReferenceDb {
10 async fn insert_invite(&self, invite: &Invite) -> Result<()> {
12 let mut invites = self.channel_invites.lock().await;
13 if invites.contains_key(invite.code()) {
14 Err(create_database_error!("insert", "invite"))
15 } else {
16 invites.insert(invite.code().to_string(), invite.clone());
17 Ok(())
18 }
19 }
20
21 async fn fetch_invite(&self, code: &str) -> Result<Invite> {
23 let invites = self.channel_invites.lock().await;
24 invites
25 .get(code)
26 .cloned()
27 .ok_or_else(|| create_error!(NotFound))
28 }
29
30 async fn fetch_invites_for_server(&self, server_id: &str) -> Result<Vec<Invite>> {
32 let invites = self.channel_invites.lock().await;
33 Ok(invites
34 .values()
35 .filter(|invite| match invite {
36 Invite::Server { server, .. } => server == server_id,
37 _ => false,
38 })
39 .cloned()
40 .collect())
41 }
42
43 async fn delete_invite(&self, code: &str) -> Result<()> {
45 let mut invites = self.channel_invites.lock().await;
46 if invites.remove(code).is_some() {
47 Ok(())
48 } else {
49 Err(create_error!(NotFound))
50 }
51 }
52}