sos_backend/
system_messages.rs

1use crate::{BackendTarget, Error};
2use async_trait::async_trait;
3use sos_core::AccountId;
4use sos_database::SystemMessagesProvider as DbSystemMessages;
5use sos_filesystem::SystemMessagesProvider as FsSystemMessages;
6use sos_system_messages::{
7    SysMessage, SysMessageCount, SystemMessageManager, SystemMessageMap,
8    SystemMessageStorage, SystemMessages as SystemMessagesImpl,
9};
10use tokio::sync::broadcast;
11use urn::Urn;
12
13/// Collection of system messages for an account.
14pub struct SystemMessages(SystemMessagesImpl<Error>);
15
16impl SystemMessages {
17    /// Create new system messages.
18    pub fn new(target: BackendTarget, account_id: &AccountId) -> Self {
19        match target {
20            BackendTarget::FileSystem(paths) => {
21                Self(SystemMessagesImpl::<Error>::new(Box::new(
22                    FsSystemMessages::new(paths.clone()),
23                )))
24            }
25            BackendTarget::Database(_, client) => {
26                Self(SystemMessagesImpl::<Error>::new(Box::new(
27                    DbSystemMessages::new(*account_id, client),
28                )))
29            }
30        }
31    }
32}
33
34#[async_trait]
35impl SystemMessageManager for SystemMessages {
36    type Error = Error;
37
38    async fn load_system_messages(&mut self) -> Result<(), Self::Error> {
39        self.0.load_system_messages().await
40    }
41
42    fn subscribe(&self) -> broadcast::Receiver<SysMessageCount> {
43        self.0.subscribe()
44    }
45
46    fn len(&self) -> usize {
47        self.0.len()
48    }
49
50    fn is_empty(&self) -> bool {
51        self.0.is_empty()
52    }
53
54    fn counts(&self) -> SysMessageCount {
55        self.0.counts()
56    }
57
58    fn iter(&self) -> impl Iterator<Item = (&Urn, &SysMessage)> {
59        self.0.iter()
60    }
61
62    fn get(&self, key: &Urn) -> Option<&SysMessage> {
63        self.0.get(key)
64    }
65
66    fn sorted_list(&self) -> Vec<(&Urn, &SysMessage)> {
67        self.0.sorted_list()
68    }
69}
70
71#[async_trait]
72impl SystemMessageStorage for SystemMessages {
73    type Error = Error;
74
75    async fn list_system_messages(
76        &self,
77    ) -> Result<SystemMessageMap, Self::Error> {
78        self.0.list_system_messages().await
79    }
80
81    async fn insert_system_message(
82        &mut self,
83        key: Urn,
84        message: SysMessage,
85    ) -> Result<(), Self::Error> {
86        self.0.insert_system_message(key, message).await
87    }
88
89    async fn remove_system_message(
90        &mut self,
91        key: &Urn,
92    ) -> Result<(), Self::Error> {
93        self.0.remove_system_message(key).await
94    }
95
96    async fn mark_system_message(
97        &mut self,
98        key: &Urn,
99        is_read: bool,
100    ) -> Result<(), Self::Error> {
101        self.0.mark_system_message(key, is_read).await
102    }
103
104    async fn clear_system_messages(&mut self) -> Result<(), Self::Error> {
105        self.0.clear_system_messages().await
106    }
107}