sos_backend/
system_messages.rs1use 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
13pub struct SystemMessages(SystemMessagesImpl<Error>);
15
16impl SystemMessages {
17 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}