]> Untitled Git - lemmy.git/blob - crates/api_crud/src/lib.rs
Fix API and clippy warnings
[lemmy.git] / crates / api_crud / src / lib.rs
1 use actix_web::{web, web::Data};
2 use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*};
3 use lemmy_utils::{ConnectionId, LemmyError};
4 use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperationCrud};
5 use serde::Deserialize;
6
7 mod comment;
8 mod community;
9 mod post;
10 mod private_message;
11 mod site;
12 mod user;
13
14 #[async_trait::async_trait(?Send)]
15 pub trait PerformCrud {
16   type Response: serde::ser::Serialize + Send;
17
18   async fn perform(
19     &self,
20     context: &Data<LemmyContext>,
21     websocket_id: Option<ConnectionId>,
22   ) -> Result<Self::Response, LemmyError>;
23 }
24
25 pub async fn match_websocket_operation_crud(
26   context: LemmyContext,
27   id: ConnectionId,
28   op: UserOperationCrud,
29   data: &str,
30 ) -> Result<String, LemmyError> {
31   //TODO: handle commented out actions in crud crate
32
33   match op {
34     // User ops
35     UserOperationCrud::Register => do_websocket_operation::<Register>(context, id, op, data).await,
36     UserOperationCrud::GetPersonDetails => {
37       do_websocket_operation::<GetPersonDetails>(context, id, op, data).await
38     }
39     UserOperationCrud::DeleteAccount => {
40       do_websocket_operation::<DeleteAccount>(context, id, op, data).await
41     }
42
43     // Private Message ops
44     UserOperationCrud::CreatePrivateMessage => {
45       do_websocket_operation::<CreatePrivateMessage>(context, id, op, data).await
46     }
47     UserOperationCrud::EditPrivateMessage => {
48       do_websocket_operation::<EditPrivateMessage>(context, id, op, data).await
49     }
50     UserOperationCrud::DeletePrivateMessage => {
51       do_websocket_operation::<DeletePrivateMessage>(context, id, op, data).await
52     }
53     UserOperationCrud::GetPrivateMessages => {
54       do_websocket_operation::<GetPrivateMessages>(context, id, op, data).await
55     }
56
57     // Site ops
58     UserOperationCrud::CreateSite => {
59       do_websocket_operation::<CreateSite>(context, id, op, data).await
60     }
61     UserOperationCrud::EditSite => do_websocket_operation::<EditSite>(context, id, op, data).await,
62     UserOperationCrud::GetSite => do_websocket_operation::<GetSite>(context, id, op, data).await,
63
64     // Community ops
65     UserOperationCrud::GetCommunity => {
66       do_websocket_operation::<GetCommunity>(context, id, op, data).await
67     }
68     UserOperationCrud::ListCommunities => {
69       do_websocket_operation::<ListCommunities>(context, id, op, data).await
70     }
71     UserOperationCrud::CreateCommunity => {
72       do_websocket_operation::<CreateCommunity>(context, id, op, data).await
73     }
74     UserOperationCrud::EditCommunity => {
75       do_websocket_operation::<EditCommunity>(context, id, op, data).await
76     }
77     UserOperationCrud::DeleteCommunity => {
78       do_websocket_operation::<DeleteCommunity>(context, id, op, data).await
79     }
80     UserOperationCrud::RemoveCommunity => {
81       do_websocket_operation::<RemoveCommunity>(context, id, op, data).await
82     }
83
84     // Post ops
85     UserOperationCrud::CreatePost => {
86       do_websocket_operation::<CreatePost>(context, id, op, data).await
87     }
88     UserOperationCrud::GetPost => do_websocket_operation::<GetPost>(context, id, op, data).await,
89     UserOperationCrud::GetPosts => do_websocket_operation::<GetPosts>(context, id, op, data).await,
90     UserOperationCrud::EditPost => do_websocket_operation::<EditPost>(context, id, op, data).await,
91     UserOperationCrud::DeletePost => {
92       do_websocket_operation::<DeletePost>(context, id, op, data).await
93     }
94     UserOperationCrud::RemovePost => {
95       do_websocket_operation::<RemovePost>(context, id, op, data).await
96     }
97
98     // Comment ops
99     UserOperationCrud::CreateComment => {
100       do_websocket_operation::<CreateComment>(context, id, op, data).await
101     }
102     UserOperationCrud::EditComment => {
103       do_websocket_operation::<EditComment>(context, id, op, data).await
104     }
105     UserOperationCrud::DeleteComment => {
106       do_websocket_operation::<DeleteComment>(context, id, op, data).await
107     }
108     UserOperationCrud::RemoveComment => {
109       do_websocket_operation::<RemoveComment>(context, id, op, data).await
110     }
111     UserOperationCrud::GetComments => {
112       do_websocket_operation::<GetComments>(context, id, op, data).await
113     }
114   }
115 }
116
117 async fn do_websocket_operation<'a, 'b, Data>(
118   context: LemmyContext,
119   id: ConnectionId,
120   op: UserOperationCrud,
121   data: &str,
122 ) -> Result<String, LemmyError>
123 where
124   for<'de> Data: Deserialize<'de> + 'a,
125   Data: PerformCrud,
126 {
127   let parsed_data: Data = serde_json::from_str(&data)?;
128   let res = parsed_data
129     .perform(&web::Data::new(context), Some(id))
130     .await?;
131   serialize_websocket_message(&op, &res)
132 }