revolt_database/models/user_settings/ops/
reference.rs

1use revolt_result::Result;
2
3use crate::ReferenceDb;
4use crate::UserSettings;
5
6use super::AbstractUserSettings;
7
8#[async_trait]
9impl AbstractUserSettings for ReferenceDb {
10    /// Fetch a subset of user settings
11    async fn fetch_user_settings(&'_ self, id: &str, filter: &'_ [String]) -> Result<UserSettings> {
12        let user_settings = self.user_settings.lock().await;
13        user_settings
14            .get(id)
15            .cloned()
16            .map(|settings| {
17                settings
18                    .into_iter()
19                    .filter(|(key, _)| filter.contains(key))
20                    .collect()
21            })
22            .ok_or_else(|| create_error!(NotFound))
23    }
24
25    /// Update a subset of user settings
26    async fn set_user_settings(&self, id: &str, settings: &UserSettings) -> Result<()> {
27        let mut user_settings = self.user_settings.lock().await;
28        if let Some(settings) = user_settings.get_mut(id) {
29            settings.extend(settings.clone());
30        } else {
31            user_settings.insert(id.to_string(), settings.clone());
32        }
33
34        Ok(())
35    }
36
37    /// Delete all user settings
38    async fn delete_user_settings(&self, id: &str) -> Result<()> {
39        let mut user_settings = self.user_settings.lock().await;
40        if user_settings.remove(id).is_some() {
41            Ok(())
42        } else {
43            Err(create_error!(NotFound))
44        }
45    }
46}