revolt_database/models/sessions/ops/
reference.rs1use crate::{AbstractSessions, ReferenceDb, Session};
2use iso8601_timestamp::Timestamp;
3use revolt_result::Result;
4
5#[async_trait]
6impl AbstractSessions for ReferenceDb {
7 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 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 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 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 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 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 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 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}