Skip to main content

revolt_database/models/sessions/ops/
reference.rs

1use crate::{AbstractSessions, ReferenceDb, Session};
2use iso8601_timestamp::Timestamp;
3use revolt_result::Result;
4
5#[async_trait]
6impl AbstractSessions for ReferenceDb {
7    /// Find session by id
8    async fn fetch_session(&self, id: &str) -> Result<Session> {
9        let sessions = self.sessions.lock().await;
10        sessions
11            .get(id)
12            .cloned()
13            .ok_or_else(|| create_error!(UnknownUser))
14    }
15
16    /// Find sessions by user id
17    async fn fetch_sessions(&self, user_id: &str) -> Result<Vec<Session>> {
18        let sessions = self.sessions.lock().await;
19        Ok(sessions
20            .values()
21            .filter(|session| session.user_id == user_id)
22            .cloned()
23            .collect())
24    }
25
26    /// Find sessions by user ids
27    async fn fetch_sessions_with_subscription(&self, user_ids: &[String]) -> Result<Vec<Session>> {
28        let sessions = self.sessions.lock().await;
29        Ok(sessions
30            .values()
31            .filter(|session| session.subscription.is_some() && user_ids.contains(&session.user_id))
32            .cloned()
33            .collect())
34    }
35
36    /// Find session by token
37    async fn fetch_session_by_token(&self, token: &str) -> Result<Session> {
38        let sessions = self.sessions.lock().await;
39        sessions
40            .values()
41            .find(|session| session.token == token)
42            .cloned()
43            .ok_or_else(|| create_error!(InvalidSession))
44    }
45
46    /// Save session
47    async fn save_session(&self, session: &Session) -> Result<()> {
48        let mut sessions = self.sessions.lock().await;
49        sessions.insert(session.id.to_string(), session.clone());
50        Ok(())
51    }
52
53    /// Delete session
54    async fn delete_session(&self, id: &str) -> Result<()> {
55        let mut sessions = self.sessions.lock().await;
56        if sessions.remove(id).is_some() {
57            Ok(())
58        } else {
59            Err(create_error!(InvalidSession))
60        }
61    }
62
63    /// Delete session
64    async fn delete_all_sessions(&self, user_id: &str, ignore: Option<String>) -> Result<()> {
65        let mut sessions = self.sessions.lock().await;
66        sessions.retain(|_, session| {
67            if session.user_id == user_id {
68                if let Some(ignore) = &ignore {
69                    ignore == &session.id
70                } else {
71                    false
72                }
73            } else {
74                true
75            }
76        });
77
78        Ok(())
79    }
80
81    /// Remove push subscription for a session by session id
82    async fn remove_push_subscription_by_session_id(&self, session_id: &str) -> Result<()> {
83        let mut sessions = self.sessions.lock().await;
84
85        if let Some(session) = sessions.get_mut(session_id) {
86            session.subscription = None;
87        };
88
89        Ok(())
90    }
91
92    async fn update_session_last_seen(&self, session_id: &str, when: Timestamp) -> Result<()> {
93        let mut sessions = self.sessions.lock().await;
94
95        if let Some(session) = sessions.get_mut(session_id) {
96            session.last_seen = when;
97        };
98
99        Ok(())
100    }
101}