]> Untitled Git - lemmy.git/blob - crates/websocket/src/lib.rs
b7ab5bf28b17680efb4f90b02094909361cabfc0
[lemmy.git] / crates / websocket / src / lib.rs
1 #[macro_use]
2 extern crate strum_macros;
3
4 use crate::chat_server::ChatServer;
5 use actix::Addr;
6 use background_jobs::QueueHandle;
7 use lemmy_db_schema::{source::secret::Secret, DbPool};
8 use lemmy_utils::{settings::structs::Settings, LemmyError};
9 use reqwest::Client;
10 use serde::Serialize;
11
12 pub mod chat_server;
13 pub mod handlers;
14 pub mod messages;
15 pub mod routes;
16 pub mod send;
17
18 pub struct LemmyContext {
19   pool: DbPool,
20   chat_server: Addr<ChatServer>,
21   client: Client,
22   activity_queue: QueueHandle,
23   settings: Settings,
24   secret: Secret,
25 }
26
27 impl LemmyContext {
28   pub fn create(
29     pool: DbPool,
30     chat_server: Addr<ChatServer>,
31     client: Client,
32     activity_queue: QueueHandle,
33     settings: Settings,
34     secret: Secret,
35   ) -> LemmyContext {
36     LemmyContext {
37       pool,
38       chat_server,
39       client,
40       activity_queue,
41       settings,
42       secret,
43     }
44   }
45   pub fn pool(&self) -> &DbPool {
46     &self.pool
47   }
48   pub fn chat_server(&self) -> &Addr<ChatServer> {
49     &self.chat_server
50   }
51   pub fn client(&self) -> &Client {
52     &self.client
53   }
54   pub fn activity_queue(&self) -> &QueueHandle {
55     &self.activity_queue
56   }
57   pub fn settings(&self) -> Settings {
58     // TODO hacky solution to be able to hotload the settings.
59     Settings::get()
60   }
61   pub fn secret(&self) -> &Secret {
62     &self.secret
63   }
64 }
65
66 impl Clone for LemmyContext {
67   fn clone(&self) -> Self {
68     LemmyContext {
69       pool: self.pool.clone(),
70       chat_server: self.chat_server.clone(),
71       client: self.client.clone(),
72       activity_queue: self.activity_queue.clone(),
73       settings: self.settings.clone(),
74       secret: self.secret.clone(),
75     }
76   }
77 }
78
79 #[derive(Serialize)]
80 struct WebsocketResponse<T> {
81   op: String,
82   data: T,
83 }
84
85 pub fn serialize_websocket_message<OP, Response>(
86   op: &OP,
87   data: &Response,
88 ) -> Result<String, LemmyError>
89 where
90   Response: Serialize,
91   OP: ToString,
92 {
93   let response = WebsocketResponse {
94     op: op.to_string(),
95     data,
96   };
97   Ok(serde_json::to_string(&response)?)
98 }
99
100 #[derive(EnumString, ToString, Debug, Clone)]
101 pub enum UserOperation {
102   Login,
103   GetCaptcha,
104   MarkCommentAsRead,
105   SaveComment,
106   CreateCommentLike,
107   CreateCommentReport,
108   ResolveCommentReport,
109   ListCommentReports,
110   CreatePostLike,
111   LockPost,
112   StickyPost,
113   SavePost,
114   CreatePostReport,
115   ResolvePostReport,
116   ListPostReports,
117   GetReportCount,
118   GetUnreadCount,
119   FollowCommunity,
120   GetReplies,
121   GetPersonMentions,
122   MarkPersonMentionAsRead,
123   GetModlog,
124   BanFromCommunity,
125   AddModToCommunity,
126   AddAdmin,
127   BanPerson,
128   Search,
129   ResolveObject,
130   MarkAllAsRead,
131   SaveUserSettings,
132   TransferCommunity,
133   TransferSite,
134   PasswordReset,
135   PasswordChange,
136   MarkPrivateMessageAsRead,
137   UserJoin,
138   GetSiteConfig,
139   SaveSiteConfig,
140   PostJoin,
141   CommunityJoin,
142   ModJoin,
143   ChangePassword,
144   GetSiteMetadata,
145   BlockCommunity,
146   BlockPerson,
147 }
148
149 #[derive(EnumString, ToString, Debug, Clone)]
150 pub enum UserOperationCrud {
151   // Site
152   CreateSite,
153   GetSite,
154   EditSite,
155   // Community
156   CreateCommunity,
157   ListCommunities,
158   GetCommunity,
159   EditCommunity,
160   DeleteCommunity,
161   RemoveCommunity,
162   // Post
163   CreatePost,
164   GetPost,
165   GetPosts,
166   EditPost,
167   DeletePost,
168   RemovePost,
169   // Comment
170   CreateComment,
171   GetComments,
172   EditComment,
173   DeleteComment,
174   RemoveComment,
175   // User
176   Register,
177   GetPersonDetails,
178   DeleteAccount,
179   // Private Message
180   CreatePrivateMessage,
181   GetPrivateMessages,
182   EditPrivateMessage,
183   DeletePrivateMessage,
184 }
185
186 pub trait OperationType {}
187
188 impl OperationType for UserOperationCrud {}
189
190 impl OperationType for UserOperation {}