revolt_database/models/channel_invites/ops/
reference.rs

1use revolt_result::Result;
2
3use crate::Invite;
4use crate::ReferenceDb;
5
6use super::AbstractChannelInvites;
7
8#[async_trait]
9impl AbstractChannelInvites for ReferenceDb {
10    /// Insert a new invite into the database
11    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    /// Fetch an invite by the code
22    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    /// Fetch all invites for a server
31    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    /// Delete an invite by its code
44    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}