1 use actix_web::{web, web::Data};
2 use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*};
3 use lemmy_utils::{error::LemmyError, ConnectionId};
4 use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperationCrud};
5 use serde::Deserialize;
14 #[async_trait::async_trait(?Send)]
15 pub trait PerformCrud {
16 type Response: serde::ser::Serialize + Send;
20 context: &Data<LemmyContext>,
21 websocket_id: Option<ConnectionId>,
22 ) -> Result<Self::Response, LemmyError>;
25 pub async fn match_websocket_operation_crud(
26 context: LemmyContext,
28 op: UserOperationCrud,
30 ) -> Result<String, LemmyError> {
31 //TODO: handle commented out actions in crud crate
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
39 UserOperationCrud::DeleteAccount => {
40 do_websocket_operation::<DeleteAccount>(context, id, op, data).await
43 // Private Message ops
44 UserOperationCrud::CreatePrivateMessage => {
45 do_websocket_operation::<CreatePrivateMessage>(context, id, op, data).await
47 UserOperationCrud::EditPrivateMessage => {
48 do_websocket_operation::<EditPrivateMessage>(context, id, op, data).await
50 UserOperationCrud::DeletePrivateMessage => {
51 do_websocket_operation::<DeletePrivateMessage>(context, id, op, data).await
53 UserOperationCrud::GetPrivateMessages => {
54 do_websocket_operation::<GetPrivateMessages>(context, id, op, data).await
58 UserOperationCrud::CreateSite => {
59 do_websocket_operation::<CreateSite>(context, id, op, data).await
61 UserOperationCrud::EditSite => do_websocket_operation::<EditSite>(context, id, op, data).await,
62 UserOperationCrud::GetSite => do_websocket_operation::<GetSite>(context, id, op, data).await,
65 UserOperationCrud::GetCommunity => {
66 do_websocket_operation::<GetCommunity>(context, id, op, data).await
68 UserOperationCrud::ListCommunities => {
69 do_websocket_operation::<ListCommunities>(context, id, op, data).await
71 UserOperationCrud::CreateCommunity => {
72 do_websocket_operation::<CreateCommunity>(context, id, op, data).await
74 UserOperationCrud::EditCommunity => {
75 do_websocket_operation::<EditCommunity>(context, id, op, data).await
77 UserOperationCrud::DeleteCommunity => {
78 do_websocket_operation::<DeleteCommunity>(context, id, op, data).await
80 UserOperationCrud::RemoveCommunity => {
81 do_websocket_operation::<RemoveCommunity>(context, id, op, data).await
85 UserOperationCrud::CreatePost => {
86 do_websocket_operation::<CreatePost>(context, id, op, data).await
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
94 UserOperationCrud::RemovePost => {
95 do_websocket_operation::<RemovePost>(context, id, op, data).await
99 UserOperationCrud::CreateComment => {
100 do_websocket_operation::<CreateComment>(context, id, op, data).await
102 UserOperationCrud::EditComment => {
103 do_websocket_operation::<EditComment>(context, id, op, data).await
105 UserOperationCrud::DeleteComment => {
106 do_websocket_operation::<DeleteComment>(context, id, op, data).await
108 UserOperationCrud::RemoveComment => {
109 do_websocket_operation::<RemoveComment>(context, id, op, data).await
111 UserOperationCrud::GetComment => {
112 do_websocket_operation::<GetComment>(context, id, op, data).await
114 UserOperationCrud::GetComments => {
115 do_websocket_operation::<GetComments>(context, id, op, data).await
120 async fn do_websocket_operation<'a, 'b, Data>(
121 context: LemmyContext,
123 op: UserOperationCrud,
125 ) -> Result<String, LemmyError>
127 for<'de> Data: Deserialize<'de> + 'a,
130 let parsed_data: Data = serde_json::from_str(data)?;
131 let res = parsed_data
132 .perform(&web::Data::new(context), Some(id))
134 serialize_websocket_message(&op, &res)